어간 추출이란?
단어에서 변하지 않는 뿌리(어간)만 남기고 접사(변형, 굴절, 어미 등)는 기계적으로 잘라내는 작업
예시:
from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
words = ["study", "studies", "studying", "studied", "studious"]
for w in words:
print(w, "->", stemmer.stem(w))
결과:
study -> study
studies -> studi
studying -> studi
studied -> studi
studious -> stud
해설:
from konlpy.tag import Okt
okt = Okt()
print(okt.morphs("먹었다")) # ['먹', '었다']
print(okt.morphs("가는 중이다")) # ['가', '는', '중', '이다']
표제어 추출이란?
단어를 사전에 등록된 정확한 기본형(표제어)로 바꿔주는 작업 → 즉, 단어를 진짜 원래 단어로 맞춰주는 것!
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
words = ["study", "studies", "studying", "studied", "studious", "went", "going"]
for w in words:
print(w, "->", lemmatizer.lemmatize(w, pos='v'))
결과:
study -> study
studies -> study
studying -> study
studied -> study
studious -> studious
went -> go
going -> go
해설:
| 어간 추출(Stemming) | 표제어 추출(Lemmatization) | |
|---|---|---|
| 방식 | 기계적으로 접사만 자름 | 사전(국어/영어) 기반, 실제 단어만 남김 |
| 정확도 | 낮음(오류, 오용 가능) | 높음(진짜 단어만 남김) |
| 속도 | 빠름 | 느림(사전 검색 필요) |
| 예시 | studies → studi | studies → study |
| went → went | went → go |
from konlpy.tag import Okt
print(okt.pos("아름다웠던 순간을 잊지 못해요."))
# [('아름답', 'Adjective'), ('었던', 'Eomi'), ...]
어간 추출은 단어에서 “뿌리”만 남기는 ‘가지치기’,
표제어 추출은 사전 기준 “진짜 본래 단어”만 남기는 ‘본명 맞추기’!
정확성 중요하면 표제어, 속도/단순 그룹이면 어간 추출!