EXCELSIOR

Chap02-1 : Stemming, Lemmatizing 본문

NLP/NLTK

Chap02-1 : Stemming, Lemmatizing

Excelsior-JH 2016. 12. 22. 19:53

1. Stemming words

Stemming은 단어에서 접사(affix)를 제거하는 것을 말한다. Stemming은 검색엔진에서 색인할 때 가장 많이 쓴다. 모든 형태의 단어를 저장하는것 보다 Stemming한 단어를 저장하는 것이 색인 크기를 줄일 뿐만아니라 검색 정확성을 높일 수 있다.

Stemming algorithm 중에서 유명한 알고리즘은 Martin Porter의 Porter stemming algorithm이다. Porter 알고리즘은 영어의 접미사(suffix)를 제거한다.


1) The PorterStemmer class

from nltk.stem.porter import PorterStemmer
stemmer = PorterStemmer()
print(stemmer.stem('cooking'))
print(stemmer.stem('cookery'))
#결과
cook
cookeri

또다른 알고리즘으로는 Lancaster 대학이 개발한 Lancaster stemming algorithm이 있다. NLTK는 Porter, Lancaster, Regexp, Snowball Stemmer 클래스를 제공한다.


2) The LancasterStemmer class

LancasterStemmer 함수는 PorterStemmer와 비슷하지만 예제에서도 알 수 있듯이 LancasterStemmer가 좀더 성능이 좋다.

from nltk.stem.lancaster import LancasterStemmer
stemmer = LancasterStemmer()
print(stemmer.stem('cooking'))
print(stemmer.stem('cookery'))
#결과
cook
cookery

3) The RegexpStemmer class

RegexpStemmer는 사용자가 지정한 정규표현을 기준으로 동작한다. 아래의 예제와 같이 'ing'를 stem처리한다고 할 때, 단어 inleside(명사)에서 ing가 제거되는 문제가 발생한다. 따라서, RegexpStemmer는 Porter나 Lancaster가 처리하지 못하는 특수한 부분에서 쓰는것이 적절하다.

from nltk.stem.regexp import RegexpStemmer
stemmer = RegexpStemmer('ing')
print(stemmer.stem('cooking'))
print(stemmer.stem('cookery'))
print(stemmer.stem('ingleside'))
#결과
cook
cookery
leside

4) The SnowballStemmer class

SnowballStemmer는 영어 외의 13개 국가의 언어에대한 Stemming을 지원한다.

from nltk.stem.snowball import SnowballStemmer
spanish_stemmer = SnowballStemmer('spanish')
print(spanish_stemmer.stem('hola'))
#결과
hol


2. Lemmatizing words with WordNet

Lemmatization은 stemming과 매우 비슷하지만, 동의어 대체와 유사하다. Lemma는 어원(root word)이라는 의미다. Stemming과는 달리 Lemmatize 후에도 그 단어는 같은 의미를 지닌다. 아래의 예제에서, 'cooking'은 POS(Part of Speech)의 설정없이는 'cooking'자체가 하나의 명사(요리)로 보기 때문에 lemma는 'cooking'자체가 된다. POS 설정을 동사(verb)로 설정해주면 lemma는 'cook'이 된다.  또한 'cookbooks'는 복수명사이므로 그 원형인 'cookbook'이 된다.

from nltk.stem.wordnet import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
print(lemmatizer.lemmatize('cooking'))
print(lemmatizer.lemmatize('cooking', pos='v'))
print(lemmatizer.lemmatize('cookbooks'))
#결과
cooking
cook
cookbook

아래의 예는 stemming과 lemmatization의 차이를 보여준다. PorterStemmer는 'es'를 잘라내고, lemmatize는 원어를 찾아서 결과를 보여준다.

from nltk.stem.wordnet import WordNetLemmatizer
from nltk.stem.porter import PorterStemmer
lemmatizer = WordNetLemmatizer()
stemmer = PorterStemmer()
print(stemmer.stem('believes'))
print(lemmatizer.lemmatize('believes'))
#결과
believ
belief
Comments