- 두 작업이 갖고 있는 의미는 눈으로 봤을 때는 서로 다른 단어들이지만, 하나의 단어로 일반화시킬 수 있다면 하나의 단어로 일반화시켜서 문서 내의 단어 수를 줄이겠다는 "정규화" 의미.
단어의 뿌리 단어를 찾아가 단어의 개수를 줄일 수 있도록 한다.
형태학적 parsing 진행 시, 섬세한 표제어 추출.
형태소 - (1) 어간(stem) : 단어 의미 담고있는 단어 핵심부
(2) 접사(affix) : 단어에 추가적 의미를 주는 부분
로 분리하는 것을 형태학적 parsing이라 한다.
from nltk.stem import WordNetLemmatizer
n=WordNetLemmatizer()
words=['policy', 'doing', 'organization', 'have', 'going', 'love', 'lives', 'fly', 'dies', 'watched', 'has', 'starting']
print([n.lemmatize(w) for w in words])
--------------------------------------------------------------------
['policy', 'doing', 'organization', 'have', 'going', 'love', 'life', 'fly', 'dy', 'watched', 'ha', 'starting']
어간을 추출하는 작업. 표제어 추출보다 들 섬세한 작업. 결과가 반드시 사전에 존재하는 단어는 아니다. 정해진 규칙만 파악 후 추출
ex
from nltk.stem import PorterStemmer
from nltk.tokenize import word_tokenize
s = PorterStemmer()
text="This was not the map we found in Billy Bones's chest, but an accurate copy, complete in all things--names and heights and soundings--with the single exception of the red crosses and the written notes."
words=word_tokenize(text)
print(words)
---------------------------------------------------------------
['This', 'was', 'not', 'the', 'map', 'we', 'found', 'in', 'Billy', 'Bones', "'s", 'chest', ',', 'but', 'an', 'accurate', 'copy', ',', 'complete', 'in', 'all', 'things', '--', 'names', 'and', 'heights', 'and', 'soundings', '--', 'with', 'the', 'single', 'exception', 'of', 'the', 'red', 'crosses', 'and', 'the', 'written', 'notes', '.']
-----------------------------------------------------------
print([s.stem(w) for w in words])
------------------------------------------------------------
['thi', 'wa', 'not', 'the', 'map', 'we', 'found', 'in', 'billi', 'bone', "'s", 'chest', ',', 'but', 'an', 'accur', 'copi', ',', 'complet', 'in', 'all', 'thing', '--', 'name', 'and', 'height', 'and', 'sound', '--', 'with', 'the', 'singl', 'except', 'of', 'the', 'red', 'cross', 'and', 'the', 'written', 'note', '.']
어간 추출은 단순 규칙에 기반하여 이루어진다.
(포터 알고리즘 : ALIZE → AL / ANCE → 제거 / ICAL → IC)
한국어에서도 stemming을 통해 어간 추출.
배경지식정도로 학창시절 배웠던 품사 복습하자면
언 | 품사 |
---|---|
체언 | 명사, 대명사, 수사 |
수식언 | 관형사, 부사 |
관계언 | 조사 |
독립언 | 감탄사 |
용언 | 동사, 형용사 |
from konlpy.tag import Okt
Okt = Okt()
sentence = '1980년대, 약 10년 전 한국을 떠나 미국에 정착한 한인 이민자인 제이콥(스티븐 연)과 모니카(한예리) 부부는 아칸소 주의 농장이 딸린 트레일러 집으로 첫째 딸 앤과 심장병이 있는 둘째 아들 데이빗을 데리고 이사를 한다. \
제이콥은 자식들에게 농장을 소개하며 이제 농사를 짓고 살 거라고 말하지만, 모니카는 한인들이 많이 사는 도시인 캘리포니아 로스앤젤레스를 떠나 낯설고 아무 것도 없는 시골 땅에 정착하는 이 상황이 막막하고 짜증만 난다.'
print("Okt.morphs(sentence)")
print(Okt.morphs(sentence))
print("Okt.nouns(sentence)")
print(Okt.nouns(sentence))
print("Okt.pos(sentence)")
print(Okt.pos(sentence))
-----------------------------------------------------------------
Okt.morphs(sentence)
['1980년', '대', ',', '약', '10년', '전', '한국', '을', '떠나', '미국', '에', '정착', '한', '한인', '이민자', '인', '제이콥', '(', '스티븐', '연', ')', '과', '모니카', '(', '한예리', ')', '부부', '는', '아칸소', '주의', '농장', '이', '딸린', '트레일러', '집', '으로', '첫째', '딸', '앤', '과', '심장병', '이', '있는', '둘째', '아들', '데이빗', '을', '데리', '고', '이사', '를', '한다', '.', '제이콥', '은', '자식', '들', '에게', '농장', '을', '소개', '하며', '이제', '농사', '를', '짓고', '살', '거', '라고', '말', '하', '지만', ',', '모니카', '는', '한인', '들', '이', '많이', '사는', '도시', '인', '캘리포니아', '로스앤젤레스', '를', '떠나', '낯설고', '아무', '것', '도', '없는', '시골', '땅', '에', '정착', '하는', '이', '상황', '이', '막막하고', '짜증', '만', '난다', '.']
Okt.nouns(sentence)
['약', '전', '한국', '미국', '정착', '한인', '이민자', '제이콥', '스티븐', '연', '과', '모니카', '한예리', '부부', '아칸소', '주의', '농장', '트레일러', '집', '첫째', '딸', '앤', '심장병', '둘째', '아들', '데이빗', '데리', '이사', '제이콥', '자식', '농장', '소개', '이제', '농사', '살', '거', '말', '모니카', '한인', '도시', '캘리포니아', '로스앤젤레스', '아무', '것', '시골', '땅', '정착', '이', '상황', '짜증']
Okt.pos(sentence)
[('1980년', 'Number'), ('대', 'Foreign'), (',', 'Punctuation'), ('약', 'Noun'), ('10년', 'Number'), ('전', 'Noun'), ('한국', 'Noun'), ('을', 'Josa'), ('떠나', 'Verb'), ('미국', 'Noun'), ('에', 'Josa'), ('정착', 'Noun'), ('한', 'Josa'), ('한인', 'Noun'), ('이민자', 'Noun'), ('인', 'Josa'), ('제이콥', 'Noun'), ('(', 'Punctuation'), ('스티븐', 'Noun'), ('연', 'Noun'), (')', 'Punctuation'), ('과', 'Noun'), ('모니카', 'Noun'), ('(', 'Punctuation'), ('한예리', 'Noun'), (')', 'Punctuation'), ('부부', 'Noun'), ('는', 'Josa'), ('아칸소', 'Noun'), ('주의', 'Noun'), ('농장', 'Noun'), ('이', 'Josa'), ('딸린', 'Verb'), ('트레일러', 'Noun'), ('집', 'Noun'), ('으로', 'Josa'), ('첫째', 'Noun'), ('딸', 'Noun'), ('앤', 'Noun'), ('과', 'Josa'), ('심장병', 'Noun'), ('이', 'Josa'), ('있는', 'Adjective'), ('둘째', 'Noun'), ('아들', 'Noun'), ('데이빗', 'Noun'), ('을', 'Josa'), ('데리', 'Noun'), ('고', 'Josa'), ('이사', 'Noun'), ('를', 'Josa'), ('한다', 'Verb'), ('.', 'Punctuation'), ('제이콥', 'Noun'), ('은', 'Josa'), ('자식', 'Noun'), ('들', 'Suffix'), ('에게', 'Josa'), ('농장', 'Noun'), ('을', 'Josa'), ('소개', 'Noun'), ('하며', 'Verb'), ('이제', 'Noun'), ('농사', 'Noun'), ('를', 'Josa'), ('짓고', 'Verb'), ('살', 'Noun'), ('거', 'Noun'), ('라고', 'Josa'), ('말', 'Noun'), ('하', 'Suffix'), ('지만', 'Josa'), (',', 'Punctuation'), ('모니카', 'Noun'), ('는', 'Josa'), ('한인', 'Noun'), ('들', 'Suffix'), ('이', 'Josa'), ('많이', 'Adverb'), ('사는', 'Verb'), ('도시', 'Noun'), ('인', 'Josa'), ('캘리포니아', 'Noun'), ('로스앤젤레스', 'Noun'), ('를', 'Josa'), ('떠나', 'Verb'), ('낯설고', 'Adjective'), ('아무', 'Noun'), ('것', 'Noun'), ('도', 'Josa'), ('없는', 'Adjective'), ('시골', 'Noun'), ('땅', 'Noun'), ('에', 'Josa'), ('정착', 'Noun'), ('하는', 'Verb'), ('이', 'Noun'), ('상황', 'Noun'), ('이', 'Josa'), ('막막하고', 'Adjective'), ('짜증', 'Noun'), ('만', 'Josa'), ('난다', 'Verb'), ('.', 'Punctuation')]
mecab이 일반적으로 속도가 빠르고 성능이 우수한 듯 하고, khaiii는 mecab보다 동일하거나 좋은 성능이라고는 하나 mecab을 쓰는 사례가 많아보인다.
한글 형태소 분석기 분석리뷰 링크)
https://passerby14.tistory.com/3