어간 추출(Stemming) & 표제어 추출(Lemmatization)

c.haha.e·2025년 8월 16일

STUDY

목록 보기
23/27

1. 어간 추출(Stemming)이란?

어간 추출이란?

단어에서 변하지 않는 뿌리(어간)만 남기고 접사(변형, 굴절, 어미 등)는 기계적으로 잘라내는 작업


WHY? (왜 해야 할까?)

  • 의미는 거의 같은데, 단어 형태만 달라서
    • 데이터 분석/검색/분류할 때 비슷한 단어를 한 덩어리로 보고 싶으니까!

예시:

  • “study”, “studies”, “studying”, “studied” → 전부 “studi”로 자름

실전 예시와 코드(영어)

(1) NLTK의 PorterStemmer 사용

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

해설:

  • 어간(stem)은 “study”에서 “y”까지,
  • 다른 단어는 접미사(ies, ing, ed, ious)만 자르고
  • 남은 부분 “studi”만 똑같이 반환

(2) 영어의 어간 추출 단점

  • 너무 기계적으로 자름! → 뜻이 다르거나 어색한 줄기까지 뽑히기도 함
  • 예: “studious”(공부하는, 근면한)도 “studi”로 잘림 → 실제론 ‘study’와 다르지만 같은 그룹 취급

한글에서의 어간 추출

  • 한글은 “동사/형용사 어간”이 활용(변형)될 때 형태소 분석기(예: Okt, Kkma 등)가 ‘어간(동사 기본형)’을 자동 추출함

예시)

from konlpy.tag import Okt
okt = Okt()
print(okt.morphs("먹었다"))  # ['먹', '었다']
print(okt.morphs("가는 중이다"))  # ['가', '는', '중', '이다']
  • “먹었다” → [‘먹’, ‘었다’] (먹: 어간, 었다: 어미)
  • “가는 중이다” → [‘가’, ‘는’, ‘중’, ‘이다’] (가: 어간)


2. 표제어 추출(Lemmatization)이란?

표제어 추출이란?

단어를 사전에 등록된 정확한 기본형(표제어)로 바꿔주는 작업 → 즉, 단어를 진짜 원래 단어로 맞춰주는 것!


WHY? (왜 표제어?)

  • 단어의 정확한 본래 의미를 영어 사전/국어사전 기준으로 통일
  • 검색, 분류, 의미 비교, 번역 등에서 가장 ‘정확한 단어’만 남기고 싶을 때 사용

실전 예시와 코드(영어)

(1) NLTK의 WordNetLemmatizer 사용

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

해설:

  • “study” 계열 → 전부 “study”(기본형)
  • “went” “going” → “go”(동사 원형)
  • “studious”는 형용사(근면한)라 “study”로 안 바뀜

(2) 어간 추출 vs 표제어 추출 차이점

어간 추출(Stemming)표제어 추출(Lemmatization)
방식기계적으로 접사만 자름사전(국어/영어) 기반, 실제 단어만 남김
정확도낮음(오류, 오용 가능)높음(진짜 단어만 남김)
속도빠름느림(사전 검색 필요)
예시studies → studistudies → study
went → wentwent → go

한글에서의 표제어 추출

  • 한글 형태소 분석기는 ‘동사/형용사’의 기본형(표제어)을 자동으로 태깅해줌

예시)

from konlpy.tag import Okt
print(okt.pos("아름다웠던 순간을 잊지 못해요."))
# [('아름답', 'Adjective'), ('었던', 'Eomi'), ...]
  • “아름다웠던” → ‘아름답’(표제어), ‘었던’(어미)


3. 실제 실무/실전에서의 활용

  • 어간 추출:
    • 속도가 매우 중요하고, ‘비슷하면 한 그룹’만 필요할 때 (검색, 대용량 데이터)
  • 표제어 추출:
    • 의미, 정확성이 더 중요한 작업 (번역, 감정분석, 요약 등)

4. 실습 결과 해설

(1) 어간 추출의 단점

  • 엉뚱한 줄기(studi, go, runn 등)만 남아 진짜 뜻이 사라지기도 함!
  • “meeting” → “meet” (OK) “better” → “better” (표제어는 “good”)

(2) 표제어 추출의 단점

  • 속도가 느림
  • 사전 없는 단어는 안 바뀜(신조어, 오타 등)

5. 입문자용 체크 퀴즈

  1. 어간 추출이랑 표제어 추출의 큰 차이는?
  2. “studied”를 어간/표제어 추출하면 각각 뭐가 되나?
  3. 한글 문장(“먹었다”)에서 어간/표제어는 각각?
  4. 실제 뉴스 기사/리뷰 분석에서는 어떤 방식을 더 쓸까? 그 이유는?

한줄정리

어간 추출은 단어에서 “뿌리”만 남기는 ‘가지치기’,
표제어 추출은 사전 기준 “진짜 본래 단어”만 남기는 ‘본명 맞추기’!
정확성 중요하면 표제어, 속도/단순 그룹이면 어간 추출!

profile
기록용 블로그

0개의 댓글