일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- effective python
- python
- hive
- 주식분석
- 하이브
- NumPy
- 딥러닝
- yarn
- Sort
- recursion
- Java
- C
- RNN
- 알고리즘
- 텐서플로
- 선형대수
- GRU
- 하둡2
- hadoop2
- LSTM
- scrapy
- collections
- 파이썬
- 그래프이론
- graph
- codingthematrix
- HelloWorld
- 코딩더매트릭스
- tensorflow
- C언어
- Today
- Total
EXCELSIOR
Chap02-1 : Stemming, Lemmatizing 본문
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
'NLP > NLTK' 카테고리의 다른 글
Chap03 -1 : Creating Custom Corpora(corpus, chunk) (3) | 2017.01.06 |
---|---|
Chap02-2 : Replacing and Correcting Words (2) | 2016.12.26 |
Chap01-2 : WordNet, Part-Of-Speech(POS) (1) | 2016.12.14 |
Chap01-1: Token, Tokenize, Tokenizer (0) | 2016.12.13 |
python3.5에 NLTK 설치하기 (4) | 2016.12.13 |