슬기로운 연구생활

Classification - [4] Stemming, Lemmatizing 본문

슬기로운 NLP 생활

Classification - [4] Stemming, Lemmatizing

vhrehfdl 2020. 8. 23. 15:20

이전 글

자연어처리 [1] 자연어처리란?

자연어처리 [2] Classification Task

자연어처리 [3] POS Tagging

 

들어가며

이전 글에서는 Pre Precessing 과정 중 하나인 POS Tagging에 대해 설명했습니다.

이번 글에서는 영어 텍스트 전처리를 할 때, 자주 사용되는 전처리 방법인 Stemming과 Lemmatizing에 대해 알아보겠습니다.

 

Stemming

Stemming(어간 추출)은 어형이 변형된 단어로부터 접사 등을 제거하고 그 단어의 어간을 분리하는 것을 말합니다 [위키백과].

Stemming은 정해진 규칙만 보고 단어의 어미를 어림짐작으로 자르기 때문에, Stemming 후에 나오는 단어는 사전에 존재하지 않는 단어일 가능성이 있습니다.

from nltk.stem import PorterStemmer
s = PorterStemmer()
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])

Stemming을 실행시키면

['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', '.'] 

과 같은 단어들이 아래와 같이 변환됩니다.

['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', '.']

 

'was' -> 'wa'과 같이 Stemming을 거친 단어는 사전에 존재하지 않을 수 있습니다.

 

Lemmatizing

Lemmatizaing(표제어 추출)은 단어의 표제어를 찾아가는 과정입니다.

표제어는 '표제어' 또는 '기본 사전형 단어' 정도의 의미를 갖습니다 [위키독스].

 

Lemmatizaing은 Stemming과 비슷하지만, 동의어 대체와 유사합니다.

표제어 추출은 어간 추출과는 달리 단어의 형태가 적절히 보존되는 특징을 가지고 있습니다.

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])

Lemmatizing을 거치면

['policy', 'doing', 'organization', 'have', 'going', 'love', 'lives', 'fly', 'dies', 'watched', 'has', 'starting']

과 같은 단어가

['policy', 'doing', 'organization', 'have', 'going', 'love', 'life', 'fly', 'dy', 'watched', 'ha', 'starting']

로 변하게 됩니다.

 

Lemmatizing은 Stemming과 다르게 단어의 형태가 거의 바뀌지 않은 것을 확인할 수 있습니다.

다만 "dy"와 "ha"와 같은 의미를 알 수 없는 단어를 출력하는 경우도 있습니다.

 

이것은 단어의 품사정보가 입력되어 있지 않았기 때문이며, 품사를 같이 입력해주면 정확한 결과값을 얻을 수 있습니다.

n.lemmatize('has', 'v')

위의 코드를 실행하면 'have'라는 결과값을 확인 할 수 있습니다.

 

마무리

Stemming과 Lemmatizaing을 하는 이유는 두가지 입니다.

첫째, 컴퓨터는 "좋아요"와 "좋다"를 같은 의미를 가진 단어라고 정확히 인식 못하기 때문입니다.

두 단어에 One-Hot Encoding을 적용하면 "좋아요" -> [ 0 1 0 ]로 변환되고 "좋다" -> [ 1 0 0 ]로 변환됩니다.

위의 Vector로는 두 단어 사이의 의미적 유사성을 파악할 수 없습니다.

 

둘째, Text To Vector의 단어를 사전으로 매핑하는 과정이 존재하는데 이 때 색인 크기를 줄이기 위해 사용합니다.

ex) [1:"좋아요", 2:"좋다" .... 102:"좋을까"] -> [1:"좋다"]

"좋다"에서 변형된 단어를 하나로 통일할 수 있습니다.

 

이번 글에서는 Stemming과 Lemmatizaing에 대해 알아보았습니다.

영어에서는 NLTK를 사용해 Stemming과 Lemmatizaing을 진행하는데 한국어에서는 어떻게 할까요?

한국어에서는 POS Tagging을 적용할 때 활용했던 형태소 분석기를 사용합니다.

다음 글에서는 형태소 분석기에 대해 자세히 살펴보도록 하겠습니다.

 

Comments