よっぽどのことがない限り更新しないブログ

Ruby、JavaScriptから機械学習などの技術、スタートアップの情報まで更新する。

IBM Watsonを使って簡易版電子彼女的なものを作ってみる(設計編)

先日、IBMのWatsonを使ったハッカソンがあった。
入賞すればWatsonの無料券やスマートデバイスなどの副賞があったのだけど、残念ながら入賞できなかった。

watson-hack.strikingly.com

Watsonはつい先日、一部機能について日本語対応したので今後使われるシーンも出てくると思う。
なので簡単な活用法をご紹介したい。

 

まずWatsonとは

IBMのサイトを見るとこのように定義されている。

Watson(ワトソン)は、コンピューターでありながら、人と同じように情報から学び、経験から学習するコグニティブ・テクノロジーです。

 

 

www.ibm.com

 

世間では「人口知能」と呼ばれているが、IBMの方はコグニティブ(認識・思考)という表現を強調していた。

これには自分もすごく共感できる。やっぱり知能ではないかなと思う。

まぁ何を持って知能とすべきかみたいな話になると延々と終わらないので、要は画像や文章、音声を認識したうえで適切な答えを出し、またその為の学習を行うことができるシステムだと言える。

 

どんなことができるのか

 上記の通り、画像や文章、音声を認識することができる。
また大規模なデータ解析もIBM BluemixというWebプラットフォーム上で簡単に操作することができる。

BluemixはPaasでherokuみたいなもの。実際にherokuの技術を使っているみたい。

IBM developerWorks 日本語版 : IBM Bluemix

例えば、ピザのデリバリー注文チャットシステムや、音声でのブログ投稿システムなんていうものも割りと簡単に作ることができる。

実は使うことができるAPIはここで紹介されているだけで19種類にも及ぶ。

www.ibm.com

 

電子彼女を作ってみる

では本題に入って、簡易電子彼女的なものを作ってみる。

仕様としては以下の通りとする。

1. チャット形式で会話を行うことができる。
2. 最初はわからない単語が多くても少しずつ覚えていくことができる。
3. ユーザーに合わせた会話をすることができる。

 

ちなみに3が無いと悲しいことになる。
毎回名前を覚えてもらえず、不特定多数の男性に愛想を振りまく彼女なんて嫌すぎる。
今回は映画herのように各ユーザー毎のデータも中央制御されているようなことはないので、どんな会話をしても他のユーザーにばれることはない。

her.asmik-ace.co.jp

 

実現方法

今回は敢えてBluemixを使わず、Amazon Web Servicesで環境を構築し、Rubyで実装していく。

使うAPIは下記2つ。

・dialog

・Natural Language Classifier

 

dialogはその通り、会話をすることができるAPI
といっても何か考えながらではなく、予め設定しておいた文言を返すレベル。

本来であればその処理も「ゆらぎ」を感知することができる、構文解析→意味解析ができるのだけど、実は日本語版ではそこまでできない。

英語版のデモはこちら。ピザの注文に関するチャットをすることができる。

Dialog

 

完全一致で答えを入力しなければならないとなると、少なくとも数万以上の問答を教えなければいけなくなる。

そこで使うのがNatural Language Classifier(NLC)、つまりクラス分類処理のAPIだ。

これは、例えば何か質問したものに対して「〜について話されている可能性が〜%」という予測を返すことができる。

そしてそのパターンはある程度曖昧なものを学習させることができる。

つまり、ある程度パターンをNatural Language Classifierに学習させておき、そのパターンに合う回答さえdialogで設定してしまえば自然な会話をすることができるということ。

 

ちなみにNatural Language ClassifieerのインプットデータはCSVで入力する。シンプルにインプット、アウトプット(分類するクラス)の2カラムで設定する。

すごくざっくり書くとこんな感じ。

 

質問内容 分類内容

"休みの日は何してるの?","ask_hobbies"

"好きな食べものはなに?","ask_foods"

 

これで"休みの日は何するの?"や"お休みの日なにしてる?"といった表現の揺らぎについても、高確率で分類することができる。

そしてdialogのほうはその分類に対しての答えを定義する。
その為にはXMLで質問に対する回答を書かなければならない。

つまり、ユーザー→Natural Language Classifier→dialog→ユーザーという流れ。

少しまどろっこしいけどこれで表現を丸めることができる。

 

学習させる

NLCでは最低15,000以上の学習データが必要と言われている。
それを手作業で入れていくのはなかなかしんどい。
もちろん辞書データなど公開されているものから取ってくることもできるが、せっかくなのでそこも学習させていこう。

精度の関係もあり、NLC、dialogで拾えなかった表現を毎日チェックし、正解を教えるという教師あり学習で進めていく。

まぁ簡単なもので、会話の内容をNLCに対してpost処理を行うと、ステータスコードと現時点での一番自信のある回答を持ってきてくれる。そのステータスコードが拾えなかったものを指す場合にDBに質問を記録していく。
dialogも同様にできなかったものを拾っていく。

APIは割りと簡単に実装することができる。

www.ibm.com

そして集めた辞書に無いデータについて、管理画面から簡易入力フォームで正解を教えてあげれば良い。

フォームからNLCのCSVやdialogのXMLに日時でも即時でも更新処理をしていけば、段々と賢くなるという仕様。

 

インタフェースは悩むが、仕様自体は至極シンプル。
一日もあればできると思う。

とはいえ実際のソースが無いとなかなかイメージしづらいと思うので、よっぽどのことがあればソースをブログで公開したい。