- 이미지에서 관심영역을 선택후 그 이미지나⋯
- 네 ^^
- 제가 추천 시스템과 관련된 논문을 작성하고⋯
- 오타 발견해주셔서 고맙습니다. 수정했습니다 :)
- 안녕하세요. 좋은 글 감사합니다 :) 글 중에⋯
- 옙!
- 네~ ^^ 출처만 적어주시면 감사드리겠습니다!
- 안녕하세요 블로그 게시물 잘 보고있습니다.⋯
- 고맙습니다 ^^
- 덕분에 쉽게 이해가 되었습니다. 친절한 설명⋯
- keypoint.pt[0], keypoint.pt[1]이 각각 x, y⋯
- 안녕하세요, ORB알고리즘을 처음 공부하는⋯
- 읽어주셔서 고맙습니다 ~
- 정말 쉽고 흥미로운 이야기들입니다! 잘 읽고⋯
- 아하 그렇군요! ㅎㅎ 포스팅 정말 잘 읽고 갑⋯
귀퉁이 서재
NLP - 4. 어간 추출(Stemming)과 표제어 추출(Lemmatization) 본문

텍스트 전처리 세 번째 주제는 어간 추출(Stemming)과 표제어 추출(Lemmatization)입니다. 이전과 마찬가지로 파이썬 머신러닝 완벽 가이드 (권철민 저), 딥 러닝을 이용한 자연어 처리 입문(유원주 저)을 요약정리했습니다.
택스트 전처리의 목적은 말뭉치(Corpus)로부터 복잡성을 줄이는 것입니다. 어간 추출과 표제어 추출 역시 말뭉치의 복잡성을 줄여주는 텍스트 정규화 기법입니다.
텍스트 안에서 언어는 다양하게 변합니다. 영어를 예로 들면, 과거형, 현재 진행형, 미래형, 3인칭 단수 여부 등 많은 조건에 따라 원래 단어가 변화합니다. play를 예로 들면, plays, played, playing 등과 같이 조건에 따라 다양하게 달라집니다. 어간 추출(Stemming)과 표제어 추출(Lemmatization)은 단어의 원형을 찾는 것입니다. played, plays, playing으로부터 play를 찾는 것입니다.
어간 추출(Stemming)
어간 추출(Stemming)이란 단어로 부터 어간(Stem)을 추출하는 작업을 뜻합니다. 어간 추출은 뒤이어 설명할 표제어 추출보다 성능이 떨어집니다. 즉, 일부 철자가 훼손된 어근 단어를 추출합니다. 단어를 보고 어림짐작하여 어미를 잘라 어간을 추출하기 때문입니다. NLTK의 어간 추출 Stemmer로는 대표적으로 Porter, Lancaster, Snowball Stemmer가 있습니다. Porter Stemmer와 Lancaster Stemmer를 비교해보겠습니다.
Porter Stemmer
from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
print(stemmer.stem('working'),stemmer.stem('works'),stemmer.stem('worked'))
print(stemmer.stem('amusing'),stemmer.stem('amuses'),stemmer.stem('amused'))
print(stemmer.stem('happier'),stemmer.stem('happiest'))
print(stemmer.stem('fancier'),stemmer.stem('fanciest'))
print(stemmer.stem('was'), stemmer.stem('love'))
work work work
amus amus amus
happier happiest
fancier fanciest
wa love
Lancaster Stemmer
from nltk.stem import LancasterStemmer
stemmer = LancasterStemmer()
print(stemmer.stem('working'),stemmer.stem('works'),stemmer.stem('worked'))
print(stemmer.stem('amusing'),stemmer.stem('amuses'),stemmer.stem('amused'))
print(stemmer.stem('happier'),stemmer.stem('happiest'))
print(stemmer.stem('fancier'),stemmer.stem('fanciest'))
print(stemmer.stem('was'), stemmer.stem('love'))
work work work
amus amus amus
happy happiest
fant fanciest
was lov
work는 모두 잘 추출했습니다. 하지만 amusing, amuses, amused는 amuse로 추출해야 하는데 amus로 잘못 추출한 것을 볼 수 있습니다. Porter와 Lancaster가 서로 다른 성능을 보입니다.
표제어 추출(Lemmatization)
일반적으로 어간 추출(Stemming)보다 표제어 추출(Lemmatization)이 더 정확히 어근 단어를 찾아줍니다. 품사와 같은 문법적인 요소와 더 의미적인 부분을 감안하기 때문인데, 그래서 어간 추출보다 시간이 더 오래 걸립니다.
표제어 추출은 WordNetLemmatizer를 주로 사용합니다.
from nltk.stem import WordNetLemmatizer
lemma = WordNetLemmatizer()
print(lemma.lemmatize('amusing'),lemma.lemmatize('amuses'),lemma.lemmatize('amused'))
print(lemma.lemmatize('happier'),lemma.lemmatize('happiest'))
print(lemma.lemmatize('fancier'),lemma.lemmatize('fanciest'))
print(lemma.lemmatize('was'), lemma.lemmatize('love'))
amusing amuses amused
happier happiest
fancier fanciest
wa love
영 성능이 좋지 않네요. 표제어 추출은 단어의 품사 정보를 알아야만 정확한 결과를 얻을 수 있습니다. 아래와 같이 두 번째 인자에 품사 정보를 넣어주면 정확하게 어근 단어를 추출하는 것을 볼 수 있습니다.
print(lemma.lemmatize('amusing','v'),lemma.lemmatize('amuses','v'),lemma.lemmatize('amused','v'))
print(lemma.lemmatize('happier','a'),lemma.lemmatize('happiest','a'))
print(lemma.lemmatize('fancier','a'),lemma.lemmatize('fanciest','a'))
print(lemma.lemmatize('was', 'v'), lemma.lemmatize('love', 'v'))
amuse amuse amuse
happy happy
fancy fancy
be love
완벽하죠?
References
Reference1: 파이썬 머신러닝 완벽가이드 (권철민 저)
Reference2: 딥 러닝을 활용한 자연어 처리 입문 (어간 추출과 표제어 추출)
'자연어 처리 (NLP)' 카테고리의 다른 글
NLP - 6. 카운트 기반 벡터화(CountVectorizer)와 TF-IDF 벡터화 (2) | 2020.02.15 |
---|---|
NLP - 5. Bag of Words (BOW) (0) | 2020.02.13 |
NLP - 4. 어간 추출(Stemming)과 표제어 추출(Lemmatization) (0) | 2020.02.12 |
NLP - 3. 불용어(Stop word) 제거 (0) | 2020.02.11 |
NLP - 2. 텍스트 토큰화(Text Tokenization) (0) | 2020.02.10 |
NLP - 1. 자연어 처리(Natural Language Processing)란 무엇인가? (0) | 2020.02.09 |