開発のために必要なこと
テキストベースの「対話ボット」の開発にあたって、最近劇的な精度向上によって話題になっているGoogle翻訳のベースの技術として利用されている、Googleが開発したライブラリである「Tensorflow」の”encoder-decoder sequence-to-sequence model”を用いる。Tensorflowの利用にあたっては、C++とPythonのAPIが用意されているが、現時点(2016/11/14)では、Python APIが最も開発が進んでおり、手軽なため、以後Pythonで開発する事を前提とする。ちなみにTensorflowは、 Apache 2.0 open source license の下で、OSSとして公開されており、本モデル以外にも、チュートリアルと共に様々なDNN応用例が実装されている。
参考1:「Google翻訳が進化!? 精度が向上したと話題に(ディープラーニングによる新翻訳システムが導入されたとみられています。)2016年11月12日 10時23分 更新」
http://nlab.itmedia.co.jp/nl/articles/1611/12/news021.html
Fig. Google翻訳にるArtificial Intelligenceの日本語訳結果
参考2:Tensorflow: Sequence-to-Sequence Models
https://www.tensorflow.org/versions/r0.11/tutorials/seq2seq/index.html#sequence-to-sequence-models
参考2:Tensorflow: Sequence-to-Sequence Models のチュートリアルでは、同モデルを用いて英仏翻訳を行う例が紹介されている。英語の単語のシーケンスを入力とし、フランス語の単語のシーケンスを出力するモデルである。この構造を「対話ボット」に適用する場合、以下の作業が必要となる。
1. 「対話ボット」学習データの整備
2. 「対話ボット」学習ロジックの実装
3. 「対話ボット」対話ロジックの実装
次に各作業の詳細について説明する。
1.「対話ボット」学習データの整備
チュートリアルの英仏翻訳学習用のデータは、対訳データと呼ばれるデータである。これは、英語の文章に対して、翻訳結果となるフランス語の文章が対となった形で、それぞれのファイルに格納され、各行が対をなしているデータである。また、英語もフランス語も各単語が半角スペースで区切られ、単語のシーケンスとなっている。これに対して、今回対象とする対話ボットは、LINEトーク履歴データ(日本語)を用いた「対話ボット」であるが故に以下が必要となる。
・対話を形成する日本語文対の作成
LINE のトークデータは以下の手順で簡単にテキストデータとしてエクスポート可能である。(iPhoneの場合)出力対象のトーク画面→「設定」→「トーク履歴を送信」
エクスポートされたテキストデータは、以下のような形式である。
ファイル名 :[LINE]トーク相手名.txt
ex1.[LINE]田中太郎.txt
ファイル内容:HH:MM¥tトーク者¥t発話内容
ex2.
08:40 太郎 おはようー
08:40 太郎 ございます!
08:41 太郎 [スタンプ]
09:00 花子 今日は起きれたんだね。
09:02 太郎 [スタンプ]
: : :
08:40 太郎 おはようー
08:40 太郎 ございます!
08:41 太郎 [スタンプ]
09:00 花子 今日は起きれたんだね。
09:02 太郎 [スタンプ]
: : :
このファイルを用いて入力文と出力文のペアを作成する。
LINEトークの特徴として、一方的に短文を何度も発話する場合が往々にしてあるため、シーケンスの単位として、連続して発話した一連の内容を1単位とした。簡単のため、発話時刻の間隔は考慮せず、連続で発話したすべてをまとめて一つの単位とした。
ex3.
太郎 おはようーございます![スタンプ]
花子 今日は起きれたんだね。
太郎 [スタンプ]
: :
太郎 おはようーございます![スタンプ]
花子 今日は起きれたんだね。
太郎 [スタンプ]
: :
また、発話の順序性については、本来は発話時刻を考慮してセッションを考え、対話となっているペア生成する必要がある。しかし、今回は上の処理で一連の発話内容を1単位とした後、最初の発話者を入力担当、次の発話者を出力担当と割り振り、順々にペアを生成した。
ex4. 入力部分
おはようーございます![スタンプ]
[スタンプ]
:
おはようーございます![スタンプ]
[スタンプ]
:
ex5. 出力部分
今日は起きれたんだね。
:
今日は起きれたんだね。
:
・日本語文の分かち書き
日本語や中国語のような文章中に区切り文字が存在しない文章は、明示的なシーケンスを表現するために、形態素解析を行い、意味のある単位(=形態素)で文を分解する必要がある。今回はPure Pythonで開発された形態素解析エンジンであるJanome(蛇の目)を用いる。
Janome (0.2.8)
http://mocobeta.github.io/janome/
以下にサンプルコードを示す。
from janome.tokenizer import Tokenizer
with open('../data/line_talk.in', mode = 'w') as fw:
t = Tokenizer()
for line in inputs:
tokens = t.tokenize(line)
line = ' '.join([token.surface for token in tokens]).encode('utf-8') + '\n'
fw.write(line)
分かち書きを行った入力部分、出力部分をそれぞれファイルに格納する。
ex6. line_talk.in
おはようーございます ! [スタンプ]
[スタンプ]
:
おはようーございます ! [スタンプ]
[スタンプ]
:
ex7. line_talk.out
今日 は 起き れ た ん だ ね 。
:
今日 は 起き れ た ん だ ね 。
:
話題のTensorFlow・LINEトーク履歴を用いて対話ボットを作ってみた(1)
話題のTensorFlow・LINEトーク履歴を用いて対話ボットを作ってみた(2)
話題のTensorFlow・LINEトーク履歴を用いて対話ボットを作ってみた(4)
話題のTensorFlow・LINEトーク履歴を用いて対話ボットを作ってみた(5)
0 件のコメント:
コメントを投稿