keras seq2seq でチャットボットをやってみる

今回は、keras の seq2seq サンプルプログラムを使って、チャットボットをやってみます。

こんにちは cedro です。

kerasseq2seq サンプルプログラムは、系列を入力として受け取り、それに対応する系列を出力するモデルです。先回はこのサンプルプログラムを使って、英文の単語の系列を受け取り、それと同じ意味の日本文の単語の系列を出力することで、英日翻訳をやってみました。

ということは、このサンプルプログラムをそのまま使って、日本文の単語の系列を受け取り、それに応答する日本文の単語の系列を出力すれば、チャットボットが出来ることはお分かりになると思います。

ということで、今回は、keras seq2seq サンプルプログラムを使って、チャットボットをやってみます。

 

データセットを準備します

まず、データセットフォーマットはどうすれば良いのか、先回使った 英文と日本訳のデータセット(jpn-eng.zip)を見てみましょう。

 

英文があって、タブ区切り日本文が続く形です。つまり、入力したい単語の系列タブ区切り出力したい単語の系列、改行と書けば良いわけです。

 

日本語の対話のデータセットを色々探してみました。その中で面白そうだったのが、この GitHub のデータセット(corpus.distinct.txt)です。これはノクターンノベルズなどの小説から対話部分を抜き出して作ったものだそうで、対話の区切りは「___SP___」で表現されています。

また、めずらしい分かち書きしたカタカナ文なのですが、これだと文字の種類が少なくてすむので予測させ易いですね。GINK03 さん、データセットをありがたく使わせて頂きます。感謝致します!

 

サンプルプログラムが適切に読み込めるように、データセットを加工します。python で加工プログラムを書いても良いですが、この程度ならエディタの方が簡単で速いので、今回はサクラエディタを使います。

検索置換から、正規表現に✔を入れ、置換前に「___SP___」、置換後に「¥t」と入力し、全て置換のボタンを押せば、___SP___区切りタブ区切りに全て置き換わります。ここで正規表現というのは、タブ区切りとか改行などの制御文字を見えるようにすることを言い、タブ区切りの制御文字は「¥t」だというわけです。

 

あと、分かち書きの空白頻繁に出現するため予測する時にノイズになり易いので、空白は全て削除します。置換前「 」置換後「」(置換前はスペースを入力、置換後は何も入力しない)で全て置換のボタンを押せば、空白全部削除されます。

データセットの加工が終わったら、サンプルプログラムがあるフォルダーに dataset フォルダーを作り、その中に katakana_txt という名前で保存します。

 

サンプルプログラムを確認します

サンプルプログラム(lstm_seq2seq.py)ほとんどそのままですが、全体をここに載せておきます。11行目num_samples=20000 (データセットの頭から20000行だけ読み込む)としています。13行目dataset を読み込む部分は修正しています。

100行目は、スクリーンにモデルを表示する部分を追加。101ー102行目は、モデルを ‘seq2seq_k.png’ というファイル名で保存する部分を追加していますが、pydotgraphviz が事前にインストールしてない場合は削除して下さい(エラーになります)。

179行目は、学習したニューラルネットワークを使って、データセットの頭から何行目までの入力を使って、チャットボットの入力とするかの指定です。今回は、2000にしてあります。

なお、サンプルプログラム基本的な動き先回のブログで書きましたので、そちらを見て下さい。

 

プログラムを動かしてみます

カタカナ文で文字の種類が少ないこともあって、20000行分のデータセットを読ませても、私の MacbookAir で 100sec/ eopch くらい、100epoch約3時間弱で終わりますので、ノートパソコンでも十分動かせます。

 

Number of unique output tokens は、先回は漢字交じりの日本文だったので1483種類と大きな数字でしたが、今回はカタカナ文になったので125種類と小さな数字になっています。これによって最適化が必要なパラメータ数Total params は 2,499,787 → 814,461 と大幅に減ったため、データセット10000 →20000 に倍増しても、先回より処理は短時間で済みます

 

プログラムが保存したモデルseq2seq_k.png)がこれです。

 

学習完了後対話結果です。分かち書きしてないカタカナ文でも、結構読めます。例によって1文字単位の予測ですので精度はあまり良くないですが、なんとなく会話になっているのが面白いです(笑)。

seq2seq モデルは、原理的には、文字を入力してそれに対応する画像を出力することも、画像を入力して文字を出力することもできるわけで、相当応用範囲が広そうです。また、色々やってみたい気がします。

では、また。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)