Yaong

Written by a cat

형태소 분석기

대화를 하는데 대답이 늦으면 답답할 것이다. 때문에 챗봇의 형태소 분석기는 정확도 보다는 속도가 중요하다. KoNLPy 의 형태소 분석기 비교를 보면 Mecab이 가장 빠르고 Okt (구 Twitter)가 그 뒤를 잇는다. 여기에 카카오의 Khaiii 도 고려해보았다.

Khaiii 는 일단 설치가 불가능했다. 빌드에 CMake 3.10 이상을 요구하는데, 라즈베리파이에는 3.7 버전 밖에 없기 때문이다. Mecab은 테스트에 있던 그대로 속도와 성능 모두 훌륭했다. 하지만 단어를 기본형으로 만들어주는 기능이 없어서 아쉬웠다. Okt 는 상대적으로 속도는 느리지만 기본형으로 만들어주는 기능이 있어서 편리하다. 라즈베리파이 기준 최초 로딩에 30초 가까이 걸리기는 하지만, 그 이후에는 챗봇에 쓸만한 정도의 속도는 나오기에 결과적으로 Okt 를 사용하게 되었다.

응답 선택

작동하는 무언가를 만드는 것의 우선 순위가 높았다. 딥러닝으로 멋있게 하면 좋겠으나 그것은 미래의 일로 남기기로 했다. 기존에 취미 삼아 만들던 슬랙봇을 그대로 사용하여 데이터를 직접 입력하기로 했다.

동일 의미의 단어들을 그룹으로 묶고,

groups:
    iu: '아이유, 지은, 징쨩'
    birthday: '생일, 태어나다'
    when: '날짜, 날, 언제, 며칠'

아래와 같이 질의응답을 정의한다.

qnas:
  - keywords: 'group:iu, group:birthday, group:when'
    answers: '아이유 생일은 1993년 5월 16일 입니다.'

각 그룹의 단어 중 하나씩을 모두 포함하면 그에 정해진 대답을 고르게 된다.

"아이유 언제 태어났어"
[('아이유', 'Noun'), ('언제', 'Noun'), ('태어나다', 'Verb'), ('어', 'Eomi')]
>>> | "아이유 생일은 1993년 5월 16일 입니다."

Okt 는 사용자 사전 기능이 없다. 때문에 '징쨩1' 같은 단어에서 '쨩'을 접미사로 인식하여 분리한다. 때문에 지정한 단어가 날 것의 문장에 포함되어있는지 추가로 확인하게 하였다.

"징쨩 생일 언제야?"
[('징', 'Noun'), ('쨩', 'Suffix'), ('생일', 'Noun'), ('언제', 'Noun'), ('야', 'Josa'), ('?', 'Punctuation')]
>>> | "아이유 생일은 1993년 5월 16일 입니다."

결과

봇에게 뻘소리를 할 수 있게 되었다.

슬랙 질의응답


  1. 지은 + 쨩 = 아이유의 애칭