Develop/AI

어간 추출 알아보자.

YOOZI. 2025. 2. 19. 22:12
728x90
어떻게 잘라서 변환할 것 인가

 

 

 

오늘은 어간추출 - stemming, lemmatization에 대해 알아보자.

오늘의 배움
  • 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

 

📌 정리

  1. Stemming(어간 추출)은 단어에서 변형된 부분을 잘라서 변환하는 방법
  2. 단순 규칙 기반이라 속도는 빠르지만, 정확도가 낮음
  3. Lemmatization보다 빠르고 간단하지만, 문법적으로 부자연스러운 단어가 나올 수 있음
  4. 빠른 처리가 필요한 경우 유용하지만, 정확도가 중요한 작업에는 Lemmatization 추천!

 

728x90