Microsoft Bot Framework v3.0 からはじめる BOT 開発: 天気予報 BOT～自然言語を解釈する - Cognitive Services LUIS(1)

「明日の横浜の天気は？」そんなナチュラルな入力を解釈する Chat Bot は簡単に作れます。Microsoft Bot Framework と Cognitive Services LUIS (Language Understanding Intelligent Service) を利用して、自然言語で入力された文章を分類し、キーワード(今回は日程と場所)を取得、[Livedoor 天気予報 Weather Hacks](http://weather.livedoor.com/weather_hacks/) の天気予報 API を利用してデータを取得、日付と気温と共に天気アイコンを表示するカードを作成、表示する BOT を作成します。

下記手順 3 まで行って作成できる 天気予報BOT↓
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170816_06.png)


##手順
1. [天気予報 BOT - Adaptive Card : 天気情報を取得して表示する](http://qiita.com/annie/items/3416fcf1ec275940979a)
2. 天気予報 BOT - Cognitive Services LUIS(1): 自然言語(文章)を解釈して、場所や日時を取得する　(※このページ) 
3. [天気予報 BOT - Cognitive Services LUIS(2): 自然言語判定結果をBOTに組み込む](http://qiita.com/annie/items/23b821108f9d32a0832e)


>ご参考まで、天気予報 BOT - Adaptive Card 編で作成したアプリはこちらからダウンロードできます。(が、今回の手順の中では使いません)
[Bot Framework × Adaptive Cards: WeatherBot アプリサンプル](https://msdnshared.blob.core.windows.net/media/2017/08/WeatherBot_AdaptiveCards.zip)

##開発環境
以下の手順は Windows 10 にて作成を行っています。
今回は Cognitive Services LUIS を管理サイトから作成、編集するため、ブラウザがあれば OK です。

#天気予報 BOT - Cognitive Services LUIS(1) : 自然言語(文章)を解釈して、場所や日時を取得する
##LUIS 管理サイトから自然言語解析エンジンの作成
###新規 App の作成
Cognitive Services LUIS の管理サイト (https://www.luis.ai/) にアクセスし、Sign in からサインインを行います。
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_01.png)

My Apps ページが表示されたら、[New App]をクリックして、新規の自然言語解析エンジン (Appと呼びます) を作成します。
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_02.png)

*Name* に お好みの App 名を入力、*Culture* は Japanese を選択します。[Create]をクリックして作成します。
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_03.png)

Overview の画面で利用状況を一覧で見ることができます。
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_04.png)

###Entity の作成
Overview 画面の左列から *Entities* をクリックして Entity を作成します。
今回は Entity として 場所 と 日程(今日、明日、明後日) を取得できるように設定します。
[Add Entity] をクリックして、新規 Entity を作成します。
まずは場所から、*Entity Name* に　Place と入力、*Entity Type* は Simple を選択し、[Save] をクリックします。 
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_05.png)

次に日程、*Entity Name* に　Day と入力、*Entity Type* は Hierachical を選択します。 
> Hierachical Type の Entity で親子関係のある Entity を作成できます。

*Child#1* の欄が表示されたら、Today と入力します。
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_06.png)

*+Add Child* をクリックして Child Entity を増やして Tomorrow と入力、同様に DayAfterTomorrow を作成します。 [Save] をクリックして保存します。
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_07.png)

以上で Entity の作成は完了です。
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_08.png)


###Intent の作成
次に Intent を作成します。左列から *Intents* をクリックして Intent のページを開きます。*Add Intent*をクリックして、*Intent Name* に GetWeather と入力、[Save] をクリックします。
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_09.png)

GetWeather の Intent に例文を学習させます。*Type a new utterance & press Enter* 書かれた列に例文を入力して Enter をクリックします。
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_10.png)

例文が入力されたら、例文の単語をクリックして、作成した Entity に関連付けます。
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_11.png)

"今日" という単語をクリックし、表示される Entity を *Day* > *Day::Today* の順にクリックして *Today* に紐づけます。
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_12.png)
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_13.png)

次に場所を表す単語(地名) をクリックして、*Place* という Entity に紐づけます。
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_14.png)
[Save] をクリックして、例文を保存します。

同様に他の例文を入力し、それぞれの Entity として認識させたい単語を紐づけます。
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_15.png)
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_16.png)

それぞれのEntity に紐づくように例文を選定し、数個入力します。保存を忘れずに。

|Entity|--|覚えさせる単語の例|
|:---|:---|:---|
|Day|Today|今日, きょう, 本日, 今|
|〃|Tomorrow|明日, あした, あす|
|〃|DayAfterTomorrow|明後日, あさって|
|Place|--|東京、大阪...|

![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_17.png)

>LUIS は、文章の構造＋紐づけられた単語 から文章の意図 (Intent) と キーワード (Entity) を判別します。そのため、
1. Entity に関連付けたいすべての単語 (例えば Place に日本全国の地名を紐づけ) をこの Intent 例文入力作業で行う必要はありません。
2. 実際に LUIS に判別させたい自然言語になるべく近い例文を用いてください。

>漢字＆ひらがな交じり、難しい地名など、判定が難しい場合は、Features に用意されている Phrase List を用いると、判定精度を上げることができます。

###LUIS App の学習とテスト
作成した Entity と Intent で LUIS App に学習させていきます。
画面左列のメニューから *Train & Test* をクリックします。[Train] をクリックすると学習が始まります。
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_18.png)

学習が終了すると、画面中央でテストが可能になります。判別したい文章を入力し、Intent や Entity が判別されるのを確認してください。
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_19.png)
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_20.png)

>想定される結果にならなかった場合は、Intent の例文の見直しや追加、Entity への紐づけを確認してください。
Intent や Entity の修整、追加を行った後、再度 Train を行わないと反映されませんのでご注意ください。

###LUIS App の公開
作成した LUIS App を公開することで、API でアクセスすることが可能になります。
画面左列のメニューから *Publish* をクリックします。
*Publish App* の画面で、Endpoint Key (デフォルトで用意されている試用 *Bootstrap Key* でOK) を選択します。[Publish] をクリックして、App の公開を行います。
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_21.png)

公開すると、API URL ↓が表示されます。
`https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/[LUIS AppID]?subscription-key= [Endpoint Key]&timezoneOffset=0&verbose=true&q=`
![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_22.png)

この URL の最後、"q=" のあとに判別したい文章を入力すると、その結果をJSONで取得することができます。
ブラウザに APIのURL＋判別したい文章を入力して、判定結果がJSONで取得できることを確認してください。
>Internet Expolor では JSON ファイルがダウンロードで取得できます。ローカルに保存して、テキストエディタなどで内容を確認してください。

![](https://msdnshared.blob.core.windows.net/media/2017/08/bluesky_20170814_23.png)

次のステップで、LUIS による解析結果をBOT側に取り込んで処理を行います。

## Appendix
ご参考まで、ここまで作成した LUIS App はこちらからダウンロードできます。
LUIS 管理画面から Import し、Train & Publish を行ってお使いください。
[WeatherBot LUIS App サンプル(JSON)](https://raw.githubusercontent.com/a-n-n-i-e/CognitiveLUIS-AdaptiveCards-WeatherBot/master/LUISApp_WeatherBot.json)