자연어처리 전처리 단계에서 필수적인 표제어추출(Lemmatisation)과 어간추출(Stemming)이 무엇인지 간략히 살펴보겠습니다.
먼저 표제어처리와 어간추출을 정리해보자면 다음과 같습니다.
표제어처리(Lemmatisation): 주어진 단어의 사전적 어원을 찾는 과정
ex) caring -> care
표제어처리는 단어와 단어의 품사를 바탕으로 단어사전과 비교하여 표제어를 찾는 방식으로 동작합니다.
어간추출(Stemming): 주어진 단어에서 핵심 의미를 담고 있는 부분을 찾는 과정, 이 과정은 형태소분석이라고도 불림
ex) caring -> car
어간추출은 단어를 의미를 담고 있는 어간(stem)과 문법적 역활을 하는 접사(affix)를 분리하는 방식으로 동작합니다.
이렇게 표제어추출과 어간추출을 구분하여 정리할 수 있지만, 단어를 의미있는 형태로 전처리하는 과정이므로 크게 차이 나지 않습니다.
이제 konlpy 오픈소스를 통해 한글에서 표제어추출/어간추출 예시를 한번 살펴보겠습니다.
from konlpy.tag import Okt
if __name__ == '__main__':
okt = Okt()
# 출력 값: [('나', 'Noun'), ('는', 'Josa'), ('6시', 'Number'), ('가', 'Foreign'), ('땡', 'Noun'), ('치면', 'Noun'), ('회사', 'Noun'), ('를', 'Josa'), ('나오다', 'Verb'), ('집', 'Noun'), ('으로', 'Josa'), ('가다', 'Verb')]
print(okt.pos('나는 6시가 땡치면 회사를 나와 집으로 갑니다', stem=True))
from konlpy.tag import Kkma
if __name__ == '__main__':
kkma = Kkma()
# 출력 값: [('나', 'NP'), ('는', 'JX'), ('6', 'NR'), ('시', 'NNM'), ('가', 'JKS'), ('땡', 'MAG'), ('치', 'VV'), ('면', 'ECE'), ('회사', 'NNG'), ('를', 'JKO'), ('나오', 'VV'), ('아', 'ECS'), ('집', 'NNG'), ('으로', 'JKM'), ('갈', 'VV'), ('ㅂ니다', 'EFN')]
print(kkma.pos('나는 6시가 땡치면 회사를 나와 집으로 갑니다'))