콘텐츠로 이동

챗봇 의도 분류 전처리

챗봇 의도 분류 전처리 — 형태소 기반 피처 만들기

챗봇의 의도 분류(intent classification)는 사용자의 짧고 거친 발화를 정확한 피처로 바꾸는 데서 시작합니다. 한국어는 같은 의도를 "환불해줘", "환불 좀요", "환불되나요?"처럼 다양하게 표현하기 때문에, 어절을 그대로 쓰면 피처가 흩어집니다. 바른으로 명사와 용언 원형을 뽑으면 표현이 달라도 핵심 의미가 같은 피처로 모입니다.

문제 상황

  • "환불해주세요"와 "환불됨?"은 의도가 같지만 문자열이 전혀 달라 별도 피처가 됩니다.
  • 조사·어미가 피처 공간을 불필요하게 키워 데이터가 부족할 때 학습이 어렵습니다.
  • 오타·띄어쓰기 변형이 그대로 피처에 섞입니다.

바른을 어떻게 적용하나

발화를 형태소로 분석해 명사 + 용언/형용사 원형만 남깁니다. 조사·어미를 제거하면 표현 변형이 같은 피처로 정규화됩니다.

graph TD
  U[사용자 발화] --> TAG[바른 형태소 분석];
  TAG --> N[명사 추출];
  TAG --> V[용언 원형 추출];
  N --> FEAT[정규화된 피처 벡터];
  V --> FEAT;
  FEAT --> CLF[의도 분류 모델];
from bareunpy import Tagger

tagger = Tagger("koba-XXXX-...", "localhost")

def intent_features(utterance: str):
    """발화에서 의도 분류용 피처(명사 + 용언/형용사 원형)를 만듭니다."""
    res = tagger.tags([utterance])
    feats = res.nouns()                      # 명사
    for morph, tag in res.pos():
        if tag in ("VV", "VA", "VX"):        # 동사·형용사·보조용언 원형
            feats.append(morph)
    return feats

for u in ["환불해주세요", "환불 됨?", "환불되나요"]:
    print(u, "->", intent_features(u))
환불해주세요 -> ['환불', '하']
환불 ? -> ['환불', '되']
환불되나요 -> ['환불', '되']

세 발화 모두 환불이라는 핵심 명사 피처로 모입니다.

결과와 이점

발화 변형 어절 피처 형태소 피처
환불해주세요 환불해주세요 환불,
환불 됨? 환불, 됨? 환불,
환불되나요 환불되나요 환불,

정리

조사·어미를 걷어낸 형태소 피처는 표현 변형에 강합니다. 같은 의도의 발화가 같은 피처로 모여, 적은 데이터로도 분류 성능이 안정됩니다.

자주 묻는 질문

Q. 명사만 쓰면 안 되나요?

명사만으로도 많은 의도가 분류되지만, "취소돼요"와 "취소 안 돼요"처럼 용언과 부정 표현이 의도를 가르는 경우가 있습니다. 용언 원형과 부정 표현 형태소를 함께 쓰는 것이 안전합니다.

Q. 오타가 많은 발화는 어떻게 하나요?

채팅 입력은 오타·띄어쓰기 오류가 잦습니다. 분석 전에 맞춤법 검사 API(CorrectError)로 한 번 정리하면 피처 품질이 더 좋아집니다.

Q. 도메인 전용 용어는 어떻게 인식시키나요?

서비스 고유 용어(상품명·기능명)는 사용자 사전의 고유명사 사전(np_set)에 등록한 뒤 set_domain()으로 지정하면 하나의 명사 피처로 잡힙니다.

관련 문서

Q. 챗봇 의도 분류에 어떤 형태소 분석기가 좋나요?

한국어는 조사·어미 변형이 많아, 어절을 그대로 쓰면 같은 의도의 발화가 서로 다른 피처로 흩어집니다. 바른은 품사 태깅 정확도 99.6%로 명사와 용언 원형을 안정적으로 뽑아 주고, 사용자 사전으로 도메인 용어까지 잡아 줍니다. 표현 변형에 강한 피처를 만들 수 있어 의도 분류 전처리에 적합합니다.

도움이 되었나요?