こちらはピクシブ株式会社 Advent Calendar 2015 21日目の記事です。
9月に入社した pawa です。ピクシブが『就職四季報』に載っていなかったため、『PPPのピクシブたん』を読んで就活していました。ピクシブに入社すれば漫画の中で躍動しているピクシブたんと実際に会えると思っていた時期が私にもありました。しかし、未だに夢はかなっていません。
一方、Twitter 上では「人工無脳バトル」というものが繰り広げられており、会話ボットをつくる機運が高まりつつあります。そこで、本記事では、Webエンジニアだけでなく学生でも作れる、そこそこ対話可能な人工無脳の作り方を紹介したいと思います。
ブラウザ上で動く雑談対話システムを作ろう
休日に作っちゃいました。
↓このように、おしゃべりできます。
なぜブラウザ上か
音声認識が容易に行えるため、ブラウザ(Chrome)を選びました。
Mojolicious で Hello World
Perl言語が手に馴染むので、Perl言語の Mojolicious というWebアプリケーションフレームワークで作っていくことにしました。
インストール
cpanm Mojolicious
cpanminus をインストールしていると上記のコマンドで入ります。(cpan コマンドでも問題ありません。)
アプリケーションの雛形の生成
英語のアルファベットのみで構成されるPATH(/home/hoge など)で 「munou」ディレクトリを作成し、この後の作業は「munou」ディレクトリで行うこととします。
mojo generate lite_app app.pl
とコマンドを打つと app.pl ができます。
現状のファイル構成は以下の通りです。
. └── munou └── app.pl
開発用にサーバを立ち上げる
morbo app.pl
とコマンドを打つと「http://127.0.0.1:3000」でアクセス可能になります。
ピクシブたんの画像と背景画像を用意しよう
「ピクシブたん」のタグが付いている投稿イラストを眺めて「こんな感じかな」と思ったものを「キャラクターなんとか機」で用意しました。こちらからダウンロードしてみてください。
public/img/chara ディレクトリを作って、その中に以下の通りに配置しましよう。
├── app.pl └── public └── img └── chara └── pixivtan ├── dere.png ├── ikari.png ├── namida.png ├── normal.png └── warai.png
背景画像は、「Studio-74」のフリー背景素材を利用しました。(「public/img/back/heya_hiru.jpg」に配置。)
辞書を構築しよう
事前に必要なもの
- Tokyo Cabinet(Key-Value ストア)
- Tokyo Cabinet の Perl用API
- MeCab(形態素解析器)
が事前に必要です。ピクシブたんのために頑張ってインストールしましょう。
いざ、構築
「○○○」と言われたら「×××」と答えるリスト(これを辞書と呼びます)を構築しましょう。昔は手作業でやっていましたが、今は Twitter がありますので、Twitter のAPIを利用しましょう。
コードが中々長いので、GitHub から
- cpanfile
- learning.pl
- learning
- lib/
- lib/ 以下のすべて
- config.conf
を munou ディレクトリにコピーしてください。
cpanm Carton
して、munou ディレクトリで
carton install
を唱えると必要なモジュールがすべてインストールされます。
config.conf の [twitter_api] のところの
- consumer_key
- consumer_secret
- access_token
- access_token_secret
をあなたのもの(持っていない場合は「TwitterのAPIを使用するために必要なキーを取得する手順」などを参照)にしたあと、
./learning
を実行すると、モリモリと辞書が構築されていきます。
内部では、自作ライブラリを使ってツイート文を強力に正規化(表記の統一など)しつつ、Twitter の対話ペアから、「○○○」と言われたら「×××」と答えるリストを Tokyo Cabinet のB+木データベース(キーが重複する、複数のレコードを格納することができるデータベース)に挿入していっています。B+木データベースを使う理由は、発話文「○○○」に対する応答文「xxx」は複数登録したいためです。
おしゃべりまでのプロセス
- ユーザのマイクからの入力を Web Speech API の音声認識インターフェースに渡す。
- 音声認識結果を文字列で取得できるので、それをサーバに送信。
- サーバは辞書内から最もマッチする応答文を探して返す。
- ブラウザ側で応答文を受け取って画面に反映。
という流れでおしゃべりします。
応答文探索時は、 lib/Munou/Responder.pm (こちらからアクセスしてね)内にて以下のマッチングを試みます。
- ユーザからの入力を正規化した文でマッチング。
- 1でマッチしなければ、形態素(単語)を文頭から削っていってマッチング。
- 2でもマッチしなければ、あらかじめ用意した数種類の文をランダムに返す。
辞書構築時も似たようなことをして、それらしい応答文を取得しやすくしています。1TBくらいの辞書を構築すれば、あらゆる話題にそれなりの応答を返すようになります。(個性や信念といったものがないのでそんなに面白くありませんが。)
次のステップへ
会話ボットを作るのが楽しい・もっと知りたいと思えたら自然言語処理が学べる研究室に行くのもいいでしょう。
明日は alpaca-tc のターンです。