LUISチュートリアル：天気予報アプリを作る

#はじめに
この記事は社内勉強会でハンズオンする為に投稿しました。
LUISを初めて使う非エンジニアでも４０分～５０分程度で実施できるよう、極基本的なことのみを細かく進めるように構成しています。

#前提
LUISを使い始める為に必要なアカウント作成は既に済んでいる前提としています。
まだの方は、[LUISのサインアップから使い始めるまで](https://qiita.com/Yuwji/items/dda88c0c19f2b02e8c26)を参考にしてください。

#目的
- どう設定すれば良いかを何となく学ぶ
- どんな情報を返してくれるのか何となく学ぶ
- LUISのみを使用してもWebAPIとして公開できるのでやってみる
    - 公開したWebAPIにアクセスした場合、どう認識されたのかJSON形式で返却されるので見てみる

#今回作成するアプリ
天気予報を尋ねるアプリにします。
「大阪の明日の天気を教えて」という発話が考えられ、
- インテントとしては「天気予報を聞きたい」
- エンティティとしては、いつ：「日付」、どこの：「地名」
ということになります。

#ハードコピー内の枠線の色について
【赤】はこれからすべきことを指しています。クリック・入力するべき箇所です。
【緑】は前の手順を実施した結果、反映・変更された箇所です。
つまり、赤枠のボタンを選択　->　次の手順で、次工程の緑枠の箇所が変化、赤枠のボタンを選択　という感じの流れになっています。

#手順
1.LUISのページにアクセスし、サインインする
[https://www.luis.ai/home](https://www.luis.ai/home)にアクセスし、サインインしておきます。

2.MyAppの画面が表示されますが、まだアプリが一つもないため、殺風景です。
では、「Create new app」を選択してアプリを作っていきましょう。
![WS000088.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/2ffa2b7f-27c2-337b-3941-648afc77cbb7.jpeg)

3.アプリ名や言語について下記の通り記入し、「Done」を選択します。
Name　：天気予報アプリ
Culture：Japanese
Description　：チュートリアル
![WS000089.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/7888605e-54b6-0280-8a6a-bcc8a02d7cd4.jpeg)


4.アプリが作成され、Intentsの画面が表示されます。
まずはインテントを追加します。
「Create new intent」をクリックしましょう。
![WS000091.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/6543096a-98e1-9f5b-9bd8-06d841b9a505.jpeg)

5.Create new Intentのモーダルが開きます。
今回は天気予報を聞きたいので、intent nameに「天気予報を聞きたい」と入力し、[Done」を選択します。
![WS000092.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/a5a29773-65ff-87ff-a990-1462ee26bfe1.jpeg)

6.「天気予報を聞きたい」インテントが追加され、インテント設定の画面になります。
まだ何も入力せず、続いてエンティティを登録します。
左側のメニューにある「Entities」を選択します。
![WS000093.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/018074d4-500a-d4f7-89ed-51f3052094ba.jpeg)

7.インテント同様に、「Create new entity」を選択します。
![WS000094.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/bd6a53b3-36cf-03c9-ed1f-3c267f523369.jpeg)

8.下記の通り入力して「Done」を選択します。
Entity name　：地名
Entity type　：Simple
![WS000095.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/a64f4447-1b25-8b56-3cca-cabafefeb194.jpeg)

9.Entityに「地名」が追加されました。
「日付」も追加する為、もう一度「Create new Entity」を選択します。
![WS000096.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/63002af6-8d32-718e-ad31-218d2f6b2e39.jpeg)

10.下記の通り入力して「Done」を選択します。
Entity name　：日付
Entity type　：Simple
※後述しますが、prebuilt EntityのDatetimeが発話の単語を上手く認識できなかったので、今回は別で作成しています。
![WS000097.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/f6c588f7-0b2c-1e9a-7111-a8416e15d7da.jpeg)

11.Entityに「日付」が追加されました。
続けてインテントに発話を追加し、エンティティを認識させるため、左側のメニューにある「Intents」を選択します。
![WS000098.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/ab175653-e9fa-68e4-f0bb-d48513f5b98b.jpeg)

12.インテントの一覧から「天気予報を聞きたい」を選択します。
![WS000099.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/735b37f3-a834-ad49-065d-313bb60f5ac8.jpeg)

13.「天気予報を聞きたい」エンティティの設定画面が開きます。
発話を追加する為、画面上部の「Type about 5～」と表示されているテキストボックスを選択し、「大阪の明日の天気を教えて」と入力・Enter押下します。
![WS000100.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/a36d6557-4dd9-91dd-dc0b-d9b9ae5a84b2.jpeg)

14.「大阪の明日の天気を教えて」という発話が追加されました。
これで、「大阪の明日の天気を教えて」やこれに類するテキストが発話として渡された際に、「天気予報を聞きたい」インテントとして認識するようになります。
![WS000101.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/8df0fa6b-5a49-9194-65d4-1a07d4c4d64e.jpeg)

15.続けて、単語とエンティティを紐付けていきます。
「大阪」を「地名」エンティティ・「明日」を「日付」エンティティとして認識するように設定します。
「大阪の明日の天気を教えて」の「大阪」の箇所にマウスカーソルを合わせると、下図のように[大阪]と表示されますので、そこでクリックします。
![WS000102.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/ed3e7be9-336f-a379-ea08-8a3067115c0d.jpeg)

16.下図のようにサブメニューが開きますので、「地名」を選択します。
![WS000103.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/402781ee-d925-2d2f-c717-5f2039abb833.jpeg)

17.「大阪」が[地名]という表示に変わり、背景色も変わりました。
これで、「大阪」が「地名」エンティティとして認識されるようになりました。
![WS000104.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/e5b09aa6-bf6f-17a9-1c37-8cb5618bfd56.jpeg)

18.同様に、「明日」も「日付」にします。
![WS000105.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/73e8b0cf-e651-7d4d-2368-3bf2e056f652.jpeg)

19.この発話を登録して、エンティティを認識させる流れを繰り返します。
※最低５つの発話が必要ですので、いろいろなパターンで登録してください。
ここでは、下記を登録しました。
- 東京の今日の天気予報は？
- 明後日の奈良の天気は？
- 明後日、三重は晴れるかな
- 今日、広島雨降る？
- 週末の神奈川の天気を教えて
なお、一度Entityを割り当てた単語が元々どんな単語で発話を入力していたか確認する為に、画面の「Token View」を選択します。
![WS000106.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/468ad61c-eec5-cf5a-be38-38c33c81a3df.jpeg)

20.下図のように、元々の単語を確認できます。
次に、入力・設定したインテント・エンティティをＡＩに学習させるため、右上の「●Train」を選択します。
![WS000107.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/e9458730-480f-2348-e3e3-c8c972d9fc2f.jpeg)

21.学習が完了すると、画面上部に下図のように表示されます。
![WS000110.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/07e4e68d-8746-f342-1108-e776f347b2d2.jpeg)

22.次に、学習した内容を使って、発話が想定通りに認識されているかテストします。
右上の「← Test」を選択します。
![WS000111.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/dbfae5ca-4e9a-dbf3-f0e6-b934e7a4528b.jpeg)

23.テスト用のペインが右側に表示されるので、発話文を入力・Enter押下します。
ここでは「大阪の明後日の天気を教えて」と入力しました。
![WS000112.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/9d598753-59c5-eb88-0dc4-6fffc523c987.jpeg)

24.入力した発話が認識されました。
エンティティなども確認する為、「Inspect」を選択します。
![WS000113.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/40abb8a8-393d-5466-8b2a-8128a9cbc812.jpeg)

25.Inspectペインが表示され、発話がどのように認識されたのか確認できます。
下図では
- インテントは「天気予報を聞きたい」
- 「地名」エンティティは「大阪」
- 「日付」エンティティは「明後日」
と認識されたことが分かります。
次に、このアプリをWebAPIとして公開して、ブラウザから発話を渡してみましょう。
「PUBLISH」を選択します。
![WS000114.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/0a351fcf-9b89-ba57-7ad0-4ed50621d7f2.jpeg)

26.Publish app画面が開きます。
下図の通り選択して、「Publish to Staging Slot」を選択します。
Publish to　：Staging
Timezone　：GMT +9:00 Tokyo ～
![WS000116.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/c0bdc9bc-73b4-d119-81ae-ab5c45a53a66.jpeg)

27.公開が完了すると、画面上部に下図のように表示されます。
![WS000118.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/f91c4a28-323c-2bb2-d504-ff092f53a55d.jpeg)

28.そのまま画面下部にスクロールし、下図に表示されているURLリンクを選択します。
![WS000119.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/94c33658-65bf-daa3-b641-a998b51c74e6.jpeg)

29.別タブ/ウィンドウで、下図のように表示されます。
これは、発話を何も渡していない場合の返却内容です。
![WS000120.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/366f017c-3ada-3fbb-7b79-2c101e899bf9.jpeg)

30.URLの最後が「q=」で終わっているので、ここに発話文を追加してアクセスし直します。
ここでは、「～q=東京の週末の天気を教えて」としました。
その結果、下図のようにブラウザに表示されます。
無事に、
- インテントは「天気予報を聞きたい」
- 地名エンティティは「東京」
- 日付エンティティは「週末」
と認識され、返却されたことが分かります。
![WS000123.JPG](https://qiita-image-store.s3.amazonaws.com/0/199815/3e640f4a-a48e-17d1-4897-dd7a50cbf05e.jpeg)

#まとめ
このように、LUISを使うと簡単にNLUアプリを作成することができます。
実際にちゃんとした仕組みを作ろうとすると、かなりの発話数が必要だったり、インテントやエンティティの衝突が起こったりします。
この辺りの苦労話などはまた別途。

#今後の課題
今回、チュートリアルを作るに当たり、Prebuilt entitiesのdatetimeを使おうと思っていたのですが、インテントに発話を入れた際に、「明日」「明後日」などの単語がことごとくdatetimeと認識せず、範囲指定してもdatetimeを選択できず、といった状況だったため、断念しました。
対処方法が分かる方、ご連絡いただけますと助かります。
※海外のQA情報か何かで、GUI上は認識してくれないけど、実際に動かしたら認識するよ、という内容があり、試してみたのですがダメでした。
この辺りはAlexaの方が秀でてるのかなぁ、という印象です。