Python으로 용례 기반 대화 시스템 만들기

7313 단어 Python3

개요


대화 시스템은 컴퓨터가 인류와 대화를 목적으로 하는 시스템을 가리킨다.
컴퓨터는 입력 문장이 응답 문장을 어떻게 결정하는지에 대해 여러 가지 방법이 있는데, 그 중 하나는 용례를 바탕으로 하는 방법이다.
용례를 바탕으로 몇 개의 입력 문장과 응답 문장 쌍을 대화 데이터로 미리 준비했다.그 구조는 사용자의 입력 문장과 가장 유사한 대화 데이터에서 입력 문장을 구하고 이 쌍에 해당하는 응답 문장을 되돌려주는 것이다.

제작


아래와 같다.

프로그램의 순서로
1. 대화 데이터를 준비한다.
2. 사용자로부터 입력문을 수신합니다.
3. 사용자의 입력 문장과 상호작용 데이터에서 각 입력 문장의 유사도를 계산한다.
4. 응답 문장을 출력합니다. 이 응답 문장은 가장 유사한 상호작용 데이터의 입력 문장 쌍입니다.
5.2~4번 왔다 갔다 한다.
1단계와 3단계는 다음과 같습니다.

입력 및 응답 문장 쌍 만들기


잡담 대화 자료 라이브러리https://sites.google.com/site/dialoguebreakdowndetection/chat-dialogue-corpus를 사용하여 대화 데이터를 만듭니다.
시스템 발언 1 → 사용자 발언 1 → 시스템 발언 2...의 명세란 스타일에 정의된 설정입니다.
이번에 json의 대화를 분해하여 아래 표처럼 csv 형식의 대화 데이터를 만듭니다.
입력문
응답문
시스템 발언1
사용자 발신 1
사용자 발신 1
시스템 발언 2
시스템 발언 2
사용자 발화2
사용자 발화2
시스템 발언
...
...

문장간 유사도


나는 어떤 문장과 어떤 문장이 얼마나 비슷한지 계산할 수 있는 몇 가지 방법이 있다고 생각한다. 이번에 사용한 방법WMD(Word Mover's Distance)

예를 들어, 문서 D0과 문서 D1 사이의 거리를 계산할 때 문서 D1의 의미 단어(Obama 등)를 문서 D0의 의미 단어(President 등)로 바꿀 때의 비용을 계산하고, 이 원가의 총합이 가장 낮을 때의 점수를 문서 D0, D1의 거리로 계산합니다.단어의 분산 표시에서 얻은 단어 간의 유사도를 어의어를 대체하는 비용으로 계산할 수 있다.
이번에는 의미어의 정의로 조동사, 조사, 기호 이외의 단어를 의미어로 한다.
학습이 끝난 단어가 벡터에 박혀 있으면 문장 간의 싱크로율을 계산할 수 있기 때문에doc2vec처럼 학습 준비 모형처럼 일을 줄일 수 있다는 장점이 있다.
이미 배운 일본어 단어 삽입 벡터는 백산양회사가 공개한 단어 삽입 벡터https://aial.shiroyagi.co.jp/2017/02/japanese-word2vec-model-builder/를 사용한다.일본어 물건은 다른 곳에서도 몇 개 공개됐지만 상술한 서류의 사이즈는 다른 것보다 작다.

가방 사용


대화 데이터는 csv 파일에 저장됩니다.csv의 작업은pandas를 사용합니다.또 WMD를 실현하기 위해gensim을 사용했고 일본어의 형태소 해석을 위해 MeCab를 사용했다.
MeCab에 가입하는 것은 매우 힘들다!이런 사람은 janome에서도 실현할 수 있다.

데이터 준비


코드는 여기 에 있습니다.대화 자료 라이브러리와 삽입 벡터가 포함되지 않기 때문에 따로 다운로드하여 디렉터리에 넣어야 합니다.디렉토리의 구조는 다음과 같습니다.
examplebase_bot
├ main.py
├ item.py
├ make_csv.py
└ model/
잡담 대화 자료 라이브러리를 다운로드하여 zip 파일을 압축한 후 json이라는 대화 데이터를 포함하는 폴더가 있기 때문에examplebase_bot/를 넣습니다.
백산양 회사에서 공개한 단어를 벡터에 삽입하여 다운로드하면word2vec의 모델과 npy 파일 2개를 손에 넣을 수 있습니다.3 꽉 잡고 모델/를 넣는다.
$ python3 make_csv.py
위에서 설명한 make_csv.py를 실행하면 대화 데이터의 데이터가 됩니다.csv를 examplebase_로 설정bot/로 생성됩니다.이렇게 준비하면 완성된다.

실시


본체의main.py 구현은 다음과 같습니다.
main.py
import pandas as pd
import MeCab
from gensim.models.word2vec import Word2Vec
from gensim.models.keyedvectors import KeyedVectors
import item #自作モジュール

mecab = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')
print("学習済みモデル読み込み")
model_path = 'model/word2vec.gensim.model'
model = Word2Vec.load(model_path)
print("読み込み終わり")
df = pd.read_csv('data.csv')
df = df.dropna()


def ans(text, df):
  text_wakati = item.morpheme_list(text)#入力文の形態素解析
  wmd = lambda x: model.wv.wmdistance(text_wakati, x)
  result = df['input_wakati'].map(wmd).idxmin()
  return df['output'].iloc[result]


while True:
  text = input(">>>")
  if text == "quit":
    break
  r = ans(text, df)
  print(r)
main.py를 실행하면 채팅을 할 수 있습니다.문장을 입력할 때마다 각 문장과의 싱크로율을 계산하기 때문에 대답하기까지 10초 정도가 걸린다.
$ python3 main.py
学習済みモデル読み込み
読み込み終わり
>>>こんにちは!
元気ですか?
>>>僕は元気ですよ
退屈でしかたないですか
>>>いえ、最近は毎日が楽しいです。
退屈でしょうがないです
>>>
안 맞물릴 때도 있지만 재미있어요.

좋은 웹페이지 즐겨찾기