한국어 전처리에 이어, 오늘은 영어 전처리를 알아 보도록 하겠습니다:)
영어 자연어처리는 대표적인 2개의 라이브러리가 있습니다.
- NLTK(Natural Language ToolKit)
- spaCy
이렇게 2가지가 있는데 두 가지 다 사용하여 전처리 해보도록 하겠습니다.
설치
라이브러리 설치는 아나콘다 프롬프트 창을 열고 아래와 같이 명령어를 입력하여 설치해 주세요.
[nltk 설치]
conda install nltk
[spaCy 설치]
conda install spacy
문장 토크나이징
자연어 처리를 할 때는 보통 텍스트에 대한 정보를 단위별로 나누어 전처리를 합니다.
이 때 토크나이징이 필요한데요, 이는 문장을 특정 기본 단위로 나누어 줍니다.
설치가 완료되었으면 한 문장을 예시로 각각의 라이브러리를 사용해서 단어 및 문장별로 나누어 주겠습니다.
문장은 spacy에서 기본적으로 제공하는 문장 중 하나를 선택하여 사용하겠습니다.
import nltk
from nltk.tokenize import word_tokenize
from nltk.tokenize import sent_tokenize
import spacy
from spacy.lang.en.examples import sentences
nlp = spacy.load('en_core_web_sm')
#문장 불러오기
doc = nlp(sentences[0])
print('원래 문장')
print(doc.text) #예시문장
원래 문장
Apple is looking at buying U.K. startup for $1 billion
위의 문장을 단어별로, 문장별로 토크나이징 해주도록 하겠습니다.
##### nlkt 토크나이징 #####
print('nlkt로 단어 토크나이징')
print(word_tokenize(doc.text))
print('nlkt로 문장 토크나이징')
print(sent_tokenize(doc.text))
##### spacy 토크나이징 #####
print('spacy로 단어 토크나이징')
spacy_word = [word.text for word in doc] #단어
print(spacy_word)
print('spacy로 문장 토크나이징')
spacy_sentence = [sentence.text for sentence in doc.sents] #문장
print(spacy_sentence)
nlkt로 단어 토크나이징
['Apple', 'is', 'looking', 'at', 'buying', 'U.K.', 'startup', 'for', '$', '1', 'billion']
nlkt로 문장 토크나이징
['Apple is looking at buying U.K. startup for $1 billion']
spacy로 단어 토크나이징
['Apple', 'is', 'looking', 'at', 'buying', 'U.K.', 'startup', 'for', '$', '1', 'billion']
spacy로 문장 토크나이징
['Apple is looking at buying U.K. startup for $1 billion']
위와 같이 nltk, spacy에서 동일한 결과를 출력하는 것을 알 수 있습니다.
어간 추출(Stemming)
예시 문장을 보면 looking과 같은 단어는 동사 look(보다)에서 변형되었음을 알 수 있습니다.
looking 은 look이랑 같은 의미를 갖습니다.
하지만 컴퓨터는 look, looking 모두 다른 단어로 인식하기 때문에
어간 동일화를 하여 원래의 형태로 바꾸어 추출해주는 과정을 거칩니다.
이를 스테밍(Stemming) 또는 '어간 동일화'라고 합니다.
Stemming은 nltk에서만 제공하는 기능이어서 nltk로 진행해보도록 하겠습니다.
nltk의 stem에는 3가지 종류의 stemmer가 있습니다.
그 종류는 아래와 같습니다.
- PorterStemmer
- LancasterStemmer
- RegexpStemmer
이 중 RegexpStemmer는 특정 단어를 일괄 제거해 주는 stemmer입니다.
#### 어간 추출 ####
a = word_tokenize(doc.text)
from nltk.stem import PorterStemmer, LancasterStemmer, RegexpStemmer
porter_stemmer, lancaster_stemmer = PorterStemmer(),LancasterStemmer()
porter = [porter_stemmer.stem(i) for i in a]
print("PorterStemmer 사용하여 어간추출")
print(porter)
lancaster = [lancaster_stemmer.stem(i) for i in a]
print("LancasterStemmer 사용하여 어간추출")
print(lancaster)
regexp_stemmer = RegexpStemmer("Apple") # ()안 특정 표현식 일괄 제거
regexp = [regexp_stemmer.stem(i) for i in a]
print("RegexpStemmer 사용하여 특정 단어 제거")
print(regexp)
PorterStemmer 사용하여 어간추출
['appl', 'is', 'look', 'at', 'buy', 'u.k.', 'startup', 'for', '$', '1', 'billion']
LancasterStemmer 사용하여 어간추출
['appl', 'is', 'look', 'at', 'buy', 'u.k.', 'startup', 'for', '$', '1', 'bil']
RegexpStemmer 사용하여 특정 단어 제거
['', 'is', 'looking', 'at', 'buying', 'U.K.', 'startup', 'for', '$', '1', 'billion']
결과를 보면, looking을 look으로, buying을 buy로 추출한 것을 알 수 있습니다.
품사 분석
한국어 전처리와 마찬가지로 영어에도 pos(part-of-speech)라는 품사 분석기가 있습니다.
nltk, spacy 모두 사용해 보겠습니다.
####품사태깅####
## nltk ##
print('nltk 품사 태깅')
print(nltk.pos_tag(a))
## spacy ##
print('spacy 품사 태깅')
tag = [(tag.text ,tag.tag_) for tag in doc]
print(tag)
nltk 품사 태깅
[('Apple', 'NNP'), ('is', 'VBZ'), ('looking', 'VBG'), ('at', 'IN'), ('buying', 'VBG'), ('U.K.', 'NNP'), ('startup', 'NN'), ('for', 'IN'), ('$', '$'), ('1', 'CD'), ('billion', 'CD')]
spacy 품사 태깅
[('Apple', 'NNP'), ('is', 'VBZ'), ('looking', 'VBG'), ('at', 'IN'), ('buying', 'VBG'), ('U.K.', 'NNP'), ('startup', 'VBD'), ('for', 'IN'), ('$', '$'), ('1', 'CD'), ('billion', 'CD')]
이렇게 각각의 단어마다 품사 태그를 한 것을 확인할 수 있습니다.
품사 태그의 의미 및 종류는 아래의 링크에서 확인해 주세요:)
전체 코드
import nltk
from nltk.tokenize import word_tokenize
from nltk.tokenize import sent_tokenize
import spacy
from spacy.lang.en.examples import sentences
nlp = spacy.load('en_core_web_sm')
#문장 불러오기
doc = nlp(sentences[0])
print('원래 문장')
print(doc.text) #예시문장
##### nlkt 토크나이징 #####
print('nlkt로 단어 토크나이징')
print(word_tokenize(doc.text))
print('nlkt로 문장 토크나이징')
print(sent_tokenize(doc.text))
##### spacy 토크나이징 #####
print('spacy로 단어 토크나이징')
spacy_word = [word.text for word in doc] #단어
print(spacy_word)
print('spacy로 문장 토크나이징')
spacy_sentence = [sentence.text for sentence in doc.sents] #문장
print(spacy_sentence)
#### 어간 추출 ####
a = word_tokenize(doc.text)
from nltk.stem import PorterStemmer, LancasterStemmer, RegexpStemmer
porter_stemmer, lancaster_stemmer = PorterStemmer(),LancasterStemmer()
porter = [porter_stemmer.stem(i) for i in a]
print("PorterStemmer 사용하여 어간추출")
print(porter)
lancaster = [lancaster_stemmer.stem(i) for i in a]
print("LancasterStemmer 사용하여 어간추출")
print(lancaster)
regexp_stemmer = RegexpStemmer("Apple") # ()안 특정 표현식 일괄 제거
regexp = [regexp_stemmer.stem(i) for i in a]
print("RegexpStemmer 사용하여 특정 단어 제거")
print(regexp)
####품사태깅####
## nltk ##
print('nltk 품사 태깅')
print(nltk.pos_tag(a))
## spacy ##
print('spacy 품사 태깅')
tag = [(tag.text ,tag.tag_) for tag in doc]
print(tag)
코드 파일
참고 자료
- 책 「잡아라! 텍스트 마이닝 with 파이썬」
- 책 「텐서플로 2와 머신러닝으로 시작하는 자연어처리-로지스틱회귀부터 BERT와 GPT2까지」
- spaCy 공식 사이트
마무리
오늘은 영어 전처리 방법을 간단히 알아보았습니다.
nltk나 spacy 중 편한 라이브러리를 사용하여 영어 전처리 하면 될 것 같습니다 ㅎㅎ
영어 말고도 다른 언어도 지원하니 관심이 있는 분은 공식 문서를 사용하여 분석 진행하시면 됩니다. o(〃^▽^〃)o
제 포스팅 항상 봐주셔서 감사합니다. ლ(╹◡╹ლ)
'NLP' 카테고리의 다른 글
[python] 자연어처리(NLP) - Kmeans, K대푯값 군집 분석 (2) | 2021.12.07 |
---|---|
[python] 자연어처리(NLP) - 텍스트 유사도 (0) | 2021.11.26 |
[python] 자연어처리(NLP) - Konlpy로 한국어 형태소 분석하기 (0) | 2021.11.22 |
[python] 자연어처리(NLP)-텍스트 빈도 분석 (4) | 2021.11.19 |
[python/konlpy] SystemErrorjava.nio.file.InvalidPathException 오류해결 (1) | 2021.11.09 |