본문 바로가기
AI

자연어처리 : 텍스트 전처리 : 정제 및 정규화 : 어간 추출 및 표제어 추출 (stemming & Lemmatization)

by 월곡동로봇팔 2020. 3. 4.

정의

정제 및 정규화 작업 중 포함되는 stemming, Lemmatization, 어간 추출 및 표제어 추출이다.

stemming, Lemmatization 의 목표는 겉보기에는 서로 다른 단어들이지만, 하나의 단어로 일반화시킬 수 있다면 하나의 단어로 일반화시켜서 문서 내의 단어 수를 줄이겠다는 것이 포인트다.

이러한 방법들은 단어의 빈도수를 기반으로 문제를 풀고자 하는 BoW(Bag of Words) 표현을 사용하는 자연어 처리 문제에서 주로 사용된다.

자연어 처리에서 전처리, 더 정확히는 정규화의 지향점은 언제나 갖고 있는 코퍼스로부터 복잡성을 줄이는 일이다.


형태소 

정의

의미를 가진 가장 작은 단위 (morpheme)

1) 어간 (stem)

단어의 의미를 담고 있는 단어의 핵심 부분

2) 접사 (affix)

단어에 추가적인 의미를 주는 부분.


1. 표제어 추출 (Lemmatization)

표제어는 "기본 사전형 단어" 의 의미를 가진다.

즉, 표제어 추출은 단어가 나타내는 실질적인 의미를 가지는 부분으로부터 표제어를 찾아가는 과정이다.

단어들이 각자 다른 형태를 가지더라도 표제어추출을 통해 표제어로 정규화하려는 것이 목적이다.

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']
"""

표제어 추출은 어간추출보다 단어의 형태가 적절히 보존되는 양상을 보인다.

이는 표제어 추출기가 본래 단어의 품사 정보를 알아야만 정확한 결과를 얻을 수 있기 때문이다.

n.lemmatize('dies', 'v')
'die'
n.lemmatize('watched', 'v')
'watch'
n.lemmatize('has', 'v')
'have'

2. 어간 추출 (Stemming)

어간 추출은 정해진 규칙만을 보고 작업을 하므로, 결과값이 사전에 없는 단어일 확률이 매우 높다.

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)

"""
['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

 

결론

따라서 이미 알려진 알고리즘을 사용할 때는, 사용하고자 하는 코퍼스에 여러 스태머를 적용해보고 어떤 스태머가 해당 코퍼스에 적합한지를 판단한 후에 사용하여야 합니다.

이런 규칙에 기반한 알고리즘은 종종 제대로 된 일반화를 수행하지 못 할 수 있습니다. 어간 추출을 하고나서 일반화가 지나치게 되거나, 또는 덜 되거나 하는 경우입니다. 

댓글