Watson Retrieve and Rankの公式ツールを利用して質問応答システムを作る (1)

# 2017年11月1日追記

[[Watson] Retrieve and Rankのサービス終了について](https://qiita.com/y-some/items/fc0937e031a3ab52d459)

# 概要

自然言語での質問に対して適切な回答を返す「質問応答システム」は、Watsonの最も得意とする分野です。
質問応答システムでは主にRetrieve and Rankサービス（以下R&R）を利用します。

R&Rは機械学習をベースとしたサービスであり、サービス利用者がデータを準備して学習（トレーニング）させる必要があります。

従来は、curlコマンドやPythonスクリプトを実行してトレーニングする必要がありました。
現在では、Retrieve and Rank Web interfaceという**ブラウザベースの公式ツール（以下公式ツール）を利用することで、視覚的にトレーニングが可能**になっています。

本稿では、ツールを利用してR&Rのトレーニングを行い、簡単な質問応答システムを作るまでの手順をシリーズ化して解説します。

**(1) R&Rおよび公式ツール利用開始〜回答データ投入　※この記事で説明する部分**
(2) 質問データ投入〜Rankerトレーニング
(3) Node-REDアプリケーションとR&Rの連携

# 免責事項

本稿におけるWatsonサービスに関する解説は執筆者の個人的な見解であり、公式資料に基づいていない内容を含みます。
また本稿の情報は2017年4月現在のものです。
必ず[Watson Developer Cloud](https://www.ibm.com/watson/developercloud/doc/retrieve-rank/index.html)などの公式資料も併せて確認してください。

# Retrieve and Rankの全体イメージ

R&Rは2つのコンポーネントを組み合わせてサービスを構成しています。

- Apache Solr ： オープンソースの全文検索エンジン
- Ranker ： 機械学習アルゴリズムを使用して関連性の高い回答を導き出す仕組み

<img width="480" alt="RR概念図.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/ca64acc1-e75b-24b9-8682-bbfa1b1bfb3b.png">

R&Rを利用する上で、この全体像の理解は非常に重要です。

# 準備

Bluemixアカウントが必要です。
まだお持ちでない方は、簡単にフリートライアルアカウントを取得することができますので、こちらを参照してください。

[Bluemix の基礎: フリートライアルを開始する - IBM developerWorks](https://www.ibm.com/developerworks/jp/cloud/library/cl-bluemix-fundamentals-start-your-free-trial/)

# R&Rの利用開始

## R&Rをサービス追加

Bluemixダッシュボードで「サービスの作成」ボタンをクリックすると、以下のような画面になります。
カテゴリーから「Watson」－「Retrieve and Rank」を選択します。
<img width="1195" alt="スクリーンショット 2017-04-29 8.14.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/c3fd3ff7-fe1d-8ea9-f02d-9bdfed30c163.png">

以下の画面で「作成」をクリックします。
<img width="1160" alt="スクリーンショット 2017-04-29 8.15.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/38ec8d25-aac3-2cd9-c7c1-db11cb168582.png">

## Document Conversionをサービス追加

公式ツールを利用する場合は必須ですので、R&Rと同じように追加します。

## 公式ツールを起動

Bluemixダッシュボードの「すべてのサービス」にてR&Rを選択すると、以下の画面に遷移します。
「Launch tooling」をクリックすると公式ツールが起動します
<img width="803" alt="スクリーンショット 2017-04-29 8.18.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/1c331d09-f1a9-49b1-0fa0-703626318cdc.png">

「Connect to service」をクリックします。
<img width="835" alt="スクリーンショット 2017-04-29 8.38.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/d6ddcc46-7243-d95f-ae18-54d04e9ee939.png">

クラスタ名を指定して「Create」クリックします。
<img width="813" alt="スクリーンショット 2017-04-30 14.29.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/0419f86b-160e-9251-e30e-3b8cfb4d4dac.png">

以下の画面に遷移しますが、裏で走っているSolrクラスタ作成処理が完了するまで「Create a new collection」ボタンが押せません。
途中ヘッダーにエラーっぽい表示がでますが、そのうち消えますので気にせず待ちます。
ボタンが有効になったらクリックします。
<img width="908" alt="スクリーンショット 2017-04-30 14.33.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/fdb758f6-bb58-1d0f-333f-c832c5323716.png">

Solrコレクション名と言語を指定して「Create」ボタンをクリックします。
<img width="1222" alt="スクリーンショット 2017-04-30 14.34.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/caa3a5e7-fe85-faa9-327c-e480474e0424.png">

Solrコレクションの作成が完了すると以下の画面に遷移します。
作成したコレクションの「→」をクリックします。
<img width="906" alt="スクリーンショット 2017-04-30 14.35.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/4b119043-d136-b8c8-f03e-79fede4a90e7.png">

チュートリアルの選択が表示されます。今回は「Start using Watson」を選択します。
<img width="480" alt="スクリーンショット 2017-04-29 8.57.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/c7095ba2-b2a1-813b-3b5b-8be6f4e2ef60.png">

以下のような画面に遷移します。
「Upload」ボタンにて回答データ（正確にはSolrコレクションドキュメント）をアップロードするわけですが、当然、データを準備しなければなりません。
ブラウザでの作業はここで一旦中断し、データを準備します。
<img width="1227" alt="スクリーンショット 2017-04-29 9.21.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/38a43f7a-373f-958e-d694-feff566a7e58.png">

# 回答データの準備

公式ツールからアップロードできる回答データの形式は、PDF、Word、またはHTMLです。

本当はFAQのような、質問と回答がセットになっており、しかもそれなりの数が揃った文書が入手できれば一番なのですが、一個人では著作権の問題もあり、なかなか難しいです。

というわけで私の場合はDBpediaから「北海道の観光地」の一覧を取得してソースとしました。

[DBpadiaのエンドポント](http://ja.dbpedia.org/sparql)にアクセスし、以下のクエリを実行します。

```
prefix dbp: <http://ja.dbpedia.org/resource/>
prefix dbp-owl: <http://dbpedia.org/ontology/>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?title, ?comment
WHERE {
        dbp:北海道の観光地 dbp-owl:wikiPageWikiLink ?thing.
        ?thing rdfs:label ?title.
        ?thing rdfs:comment ?comment.
}
```

こんな感じでtableが表示されるので、これを二次加工します。
<img width="1209" alt="スクリーンショット 2017-04-30 16.29.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/8c9203c3-ec95-d16e-3732-087f1ff247ad.png">


ブラウザの機能でソースを表示し、テキストファイルとして保存します。
この際、タイトルを\<h1>タグ、回答文を\<p>タグにするところがポイントです（後述）。

```html
<!DOCTYPE html>
<html>

<!-- 以下抜粋 -->

  <h1>小樽運河</h1>
  <p>小樽運河（おたるうんが）は、北海道の小樽市にある運河。大正12年（1923年）に完成した。</p>

  <h1>層雲峡</h1>
  <p>層雲峡（そううんきょう）は、北海道上川町にある峡谷である。大雪山国立公園に位置し、石狩川を挟み約24kmの断崖絶壁が続く。大雪山黒岳山麓にある層雲峡温泉は大型ホテルなどが立ち並ぶ北海道有数の規模を誇る温泉街で、層雲峡および大雪山観光の中心地となっている。</p>

  <h1>野寒布岬</h1>
  <p>野寒布岬（のしゃっぷみさき）は、北海道稚内市ノシャップにある岬。「ノシャップ岬」とカナで表記することも多い。日本海から宗谷湾を区切る。</p>

  <h1>摩周温泉</h1>
  <p>摩周温泉（ましゅうおんせん）は、北海道川上郡弟子屈町にある温泉。</p>

</html>
```

ファイルをUTF-8のHTMLファイルで保存します。

これで回答データの準備は完了です。公式ツールの作業に戻ります。

# 回答データのアップロード

以下の画面で「Upload」ボタンをクリックします。
<img width="1231" alt="スクリーンショット 2017-04-29 10.19.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/9180ae59-d049-4e12-39f1-7b95a0a23b55.png">

以下のダイアログで、先ほど作成した回答データのHTMLファイルを指定し、アップロードします。
<img width="480" alt="スクリーンショット 2017-04-29 10.20.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/41df1b9f-ada2-acca-0df1-2d8a80fc0877.png">
「Split my documents ...」のチェックボックスに注目してください。
前述の通り、HTML内の個々の文章に\<h1>\<p>タグをつけ、このチェックボックスをオンにすることで、個別の回答文として分割されます。
そうでない場合は、ドキュメント全体が一つの回答文と扱われます。

アップロードが完了すると以下の画面に遷移します。
<img width="1227" alt="スクリーンショット 2017-04-30 14.41.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/3c27e905-7cf1-f16b-c4ad-6af95971c0ab.png">

ここまでの作業により、Solrコレクションが完成したことになります。
「Try Out Watson」タブでは、Solrによる全文検索を試すことができます。
<img width="1207" alt="スクリーンショット 2017-04-30 16.02.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/fb6b8276-4eee-9958-5cc9-bef71fa098a8.png">


ただしここでの検索結果は、Solrのみによる検索結果です。
これに対してランク付けを行い、期待通りの回答になるように改善できるのが、Retrieve and Rankのミソです。

次回の記事では、質問文の投入と、回答のランク付けの作業を行っていきます。