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']
'Python > Data Analysis' 카테고리의 다른 글
데이터 비닝과 WOE(Weight of Evidence), IV(Information Value) (0) | 2024.02.29 |
---|---|
[텍스트 분석] konlpy 한글 형태소 분석 (0) | 2024.02.22 |
[텍스트 분석] Python 문법 , 정규표현식으로 텍스트 분석하기 - basic (0) | 2024.02.17 |
코사인 유사도(CountVectorizer , TF-IDF 벡터화) (0) | 2024.02.12 |
Python 대용량 데이터 처리 라이브러리 - Dask (0) | 2024.02.04 |