규화 기법 중 코퍼스에 있는 단어의 개수를 줄일 수 있는 기법인 표제어 추출(lemmatization)과 어간 추출(stemming)의 개념에 대해서 알아볼 것이다. 이 두 작업이 갖고 있는 의미는 눈으로 봤을 때는 서로 다른 단어들이지만, 하나의 단어로 일반화시킬 수 있다면 하나의 단어로 일반화시켜서 문서 내의 단어 수를 줄이겠다는 것이다.
1. 표제어 추출(Lemmatization)
표제어(Lemma)는 한글로는 '표제어' 또는 '기본 사전형 단어' 정도의 의미를 갖습니다. 표제어 추출은 단어들로부터 표제어를 찾아가는 과정이다. 표제어 추출은 단어들이 다른 형태를 가지더라도, 그 뿌리 단어를 찾아가서 단어의 개수를 줄일 수 있는지 판단한다. 예를 들어서 am, are, is는 서로 다른 스펠링이지만 그 뿌리 단어는 be라고 볼 수 있습니다. 이때, 이 단어들의 표제어는 be라고 한다. 표제어 추출을 하는 가장 섬세한 방법은 단어의 형태학적 파싱을 먼저 진행하는 것입니다. 형태소란 '의미를 가진 가장 작은 단위'를 뜻한다.
1) 어간(stem)
: 단어의 의미를 담고 있는 단어의 핵심 부분.
2) 접사(affix)
: 단어에 추가적인 의미를 주는 부분.
형태학적 파싱은 이 두 가지 구성 요소를 분리하는 작업을 말한다. 가령, cats라는 단어에 대해 형태학적 파싱을 수행한다면, 형태학적 파싱은 결과로 cat(어간)와 -s(접사)를 분리합니다. 꼭 두 가지로 분리되지 않는 경우도 있다. 단어 fox는 형태학적 파싱을 한다고 하더라도 더 이상 분리할 수 없다. fox는 독립적인 형태소이기 때문입니다. 이와 유사하게 cat 또한 더 이상 분리되지 않는다.
NLKT WordNetLemmatizer 를 사용하여 표제어 추출 실습
from nltk.stem import WordNetLemmatizer
n=WordNetLemmatizer()
words=['policy', 'doing', 'organization', 'have', 'going', 'l
ove', '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']
위의 결과에서는 dy나 ha와 같이 의미를 알 수 없는 적절하지 못한 단어를 출력하고 있다. 이는 표제어 추출기(lemmatizer)가 본래 단어의 품사 정보를 알아야만 정확한 결과를 얻을 수 있기 때문이다.
WordNetLemmatizer는 입력으로 단어가 동사 품사라는 사실을 알려줄 수 있다. 즉, dies와 watched, has가 문장에서 동사로 쓰였다는 것을 알려준다면 표제어 추출기는 품사의 정보를 보존하면서 정확한 Lemma를 출력하게 된다.
n.lemmatize('dies', 'v')
'die'
2. 어간 추출(Stemming)
어간(Stem)을 추출하는 작업을 어간 추출(stemming)이라고 한다. 어간 추출은 형태학적 분석을 단순화한 버전이라고 볼 수도 있고, 정해진 규칙만 보고 단어의 어미를 자르는 어림짐작의 작업이라고 볼 수도 있다.
이해를 위해 예제 알고리즘인 포터 알고리즘에 아래의 TEXT를 입력으로 넣어본다.
input : 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.
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", 'c
hest', ',', 'but', 'an', 'accurate', 'copy', ',', 'complete', 'in', 'all', 'things',
'--', 'names', 'and', 'heights', 'and', 'soundings', '--', 'with', 'the', 'single', 'except
ion', 'of', 'the', 'red', 'crosses', 'and', 'the', 'wri
tten', '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
포터 알고리즘 이외에 랭커스터 스태머 알고리즘도 있다.
3. 한국어에서의 어간 추출
한국어에 대해서는 별도 실습은 진행하지 않지만, 한국어의 어간에 대해서 간략히 설명합니다. 한국어는 아래의 표와 같이 5언 9 품사의 구조를 가지고 있습니다.
언 | 품사 |
체언 | 명사,대명사,수사 |
수식언 | 관형사,부사 |
관계언 | 조사 |
독립언 | 감탄사 |
용언 | 동사,형용사 |
용언에 해당되는 '동사'와 '형용사'는 어간(stem)과 어미(ending)의 결합으로 구성됩니다. 앞으로 용언이라고 언급하는 부분은 전부 동사와 형용사를 포함하여 언급하는 개념이다.
어간(stem) : 용언(동사, 형용사)을 활용할 때, 원칙적으로 모양이 변하지 않는 부분. 활용에서 어미에 선행하는 부분. 때론 어간의 모양도 바뀔 수 있음(예: 긋다, 긋고, 그어서, 그어라).
어미(ending): 용언의 어간 뒤에 붙어서 활용하면서 변하는 부분이며, 여러 문법적 기능을 수행
불규칙 활용은 어간이 어미를 취할 때 어간의 모습이 바뀌거나 취하는 어미가 특수한 어미일 경우를 말한다.
예를 들어 ‘듣-, 돕-, 곱-, 잇-, 오르-, 노랗-’ 등이 ‘듣/들-, 돕/도우-, 곱/고우-, 잇/이-, 올/올-, 노랗/노라-’와 같이 어간의 형식이 달라지는 일이 있거나 ‘오르+ 아/어→올라, 하+아/어→하여, 이르+아/어→이르러, 푸르+아/어→푸르러’와 같이 일반적인 어미가 아닌 특수한 어미를 취하는 경우 불규칙 활용을 하는 예에 속한다.
'머신러닝 > 딥러닝을 이용한 자연어처리 입문' 카테고리의 다른 글
데이터의 분리(Splitting Data) (0) | 2019.11.19 |
---|---|
불용어(Stopword) (0) | 2019.11.11 |
정제(Cleaning) 과 정규화(Normalization) (0) | 2019.11.01 |
토큰화(Tokenization) (0) | 2019.10.28 |
자연어 처리(NLP)란? (0) | 2019.07.31 |