토큰화 작업 전에 텍스트 데이터를 용도에 맞게 정제및 정구화를 한다
정제: 갖고 있는 코퍼스로 부터 노이즈 데이터를 제거한다
정규화: 표현 방법이 다른 단어들을 통합시켜서 같은 단어로 만들어준다
노이즈 데이터는 자연어가 아니면서 아무 의미도 갖지 않는 글자들을 의미. 하지만 목적에 맞지 않는 불필요 단어들도 노이즈 데이터라고 한다
영어권 안에서는 길이가 짧은 단어를 삭제하는 것만으로도 어느정도 효과있다.
import re
text = "I was wondering if anyone out there could enlighten me on this car."
# 길이가 1~2인 단어들을 정규 표현식을 사용해 삭제
shortword = re.compile(r'\W*\b\w{1,2}\b')
print(shortword.sub('',text))
>>> was wondering anyone out there could enlighten this car.
정규화 기법 중 코퍼스에 있는 단어의 개수를 줄일 수 있는 기법인 표제어 추출과 어간 추출이 있다
표제어(Lemma) 추출은 단어들로 부터 표제어를 찾아가는 과정이다.
am, are, is는 서로 다른 스펠링이지만 그 뿌리 단어는 be라고 볼 수 있다. 이때 이 단어들의 표제어는 be이다
1) 어간 (stem) : 단어의 의미를 담고 있는 단어의 핵심 부분
2) 접사(affix) : 단어에 추가적인 의미를 주는 부분
cats라는 단어에 대해 형태학적 파싱을 수행한다면, 형태학적 파싱 결과로 cat(어간)와 -s(접사)를 분리.
NLTK에서는 표제어 추출을 위한 도구인 WordNetLemmatizer를 지원한다.
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
words = ['policy', 'doing', 'organization', 'have', 'going', 'love', 'lives', 'fly', 'dies', 'watched', 'has', 'starting']
print('표제어 추출 전 :',words)
print('표제어 추출 후 :',[lemmatizer.lemmatize(word) for word in words])
표제어 추출 전 : ['policy', 'doing', 'organization', 'have', 'going', 'love', 'lives', 'fly', 'dies', 'watched', 'has', 'starting']
표제어 추출 후 : ['policy', 'doing', 'organization', 'have', 'going', 'love', 'life', 'fly', 'dy', 'watched', 'ha', 'starting']
lemmatizer.lemmatize('dies', 'v')
>>> die
lemmatizer.lemmatize('has', 'v')
>>> have
어간을 추출하는 작업을 어간추출(stemming)이라고 한다. 정해진 규칙만 보고 단어의 어미를 자르는 어림짐작의 작업이라고 볼 수 있다. 어간 추출 알고리즘 중 하나인 포터 알고리즘을 알아보자
words = ['formalize', 'allowance', 'electricical']
print('어간 추출 전 :',words)
print('어간 추출 후 :',[stemmer.stem(word) for word in words])
어간 추출 전 : ['formalize', 'allowance', 'electricical']
어간 추출 후 : ['formal', 'allow', 'electric']
규칙 기반의 접근을 하고 있다
formalize → formal
allowance → allow
electricical → electric
NLTK에서는 포터 알고리즘 외에도 랭커스터 스태머 (Lancaster Stemmer)알고리즘을 지원한다
# 랭커스터 알고리즘
from nltk.stem import PorterStemmer
from nltk.stem import LancasterStemmer
porter_stemmer = PorterStemmer()
lancaster_stemmer = LancasterStemmer()
words = ['policy', 'doing','organization', 'have', 'going','love','lives','fly','dies','watched','has','starting']
print('어간 추출 전:',words)
print('포터 스테머의 어간 추출 후:',[porter_stemmer.stem(word) for word in words])
print('랭커스터 스테머의 어간 추출 후:',[lancaster_stemmer.stem(word) for word in words])
둘이 전혀 다른 결과인걸 볼 수 있다. 알고리즘을 사용할때는 사용하고자 하는 코퍼스에 스태머를 적용해보고 어떤 스태머가 해당 코퍼스에 적합한지를 판단한 후에 사용해야 한다.
마지막으로 동리한 단어에 대해서 표제어 추출과 어간 추출을 각각 수행했을때, 결과에서 어떤 차이가 있는지 간단한 예를 보자
Stemming
am → am
the going → the go
having → hav
Lemmatization
am → be
the going → the going
having → have
한국어는 5언 9품사의 구조를 가지고 있다
| 언 | 품사 |
|---|---|
| 체언 | 명사,대명사,수사 |
| 수식언 | 관형사,부사 |
| 관계언 | 조사 |
| 독립언 | 감탄사 |
| 용언 | 동사,형용사 |
용언에 해당되는 '동사'와 '형용사'는 어간(stem)과 어미(ending)의 결합으로 구성.
활용이란 용언의 어간이 어미를 가지는 일
어간: 용언을 활용할때 원칙적으로 모양이 변하지 않는 부분. 예: 긋다, 긋고, 그어서, 그어라
어미: 용언의 어간 뒤에 붙어서 활용하면서 변하는 부분.
잡/어간 + 다/어미
-> 어간의 형태가 바뀌지 않음
어간이 어미를 취할때 모습이 바뀌거나 취하는게 어미가 특수한 어미일 경우
듣-,돕-,곱-,잇- 등이 듣/들-, 돕/도우- 와 같이 어간의 형식이 달라지는 일이 있거나
오르+아/어 -> 올라, 하+아/어-> 하여 와 같이 일반적인 어미가 아닌 특수한 어미를 취하는 경우 불규칙활용을 하는 예에 속함
무슨 소리세요..? 이해못함