rueki

텍스트 전처리 - 어간 추출과 표제어 추출 본문

DL/NLP

텍스트 전처리 - 어간 추출과 표제어 추출

륵기 2019. 7. 1. 15:27
728x90
반응형

본문은 https://wikidocs.net/22592 를 참고해서 작성한 글입니다.

 

 

이번에는 코퍼스(말뭉치)에 있는 단어의 개수를 줄일 수 있는 어간추출과 표제어 추출에 대해 알아보자.


1. 표제어 추출(Lemmatization)

표제어는 쉽게 말해 '기본 사전형 단어'이다. 단어들로 부터 표제어를 찾는 과정을 표제어 추출이라 하며

단어들이 서로 다른 형태를 가지더라도, 그 뿌리 단어를 찾아가서 단어의 개수를 줄일 수 있는지 판단한다.

 

그래서 우선적으로 단어의 형태학적 파싱을 진행해야한다.

 

형태소(의미를 가진 가장 작은 단위) 종류

1) 어간(stem) : 단어의 의미를 담고 있는 단어의 핵심 부분

2) 접사(affix) : 단어에 추가적 의미를 주는 부분

 

예를 쉽게 들어서 말하면 복수형태의 단어에서 따로 단수만 빼서 추출한다고 이해하면 쉽다.

Lives -> life    cats -> cat

다만, 모든 단어가 위와 같이 분리되지는 않는다. 독립적인 형태소의 경우는 그대로 유지한다.

 

표제어 추출에는 WordNetLemmatizer을 사용한다.

import nltk
from nltk.stem import WordNetLemmatizer
nltk.download('wordnet')
n = WordNetLemmatizer()
words = ['fox', 'cats','lives','hands', 'babies', 'tigers']
for w in words:
    print([n.lemmatize(w)])
['fox']
['cat']
['life']
['hand']
['baby']
['tiger']

위의 예시는 전부 명사인 경우여서 적절한 단어를 출력했지만, 실제로는 표제어 추출기(lemmatizer)가

단어의 품사 정보를 알아야 정확한 결과값을 추출할 수가 있다.

WordNetLemmatizer는 입력을 통해 품사를 인지시킬 수가 있다.

n.lemmatize('plaies','v')
'play'
n.lemmatize('had','v')
'have'

표제어 추출은 단어 품사 정보를 보존함에따라 원하는 단어를 유추하고 결과값을 얻어낼수 가 있었다.

 


2. 어간 추출(Stemming)

정해진 규칙만 보고 어미를 자르는 작업으로서, 표제어 추출만큼의 정교한 결과를 기대하기는 힘들며,

사전에 정의되지 않은 단어가 나올 수도 있다.

from nltk.stem import PorterStemmer
from nltk.tokenize import word_tokenize
s = PorterStemmer()
text = "When i was young, i always played with my mother."
word = word_tokenize(text)
print(word)
['When', 'i', 'was', 'young', ',', 'i', 'always', 'played', 'with', 'my', 'mother', '.']

위의 코드와 결과는 이전에 토큰화 과정에서 보았던 것이고 어간 추출결과와 비교하기 위해 가져왔다.

[s.stem(w) for w in words]
['when',
 'i',
 'wa',
 'young',
 ',',
 'i',
 'alway',
 'play',
 'with',
 'my',
 'mother',
 '.']

토큰화할 때는 단어의 형태가 거의 온전하다. 그러나 어간 추출을 했을 때 위의 예시를 보면

was -> wa     always -> alway로 추출됬다.

Porter 알고리즘을 통한 어간 추출은 속도에 있어서는 빠르고 정확도도 높은 편이여서

영어 NLP에서의 어간추출에서는 좋은 방법이라고 한다.

다른 알고리즘인 Lancaster를 사용해보자.

from nltk.stem import LancasterStemmer
l = LancasterStemmer()
[l.stem(w) for w in word]
['when',
 'i',
 'was',
 'young',
 ',',
 'i',
 'alway',
 'play',
 'with',
 'my',
 'moth',
 '.']

Porter 알고리즘과는 다른 결과를 확인할 수 있었다.


3. 한국어 어간 추출

한국어에서 동사와 형용사가 어간(stem)과 어미(ending)의 결합으로 구성된다. 

동사와 형용사를 통틀어서 용언이라고 일컫는다.

 

1) 활용(conjugation)

용언의 어간이 어미를 가지는 일을 말한다.

어간 : 용언(동,형용사)을 활용할 때, 원칙적으로 모양이 변하지 않는 부분. 어미에 선행하는 부분

         어간의 모양도 변할 수 있다. 

어미 : 용언의 어간 뒤에 붙어서 활용하면서 변하는 부분, 여러 문법적 기능 수행

 

활용은 어간의 모습이 일정하다면 규칙활용, 어간이나 어미의 모습이 변하는 불규칙 활용으로 나뉜다.

 

2) 규칙활용

어간이 어미를 취할 때, 어간의 모습은 일정하다.

잡다 -> 잡/어간 + 다/어미

어간이 어미가 붙기전의 모습과 붙은 후의 모습이 동일하므로, 규칙 기반으로 어미를 단순히 분리하면

어간 추출이 된다.

 

3) 불규칙 활용

규칙활용과는 다르게, 어간이 어미를 취할 때 어간의 모습이 바뀌거나, 어미가 특수한 어미일 경우를 말한다.

 

듣다의 '듣'이 어미에 따라 '듣'이 될수도, '들'이 될수도 있다. 

곱다의 '곱'도 역시 '고우'가 될 수 있다. -> 곱다 == 고우시다

 

- 특수한 어미를 취하는 경우

오르+ 아/어→올라

하+아/어→하여

이르+아/어→이르러

 

728x90
반응형
Comments