AI Botメッセンジャー「Luka」のUIが面白い

Lukaとは

AI Botメッセンジャー「Luka」は、当初お薦めレストランを紹介するチャットアプリとして登場したが、対応できる領域をどんどん拡張してきている。
Botに天気を聞いたり、Wikiに質問したりできるようになっており、パーソナルアシスタントの地位を狙っているのがうかがえる。

Luka – App Store

今年はAI Botが来ると言われながらも毎日使われるようなBotが登場してきていない。
その理由の一つは、現在のチャットUIでは、アプリやウェブ以上のユーザ体験を提供できていないことがあるのではないかと言われている。
Lukaは、この問題に真正面から取り組み、一つの解を提供している。
今回は、Lukaの素晴らしいUIをいくつか紹介したいと思う。

ユーザに極力入力をさせない

モバイル端末でテキストを入力するのは、やはり億劫だ。
チャットを使って買い物ができれば便利だろうが、やりとり全てを小さなキーボードを使って打ち込むのは心が折れる。

Lukaでは、基本的にユーザはテキスト入力せずにチャットで会話ができるようにしている。

IMG_0902

上記イメージは、レストランを選択した後のUIである。
画面下部にメニューとして、「利用可能な場所だけ紹介して」「テーブルに空きはあるか?」「料理のアドバイスは?」「ちょっと遠すぎるね」「あまりよくないね」などといったユーザが言いたいであろう文を用意してあげている。
これにより、ユーザはわざわざテキストを入力しなくても下のメニューをタップしていくことで、Botと会話を続けていける。
尚、メニューが多いときは、メニューの部分をスライドさせることで次のメニュー一覧が表示される。

FBメッセンジャーも同様にボタンというUIがあるのだが、現状は3つまでしか表示できない為、それ以上の選択肢がある場合は他の方法を考えなければいけない。

カルーセルUI

FBメッセンジャーでもできるカルーセルUI。

IMG_0901

Lukaの場合、レストランを選択すると、背景の地図と連動するのでレストランを検討するのに使いやすい。

IMG_0905

入力部のUIが変わる

画面下部のユーザが入力するであろう選択肢は、入力させたい内容により変更できる。
例えば、レストランの予約日時を入れてもらいたい場合は、それ用の入力部品を配置している。こうすることで、わざわざユーザに日時をタイプさせる手間を省いている。Webフォームであれば当たり前のことだが、現状のメッセンジャープラットフォームではできていない。

IMG_0903

また、興味のあるニュースを選択する部分は画像のカルーセル表示にしている。

IMG_0904

チャットUIでニュースを読む場合

チャットUIでニュースを読む場合、長くなると読みにくいし、読む気が無くなる。
Lukaでは、ニュースを読みやすい長さに区切って表示している。その先を読みたいのであれば、ボタンをタップせるようにしている。
Webでよくある「続きを読む」と同じだが、Lukaの場合、ニュースの内容に沿って、ボタンの文字を変えている。
例えば、以下のTwitterのニュースではボタンが「How!?」となっており、タップすることで、会話の流れで続きの文章が読めるようになっている。

IMG_0906
IMG_0908

今の所、続きを読むボタンは、1つだけのようだが、選択肢にして興味のある内容を深堀させて読んでいけるようにしても面白いかもしれない。

まとめ

最初にも書いたが、まだまだ現状のメッセンジャープラットフォームでは、チャットに最適化されたUIを提供することができない。
各プラットフォーム、UIの改善は続けているようであり、今後、チャットに最適化されたUIのBotが登場することで、日常で使われるようなチャットボットが登場することを期待したい。

ディープラーニングで文書分類(2)

はじめに

前回ディープラーニング(CNN)を使って、文書分類を行う方法を示した。
今回は、前回示した方法を使って、Livedoor Newsコーパスをカテゴリー分類する分類器をTensorflowで実装していく。

全体像おさらい

今回作成するモデルの全体像は以下の図の通り。
詳細は前回の記事参照。

インプットデータの作成

Livedoor Newsコーパスの各文書を以下の図のような行列にする。
行=各文書の単語。行数を合わせる為に、500単語で区切っている。
列=各単語をWord2Vecで変換した100次元のベクトル。

models[‘文書名’]で、当該文書の行列が取得できるように事前準備をしておく。
Word2Vecモデル作成時に存在しなかった未知語については、[0,0,0,…0]のベクトルで置き換えておく。
500単語に満たない文章については[0,0,0,…0]でパディングし、また500単語を超える文書については、500単語で切ることで、行数を合わせている。

定数・変数の準備

Tensorflowで利用する定数・変数を用意しておく。

ドロップアウト変数は、出力層の計算をする際にプーリング層の結果を当変数の割合でランダムに間引いて行う為のもの。
過学習を防ぐ為に設定をする。
トレーニングの際は0.5、評価の際は1.0(間引かない)を設定する。

“x_expanded”は、インプット変数の次元を1つ増やしたもの。
TensorFlowのconv2d関数は、4次元のテンソル(バッチ、幅、高さ、チャネル)を入力とする為、ここでインプット変数の次元を1つ増やしている。チャネルとは画像であれば、RGBと3つの値を使うことができ、文書であれば「Word2Vec」「GloVe」などエンベディングの方法別にチャネルを設定することができる。今回は、「Word2Vec」のみを使う為、チャネルは1つとする。

畳み込み層・プーリング層

畳み込み層では、Tensorflowのconv2d関数を使って畳み込みの処理を行う。
フィルタのサイズとしては、3単語、4単語、5単語の3種類で、それぞれ128個のフィルタを使う。
フィルタは、各次元に1つずつスライドさせている。

Pooling層では、畳み込み層の結果をMax-poolingにてプーリング処理を行う。
その後、各フィルタの処理結果をプーリングした値をつなげて、1つにしている。

出力層

最後は、プーリング層の結果をインプットにカテゴリへの分類を行う。
DOC_CLASS_DEFで定義されているカテゴリのうち、predictionsで”1″が立っている場所のカテゴリが分類結果となる。

トレーニング及びテスト

コスト関数の定義とAdamオプティマイザーによる各パラメータの最適化を行う為の定義をする。

ここまでで各処理の定義ができた為、いよいよトレーニング及びテスト(評価)を行っていく。
前回のニューラルネットワークと同様ミニバッチにて、100件ずつランダムにピックアップしたデータをトレーニングデータとして使っている。
イテレーション回数は、14,000回とした。

最終結果としては、評価用データで92%の正答率となり、ニューラルネットワークでの分類結果とほぼ同程度の値となった。
ニューラルネットワークよりもトレーニングの時間が多くかかり、今回入力データやハイパーパラメータの調整までを行うことができたなかった。この辺りをもう少し調整することで、より高い正答率は出せるものと考えられる。