728x90
어떻게 잘라서 변환할 것 인가
오늘은 어간추출 - stemming, lemmatization에 대해 알아보자.
오늘의 배움 |
|
어간 추출
- Stemming : 단순히 어미를 잘라 변환 (PorterStemmer는 조금 더 보수적으로 자르고 / LancasterStemmer는 공격적으로 자르는 편)
from nltk.stem import PorterStemmer, LancasterStemmer
from nltk.tokenize import word_tokenize
# 두 가지 다른 Stemmer
porter = PorterStemmer()
lancaster = LancasterStemmer()
words = ["running", "flies", "happily", "better", "studies"]
print([porter.stem(word) for word in words]) # ['run', 'fli', 'happili', 'better', 'studi']
print([lancaster.stem(word) for word in words]) # ['run', 'fli', 'happy', 'bet', 'study']
- Lemmatization : 단어를 의미적으로 분석하여 원형으로 변환 (문법, 의미를 고려하여 변환)
from nltk.stem import WordNetLemmatizer
from nltk.tokenize import word_tokenize
import nltk
nltk.download('punkt')
nltk.download('wordnet')
lemmatizer = WordNetLemmatizer()
words = ["running", "flies", "better", "geese", "am", "was"]
lemmatized_words = [lemmatizer.lemmatize(word, pos="v") for word in words] # 'v'는 동사
print(lemmatized_words)
# ['run', 'fly', 'better', 'geese', 'be', 'be']
Stemming vs. Lemmatization 차이점
비교 항목 | Stemming | Lemmatization |
변환 방식 | 단순히 어미를 자름 | 문법과 의미를 고려하여 변환 |
예제 1 | "running" → "runn" | "running" → "run" |
예제 2 | "flies" → "fli" | "flies" → "fly" |
예제 3 | "better" → "better" | "better" → "good" |
정확도 | 낮음 (규칙 기반) | 높음 (사전 기반) |
속도 | 빠름 | 느림 |
언제 사용할까?
- 속도가 중요하고, 조금 부정확해도 괜찮을 때 → Stemming
- 더 높은 정확도가 필요할 때 → Lemmatization
예를 들어,
- "간단한 텍스트 분류" → Stemming
- "검색 엔진, 문서 요약, 감성 분석" → Lemmatization
📌 정리
- Stemming(어간 추출)은 단어에서 변형된 부분을 잘라서 변환하는 방법
- 단순 규칙 기반이라 속도는 빠르지만, 정확도가 낮음
- Lemmatization보다 빠르고 간단하지만, 문법적으로 부자연스러운 단어가 나올 수 있음
- 빠른 처리가 필요한 경우 유용하지만, 정확도가 중요한 작업에는 Lemmatization 추천!
728x90
'Develop > AI' 카테고리의 다른 글
자연어 임베딩 이해를 알아보자. (6) | 2025.02.21 |
---|---|
Subword Tokenizing을 알아보자. (0) | 2025.02.19 |
NLP (피쳐 엔지니어링, 규칙기반 시스템, 머신러닝)을 알아보자. (4) | 2025.02.19 |
자연어 처리 요약 정리(1) (1) | 2025.02.18 |
자연어 처리 전통적 기법 - 전처리를 알아보자. (0) | 2025.02.18 |