[Watson] [Node-RED] 質問応答システムを作ってDiscoveryを試してみた

# はじめに

Discoveryの概要については、@ishida330 さんの記事がとても詳しいので、どのようなサービスかご存知でない方はこちらをお読みください。
[Watson Discovery Serviceが日本語対応したので、触ってみた【何、それ？】編](https://qiita.com/ishida330/items/b823d7c5b55806f04242)

上の記事にあるとおり、Discoveryは多くのユースケースが考えられるサービスです。
本稿は、その一つである、質問応答システムとしてのユースケースを想定して触ってみた知見の共有です。

なお、質問応答システム用のサービスとしてはRetrieve and Rank (R&R)がありましたが、サービス終了となりました。
[[Watson] Retrieve and Rankのサービス終了について]
(https://qiita.com/y-some/items/fc0937e031a3ab52d459)

**＜ご注意＞**
本稿の内容は執筆時点の情報に基づいており、現在の情報と異なっている可能性があります。
本稿の内容は執筆者独自の見解であり、所属企業における立場、戦略、意見を代表するものではありません。

# 質問応答システムの動作イメージ

Node-REDでこんな感じのモノを作ってみました。
<img width="1280" alt="スクリーンショット 2017-11-24 21.12.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/3d1db0c5-01c3-a4a0-ea13-c499199ad3a7.png">


# 日本語のコレクション作成

作成手順は概ねこちらの記事通りです。
[Watson Discovery Serviceが日本語対応したので、触ってみた【やってみた】編]
(https://qiita.com/ishida330/items/bb1bd4cf61da9b9c6da2)

2017年11月現在、日本語のコレクションはAPIで作成しなければならず、Discovery toolでは作れません。
私が叩いたcurlコマンドを載せておきます。

```
-- environmentの一覧を取得
curl -u "{ユーザーID}":"{パスワード}" "https://gateway.watsonplatform.net/discovery/api/v1/environments?version=2017-11-07"

-- environment_idを指定して日本語にカスタムしたconfiguration_idを取得
curl -u "{ユーザーID}":"{パスワード}" "https://gateway.watsonplatform.net/discovery/api/v1/environments/{上で取得したenvironment_id}/configurations?version=2017-11-07"

-- 日本語にカスタムしconfiguration_idを指定して日本語のcollectionを作成
curl -X POST -u "{ユーザーID}":"{パスワード}" -H "Content-Type: application/json" -d '{ "name": "{作成するコレクション名}",  "description": "{作成するコレクションの説明}",  "configuration_id": "{上で取得したconfiguration_id}", "language": "ja"}' "https://gateway.watsonplatform.net/discovery/api/v1/environments/{上で取得したenvironment_id}/collections?version=2017-11-07"
```

ユーザーIDとパスワードは「サービス資格情報」で確認できます。
<img width="1280" alt="スクリーンショット 2017-11-24 20.12.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/cf656f1c-e072-0bbe-876a-d7c43d31aa7c.png">

# ドキュメントのアップロード

厚生労働省の[労働基準法に関するQ＆A](http://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/roudoukijun/faq/faq_kijyunhou.html)から、適当に見繕って使いました。

（ご参考）厚生労働省のコンテンツは、規約に従えば『複製、公衆送信、翻訳・変形等の翻案等、自由に利用できます』とのことです。
[厚生労働省 > ホーム > 利用規約](http://www.mhlw.go.jp/chosakuken/)

上のサイトの質問文のリンクをクリックすると、こんな感じのページが表示されるので、
![スクリーンショット 2017-11-24 17.53.11.png](https://qiita-image-store.s3.amazonaws.com/0/122917/44d3fcf6-2373-6a41-599e-64a486c82063.png)
ソースを取得して、余計なタグを全部取っ払って、こんな感じのシンプルなHTMLにしてUTF-8で保存します。
（ここまでタグを省略しても大丈夫でした）
2017年11月現在、ファイル名に全角文字は使えません。

```html
<!DOCTYPE html>
<head>
<title>勤務時間の上限は法律で決まっていますか。｜厚生労働省</title>
</head>
<body>
原則は労働基準法第32条で1週間40時間、1日8時間と決まっています。また、一定の条件を満たした場合には1ヶ月を平均して1週40時間にする制度（1ヶ月単位の変形労働制）や1年の労働時間を平均して1週40時間にする制度（1年単位の変形労働制）があり、これを超える労働を法定時間外労働と言い、いわゆる残業ということになります。<br />
　なお、法定時間外労働については、<a href="/new-info/kobetu/roudou/gyousei/kantoku/040324-4.html" class="ico-link">時間外労働に関する限度基準</a>という告示があります。
</body>
```

そして、HTMLファイルをDiscovery tool上でアップロードし、成功すると以下のようなビューで見ることができます。

![スクリーンショット 2017-11-24 18.01.01.png](https://qiita-image-store.s3.amazonaws.com/0/122917/0b7050f3-742b-5d65-849c-3f453cf95925.png)

![スクリーンショット 2017-11-24 17.59.24.png](https://qiita-image-store.s3.amazonaws.com/0/122917/ebd1154c-1d84-ed01-1034-bcd3ee6e8aa2.png)

# tool上で自然言語検索を試してみる

こんな感じで、tool上で自然言語検索を試すことができます。
![スクリーンショット 2017-11-24 18.03.27.png](https://qiita-image-store.s3.amazonaws.com/0/122917/a586b60a-511c-5d6b-7b01-163cc41d189d.png)

# トレーニング（機械学習）

この状態でも質問応答システムのバックエンドとして使うことはできますが、「この質問にはこの回答が適切だよ！」という教師データを作成して、トレーニングすることもできます。

上図右上「Train Watson to improve results」のリンクから、トレーニング画面に遷移したら、自然言語の質問を追加して…
![スクリーンショット 2017-11-24 18.04.38.png](https://qiita-image-store.s3.amazonaws.com/0/122917/f784a183-0ce0-baa4-f527-ea7ab9a96c56.png)

表示された結果に対して、適切かどうかを評価していきます。
![スクリーンショット 2017-11-24 18.06.06.png](https://qiita-image-store.s3.amazonaws.com/0/122917/b85b02bf-cd8e-8da2-cd11-599af5e9e4f4.png)

49以上の質問に対して上を繰り返すとトレーニングが始まります。
今回はこちらの作業は省略しました。

それにしても、R&Rと比べると遥かに簡単になっています。:thumbsup_tone2:

# Node-REDの定義

<img width="836" alt="スクリーンショット 2017-11-24 20.08.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/aa8184d2-b65d-6f9b-138b-25c45a4fb787.png">

Discoveryノードには以下のような項目があります。
<img width="509" alt="スクリーンショット 2017-11-24 20.09.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/1cc50f39-905c-019a-2ff6-4ac4f43ece44.png">

Environment ID、Collection IDは、以下の画面で確認できます。
<img width="1280" alt="スクリーンショット 2017-11-24 20.11.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/c7ddcff8-d195-6b84-afa8-1dbe210ae352.png">

Discovery以外のノード定義は、私が以前書いたこちらの記事とほぼ同じですので、参考にしてください。
[Watson Retrieve and Rankの公式ツールを利用して質問応答システムを作る (3)](https://qiita.com/y-some/items/f8fb81180e89900e1bca)

Node-REDにインポートするためのJSONも公開しておきます。
[GithubGist](https://gist.github.com/y-some/8bde13ed92c210b7bc3d86b289de8ef0)

# レスポンス

**レスポンスの取得方法**
Discoveryノードのレスポンスは、`msg.search_results`に格納されています。

**レスポンス項目**
今回の手順でアップロードした文書では、
　・文書ID
　・スコア（確信度）
　・タイトル
　・html
　・text
を取得することができました。

結果配列は確信度が高い順に並んでいるようです。
（資料上それが明記されている部分は探せませんでしたが）

**応答文書数**
リクエストパラメータで、応答で返す文書数を指定できます。
Discoveryノードでは「Number of documents」という項目で指定します。

**Passages**
Discoveryノードで「Passages」というチェックボックスをチェックすると、文書中の関連性の高い箇所が配列で返ってきます。
ただし、Node-REDのバージョンが古いと、Passagesチェックボックスが表示されず、取得できません。（falseで照会されるようです）

(2017/12/14 追記)
まだ日本語環境ではPassagesの内容が正しくないようで、実質使えません。

**エンリッチメント**
本来は、エンリッチメントの情報も返ってきます。
しかし今回は（日本語未対応のため）カスタム構成でエンリッチメントを削除していますので、その情報は返ってきません。

**レスポンスのサンプル**
API Referenceにて、レスポンスのサンプルJSONファイルをダウンロードできます。
[Discovery - API Reference - Query your collection](https://www.ibm.com/watson/developercloud/discovery/api/v1/#query-collection)

# おわりに

Discoveryの日本語対応は現在進行形で、まだ全機能は対応していません。
その真価は質問応答だけではありませんので、また後日触ってみたいと思います。