자연어처리(NLP) 5일차 (어간 추출/표제어 추출)

정민수
12 min readJun 7, 2019

--

19.06.07

본 글은 https://wikidocs.net/book/2155을 참고하여 작성되었음을 밝힙니다.

학습 키워드

  • 표제어 추출(Lemmatization)
  • 어간 추출(Stemming)

어간 추출(Stemming) and 표제어 추출(Lemmatization)

이번엔 정규화 기법 중 코퍼스에 있는 단어의 개수를 줄일 수 있는 기법인 표제어 추출(Lemmatization)과 어간 추출(Stemming)의 개념에 대해서 알아본다. 또한 이 둘의 결과가 어떻게 다른지 이해한다.

이 두 작업이 갖고 있는 의미는 눈으로 봤을 때는 서로 다른 단어들이지만, 하나의 단어로 일반화시킬 수 있다면 하나의 단어로 일반화시켜서 문서 내의 단어 수를 줄이겠다는 것이다. 자연어 처리에서 전처리, 더 정확히는 정규화의 지향점은 언제나 갖고 있는 코퍼스로부터 복잡성을 줄이는 일임을 기억해야 한다.

1. 표제어 추출(Lemmatization)

Lemma는 ‘표제어’ 또는 ‘기본 사전형 단어’의 의미를 가지고 있다. Lemmatization(표제어 추출)은 단어들로부터 이 표제어를 찾아내는 과정이다.

표제어 추출은 단어들이 서로 다른 형태를 가지더라도, 그 뿌리 단어를 찾아가서 단어의 개수를 줄일 수 있는지를 판단한다. 예를 들어 am,are,is는 서로 다른 스펠링이지만, 그 뿌리 단어는 be이기 때문에 이 단어들의 Lemma는 be라고 한다.

표제어 추출을 하는 가장 섬세한 방법은 단어의 형태학적 파싱을 먼저 진행하는 것이다. 형태소란 ‘의미를 가진 가장 작은 단위’를 뜻한다. 그리고 형태학(Morphology)이란, 형태소로부터 단어들을 만들어가는 학문을 뜻한다.

형태소는 두 가지 종류가 있다. 각각 stem(어간)과 affix(접사)이다.

  • stem(어간) : 단어의 의미를 담고 있는 단어의 핵심 부분.
  • affix(접사) : 단어에 추가적인 의미를 주는 부분.

형태학적 파싱은 두 가지 구성 요소를 분리하는 작업을 뜻한다. 가령, cats라는 단어에 대해 형태학적 파싱을 수행한다면, 형태학적 파싱은 결과로 cat(어간)와 -s(접사)를 분리한다. 물론, 꼭 두 가지로 분리되지 않는 경우도 있다. 가령, 단어 fox는 형태학적 파싱을 한다고 하더라도 더 이상 분리를 할 수 없다. fox는 독립적인 형태소이기 때문이다.

NLTK에서는 표제어 추출을 위한 도구인 WordNetLemmatizer를 지원한다.

import nltk
from nltk.stem import WordNetLemmatizer
n = WordNetLemmatizer()
words=['policy', 'doing', 'organization', 'have', 'going', 'love', 'lives','fly', 'dies', 'watched', 'has', 'starting']
[n.lemmatize(w) for w in words]
['policy',
'doing',
'organization',
'have',
'going',
'love',
'life',
'fly',
'dy',
'watched',
'ha',
'starting']

표제어 추출은 어간 추출(Stemming)과는 달리(다음에서 다룸) 단어의 형태가 적절히 보존되는 양상을 볼 수있다. 하지만 그럼에도 위의 결과에서는 dy나 ha와 같이 의미를 알 수 없는 적절하지 못한 단어를 출력하고 있다. 이는 표제어 추출기(Lemmatizer)가 본래 단어의 품사 정보를 알아야만 정확한 결과를 얻을 수 있기 때문이다.

WordNetLemmatizer는 입력으로 단어의 품사를 지정해줄 수 있다. 즉, dies와 watched, has가 문장에서 동사로 쓰였다는 것을 알려준다면 표제어 추출기는 품사의 정보를 보존하면서 정확한 Lemma를 출력하게 된다.

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

Stemming(어간 추출)에 대해서 언급하기에 앞서, Lemmatization(표제어 추출)과 Stemming(어간 추출)의 차이에 대해서 미리 언급하고자 한다. 표제어 추출은 문맥을 고려하며, 수행했을 때의 결과는 해당 단어의 품사 정보를 보존한다. (POS 태그를 보존한다고 말할 수 있다.)

하지만, 어간 추출을 수행한 결과는 품사 정보가 보존되지 않는다. (POS 태그를 고려하지 않는다.) 더 정확히는, 어간 추출을 한 결과는 사전에 존재하지 않는 단어일 경우가 많다.

2. 어간 추출(Stemming)

Stem(어간)을 추출하는 작업을 Stemming이라고 한다. 어간 추출은 형태학적 분석을 단순화한 버전이라고 볼 수도 있고, 정해진 규칙만 보고 단어의 어미를 자르는 어림짐작의 작업이라고 볼 수도 있다. 다시 말해, 이 작업은 섬세한 작업이 아니기 때문에 어간 추출 후에 나오는 결과 단어는 사전에 존재하지 않을 수도 있다.

어간 추출 알고리즘 중 하나인 포터 알고리즘(Porter Algorithm)을 이용한 예제

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.

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

