「ね、簡単でしょ?」LUISを使って自然言語理解を行うAIを作ってみる。

2018.03.06

ラボ研究員 黒田

チャットボットに関して研究を進めています、その一部をご紹介したいと思います。

チャットボットとは何?

チャットボットとは主にモバイルデバイス上で、メッセンジャーやチャットを元にしたインターフェース 「例) Facebook Messanger, LINE,SnapChat, Slack等」 を活用して提供されるサービスです。
ユーザーはまるでヒトと"会話するような感覚"で情報収集を行うことができます。
通常は機械のアルゴリズムを利用しますが、場合によってはAIによる高度な会話の実現も可能です。

と、紹介されておりやっぱりAIは必要になってくるみたいですね。

少し整理してAIがやってくれるお仕事を紐解いてみますと、重要な部分に「自然言語理解」という処理があります。
ですが、この部分を自分で作るとなると、とてもじゃないですが私の頭では構築しきれません。

それなら、何かサービスは無いのか?と考え、探して試してみたことが今回のお話です。

・LUISとは

「Microsoftが提供する、自然言語理解のAIを作成・育成する事ができるAPIサービス」です。

これだけ聞くとなんだか難しそうですが、LUISではノンプログラミングで誰でも自分だけのAIが作ることができますのでご安心ください。

ログインしたダッシュボードはこんな感じになっています。

20180200601.jpg

※ログインするにはMicrosoftアカウントが必要になります。

・LUISで、できること

LUISは自然言語処理をしてくれるAPIですが、そもそも自然言語を処理するというと、意味が広すぎます。
LUISがしてくれることは、主に以下の2つです。

①文章が、どのIntentにあたるかを振り分ける。
②文中の単語が、どのEntityにあたるかを振り分ける。

※Intent(インテント) : その発言が、どういった意図を持っているのかをカテゴリー分けしていく要素。
※Entity(エンティティ): その発言のなかにある、意味のある単語をカテゴリー分けしていく要素。

詳しいことは、作りながら説明していこうと思います。

・LUISアプリケーションを作る

さてさて、さっそく自分だけのAIを誕生させましょう!
「+New App」をクリックすると2つの選択肢が現れます、今回はイチから作成しますので、「New Application」を選択。

20182000602.jpg

↓ ↓ ↓ ↓

20182000603.jpg

AIの情報を入力する画面が表示されるので作成するアプリケーション名を入力した後、アプリケーションの使用想定シナリオを選択します。

次に、アプリケーションの領域をチェックしアプリケーションの説明を入力します。
(この辺りは結構適当に選択しても問題ないです。)

最後に、アプリケーションが理解する言語を選択しますが、このLUISは、とても賢くて日本語の分解が出来るようになっています。なので言語設定は「Japanease」を選択します。

20182000604.jpg

各項目を入力し「Add App」をクリックしてアプリケーションを作成します。
少し時間がかかりますが、新たに作成されたアプリケーション設定画面が表示されます。

20182000605.jpg

メッセージを送れるような画面が現れました。
これで自分だけのAIが誕生したので、さっそくAIに話しかけてみましょう。

表示されているページ「New utterances (新しい発言)」のタブから、AIにメッセージを送信してみます。

20182000606.jpg

まずは挨拶を入力して「→」ボタンをクリックします。

20182000607.jpg

・・・何も起きない。
そりゃそうです、今は何も学習していない状態なので、このままでは何も起きません。

・AIに学習させる

AIがナイスな感じで自然言語を理解するためには、学習が必要になります。
そのためのキーワードとなるのが、上↑↑で紹介した「Intent(インテント)」と「Entity(エンティティ)」の2つなのです。

それでは、IntentとEntityを作っていきましょう。

ここで大きなポイントとなる事があります。
この時点でAIに理解してもらいたい言葉の要素、最終的につくるべきアプリケーションの全体像をしっかり決めておく必要があります。
なぜかというと、AIに学習させるべき情報の方向性を決めておかないといくら学習させても自分の欲しい結果に辿り着かなくなるからです。
(はじめに何も考えずに要素を付けて学習させた結果、解析精度がとても残念なAIを作ってしまったことは、ここだけの話。)

アプリケーションの全体像というのは下記のようなイメージで考えてください。

・出発駅と目的駅の情報を与えると経路や料金を教えてくれる。
・「~の天気は?」と聞くとその場所の現在の天気情報と予報を教えてくれる。
・食べたい料理と食事する場所を指定するとお薦めのお店を教えてくれる。
etc

少々難しく考えると、「人に聞く場合、どういった要素を聞き出す必要があるかをイメージする」ってことです。

今回は、簡素に「挨拶の種類と人物名を理解する」として、AIに学習してもらいましょう。

まずは、Intent(意図)を追加します。
画面左のメニューにある「Intents」の「+」をクリック。

20182000608.jpg

↓ ↓ ↓ ↓

20182000609.jpg

