Watson ConversationのTutorialを日本語でやってみた （後編）

#はじめに（前編のおさらい）

本記事は、[Watson ConversationのTutorialを日本語でやってみた （前編）](http://qiita.com/sukusuku_watson_editorial_room/items/2ab2b4738e31b276b91e)に続く後編です。前回に引き続き、[Watson Conversation](http://www.ibm.com/smarterplanet/jp/ja/ibmwatson/developercloud/conversation.html)（以下、Conversation）の[チュートリアル](http://www.ibm.com/watson/developercloud/doc/conversation/tutorial_basic.shtml#tutorial_login)の題材である自動車チュートリアルを日本語で実施していきます。

前回では、まずチュートリアルに先立ち、Conversationの3要素、目的を示すintent, それを補足するキーワードのentity, ユーザーからの呼びかけとWatsonからの応答の組み合わせであるdialogについて解説しました。そしてチュートリアルでは、Conversationサービスとワークスペースを作成し、その中でintentとentityの作成を完了しました。最後にこの状態でWatsonとの会話において実際にintentとentityを使っての会話を試みましたが、まだこの段階では、Watsonはこれらを認識こそするものの、応答を返すまでには至らなかったのでした。

今回では、Conversationの最後の1要素、dialogを作成することにより、Watsonが応答を返せるようにします。

#チュートリアルの前に
実際にチュートリアルを再開する前に、ふたたび必要最低限の事項を説明します。

[前回（前編）](http://qiita.com/sukusuku_watson_editorial_room/items/2ab2b4738e31b276b91e)、dialogを次のように説明しました。

- **dialog**:
ユーザーからの呼びかけとそれに対するWatsonからの応答の組み合わせです。
ユーザーからの呼びかけを受け取るとそのintentとentityが識別され、dialogの中でそれらに対応する正しい応答が選択されます。
一度のやりとりに対応する単一のdialogであることもあれば、何回かのやりとりに対応する木構造のdialogであることもあります。

自動車チュートリアルにおいては、次のような会話をさせるべく、次に示す図のようなdialogを作成します。

- 自動車チュートリアルのdialog

![WS000107.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/bbc4bb8f-e5d2-9f7f-cc92-04c11df1b74c.jpeg)
* 図表はクリックすると拡大します。

>1. 会話開始時にWatsonに`自動車デモへようこそ！`と応答させる。
[](>![WS000102.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/547fb6b8-4d29-2b81-8c0e-c531b0d5bd7b.jpeg))
>2. ユーザーからの呼びかけを待ち、そのユーザーの呼びかけにWatsonが識別できるintentが含まれるかどうかによって、Watsonにそれぞれ下記の応答をさせる。
>  - 2-1. `#あいさつ`intentを含む場合：`こんにちは！ご用件は何でしょうか？`
>  - 2-2. `#起動`intentを含む場合：後述の3. により追加の処理を行う。
>  - 2-3. いずれのintentも含まない場合：`すみません。わかりません。もう一度お願いします。`
[](>![WS000103.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/2ada3fd8-98bc-9c4f-f06e-b6936264b7f8.jpeg))
>3. 前述2-2.の場合はさらに、ユーザーからの呼びかけに`@機器`entityが含まれるかどうか、含まれる場合はそのentity値が何かによって、Watsonにそれぞれ下記の応答をさせる。
>  - 3-1. `@機器`entityを含み、それが`@機器:音楽`entity値である場合：後述の4. により追加の処理を行う。
>  - 3-2. `@機器`entityを含み、それが`@機器:音楽`entity値でない場合：`わかりました。@機器を起動します。`（`@機器`の部分に、ユーザーからの呼びかけに含まれる`@機器`entityのentity値が入ります）
>  - 3-3. `@機器`entityを含まない場合：`すみません。どのようにするのかわかりません。起動可能なものは、音楽、ヘッドライト、エアコンです。`
[](>![WS000105.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/3e39037a-52e8-32d5-d776-61793d935f03.jpeg))
>4. 前述3-1.の場合はさらに、Watsonに`わかりました。どんな音楽が聞きたいですか？`と応答させることでユーザーに追加の呼びかけをさせた上で、そのユーザーからの呼びかけに`@ジャンル`entityが含まれるかどうかによって、Watsonにそれぞれ下記の応答をさせる。
>  - 4-1. `@ジャンル`entityを含む場合：`わかりました。@ジャンルを流します。`（`@ジャンル`の部分に、ユーザーからの呼びかけに含まれる`@ジャンル`entityのentity値が入ります）
>  - 4-2. `@ジャンル`entityを含まない場合：`すみません。ジャンルがわかりません。選べるジャンルはクラシック、リズムアンドブルース、ロックです。`
[](>![WS000106.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/56e9dad9-a93b-a6df-dfd5-e7966ee36a3d.jpeg))

ところで、[前回（前編）](http://qiita.com/sukusuku_watson_editorial_room/items/2ab2b4738e31b276b91e)では3つの会話例(1)-(3)が登場しました。この3つの会話例はこの自動車チュートリアルのdialogの一例となっており、それぞれの会話例では下記のようなdialogの分岐が発生しています。

- 会話例(1)：(**1.**) → **2-1.**と分岐
>ユーザー：こんにちは。
>Watson：こんにちは！ご用件はなんでしょうか？

- 会話例(2)：(**1.**) → **2-2.** → **3-2.**と分岐
>ユーザー：ヘッドライトをつけて。
>Watson：わかりました。ヘッドライトを起動します。

- 会話例(3)：(**1.**) → **2-2.** → **3-1.** → **4-1.**と分岐
>ユーザー：音楽を流して。
>Watson：わかりました。どんな音楽が聞きたいですか？
>ユーザー：クラシックにして。
>Watson：わかりました。クラシックを流します。

#チュートリアル
では、チュートリアルを再開します。

##Stage 6: dialog作成

[](dialogの作成は、どのようなユーザーの呼びかけに対してどのような応答をするかを決定することに相当します。)
dialogを作成するためにはノードと呼ばれる箱を作成します。ひとつのノードはひとつの会話に対応します。それぞれのノードに対して、そのノードが真となる条件と、そのときにWatsonからユーザーに返す応答を記述していきます。ノードを作成したら、そのノードを他のノードのサブノートまたは並列ノードとして接続します。
会話が始まると、dialog内で接続されたノードを順番に評価していき、現在のノードが真となった場合はそのノードに記述された応答を返し、そのノードのサブノートがあればそちらの評価に移ります。現在のノードが偽となった場合はそのノードに記述された応答は返さず、そのノードの並列ノードがあればそちらの評価に移ります。

前述した自動車チュートリアルのdialogの流れに対応して、次の順序でノードを作成していきます。

- 始点ノードの作成
- `#あいさつ`ノード, `#起動`ノードの作成
- `@機器`ノードの作成
- `@機器:音楽`ノードの作成

###始点ノードの作成

はじめに会話の始点となるノードを設定します。

>1. `自動車チュートリアル`ワークスペースページにて`Dialog`タブをクリックします。

>2. `Dialog`タブにて`Create`をクリックします。
>![WS000031.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/5a32eaea-ad29-3269-c3d3-7727d3ddab40.jpeg)
>単一のノードでdialogが作成されます。
>![WS000032.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/f9cb48a9-d495-2756-602a-1eb92c260d99.jpeg)

>3. `Enter a condition`欄に`conversation_start`と入力します。
入力するとドロップダウンリストが表示されますが、そこで`conversation_start(create new condition)`を選択します。
>![WS000037.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/d766197f-aa41-58b5-a372-d8303bbe15e3.jpeg)

>4. `Watson says`欄に`自動車デモへようこそ！`と入力します。
これは指定した条件（この場合は`conversation_start`）が真の場合に返す応答です。
>![WS000038.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/12681498-79f6-352e-007b-f97ea8f48d11.jpeg)

>5. `Anything else`ノードをクリックします。
このノードは`conversation_start`ノードが定義されたとき自動的に作成されるノードです。
>![WS000039.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/4f38337f-88ad-1b41-f6ea-87490b1748ae.jpeg)

>6. `Anything else`ノードの`Watson says`欄に`すみません。わかりません。もう一度お願いします。`と入力します。
これはユーザーからの呼びかけが他のどのノードにも一致しない場合に返す応答です。
>![WS000040.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/f1cd0fa8-6afc-b9f7-3533-54ea204f829a.jpeg)

会話をテストします。
>1. 右上の会話アイコンをクリックします。
>![WS000042.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/28b329f5-4297-7f86-529b-1523c5c6ca8c.jpeg)
>チャットウインドウに応答「自動車デモへようこそ！」が自動的に表示されます。
>![WS000041.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/442cc90e-184c-4f3b-26d3-9db70b8e9438.jpeg)

>2. 好きな文章を入力しEnterを押します。
>![WS000044.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/eb719d9c-454d-6700-f18a-b2a2fbaa4889.jpeg)
>始点以外の他のノードをまだ何も定義していないため、応答「すみません。わかりません。もう一度お願いします。」が表示されます。
>![WS000045.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/e1d94ffd-af84-2e13-0bca-8daa06bb0390.jpeg)

###`#あいさつ`ノード, `#起動`ノードの作成

次に、始点ノードと並列なノードとして、2つのintentに対応する`#あいさつ`ノードと`#起動`ノードを作成します。さらに、ユーザーからの呼びかけに`#あいさつ`intentおよび`#起動`intentを含むとき、それぞれ対応するノードに分岐するように条件を設定します。

####`#あいさつ`ノードの作成

>1. `Conversation_start`ノード下部の`+`アイコンをクリックして、並列に新たなノードを作成します。
>![WS000046.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/9f50795c-bdb2-8db2-ff80-689a6a6199af.jpeg)

>2. `Enter a condition`欄に`#あいさつ`と入力します。ドロップダウンリストが表示されたら`#あいさつ`を選択します。
>![WS000048.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/cac85b61-5c60-10ad-ef20-237dfe4a3469.jpeg)

>3. `Watson says`欄に`こんにちは！ご用件は何でしょうか？`と入力します。
>![WS000049.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/ef226a21-9b15-758a-b32a-3a56b995febc.jpeg)

>4. チャットウインドウで会話をテストします。`こんにちは`と入力します。
>`#あいさつ`intentが認識され、正しい応答が表示されます。
>![WS000050.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/0c13f935-303e-2045-005c-041979939601.jpeg)

####`#起動`ノードの作成

>1. `#あいさつ`ノード下部の`+`アイコンをクリックして、並列に新たなノードを作成します。
>![WS000051.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/6d610dcd-20d1-89cd-5bf2-43770e4e6b59.jpeg)

>2. `Enter a condition`欄に`#起動`と入力します。ドロップダウンリストが表示されたら`#起動`を選択します。
>![WS000052.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/7eb934f9-c63f-902e-004b-a128dd6cae52.jpeg)

###`@機器`ノードの作成

2つのintentのうち、`#あいさつ`intentに対する応答は一種類であるため、`#あいさつ`ノードは単一ノードからなります。一方で、`#起動`intentに対する応答は、ユーザーがどの機器の起動を要求したか、またそれが有効な機器であるか（有効な`#機器`entity値を含んでいるか）どうかによって異なるため、`#起動`ノードから2つのサブノートを追加します。

####有効な機器が指定された場合

まず、ユーザーからの呼びかけが有効な`@機器`entity値を含むときに分岐する`@機器`ノードを作成します。

>1. `#起動`ノード右部の`+`アイコンをクリックして、新たなサブノードを作成します。
![WS000053.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/fc86a110-ad20-3a30-1ba8-704c104b53a5.jpeg)

>2. `Enter a condition`欄に`@機器`と入力します。ドロップダウンリストが表示されたら`@機器`を選択します。
>![WS000054.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/0d495b64-b494-8580-0316-e1e75c211dd8.jpeg)

>3. `#起動`ノード右上端の`Options`アイコンをクリックし`Continue from`をクリックします。
>![WS000056.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/6ca78943-0044-1480-1ee5-e2bbe918f78a.jpeg)

>4. `@機器`ノードをクリックし`Go to Condition`をクリックします。
>![WS000057.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/50344436-75a1-9dfc-f25b-220ec6b6875e.jpeg)
>![WS000058.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/593b67a7-7390-276a-6fa7-f5df0345299e.jpeg)

途中で登場した`#起動`ノードから`@機器`ノードへの`Continue from`リンクは、`#起動`ノードへ分岐したとき次のユーザーからの呼びかけを待つことなくそのまま`@機器`ノードへ分岐することを意味します。



#### 有効な機器が指定されなかった場合

次に、ユーザーからの呼びかけが有効な`@機器`entity値を含まないときに分岐するノードを作成します。

>1. `@機器`ノード下部の`+`アイコンをクリックして、並列に新たなノードを作成します。
>![WS000059.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/b1793c8d-492c-cf62-bf32-9b557fdc1f83.jpeg)

>2. `Enter a condition`欄に`true`と入力します。ドロップダウンリストが表示されたら`true (create new condition)`を選択します。
>![WS000088.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/12e0175a-3266-3073-8e60-9c63e6e656a0.jpeg)



>3. `Watson says`欄に`すみません。どのようにするのかわかりません。起動可能なものは、音楽、ヘッドライト、エアコンです。`と入力します。
>![WS000089.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/16529d6b-80d8-a35e-9040-a56b02f307d7.jpeg)


`@機器`ノードが偽であると評価された場合はこのノードに分岐しますが、このノードの条件に`true`を選択することによってこのノードは常に真であると評価されるようになり、それより下の並列ノードに遷移することはなくなります。

###`@機器:音楽`ノードの作成

同様に、ユーザーが有効な機器を指定した場合の適切な応答を決定するための、`@機器`ノードの2つのサブノートを追加します。2つのノードはそれぞれ、起動する機器が音楽である場合とない場合に対応します。

####起動する機器が音楽である場合

まず、ユーザーからの呼びかけが`@機器:音楽`entity値を含むときに分岐する`@機器:音楽`ノードを作成します。
このノードに分岐する場合、追加情報として音楽のジャンルを必要とするため、さらにサブノートもあわせて作成します。

>1. `@機器`ノード右部の`+`アイコンをクリックして、新たなサブノードを作成します。
>![WS000090.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/807b5898-6e8d-d9cf-c6b1-046cacc425ae.jpeg)


>2. `Enter a condition`欄に`@機器`と入力します。ドロップダウンリストが表示されたら`@機器:音楽`を選択します。
>![WS000091.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/45f339d7-c728-9918-138f-4fc8013ad460.jpeg)

>3. `Watson says`欄に`わかりました。どんな音楽が聞きたいですか？`と入力します。
>![WS000092.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/34cfd410-85a8-7b84-46c7-32f9598205a3.jpeg)


>4. `@機器`ノード右上端の`Options`アイコンをクリックし`Continue from`をクリックします。
>![WS000093.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/171fb6e7-d0fd-1b5f-f69d-b2e222dcde49.jpeg)

>5. `@機器:音楽`ノードをクリックし`Go to Condition`をクリックします。
>![WS000094.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/f280ab7d-555a-86b3-69a6-ec0b6b9d2868.jpeg)

途中で登場した`@機器`ノードから`@機器:音楽`ノードへの`Continue from`リンクは、`@機器`ノードへ分岐したとき次のユーザーからの呼びかけを待つことなくそのまま`@機器:音楽`ノードへ分岐することを意味します。

#####有効なジャンルが指定された場合

ユーザーからの呼びかけが有効な`ジャンル`entity値を含むときに分岐するノードを作成します。

>1. `@機器:音楽`ノード右部の`+`アイコンをクリックして、新たなサブノードを作成します。
>![WS000095.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/284b0d2a-9e1e-6456-fe26-917bc9e7df30.jpeg)


>2. `Enter a condition`欄に`@ジャンル`と入力します。ドロップダウンリストが表示されたら`@ジャンル`を選択します。
>![WS000096.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/d1f330d6-965b-a308-8091-8e84c9b4ee7c.jpeg)


>3. `Watson says`欄に`わかりました。@ジャンル を流します。`と入力します。
>![WS000097.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/d574657d-640f-5504-3b3a-0c307c837e51.jpeg)


今回は`@機器:音楽`ノードから`@ジャンル`ノードへの`Continue from`リンクを設定しませんでした。この場合、`@機器:音楽`ノードへ分岐したときには次のユーザーからの呼びかけを待ってから`@機器:音楽`ノードへ分岐することを意味します。

#####有効なジャンルが指定されなかった場合

ユーザーからの呼びかけが有効な`ジャンル`entity値を含まないときに分岐するノードを作成します。

>1. `@ジャンル`ノード下部の`+`アイコンをクリックして、並列の新たなサブノードを作成します。
>![WS000098.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/8409cb21-221a-6c97-6249-72824fdb9fe2.jpeg)


>2. `Enter a condition`欄に`true`と入力します。ドロップダウンリストが表示されたら`true (create new condition)`を選択します。
>![WS000099.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/c2e6df1b-4168-04e6-4741-a3a33cc4c021.jpeg)

>3. `Watson says`欄に`すみません。ジャンルがわかりません。選べるジャンルはクラシック、リズムアンドブルース、ロックです。`と入力します。
>![WS000100.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/bb2cfbc0-9f25-7c33-8a13-77f1a82db97a.jpeg)


`@ジャンル`ノードが偽であると評価された場合はこのノードに分岐しますが、このノードの条件に`true`を選択することによってこのノードは常に真であると評価されるようになり、それより下の並列ノードに遷移することはなくなります。

会話をテストします。

>1. チャットウインドウに`音楽を流して`と入力します。
>![WS000078.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/872a4f18-ea10-24a6-0fae-bc4177676df8.jpeg)
>`#起動`intentと`@機器：音楽`entityが認識され、音楽のジャンルの入力を求められます。

>2. 有効な`@ジャンル`entity値の名前または類義語を入力します。
>![WS000079.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/1324e5a4-7981-4bd8-202f-4312c94de157.jpeg)
>`@ジャンル`entityが認識され適切な応答が返されます。

>3. チャットウインドウに再び`音楽を流して`と入力し、今度は無効なジャンルを入力します。
>![WS000080.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/75b5cb4e-43c8-918f-3cf8-90389a440dcb.jpeg)
>認識できなかったことを示す応答が返されます。

####起動する機器が音楽以外である場合

つぎに、ユーザーからの呼びかけが`@機器:音楽`entity値をまないときに分岐するノードを作成します。
このノードに分岐する場合、他に追加情報を必要としないため、サブノートは作成しません。

>1. `@機器：音楽`ノード下部の`+`アイコンをクリックして、並列の新たなサブノードを作成します。
>![WS000081.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/835e08e2-81d6-21fb-a543-d7914ac56d92.jpeg)

>2. `Enter a condition`欄に`true`と入力します。ドロップダウンリストが表示されたら`true (create new condition)`を選択します。
>![WS000082.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/8bb2087e-eae9-c457-0290-5835b7fc2d1d.jpeg)

>3. `Watson says`欄に`わかりました。@機器 を起動します。`と入力します。
>![WS000083.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/992c0f8e-e8c7-d528-2a30-60296d1c0083.jpeg)

`@機器:音楽`ノードが偽であると評価された場合はこのノードに分岐しますが、このノードの条件に`true`を選択することによってこのノードは常に真であると評価されるようになり、それより下の並列ノードに遷移することはなくなります。

会話をテストします。

>4. チャットウインドウに`ヘッドライトをつけて`と入力すると、`#起動`intentと`@機器:ヘッドライト`entityが認識され、`わかりました。ヘッドライトを起動します。`という応答が返ります。
>`エアコンをつけて`と入力すると、`#起動`intentと`@機器:エアコン`entityが認識され、`わかりました。エアコンを起動します。`という応答が返ります。
>![WS000084.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/184b3e2f-f68f-a747-cde4-25245987e8c1.jpeg)

>5. 定義した類義語に基づく入力を試してみます。
>![WS000085.JPG](https://qiita-image-store.s3.amazonaws.com/0/146022/d21cc1d3-876b-6b8d-a713-77b91405bacd.jpeg)
>類義語でも正しく識別されることがわかります。

#おわりに

今回dialogを作成したことによって、ユーザーからの呼びかけに対してWatsonが応答を返せるようになりました。
[前回（前編）](http://qiita.com/sukusuku_watson_editorial_room/items/2ab2b4738e31b276b91e)と今回（後編）を通して、以上でConversationの[チュートリアル](http://www.ibm.com/watson/developercloud/doc/conversation/tutorial_basic.shtml#tutorial_login)を完了しました。
本記事によって、Conversationを使った応答システム実現の手順を手軽と感じていただければ、何よりの幸いです。

#お問い合わせ
ご質問がございましたら、こちらにもお問い合わせいただけます。

すくすくワトソン編集室: eb17685@jp.ibm.com