결과를 보면, 알고리즘의 결과로서 나온 text는 사전에 없는 단어들도 포함되어 있다. 애초에 어간 추출은 단순히 규칙에 기반하여 이루어지기 때문이다.

가령, 포터 알고리즘의 어간 추출은 이러한 규칙들을 가집니다.

ALIZE → AL

ANCE → 제거

ICAL → IC

words = ['formalize', 'allowance', 'electricical']
[s.stem(w) for w in words]
['formal', 'allow', 'electric']

위의 규칙에 따라서 다음과 같은 결과가 나온 것이다.

formalize → formal

allowance → allow

electricical → electric

어간 추출 속도는 표제어 추출보다 일반적으로 빠른데, 포터 어간 추출기는 정밀하게 설계되어 정확도가 높으므로 영어 자연어 처리에서 어간 추출을 하고자 한다면 가장 준수한 선택이다.

NLTK에서 포터 알고리즘 외에도 랭커스터 스태머(Lancaster Stemmer) 알고리즘을 지원한다. 이번에는 포터 알고리즘과 랭커스터 스태머 알고리즘으로 각각 어간 추출을 진행했을 때, 이 둘의 결과를 비교해보자.

import nltk
from nltk.stem import PorterStemmer
s = PorterStemmer()
words=['policy', 'doing', 'organization', 'have', 'going', 'love', 'lives', 'fly', 'dies', 'watched', 'has', 'starting']
[s.stem(w) for w in words]
['polici', 'do', 'organ', 'have', 'go', 'love', 'live', 'fli', 'die', 'watch', 'ha', 'start']import nltk
from nltk.stem import LancasterStemmer
l = LancasterStemmer()
words=['policy', 'doing', 'organization', 'have', 'going', 'love', 'lives', 'fly', 'dies', 'watched', 'has', 'starting']
[l.stem(w) for w in words]
['policy', 'doing', 'org', 'hav', 'going', 'lov', 'liv', 'fly', 'die', 'watch', 'has', 'start']

동일한 단어들의 나열에 대해서 두 스태머는 전혀 다른 결과를 보여준다. 두 스태머 알고리즘은 서로 다른 알고리즘을 사용하기 때문이다. 그렇기 때문에 이미 알려진 알고리즘을 사용할 때는, 사용하고자 하는 코퍼스에 스태머를 적용해보고 어떤 스태머가 해당 코퍼스에 적합한지를 판단한 후에 사용하여야 한다.

이런 규칙에 기반한 알고리즘은 종종 제대로 된 일반화를 수행하지 못할 수 있다. 어간 추출을 하고나서 일반화가 지나치게 되거나, 또는 덜 되거나 하는 경우다. 예를 들어 포터 알고리즘에서 organization을 어간 추출했을 때의 결과를 보면,

organization → organ

organization과 organ은 완전히 다른 단어임에도 이러한 겨로가가 나왔다. organ에 대해서 어간추출을 해도 organ이 나오기 때문에 어간 추출의 목적과는 맞지 않는다.

마지막으로, 같은 단어에서 표제어 추출과 어간 추출의 차이를 확인해보자.

Lemmatization

  • am → be
  • the going → the going
  • having → have

Stemming

  • am → am
  • the going → the go
  • having → hav

3. 한국어에서의 어간 추출

한국어의 5언 9품사

한국어에서 용언에 해당되는 ‘동사’와 ‘형용사’는 어간(stem)과 어미(ending)의 결합으로 구성된다. 앞으로 용언이라고 언급하는 부분은 전부 동사와 형용사를 포함하는 개념이다.

(1) 활용(conjugation)

활용(conjugation)은 한국어에서만 가지는 특징이 아니라, 인도유럽어(indo-european language)에서도 주로 볼 수 있는 언어적 특징 중 하나를 말하는 통칭적인 개념이다. 다만, 여기서는 한국어에 한정하여 설명한다.

활용이란 용언의 어간(stem)이 어미(ending)를 가지는 일을 말한다.

어간(stem) : 용언(동사, 형용사)을 활용할 때, 원칙적으로 모양이 변하지 않는 부분. 활용에서 어미에 선행하는 부분. 때론 어간의 모양도 바뀔 수 있음(예: 긋다, 긋고, 그어서, 그어라).

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

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

(2) 규칙 활용

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

잡/어간 + 다/어미

이 경우에는 어간이 어미가 붙기전의 모습과 어미가 붙은 후의 모습이 같으므로, 규칙 기반으로 어미를 단순히 분리해주면 어간 추출이 된다.

(3) 불규칙 활용

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

‘듣-, 돕-, 곱-, 잇-, 오르-, 노랗-’ 등이 ‘듣/들-, 돕/도우, 곱/고우-, 잇/이-, 오르/올-, 노랗/노라-’와 같이 어간의 형식이 다라지는 일이 있거나 ‘오르+ 아/어 → 올라, 하+아/어 → 하여, 이르+아/어 → 이르러, 푸르+아/어 → 푸르러’와 같이 일반적인 어미가 아닌 특수한 어미를 취하는 경우 불규칙 활용을 하는 예에 속한다.

이 경우에는 어간이 어미가 붙는 과정에서 어간의 모습이 바뀌었으므로 단순히 분리만으로 어간 추출이 되지 않고 좀 더 복잡한 규칙을 필요로 한다.

참고자료

다양한 한국어 불규칙 활용 : https://namu.wiki/w/한국어/불규칙%20활용

--

--

정민수
정민수

No responses yet