「Add New Intent」の画面が表示されるのでIntentの名前、例文を入力して下さい。
※+Add Actionで細かな要素分けの条件や辞書利用も出来ますが、それは機会があれば紹介します。

入力したら「Save」で保存します。これでIntentが追加されます。

20182000610.jpg

追加した例文と共にIntentsに項目が追加されます。

次に、エンティティ(意味のある単語)を追加していきます。
Intentを追加したときと同じように画面左のメニューにある「Entities」の「+」をクリック。

20182000611.jpg

↓ ↓ ↓ ↓

20182000612.jpg

「Add New Entity」の画面が表示されるのでEntityの名前入力して下さい。

入力したら「Save」で保存します、これでEntityが追加されます・・・が、

ここで注意点をご紹介。

このLUISが振り分ける大きな区分のEntityは限界があります。
分解された言葉の要素付けには段階的な子要素を持たせて振り分けないとすぐに送り先が枯渇してしまいます。

この辺りも先述した「理解してもらいたい言葉の要素」の内容に絡んでいますのでご注意ください。

では、どうやるのか「Include children」のチェックを入れます、そうすると子要素を「Hierarchical(階層)」か「Composite(複合)」どちらで作るか出てきます。

20182000613.jpg

後々の取り扱いやすさによって、人それぞれどっちがいいかは意見が分かれそうですが、今回は階層で作ってみようと思います。

今回は挨拶で、どんなパターンで分けるか考えてみましょう。
「朝」「昼」「夜」・・・・それ位ですかね。
念のため、「その他」とか作って逃げ口用意しておく方法もありです。

20182000614.jpg

これで、挨拶を振り分けるEntityが作成されます。同じ要領で人物名も振り分けるEntityを用意しましょう。

20182000615.jpg

※ちなみに子要素は後から追加/削除が可能です。

これで、学習前の準備が整ったので、ここから発言に対してIntentとEntityを結びつけて行きたいと思います。
やる事はとても単純、まずは学習前に無反応な返しを受けた時と同じように「New utterances」タブから言葉を入力します。
今回は挨拶と人物名を紐付ける学習をしていくことを念頭に入力します。

20182000616.jpg

初回なので結果は同じです、まずは入力された言葉が挨拶されたという事をAIに教えます。
入力された文章の横のドロップダウンをクリックすると作成されたIntentが選択出来るので選びます。

20182000617.jpg

入力した言葉の単語を選択するとEntityが選択できるようになっているのでその単語をどのような意味に紐付けるかを指定します。

20182000618.jpg

単語はある程度、形態素解析された状態で選択可能となっています。
(この形態素解析も何気に凄い精度なんですけどAI作成の必要機能になってしまって凄さが伝わらないのがちょっと悲しい。)
選択後、「Submit」ボタンを押すと文章にIntentとEntityが紐付けられ1つの学習となります。

後は、未熟なAIに似たような言葉を教えてあげて学習を繰り返していきます。

20182000619.jpg

学習・・・学習・・・学習・・・学習・・・学習・・・学習・・・、

ある程度、7~8件入れて画面右下の「Train」をクリックするとAIがこれまでの学習データを吸収して、精度が上がります!

20182000620.jpg

そして、同じようにAIに話しかけてみると・・・、

20182000621.jpg

自動でIntentとEntityを結びつけて結果を返してくれるようになります。
(最初にこの結果を受け取った時は少し感動します。)

これで挨拶を理解するAIの第一歩ということになります。

・学習させたAIを利用する

丹精込めて育てたAI、活用しないともったいないって事でLUISからの利用方法を一部紹介しておきます。

このLUIS、作成したAIをWebAPIとして利用する事が出来ます、やり方としては画面左のメニューにある「Publish」をクリック。

20182000622.jpg

↓ ↓ ↓ ↓

20182000623.jpg

「HTTP service」の画面が表示されます。「URL」で表示されているアドレスが今回作成したAIを外部利用するためのアクセス先情報となっています。

では、「Query」に文章を入力してEnterを押してみましょう。

20182000624.jpg

このように、解析結果のIntentのスコアと分析できたEntityの種類、スコアをJSONの形式で返してくれます。

後は、このスコアや分類要素を利用してアプリケーション側で返答文を作成すれば、簡単なチャットボットが出来上がるわけです。

今回作成した例ですと昼夜の挨拶種によって返答文を変えたり、人物名が入っていれば挨拶文の前に取り出せた人の名前を「○○さん」として付けたりとやり方は単純に考えられるようになります。

・まとめ

どうです、簡単でしょ?

今回の紹介で「それだけ?」と思う方もいるかもしれませんが、発せられる言葉の中から何をしたいかと、必要なパラメーターが抽出できれば、プログラムはつくれます。
重要な「自然言語理解」という部分に関してこういったサービスを使ってみるというのも一つの手だと覚えていただけたら幸いです。

実際にちょっと気合を入れてLUISでAIを作り込もうとするとEntityは子要素内で平気で20以上になります。

ただ、それぐらい要素を入れておかないと多種多様な文章に対応するAIを作る事は出来ません。