본문 바로가기
Python/Data Analysis

[텍스트 분석] nltk 영어 형태소 분석 - 토큰화/정규화/품사 태깅

by skwkiix 2024. 2. 21.
728x90

0. 텍스트 전처리 단계

1. 데이터 정제 (Python 문법, 정규표현식 사용)

2. 영어/한글에 따라 전처리 진행(nltk, konlpy)

  • 토큰화 : 텍스트의 단위를 token으로 나누기
    • 문장토큰화/단어토큰화/단어보다 더 작은 형태로 토큰화
  • 정규화 : 어간 추출, 표제어 추출
    • ex) go, goes > go
  • 품사 태깅 : 명사, 대명사, 형용사 등으로 분석 요구에 따라 태깅

 

👉  이번 포스팅 :  nltk 라이브러리를 사용하여 영어 텍스트를 토큰화/정규화/품사 태깅 하는 방법


1. nltk (Natural Language Toolkit)  패키지 

NLTK는 텍스트 데이터를 처리하고 분석하는 데 사용되며, 다양한 자연어 처리 작업을 수행할 수 있는 도구와 리소스를 제공하는 패키지이다. 영어 텍스트 전처리에 사용한다.

 

주요 기능

텍스트 전처리: NLTK는 텍스트 데이터를 토큰화하고, 형태소 분석, 품사 태깅, 구문 분석 

텍스트 데이터, 자연어 데이터: 다양한 텍스트 데이터와 자연어 데이터가 포함(불용어 등)

(1) 라이브러리 임포트 & 리소스 다운로드

import nltk

# 리소스 다운로드
nltk.download('punkt') # 토크나이저
nltk.download('webtext') # 텍스트 모음
nltk.download('wordnet') # 영어 어휘 데이터베이스
nltk.download('stopwords') # 불용어
nltk.download('tagsets') # 품사태깅
nltk.download('averaged_perceptron_tagger')

 

문장 예시 텍스트 

 

머신러닝에 관한 텍스트 한 문장을 예시로 가져왔다.(sample1)

sp1 = 'Machine learning algorithms can analyze large datasets to identify patterns and make predictions without being explicitly programmed.'

 

(2) 토큰화

문장 토큰화(sent_tokenize)

from nltk.tokenize import sent_tokenize
sent_tokenize(sp1) # sp1 에 대한 문장토큰화 진행


단어 토큰화(word_tokenize, WordPuncTokenizer)

from nltk.tokenize import word_tokenize # 단어토큰화
from nltk.tokenize import WordPunctTokenizer # 단어토큰화, 특수문자도 함께 제거
print(word_tokenize(sp1))

 

['Machine', 'learning', 'algorithms', 'can', 'analyze', 'large', 'datasets', 'to', 'identify', 'patterns', 'and', 'make', 'predictions', 'without', 'being', 'explicitly', 'programmed', '.']

print(WordPunctTokenizer().tokenize(sp1))

 

['Machine', 'learning', 'algorithms', 'can', 'analyze', 'large', 'datasets', 'to', 'identify', 'patterns', 'and', 'make', 'predictions', 'without', 'being', 'explicitly', 'programmed', '.']


 

정규표현식 토크나이즈

패턴, 불용어 등 분석에 의미없는 단어를 제거하기 위해 사용한다.

from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer('[\w"]+')
tokens = tokenizer.tokenize(sp1.lower())
print(tokens)

 

['machine', 'learning', 'algorithms', 'can', 'analyze', 'large', 'datasets', 'to', 'identify', 'patterns', 'and', 'make', 'predictions', 'without', 'being', 'explicitly', 'programmed']


 

노이즈, 불용어 제거

실제 모델링 프로젝트를 수행하기 전에는, 데이터에 맞게 불용어 사전을  업데이트 하여 진행한다.

from nltk.corpus import stopwords # 불용어 가져오는 패키지
en_stops = set(stopwords.words('english'))
# 불용어를 제외한 단어를 추출
res = [word for word in tokens if word not in en_stops]
print(res)

 

['machine', 'learning', 'algorithms', 'analyze', 'large', 'datasets', 'identify', 'patterns', 'make', 'predictions', 'without', 'explicitly', 'programmed']

 

(3) 정규화

어간 추출(stemming)

  • 자연어 처리에서 단어의 어간(stem)을 추출하는 과정으로, 단어의 어미(ending)를 제거하여 단어의 기본 형태를 찾아낸다.

 

poterStammer 와 LancasterStemmer 를 이용해서 진행한다.

간단한 예시로 start를 사용했으나, 패키지 마다 정규화 결과는 다를 수 있다.

  • poterStammer
from nltk.stem import PorterStemmer
stem = PorterStemmer()
print(stem.stem('start'), stem.stem('starts'), stem.stem('started'))

 

start start start

 

  • LancasterStemmer
from nltk.stem import LancasterStemmer
lstem = LancasterStemmer()
print(lstem.stem('start'), lstem.stem('starts'), lstem.stem('started'))

 

start start start

 

LancasterStemmer로 sp1 정규화

from nltk.stem import LancasterStemmer
lstem = LancasterStemmer()

tokens = word_tokenize(sp1) # 단어 토큰화
res1 = [stem.stem(token) for token in tokens] # tokens 정규화

 

['machin', 'learn', 'algorithm', 'can', 'analyz', 'larg', 'dataset', 'to', 'identifi', 'pattern', 'and', 'make', 'predict', 'without', 'be', 'explicitli', 'program', '.']

 

표제어 추출(Lemmatization)

- 단어의 기본형을 변환하는 방법

from nltk.stem import WordNetLemmatizer
lemma = WordNetLemmatizer()

print(lemma.lemmatize('go'))
print(lemma.lemmatize('going'))
print(lemma.lemmatize('goes'))

go

going

go

 

품사를 지정해서 추출하는 것도 가능하다

print(lemma.lemmatize('going',pos = 'v'))

 

go


(3) 품사 태깅

  • 품사태깅은 형태소를 분석하기 위한 방법 중 하나로, 형태소에 품사를 붙이는 작업이다.

단어 토큰을 가지고 품사 형태로 분류

tokens =  word_tokenize(sp1)
print(nltk.pos_tag(tokens))

 

[('Machine', 'NN'), ('learning', 'VBG'), ('algorithms', 'NNS'), ('can', 'MD'), ('analyze', 'VB'), ('large', 'JJ'), ('datasets', 'NNS'), ('to', 'TO'), ('identify', 'VB'), ('patterns', 'NNS'), ('and', 'CC'), ('make', 'VB'), ('predictions', 'NNS'), ('without', 'IN'), ('being', 'VBG'), ('explicitly', 'RB'), ('programmed', 'VBN'), ('.', '.')]

 

원하는 품사만 가져오기

want_tag = ['NN']

NN_tag = [word for word, tag in nltk.pos_tag(tokens) if tag in want_tag]

 

['Machine']