自然言語処理を容易に実装できるDialogflow(旧:API.AI) を使ってみる #dialogflow

#API.AIってなに？
[API.AI](https://api.ai)は自然言語で会話できるボットを作るためのツール（API）を提供するサービスです。2016年9月にAPI.AIのチームをGoogleが買収しました。


##API.AIを育てると頭が良くなる！
自然言語には、分かりにくい表現や特定の環境でのみ使用する言葉が存在します。こういった微妙なニュアンスの違いや、業界用語、方言などをAPI.AIに学習させれば適切な処理を行う手助けをしてくれます。


##API.AIのすごいところ
#####★SDKが豊富
以下のプラットフォームのSDKを提供しています。
- Android
- iOS / Watch OS / Mac OS X
- Ruby
- Webkit HTML5
- Javascript
- Node.js
- Cordova
- Unity
- .NET(WP8,W10)
- C++
- Xamarin
- Python
- PHP(Community supported)
- Java

#####★ノンコーディングで作成できるシンプルなコンソールを提供している

##API.AIを使ってみよう
コーディングが不要なので非エンジニアでもできます。

###API.AIの登録
[API.AI](https://api.ai)でサインアップをしてください。

###Create new agentをクリック
以下の内容で保存します
- Agent name:ラーメン
- Agent type:Public
- DESCRIPTION:これはラーメン屋のプロジェクトです
- LANGUAGE:日本語
- DEFAULT TIME ZONE:(GMT+9:00) Asia/Tokyo

<img width="500" alt="Screen Shot 0029-02-23 at 14.48.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/302da762-4fdc-d5e7-6d3e-ead41baca6f5.png">

###Entitiesを作成する
Agentの作成が終わったらEntitiesというタブをクリックしてください。
Entities名にRamenMenuと入れます。
Entitiesは自然言語を認識するための単語をまとめておくところです。

<img width="500" alt="Screen Shot 0029-02-23 at 14.53.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/b083882d-70c3-1a6f-d069-dae750c3a43c.png">

Entryにラーメンのメニューをどんどん入れていきます。
Enter reference value...には idを
Enter sysnonym... には キーワードになる単語を入れてください。

<img width="500" alt="Screen Shot 0029-02-23 at 15.04.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/b367e1ed-69b2-6b6d-1bac-90d6049bdf78.png">


入力が終わったら保存します。

###Intentsの作成
自然言語を処理するIntentsを作成します。IntentsタブよりIntents編集画面を開きCreate Intentをクリックしてください。

<img width="500" alt="Screen Shot 0029-02-23 at 15.09.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/60d8b843-ee5b-5cbd-d821-3b9b4d5fb388.png">

Intent nameにOrderと入れます。
Action にorderといれます。
User says に「RamenMenuをお願いします。」と入力し、RamenMenuをクリックし先ほど作成したRamenMenuを選択します。

<img width="500" alt="Screen Shot 0029-02-23 at 15.38.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/b525acf1-f3ba-9498-4645-4000a714652c.png">

すると自動的にPARAMETER NAME　ENTITY VALUEが入ったと思います。

<img width="500" alt="Screen Shot 0029-02-23 at 15.40.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/9caf3a06-1b59-bace-cf9f-5bd85633d6e5.png">

最後にText responseに「かしこまりました。」と登録します。

<img width="500" alt="Screen Shot 0029-02-23 at 15.25.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/45db0f9b-3713-0496-26cc-8d6e0dcde45a.png">

入力が終わったら保存しましょう。

###話しかける
右のテキストバーから、テキストもしくは音声で「味噌ラーメンをお願いします。」と入力してください。

<img width="353" alt="Screen Shot 0029-02-23 at 15.27.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/b48c480f-0173-5aea-5514-271e07ed7411.png">

このように「かしこまりました」と結果が帰ってくれば成功です。

<img width="340" alt="Screen Shot 0029-02-23 at 15.44.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/ce681b00-c478-7cd3-45e5-77345e1be4b3.png">

Show jsonをクリックすれば詳しい情報を取得することができます。

```json:showjson
{
  "id": "",
  "timestamp": "2017-02-23T06:44:00.057Z",
  "lang": "ja",
  "result": {
    "source": "agent",
    "resolvedQuery": "味噌ラーメンをお願いします",
    "action": "order",
    "actionIncomplete": false,
    "parameters": {
      "RamenMenu": "miso_ramen"
    },
    "contexts": [],
    "metadata": {
      "intentId": "",
      "webhookUsed": "false",
      "webhookForSlotFillingUsed": "false",
      "intentName": "Order"
    },
    "fulfillment": {
      "speech": "かしこまりました。",
      "messages": [
        {
          "type": 0,
          "speech": "かしこまりました。"
        }
      ]
    },
    "score": 1
  },
  "status": {
    "code": 200,
    "errorType": "success"
  },
  "sessionId": ""
}
```

ちゃんとこの２つが取れましたね。あとはこの情報をもとに適切な処理を行えば、BOTの完成です。簡単ですね。

```json:showjson
"action": "order"
"RamenMenu": "miso_ramen"
```

##失敗した時/他の言葉で注文したい時
失敗した時はとにかくUser sayに入力し学習させてください。使えば使うほど頭が良くなります。またこのままだと1対1のコマンドなだけなので、どんどんユーザーが発しそうな言葉を予想してUser saysに入力します。

失敗
<img width="337" alt="Screen Shot 0029-02-23 at 15.52.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/2a6c9522-7396-4c27-cc42-a90f3ecd9f7d.png">

学習させる（保存を忘れずに！！）

<img width="303" alt="Screen Shot 0029-02-23 at 15.53.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/34f48c91-e634-543c-e4fa-f7815c6845aa.png">

再度トライ！
<img width="327" alt="Screen Shot 0029-02-23 at 15.54.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/610e265a-594e-59c1-d5e0-93c1dad354d3.png">

成功
<img width="345" alt="Screen Shot 0029-02-23 at 15.54.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/386400da-ed5f-5a7d-369b-eb31bdab89e5.png">

##まとめ
いかがだったでしょうか。API.AIを使用すれば簡単に自然言語処理のツールを作成することができます。API.AIを活用し、自分のサービスに自然言語を活用したインターフェイスを採用してみてはいかがでしょうか。

#ネクストチャレンジ！
[API.AI Python SDKを使ってみる](http://qiita.com/flatfisher/items/53923e33ce1f23b3820a)

##参考にしたリンク
[API.AI Docs](https://docs.api.ai/)