LUIS (Language Understanding Intelligent Service) で天気情報 BOT を作ろう！[日本語解析エンジン作成編]

Build 2016 から各種機能がアップデートされた自然言語解析ツールである [LUIS (Language Understanding Intelligent Service)](https://www.microsoft.com/cognitive-services/en-us/language-understanding-intelligent-service-luis)。日本語を含む 8 か国語対応になりましたので、現時点 (2016年9月現在) での利用方法を紹介します。

[2017/08/18 追記]
LUIS 管理画面が当ページ執筆当時と変わっています。
最新版 の LUIS 利用方法を別途執筆しましたので、こちら↓をご利用ください。
[Microsoft Bot Framework v3.0 からはじめる BOT 開発: 天気予報 BOT～自然言語を解釈する - Cognitive Services LUIS(1)](http://qiita.com/annie/items/c55101720aee1c6d7ad6)

#LUIS とは

[LUIS (Language Understanding Intelligent Service)](https://www.microsoft.com/cognitive-services/en-us/language-understanding-intelligent-service-luis) は自然言語を解析するツールで、入力された文章の分類、キーワードの抽出を行うエンジンを GUI で作成できます。

作成したエンジンは API 経由で利用でき、結果は JSON 形式で取得できます。また、公開されている [C# ライブラリー] (https://github.com/Microsoft/Cognitive-LUIS-Windows) によるアクセスも可能です。

>[LUIS C# SDK (GitHub)](https://github.com/Microsoft/Cognitive-LUIS-Windows)

#LUIS を利用するのに必要な準備
現在 β 版として無料で利用可能です。
アカウントは Microsoft アカウント を利用するため、お持ちでない場合は取得してください。

>[Microsoft アカウント登録手続き](https://www.microsoft.com/ja-jp/msaccount/signup/default.aspx)

なお、作成したエンジンごとに Application ID と Application Key が発行され、アクセスする際にはこの ID と Key のペアが必要になります。

#LUIS を使った日本語分析エンジンの作成
今回は例として、天気に関する問い合わせ文章を分析するエンジンを作成します。
LUISでは入力された文章の分類である Intent、入力に対する返答を作成するのに必要なキーワードである Entity を設定します。

| 入力文章 | Intent | Entitiy(Day) | Entitiy(City) | Entity(Weather) |
|:-:|:-:|:-:|:-:|:-:|
| 今日、東京は雨が降りますか？ | verifyWeather | 今日 | 東京 | 雨 |
| 明日の大阪の天気を知りたい | getWeather | 明日 | 大阪 |  --  |
| ヘルプ | getHelp |  --  |  --  |  --  |


##LUIS の新規アプリケーションの作成
LUIS のWebサイト (https://luis.ai/) から作成を行います。
*Sign in or Create an account* をクリックします。
>Create Account(初回) は ロケーションや Term of Use が表示されますので、登録を行います。

![](https://msdnshared.blob.core.windows.net/media/2016/09/bluesky_20160921_01.png)


+New App をクリックして新規アプリ(LUISエンジン部分)を作成します。
![](https://msdnshared.blob.core.windows.net/media/2016/09/bluesky_20160921_02.png)

Application Name (アプリケーション名)、Usage Scenario (ここでは *Bot* を選択)、Application Domain (ここでは *Weather* を選択) を入力 or 選択し、Application Culture に *Japanese* を選択します。
![](https://msdnshared.blob.core.windows.net/media/2016/09/bluesky_20160921_03.png)

アプリケーションが作成されると、以下のような ↓ ワーク画面が表示されます。
![](https://msdnshared.blob.core.windows.net/media/2016/09/bluesky_20160921_04.png)

###Entity の作成
まずは Entity の作成から。*Entities* の横にある (+) をクリックします。
入れ子構造(Children) を作成することもできますが、今回は入れ子なしでシンプルに作成します。
*Day* と入力し、*Save* をクリックします。
![](https://msdnshared.blob.core.windows.net/media/2016/09/bluesky_20160921_05.png)
同様に City、Weather を作成します。

###Intent の作成
次に、作成した Entity を含む Intent を作成します。
*Intents* の横にある (+) をクリックします。
Intent name に *verifyWeather*、その下に解析サンプル文章を入力します。*+ Add Parameter* をクリックし、検出する Entity を追加します。*Name* は 結果が返されるタグになります。*Type* は作成済みの Entity を選択します。Day、City、Weather をそれぞれ選択し、*Save* をクリックして保存します。
![](https://msdnshared.blob.core.windows.net/media/2016/09/bluesky_20160921_06.png)

サンプル文章が表示されるので、解析された文言を Entity に紐づけします。*今日* をドラッグして選択すると、作成済みの Entity が表示されるので、*Day* を選択します。
![](https://msdnshared.blob.core.windows.net/media/2016/09/bluesky_20160921_07.png)

紐づけられた文言は Entity ごとに色分けして表示されます。紐づけが完了したら *Submit* をクリックして登録します。
![](https://msdnshared.blob.core.windows.net/media/2016/09/bluesky_20160921_08.png)

同様に getWeather を作成します。
今度は検出する Entity は Day と City に設定します。
![](https://msdnshared.blob.core.windows.net/media/2016/09/bluesky_20160921_09.png)

サンプル文章の紐づけも同様に行います。
![](https://msdnshared.blob.core.windows.net/media/2016/09/bluesky_20160921_10.png)


###サンプル文のロードと学習
Intent 作成時の文章以外にも、学習させたいサンプル文章を複数登録し、Intent の登録と Entity への紐づけを行います。
ワークスペース中央部分の *New Utterances* をクリックして、新しい解析サンプル文章を入力します。自動で Intent や Entity が紐づけられますが、間違っている場合はそれぞれ修正して *Submit* をクリックします。何文か登録したら、画面左下の *Train* をクリックして学習させます。
![](https://msdnshared.blob.core.windows.net/media/2016/09/bluesky_20160921_11.png)

学習した結果は Review Labels で確認できます。(ドロップダウンリストから *Show all labeled utterances* を選択します。) 間違いがあった場合は、この画面でも修正を行うことが可能です。
登録、修整したら *Train* から再度学習させることをお忘れなく。
![](https://msdnshared.blob.core.windows.net/media/2016/09/bluesky_20160921_12.png)

###アプリケーションの公開
ワーク画面左列にある *Publish* をクリックします。
HTTP API経由でアクセスできるようにするには、*Publish web service* をクリックします。
>再度学習させたあと、アップデートすることも可能です。

![](https://msdnshared.blob.core.windows.net/media/2016/09/bluesky_20160921_13.png)

公開すると、アクセスURLが表示されます。
この URL に Application ID と Application Key が埋め込まれていますので、必要に応じてコピーしておきます。

>https://api.projectoxford.ai/luis/v1/application?id=YOUR_APP_ID&subscription-key=YOUR_APP_KEY
といった URL が表示されているはずですが、YOUR_APP_ID に相当する部分が Application ID, YOUR_APP_KEY の部分が Application Key になります。

*Query* に解析させたい文章を入力すると、問い合わせ用 URL が生成されます。この URL リンクをクリックすると結果を JSON で取得(ダウンロード)できます。
![](https://msdnshared.blob.core.windows.net/media/2016/09/bluesky_20160921_14.png)

##LUIS による分析結果の取得(JSON)
ダウンロードした JSON をテキストエディターなどで開いて内容を確認します。
文章を解析した結果として、Intent(verifyWeather)とスコア(0~1の間の数値で表した確度)、指定した Entity の抽出結果が含まれています。

```application.json
{
  "query": "明日、東京は雨降るのかな",
  "intents": [
    {
      "intent": "verifyWeather",
      "score": 0.999998569,
      "actions": [
        {
          "triggered": true,
          "name": "verifyWeather",
          "parameters": [
            {
              "name": "day",
              "required": false,
              "value": [
                {
                  "entity": "明日",
                  "type": "Day",
                  "score": 0.936513543
                }
              ]
            },
            {
              "name": "city",
              "required": false,
              "value": [
                {
                  "entity": "東京",
                  "type": "City",
                  "score": 0.949055731
                }
              ]
            },
            {
              "name": "weather",
              "required": false,
              "value": [
                {
                  "entity": "雨",
                  "type": "Weather",
                  "score": 0.9399574
                }

:
(省略)
```

また、それぞれの Entity の分析結果も含まれています。

```application.json
:
(省略)
:
"entities": [
    {
      "entity": "明日",
      "type": "Day",
      "startIndex": 0,
      "endIndex": 1,
      "score": 0.936513543
    },
    {
      "entity": "東京",
      "type": "City",
      "startIndex": 3,
      "endIndex": 4,
      "score": 0.949055731
    },
    {
      "entity": "雨",
      "type": "Weather",
      "startIndex": 6,
      "endIndex": 6,
      "score": 0.9399574
    }
:
(省略)
```