딥 러닝을 이용한 자연어처리 입문1. 텍스트 전처리(3)

정선용·2021년 8월 16일
0

0. Stemming / Lemmatization = 형태소분석

  • 두 작업이 갖고 있는 의미는 눈으로 봤을 때는 서로 다른 단어들이지만, 하나의 단어로 일반화시킬 수 있다면 하나의 단어로 일반화시켜서 문서 내의 단어 수를 줄이겠다는 "정규화" 의미.

1. 표제어 추출(Lemmatization)

단어의 뿌리 단어를 찾아가 단어의 개수를 줄일 수 있도록 한다.

형태학적 parsing 진행 시, 섬세한 표제어 추출.
형태소 - (1) 어간(stem) : 단어 의미 담고있는 단어 핵심부
(2) 접사(affix) : 단어에 추가적 의미를 주는 부분
로 분리하는 것을 형태학적 parsing이라 한다.

  • NLTK에서는 WordNetLemmatizer를 지원.
    ex
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']
  • 어간추출(stemming)과의 차이? : 표제어 추출은 문맥을 고려, 해당 단어의 품사 정보를 결과에서 보존하지만, 어간 추출은 품사정보 보존X,

2. 어간 추출(Stemming)

어간을 추출하는 작업. 표제어 추출보다 들 섬세한 작업. 결과가 반드시 사전에 존재하는 단어는 아니다. 정해진 규칙만 파악 후 추출

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은 lemmatization보다 일반적으로 빠르고, porter알고리즘은 정확도가 높은편이라 영어 자연어처리에서 어간추출방식으로 곧잘 쓰인다. 여러 알고리즘이 있고 목적에 따라 결과를 보고 사용할것.

3.한국어 Stemming

한국어에서도 stemming을 통해 어간 추출.
배경지식정도로 학창시절 배웠던 품사 복습하자면

품사
체언명사, 대명사, 수사
수식언관형사, 부사
관계언조사
독립언감탄사
용언동사, 형용사
  • 규칙활용의경우, 단순 어간/어미 분리 시 어간추출이 된다.
  • 불규칙활용의경우, 어간에 어미가 붙는 과정에서 어간의 모습이 바뀌므로 복잡한 규칙을 필요로함. (ex -> 노랗다,노랗게,노란 푸르다,푸르러, 오르다,올라 등)
    -> 동사,형용사(용언)이 stemming이 까다로운편이다.

4. 한글 형태소분석기

  • okt example
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

profile
정선용

0개의 댓글