반응형

한국어 전처리에 이어, 오늘은 영어 전처리를 알아 보도록 하겠습니다:)

영어 자연어처리는 대표적인 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')]

이렇게 각각의 단어마다 품사 태그를 한 것을 확인할 수 있습니다.

품사 태그의 의미 및 종류는 아래의 링크에서 확인해 주세요:)

품사 태그 리스트

 

POS Tagging with NLTK and Chunking in NLP [EXAMPLES]

POS Tagging Parts of speech Tagging is responsible for reading the text in a language and assigning some specific token (Parts of Speech) to each word.

www.guru99.com

 

전체 코드
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)
코드 파일

nlp_nltk_spacy.py
0.00MB

참고 자료
  • 책 「잡아라! 텍스트 마이닝 with 파이썬」
  • 책 「텐서플로 2와 머신러닝으로 시작하는 자연어처리-로지스틱회귀부터 BERT와 GPT2까지」
  • spaCy 공식 사이트
 

English · spaCy Models Documentation

spaCy is a free open-source library for Natural Language Processing in Python. It features NER, POS tagging, dependency parsing, word vectors and more.

spacy.io

 

NLTK :: Natural Language Toolkit

Natural Language Toolkit NLTK is a leading platform for building Python programs to work with human language data. It provides easy-to-use interfaces to over 50 corpora and lexical resources such as WordNet, along with a suite of text processing libraries

www.nltk.org

마무리

오늘은 영어 전처리 방법을 간단히 알아보았습니다.

nltk나 spacy 중 편한 라이브러리를 사용하여 영어 전처리 하면 될 것 같습니다 ㅎㅎ

영어 말고도 다른 언어도 지원하니 관심이 있는 분은 공식 문서를 사용하여 분석 진행하시면 됩니다. o(〃^▽^〃)o

제 포스팅 항상 봐주셔서 감사합니다. ლ(╹◡╹ლ)

반응형

+ Recent posts