일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 전처리
- 수기
- naver movie review
- Word2Vec
- 우울증
- sentiment analysis
- NLP
- 대학원
- 자연어처리
- 품사태깅
- pytorch
- 석사
- Classification Task
- CUDA
- word embedding
- 인공지능
- Today
- Total
슬기로운 연구생활
Classification - [4] Stemming, Lemmatizing 본문
이전 글
들어가며
이전 글에서는 Pre Precessing 과정 중 하나인 POS Tagging에 대해 설명했습니다.
이번 글에서는 영어 텍스트 전처리를 할 때, 자주 사용되는 전처리 방법인 Stemming과 Lemmatizing에 대해 알아보겠습니다.
Stemming
Stemming(어간 추출)은 어형이 변형된 단어로부터 접사 등을 제거하고 그 단어의 어간을 분리하는 것을 말합니다 [위키백과].
Stemming은 정해진 규칙만 보고 단어의 어미를 어림짐작으로 자르기 때문에, Stemming 후에 나오는 단어는 사전에 존재하지 않는 단어일 가능성이 있습니다.
from nltk.stem import PorterStemmer
s = PorterStemmer()
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', '.']
print([s.stem(w) for w in words])
Stemming을 실행시키면
['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', '.']
과 같은 단어들이 아래와 같이 변환됩니다.
['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', '.']
'was' -> 'wa'과 같이 Stemming을 거친 단어는 사전에 존재하지 않을 수 있습니다.
Lemmatizing
Lemmatizaing(표제어 추출)은 단어의 표제어를 찾아가는 과정입니다.
표제어는 '표제어' 또는 '기본 사전형 단어' 정도의 의미를 갖습니다 [위키독스].
Lemmatizaing은 Stemming과 비슷하지만, 동의어 대체와 유사합니다.
표제어 추출은 어간 추출과는 달리 단어의 형태가 적절히 보존되는 특징을 가지고 있습니다.
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])
Lemmatizing을 거치면
['policy', 'doing', 'organization', 'have', 'going', 'love', 'lives', 'fly', 'dies', 'watched', 'has', 'starting']
과 같은 단어가
['policy', 'doing', 'organization', 'have', 'going', 'love', 'life', 'fly', 'dy', 'watched', 'ha', 'starting']
로 변하게 됩니다.
Lemmatizing은 Stemming과 다르게 단어의 형태가 거의 바뀌지 않은 것을 확인할 수 있습니다.
다만 "dy"와 "ha"와 같은 의미를 알 수 없는 단어를 출력하는 경우도 있습니다.
이것은 단어의 품사정보가 입력되어 있지 않았기 때문이며, 품사를 같이 입력해주면 정확한 결과값을 얻을 수 있습니다.
n.lemmatize('has', 'v')
위의 코드를 실행하면 'have'라는 결과값을 확인 할 수 있습니다.
마무리
Stemming과 Lemmatizaing을 하는 이유는 두가지 입니다.
첫째, 컴퓨터는 "좋아요"와 "좋다"를 같은 의미를 가진 단어라고 정확히 인식 못하기 때문입니다.
두 단어에 One-Hot Encoding을 적용하면 "좋아요" -> [ 0 1 0 ]로 변환되고 "좋다" -> [ 1 0 0 ]로 변환됩니다.
위의 Vector로는 두 단어 사이의 의미적 유사성을 파악할 수 없습니다.
둘째, Text To Vector의 단어를 사전으로 매핑하는 과정이 존재하는데 이 때 색인 크기를 줄이기 위해 사용합니다.
ex) [1:"좋아요", 2:"좋다" .... 102:"좋을까"] -> [1:"좋다"]
"좋다"에서 변형된 단어를 하나로 통일할 수 있습니다.
이번 글에서는 Stemming과 Lemmatizaing에 대해 알아보았습니다.
영어에서는 NLTK를 사용해 Stemming과 Lemmatizaing을 진행하는데 한국어에서는 어떻게 할까요?
한국어에서는 POS Tagging을 적용할 때 활용했던 형태소 분석기를 사용합니다.
다음 글에서는 형태소 분석기에 대해 자세히 살펴보도록 하겠습니다.
'슬기로운 NLP 생활' 카테고리의 다른 글
Classification - [6] One-Hot Encoding, Bag Of Word (0) | 2020.08.23 |
---|---|
Classification - [5] 형태소 분석기 (0) | 2020.08.23 |
Classification - [3] 품사 태깅 (0) | 2020.08.22 |
Classification - [2] 분류란? (0) | 2020.08.22 |
Classification - [1] 자연어처리란? (0) | 2020.08.22 |