「明日の横浜の天気は?」そんなナチュラルな入力を解釈する Chat Bot は簡単に作れます。Microsoft Bot Framework と Cognitive Services LUIS (Language Understanding Intelligent Service) を利用して、自然言語で入力された文章を分類し、キーワード(今回は日程と場所)を取得、Livedoor 天気予報 Weather Hacks の天気予報 API を利用してデータを取得、日付と気温と共に天気アイコンを表示するカードを作成、表示する BOT を作成します。
##手順
- 天気予報 BOT - Adaptive Card : 天気情報を取得して表示する
- 天気予報 BOT - Cognitive Services LUIS(1): 自然言語(文章)を解釈して、場所や日時を取得する (※このページ)
- 天気予報 BOT - Cognitive Services LUIS(2): 自然言語判定結果をBOTに組み込む
ご参考まで、天気予報 BOT - Adaptive Card 編で作成したアプリはこちらからダウンロードできます。(が、今回の手順の中では使いません)
Bot Framework × Adaptive Cards: WeatherBot アプリサンプル
##開発環境
以下の手順は Windows 10 にて作成を行っています。
今回は Cognitive Services LUIS を管理サイトから作成、編集するため、ブラウザがあれば OK です。
#天気予報 BOT - Cognitive Services LUIS(1) : 自然言語(文章)を解釈して、場所や日時を取得する
##LUIS 管理サイトから自然言語解析エンジンの作成
###新規 App の作成
Cognitive Services LUIS の管理サイト (https://www.luis.ai/) にアクセスし、Sign in からサインインを行います。
My Apps ページが表示されたら、[New App]をクリックして、新規の自然言語解析エンジン (Appと呼びます) を作成します。
Name に お好みの App 名を入力、Culture は Japanese を選択します。[Create]をクリックして作成します。
Overview の画面で利用状況を一覧で見ることができます。
###Entity の作成
Overview 画面の左列から Entities をクリックして Entity を作成します。
今回は Entity として 場所 と 日程(今日、明日、明後日) を取得できるように設定します。
[Add Entity] をクリックして、新規 Entity を作成します。
まずは場所から、Entity Name に Place と入力、Entity Type は Simple を選択し、[Save] をクリックします。
次に日程、Entity Name に Day と入力、Entity Type は Hierachical を選択します。
Hierachical Type の Entity で親子関係のある Entity を作成できます。
Child#1 の欄が表示されたら、Today と入力します。
+Add Child をクリックして Child Entity を増やして Tomorrow と入力、同様に DayAfterTomorrow を作成します。 [Save] をクリックして保存します。
###Intent の作成
次に Intent を作成します。左列から Intents をクリックして Intent のページを開きます。Add Intentをクリックして、Intent Name に GetWeather と入力、[Save] をクリックします。
GetWeather の Intent に例文を学習させます。Type a new utterance & press Enter 書かれた列に例文を入力して Enter をクリックします。
例文が入力されたら、例文の単語をクリックして、作成した Entity に関連付けます。
"今日" という単語をクリックし、表示される Entity を Day > Day::Today の順にクリックして Today に紐づけます。
次に場所を表す単語(地名) をクリックして、Place という Entity に紐づけます。
[Save] をクリックして、例文を保存します。
同様に他の例文を入力し、それぞれの Entity として認識させたい単語を紐づけます。
それぞれのEntity に紐づくように例文を選定し、数個入力します。保存を忘れずに。
Entity | -- | 覚えさせる単語の例 |
---|---|---|
Day | Today | 今日, きょう, 本日, 今 |
〃 | Tomorrow | 明日, あした, あす |
〃 | DayAfterTomorrow | 明後日, あさって |
Place | -- | 東京、大阪... |
LUIS は、文章の構造+紐づけられた単語 から文章の意図 (Intent) と キーワード (Entity) を判別します。そのため、
- Entity に関連付けたいすべての単語 (例えば Place に日本全国の地名を紐づけ) をこの Intent 例文入力作業で行う必要はありません。
- 実際に LUIS に判別させたい自然言語になるべく近い例文を用いてください。
漢字&ひらがな交じり、難しい地名など、判定が難しい場合は、Features に用意されている Phrase List を用いると、判定精度を上げることができます。
###LUIS App の学習とテスト
作成した Entity と Intent で LUIS App に学習させていきます。
画面左列のメニューから Train & Test をクリックします。[Train] をクリックすると学習が始まります。
学習が終了すると、画面中央でテストが可能になります。判別したい文章を入力し、Intent や Entity が判別されるのを確認してください。
想定される結果にならなかった場合は、Intent の例文の見直しや追加、Entity への紐づけを確認してください。
Intent や Entity の修整、追加を行った後、再度 Train を行わないと反映されませんのでご注意ください。
###LUIS App の公開
作成した LUIS App を公開することで、API でアクセスすることが可能になります。
画面左列のメニューから Publish をクリックします。
Publish App の画面で、Endpoint Key (デフォルトで用意されている試用 Bootstrap Key でOK) を選択します。[Publish] をクリックして、App の公開を行います。
公開すると、API URL ↓が表示されます。
https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/[LUIS AppID]?subscription-key= [Endpoint Key]&timezoneOffset=0&verbose=true&q=
この URL の最後、"q=" のあとに判別したい文章を入力すると、その結果をJSONで取得することができます。
ブラウザに APIのURL+判別したい文章を入力して、判定結果がJSONで取得できることを確認してください。
Internet Expolor では JSON ファイルがダウンロードで取得できます。ローカルに保存して、テキストエディタなどで内容を確認してください。
次のステップで、LUIS による解析結果をBOT側に取り込んで処理を行います。
Appendix
ご参考まで、ここまで作成した LUIS App はこちらからダウンロードできます。
LUIS 管理画面から Import し、Train & Publish を行ってお使いください。
WeatherBot LUIS App サンプル(JSON)