【2019/2月更新】Watson Discovery Serviceが日本語対応したので、触ってみた【何、それ？】編

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/57fd205f-d00a-4b87-4c9f-c46c460e78d0.png)

:triangular_flag_on_post: 当記事の初版は2017/9月に書いたものですが、Discoveryは日本語フル・サポート始めガンガン機能拡張が入っているので、2019/2月時点で内容を最新版にアップデート[^1]しました。

当記事は2部構成とし、①「何、それ?」という方向けの「ご紹介編」と②実際の手順をご紹介する「やってみた編」に分けてます。大筋だけ知りたいけど手を動かすほどじゃない、って方は当記事だけお目をお通しくださいませ。

[^1]: 従来は「初版に差分を追記」という感じでしたが、今回は全面改訂して画面コピー等も取り直しています。末尾に改定履歴をつけてます。


- [【やってみた】編はこちら](https://qiita.com/ishida330/items/bb1bd4cf61da9b9c6da2)です (:warning: 2019/2月　SDUを使った最新版に更新済）


# Watson Discovery Serviceって何?

一言で言えば「**コグニティブ・クエリー**」でしょうか。ホームページでの謳い文句を翻訳すると「データから回答を見つけ出したり、トレンドやパターンをモニターすることでデータの隠れた価値を解明できる世界で最も先進的なクラウドネイティブの洞察エンジン」ということですが、要は「**pdfやWordなどの文書群をとにかくぶち込めば、そこに書いてある文章を解釈して、あれこれ気の利いたデータを自動的に付加してくれて、それによって検索や回答の精度を上げてくれたり洞察を与えてくれる賢い照会・検索エンジン**」だと思っていただけばよいかと思います。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/d85c1844-ec8d-66e2-041e-8173252e45fc.png)

- オンプレのソフトウエアであるWatson Explorer(Advanced Conmponent)をご存知の方は、仕組みは違えどあれのクラウド版みたいなもの、と思っていただいて（大筋は) 結構です
- 従来別々に提供されてきた様々なWatson APIのサービスは以下のような感じでDiscoveryに統合され、より使いやすくなってます
- ![image](https://qiita-image-store.s3.amazonaws.com/0/108535/5cfaecd6-5866-b765-685f-da5bb7ca1af5.png)
- :heavy_exclamation_mark:ロングテールのQ&A用に、従来も Retrieve and RankとDocument Conversionというサービスがありましたが、[既にサービスは停止されています](https://www.ibm.com/blogs/bluemix/2017/10/make-switch-document-conversion-retrieve-rank-services/)。**後継はWatson Discoveryの「Relevancy Training」機能**になります。 
- ずっと以前、似た名前で「Watson Discovery Advisor」というものがありました。課題感は似ていますが**全くの別物**です
- 2018/06/26より**日本語がフルサポート**になりました！フル対応とは、要は「**日本語でも文書を勝手にエンリッチしてくれて、賢い文書の検索ができるようになった**」[^2] 、ってことです。

[^2]: 今までもWatson_Knowledge_Studioのエンリッチはできましたが、今回NLUが日本語対応したので、Discoveryはその恩恵を享受できるようになったものです。

:blue_book: :[Release Note](https://console.bluemix.net/docs/services/discovery/release-notes.html#release-notes)


# Watson Discovery Serviceって何がいいの?
以下がWDSサービスの特長です。

:white_check_mark: 膨大な文献・文書データの準備が楽
:white_check_mark: 膨大な文献・文書の照会・検索が迅速に行える
:white_check_mark: 話し言葉でも検索できる（サーチと自然言語処理の融合)
:white_check_mark: 自然言語処理(NLP)をカスタマイズできる
:white_check_mark: 機械学習(NLU)による文書のエンリッチメント(英語のみ）
:white_check_mark: 構造化データと非構造化データの両方を扱える
:white_check_mark: クラウド上のサービスなので構築の手間が不要
:white_check_mark: 日本語を始め９ケ国語を扱える
:white_check_mark: 様々なコグニティブ・サービスが１つに統合されており、使い勝手がシンプル
:white_check_mark: ずっと無料のLiteプランからお金持ち向けのPremiumプランまで、サービス・プランの選択肢が豊富
:white_check_mark: 東京データセンターが選べる
:white_check_mark: AIアシスタントであるWatson Assistantとの容易な統合

まあ、ぶっちゃけ申しますと似たような「**AIフレーバーの検索API/サービス**」は他社様にもあるのですが、APIがバラバラで統合されていなかったり、まだベータ段階だったり、日本語未対応だったり、、、という「初期段階」「MVP」との印象です。**すでに本番のサービスで東京で動いていて日本語も扱える**という意味で、Watson Discoveryは現時点でも最も進んでいるサービス、と言えるとおもいます。

IBM Cloudの[カタログ](https://console.bluemix.net/catalog/services/discovery)からインスタンスを簡単に作れます。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/085f47e9-6d7d-7804-5914-ad98d4c273d1.png)

# Watson Discoveryって何に使えるの?(ユースケース)

基本は「大量の文書（構造化・非構造化データ)」に対して照会をかけて洞察・知見を導く、ってことですが、大きくは下記３つの利用軸が考えられます。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/a37b7dbe-f2e2-2550-d425-81608d70a422.png)

具体的には以下のようなユースケースが考えられます。

|業界・業種|文書例|利用場面|
|:---:|:---|:---|
|保険| 業務規定集|査定で申請文書が規定のプロセスに沿っているか、チェックする(自動支払点検)|
|製造|製品マニュアル|フィールドサポート担当者が故障事象から、原因や対策・必要部品を素早く特定する|
|顧客サポート|会話ログ|コールセンターにて「お客様の声(VoC)」や評判の傾向を分析する|
|製造|苦情メール|クレームの傾向から製品不具合を早期に発見する|
|研究機関|特許情報・論文等|膨大な専門分野の文献から、望む情報を素早く取り出す|
|リーガル| 判例|法律事務所で、膨大な判例や事案から類似したケースを素早く抜き出す|
|共通|商品レビューやアンケート|マーケティング部門が自社およびブランドの評判の推移トレンドを分析する|
|共通|ニュース・決算情報|膨大な市場の情報から競合や買収対象の企業の情報を効率的に抜き出す|
|共通|マニュアル|Q&Aシステムで、通常のFAQに含みずらいロングテールな質問に対しても何らかの回答を提示する|

# アーキテクチャー

以下がWDSの大きい処理の流れです。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/c7c1f27c-5ee7-2e79-9eb2-32ce26033f32.png)

|フェーズ|説明|
|:---|:---|
|Data|様々な形式の文書|
|Ingestion[^3]|文書の取り込みと前処理を実施|
|Storage|内部的に索引が作られ保管されます|
|Query|照会または質問を投げます|
|Output|照会結果、回答、パターン、傾向など|

「クエリ・検索」の仕組み面では、事前に文書を取り込んだりクロールして内部的に索引を作っておき、その索引を検索の対象にします。リアルタイムでデータソースに直接、検索をかけるわけではありません。

[^3]: Ingestionは本来は「食物の摂取」など「何かを取り込む」感じの意味ですが、Qiita読者の皆様には「(データの)ロード」と呼んだほうがわかりやすいかもしれませんね。

# 扱えるドキュメント形式（文書)
以前はHTML/PDF/Word/Jsonの4種でしたが、 :new:2019/2月から[SDU(Smart Dosument Understanding)がサポート](https://console.bluemix.net/docs/services/discovery/sdu.html#sdu)され、Excel/PowerPoint/Imageが加わりました。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/5984b666-b3c3-6d49-a23e-4bb8f6b91963.png)

| 形式 | Query | SDU(Lite) | SDU(Advanced)|
|:--|:--:|:--:|:--:|
|HTML| ○ | - | - |
|PDF| ○ | ○ |○ |
|Word| ○ | ○ |○ |
|JSON| ○ | - |- |
|Excel| ○ | ○ |○ |
|PowerPoint| ○ | ○ |○ |
|Image(PNG,TIFF,JPG)| - | - |○ |

- 素のtextはサポートしていません ( が、pdfやWordに変換すればいいでしょう）
- 一文書の最大サイズは50MB
- 文書内のイメージやJavaScript等は無視されます
- SDUは利用しているプランにより対象が異なります
- PDFやExcelでは表の中身も照会できるようになりました
- イメージはPNG/TIFF/JPG内のテキストを検出します
 
## Connector

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/92a8ae78-8cc5-0e89-ef68-0ba9a8467d8c.png)

:blue_book: [Connecting to Data Sources](https://console.bluemix.net/docs/services/discovery/connect.html#sources)

文書だけでなく、様々なデータストアとのコネクターをご用意しています。これらのデータストアとUI操作だけで簡単に連携してコンテンツを検索できます。

- 以前はクローラーがありましたが、**2019/2月時点では非推奨**です
- 今後の機能拡張はConnectorに対して行われますので、クローラーは使わないほうが良いでしょう
- Sharepoint、Boxなど既にConnectorが提供されているデータストアではクローラーはサポートされません
- まだDBなどがConnectorに入ってないので、そこはクローラー使えます
- ConnectorはAPIの形式でも使えます。APIのほうが細かいオプションをあれこれ指定できます。翻ってUI(Discovery Tooling)は「設定の簡単さ」重視です
- IBM Secure Gatewayと連携してオンプレミスのデータソースもクロールできます

ConnectorはUIで定義するだけですがクローラーはJavaベースで定義ファイルを用意したり面倒ですから、今後はConnectorをご利用ください。

<details><summary>以下は昔のクローラーの記述。ご参考として残しておきます</summary><div>

Javaベースのクローラーが提供されています。 (別途ダウンロードして導入要)　クローラーでは以下のコネクターを利用できます

:one: ファイルシステム
:two: データベース(JDBC経由)
:three: CMIS(Content Management Interoperability Services)
:four:ファイル共有(SMB , CIFS, Samba)
:five: SharePoint / SharePoint Online
:six: box

:warning:注意事項

- クローラーはコマンド・ベースです。UIはありません
- Linuxのみ対応しています
- インターネット上のHTMLページをクロールする機能はありません(でもGitHub上に[Watson Discovery Service indexing plugin for Apache Nutch](https://github.com/IBM-Watson/nutch-indexer-discovery)というのがありました)
- クローラーはリモート・システムから大量の文書をアップロードするためのものです。ローカルファイルを利用する場合は通常のアップロードが推奨です
-  [Watson Discovery ServiceのData Crawlerでデータベース(MySQL)をクロールしてみた](https://qiita.com/ishida330/items/f7cc6d2ea0439fa67b10)の記事を書きました


</div></details>


## Watson Discovery News(:jp:日本語ニュースも!)
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/2474d2a6-aa24-9e62-8957-fb1a653ffba8.png)

[Watson Discovery News](https://console.bluemix.net/docs/services/discovery/watson-discovery-news.html#watson-discovery-news)という巨大なニュースのデータセットが容易されており、簡単に利用できます。[2018/7/29からは日本語のニュース提供も開始](https://qiita.com/ishida330/items/5afa235ac6a0461f7e5a)しています。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/7151f599-0290-4ad3-2a04-a6a577e6dfb9.png)

- Discoveryのインスタンスを作るとデフォルトで表示されます
- 過去60日間のニュースを保持（超えると消えていきます）
- エンティティやキーワードなどNLUによるエンリッチ済のデータセット
- ニュース・アラートやイベント検知、トピックのトレンド理解などに

[デモサイト](https://discovery-news-demo.mybluemix.net/)ではニュースをデータソースにした企業分析の例をご覧いただけます

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/8349aaa5-66a5-925a-c320-3cb1a412281a.png)



# Discovery Tooling(UI)とAPI

Discoveryは①ブラウザー上のUIツール(Discovery Tooling)と②APIの両方でアクセスできます

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/7ebce1e5-c3f6-c8e0-201e-f6e2cf8e658e.png)

# 日本語で何が出来て、何ができないの?

以前は英語と日本語でサポートする機能に差があったのですが2018/6月にフルサポートしたことで（表向きには）**機能差はほぼ無くなりました**[^4]。

[^4]: ベータのため英語のみ、など一部日本語で使えない機能は相変わらずあります。

言語毎の細かいサポート状況は[Supported Language](https://console.bluemix.net/docs/services/discovery/language-support.html#supported-languages)のページに機能とサポート言語が書いてあります。2019/2月時点で簡単にまとめます。

| 種類 | サポート言語 |
|:---|:---|
| Basic | Arabic (ar) / Chinese, simplified (zh-CN) / Dutch (nl)  |
| Full |  English (en) / French (fr) / German (de) / **Japanese (ja)** / Korean (ko) / Spanish (es) / Italian (it) / Portuguese, Brazilian (pt-br)|

| # | 機能 | Basic | Full(:us::jp:) |
|:---|:---|:---:|:---:|
| 1 | 文書の変換 | :ballot_box_with_check: | :ballot_box_with_check: |
| 2 | 他のWatson APIとの統合 | :ballot_box_with_check: | :ballot_box_with_check: |
| 3 | Discoveryツールの対応 | :ballot_box_with_check: | :ballot_box_with_check: |
| 4 | Front-end API (Front-end Query API除く) | :ballot_box_with_check: | :ballot_box_with_check: |
| 5 | 言語に最適化されたインデックス | :ballot_box_with_check: | :ballot_box_with_check: |
| 6 | 適切な回答のトレーニング(Relevancy training) | :ballot_box_with_check: | :ballot_box_with_check: |
| 7 | Watson Knowledge Studioカスタムモデルの利用 | :ballot_box_with_check: | :ballot_box_with_check: |
| 8 | 言語の検知(Language Detection) | :ballot_box_with_check: | :ballot_box_with_check: |
| 9 | 文書中の該当箇所の提示(Passage retrieval) |  | :ballot_box_with_check: |
| 10 | 翻訳されたWKSインターフェース |  | :ballot_box_with_check: |
| 11 | NLUによるエンリッチメント |　| :ballot_box_with_check: |


日本語はフル・サポートされている言語なので
- :o: 基本的な検索や質問は日本語の文書が扱える
- :o:「この質問にはこっちの回答のほうがいいよ！」と教えること(Relevancy Training)もできる
- :o:「あれこれ気の利いたデータを自動的に付加してくれる」(NLU Enrichment)機能も使える
- :o:「文書のここにヒットしてるよ！と教えてくれる」機能(Passage Retrieval)も使える
ってことですね。

[Supported Language](https://console.bluemix.net/docs/services/discovery/language-support.html#supported-languages)のページによると2018/8時点で英語のみ:us:なのは以下の機能です
>English-only support
The following features are currently supported in English only:
Element Classification enrichment
IBM Watson™ Discovery Knowledge Graph (beta)
Document deduplication (beta)

逆に**日本語のみ**のサポートとして以下が書かれています。
>Custom tokenization dictionaries

# Discoveryの環境面の絵

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/2063eb4c-d945-7fbe-dd71-697dc1971e1b.png)

- Discoveyのインスタンスは複数定義できます
- インスタンス毎にEnvironmentが用意されます 
    - Environmentとは、要はストレージ領域でプラン毎に利用できるサイズは異なります
    - 無料のLiteプランでは1000文書≒100MB程度が上限 
    - ストレージ・サイズの上限は1TB位が目安と聞いてます
    - 標準で使えるNewsのCollectionは利用ストレージの勘定にいれません
- Environmentの中に実際の索引単位であるCollectionを作成できます
    - 基本的に、文書のアップロードや照会は1つのCollectionに対して行います
    - 複数のCollectionを作ることもできますが、Collectionの単位は業務やドメインの単位にまとめるのがよいでしょう。 関係のない文書が何でもかんでも入ってるゴミ箱のようなCollectionでは、照会結果にノイズが増えてしまいますから

## 日本語Collectionの作成

パネルのUIで「Japanese」を選べば作れます。

![discovery_jp_collection.gif](https://qiita-image-store.s3.amazonaws.com/0/108535/d015f6f1-dcf0-67e7-735b-1f0d52072d78.gif)

<details><summary>以前のCurl/APIを使う方法の記載も残しておきますが、もうこの手順で作る必要はありません</summary><div>

[API Reference - Create a collection](https://www.ibm.com/watson/developercloud/discovery/api/v1/#create-collection)

```bash:curlで日本語のcollectionを定義
>curl -X POST -u "dab333a2-0a6f-41a9-9e6b-xxxxxxxxxxxxxx":"xxxxxxxxxxxxxx" -H "Content-Type: application/json" -d '{  "name": "jp_collection",   "description": "My test collection",  "language": "ja" }' "https://gateway.watsonplatform.net/discovery/api/v1/environments/1b519542-9450-4316-ac21-xxxxxxxxxxxx/collections?version=2017-11-07"

----以下は戻り
{
  "name" : "jp_collection",
  "collection_id" : "05e96bca-cf07-4975-af5e-xxxxxxxxxxxx",
  "description" : "My test collection",
  "created" : "2017-11-16T04:27:25.065Z",
  "updated" : "2017-11-16T04:27:25.065Z",
  "configuration_id" : "0e99be1d-13cd-45de-xxxxxxxxxxxxxxxxx",
  "language" : "ja",
  "status" : "active"
}

```


</div></details>

## 構成(Configuration)

(2019/2) 以前はCollectionを作成したら、文書をアップロードする前に「構成」を定義していましたが、今は「構成」のパネルは無くなっています。( 今でも細かい変換の定義ファイルを書けば可能）

- 「構成」は「文書を変換して索引を作る際のルールの定義」です
- デフォルトの構成が用意されていますが、カスタマイズ可能です
- (一部は）UIツールまたは（全体は)APIで定義できます

右上のConfigure Dataをクリックすると、3つの設定タブがあります
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/6888ce27-eda8-0eb7-f413-fadd02533fc4.png)

以前は以下のように「Convert/Enrich/Normalize」をパネルで定義出来ましたが、今はEnrichのみがパネルで定義可能です。Convert/Normalizeのカスタマイズは機能としては残っておりAPI経由でカスタム構成を組めば可能です。詳しくは :blue_book: [Configuring Your Service](https://console.bluemix.net/docs/services/discovery/building.html#configservice)をご参照ください。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/861e478a-b0e5-0b86-ca98-6271d7f879ca.png)

:warning:注意点

- デフォルトの構成（Default Configuration)では以下の4種類のエンリッチメントが有効になっています。それ以外のエンリッチメントを使いたければ明示的に追加登録する必要があります
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/a350a3b6-0e79-7d76-b6a7-ce8bc61c105e.png)

- 文書のアップロード後に構成情報を変更することはできますが、変更前にアップロードした文書は既に索引が作成済のため、変更内容は反映されません。定義を反映したければ文書を再度アップロードする必要があります。

# 文書の準備(Ingestion)

構成が固まったら、Discoveryで照会を行うため文書群をDiscoveryに格納します。このIngestionパイプラインは大きく３ステップから構成されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/b98f4f52-7970-0279-3b2e-7e2f4b86ec0b.png)

最新版では基本的に「デフォルト構成」が基本のようですので、**文書をアップロードするだけ**であり、とても簡単です。（カスタマイズは可能です）
以下、上記パイプラインに沿ってご説明します。

## 文書のアップロード
文書は以下の3通りの方法でDiscoveryにアップロードできます。

1. UIツール経由でのファイルのアップロード
2. API経由
3. Connector経由

【UIでのアップロード画面】
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/38086148-e9bb-ea63-21c5-0c0fd631dd67.png)

## 1) 文書の形式変換(Convert)

文書がDiscoveryにアップロードされると、内部的には以下の流れで変換(Convert)され、最終的にはJSON形式になり内部インデックスに保管されます。(Discoveryのプランに記載のストレージのサイズはこの変換後のJSONの格納サイズです）

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/6008ac49-56eb-8a50-9330-c6ef4e2b9889.png)

Discoveryは変換の過程で文書中の文節の区切りや文書のタイトルを識別しますが、WordやPDFではフォントのサイズ、HTMLの場合はh1などのタグで識別します。必要であれば、「構成」で文書種類毎にどうタイトルや文節に区切るかをルールとして指定可能です。（デフォルトあり）

更に「HTML中のJavaScriptを除去する」とか「文書中のイメージ部分を除去する」といった不要な部分をそぎ落とす処理も行います。

:new: [Release Notes](https://console.bluemix.net/docs/services/discovery/release-notes.html#release-notes)によると2017/10/3付で**Document segmentation**という機能が搭載されました。大きなHTML/Word/PDF文書をHTMLのH1-H6タグのレベルで分割するものだそうです。詳細は[Splitting documents with document segmentation](https://console.bluemix.net/docs/services/discovery/building.html#doc-segmentation)をご参照ください。(ちら読みした限りでは、注意点もいくつかありそうです）

## 2) エンリッチメント(Enrichment)

「エンリッチメント」という用語はあまり使われないので「？？」と思われる方も多いかと思いますが、Discoveryにおいては一連の文章から「興味の対象」となるフィールドを抜き出して、元の文書に追加することです。（「元の文書をもっとリッチにする」って感じでしょうか。Information Extractionとも言います。)

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/2a0c52b4-4747-1c15-7523-ba73a19f5f69.png)

例えば上は洗濯機に関する消費者のレビューの文書ですが、「お客様の声」の分析において、ここから「製品名」「カテゴリー」「モデル」「色」「クレームの内容」などのフィールドを抽出して元の文書の横に添付しておけば、あとで照会する時に「クレーム内容別の件数集計」やトレンドの分析などに使えますよね。また単なる「文書に対する全文検索」だけでなく「エンリッチしたフィールドに対する検索」も可能になります。例えば「2017/10月の製品レビューで、ポジティブ/ネガティブな意見の件数はそれぞれ何件？」という調査が簡単にできます。「非構造化データから洞察・知見を導く」との謳い文句は例えばそういう意味です。

### Discoveryではどんな「エンリッチメント」ができるの? 

DiscoveryではIngestionパイプラインの処理過程で自動的にエンリッチメントが行われます。「どんなエンリッチメントをしたいか」は事前に構成で指定しておきます。実装イメージでは元の文書にエンリッチされたフィールドが追加されたJSONの形式になります。以下は元の文書に「センチメント分析」の結果(positive/netative/neutral)を追加した場合の例です。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/2b44da4d-4185-230d-0728-f5e685a9e296.png)

Discoveryでのエンリッチメントは大きく２種類に分類できます。

1. **NLU(Natural Language Understanding)**による（標準の）エンリッチメント　- :jp: 日本語も扱えます
2. **Watson Knowledge Studio**によるカスタム・エンリッチメント - :jp: 日本語も扱えます

なお、なおデフォルトモデル(NLU)とカスタムモデル(WKS)を併用したばあい、デフォルトモデル(NLU)は上書き(無視)されます。

### NLUエンリッチメント
[NLUはDiscoveryとは別の独立したAPIサービス](https://www.ibm.com/watson/services/natural-language-understanding/)であり、単独で使うこともできますが、DiscoveryはNLUと統合されており、Discoveryで「こういうエンリッチメントがしたい」と指定しておけば自動的に実行してくれます。(NLUの分の課金も不要です）

| # | 種類 | デフォ | 意味 | 例 |
|:---:|:---|:---:|:---|:---|
| 1 | Entity Extraction | :ballot_box_with_check: | 人名/場所/会社名など | IBM / Watson |
| 2 | Sentiment Analysis |  :ballot_box_with_check:  | センチメント | positive/negative/neutralの3つ |
| 3 | Category Classification | :ballot_box_with_check:   | 所定の5階層のタクソノミー | art and entertainment->radio->podcast  |
| 4 | Concept Tagging |  :ballot_box_with_check:  | 隠れたコンセプト | 「CERN」と「ヒッグス粒子」の文章から「大型ハドロン衝突型加速器」を導く  |
| 5 | Keyword Extraction |  |文書にとって重要なキーワード | エンティティと被ることもある |
| 6 | Emotion Analysis -　:us: 英語のみ|  | 感情 | anger/disgust/fear/joy/sadnessの5つ  |
| 7 | Semantic Role Extraction |  | 主語・述語・目的語の関係を抽出  | 説明が難しいので[こちら](https://console.bluemix.net/docs/services/discovery/building.html#adding-enrichments)を参照 |

- Discoveryは内部的にNLUサービスを呼び出すので、使う側ではNLUは意識不要です
- 1文書の先頭の50000文字がエンリッチの対象です 
- エンリッチの対象はこんな感じで事前に構成にて指定します。複数のエンリッチを同時に指定することもできます。 
- ![image](https://qiita-image-store.s3.amazonaws.com/0/108535/b7386d79-da38-7ba4-ebf5-4c72cd3d42af.png)
- NLUで認識できるエンティティとカテゴリーは「一般的な項目＝事前にIBM側で定義された項目」だけです。([ここ](https://console.bluemix.net/docs/services/discovery/categories.html#categories-hierarchy)にNLUでどんな項目を認識するかのリストがあります）
- エンリッチと同時に0-1.0の適切さ/確信度のスコア(Relevarance)も返します
- NLUのConcept Taggingでは[dbpedia](http://wiki.dbpedia.org/)の知識を活用しています

### WKSを用いたカスタム・エンリッチメント

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/df146502-04c8-93b9-0cf8-9232a8342874.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/72fb9589-63f6-4ccb-14d4-56a542f16849.png)

Discoveryは前述のNLUエンリッチメントを内蔵していますが、残念ながらNLUでは「興味の対象=エンリッチしたいフィールド」を自由にカスタマイズすることはできません。たとえば文章中に「A123」という自社製品のパーツ名（固有名詞）があるとして、IBM側でトレーニングしたNLUは「A123」という単語に出くわしても「あ、これはお客様製品の固有のパーツ名だな！」と知る由もありません。結果、「文書からウチの製品の名称とモデル名称、パーツ名、パーツ番号を抜きたい」てなことは通常のNLUではできません。
しかし[Watson Knowledge Studio](https://www.ibm.com/jp-ja/marketplace/supervised-machine-learning)を使うと、これができるようになります。WKSは情報抽出(Information Extraction)のための機械学習モデル（カスタム・アノテーター)を作成できますが、このモデル(アノテーター)をWatson Discoveryに取り込んで利用することができます。（日本語もOK) これによりNLUの提供する一般的な概念モデルだけではカバーできないお客様固有の文脈に合わせた情報抽出が可能になります。「お客様固有の文脈に合わせた情報」とは、たとえば「自社の製品名・型番・パーツ#」や「部門名」「社内用語」「業界特有の言い回し」など、一般的な知識だけでは「これはＸＸだな」と解釈できないようなフィールドのことです。具体的には、WKSのUIツール上で「ここはウチの製品のパーツの名前だよ！」とラインマーカーで線を引くように印をつけ「PARTS」というタイプに割り当てる、といった作業（アノテーション）を行っていくと、そこから機械学習して「製品のパーツ名を抽出する」カスタム・アノテーターが作られます。

- 前述の通りエンリッチメントには様々な種類がありますが、WKS&日本語で利用できるのはEntityとRelationに関するエンリッチメントになります。詳しくは[こちら](https://console.bluemix.net/docs/services/natural-language-understanding/language-support.html#japanese)

【WKSで作ったモデルをDiscoveryで利用するイメージ】
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/6e7d0a1b-6eb5-71e7-d311-43cb66c01b6d.png)

要は、業務での要件に合わせてWKSで(例えば）サンプルの1000文書をトレーニング（アノテート）して一旦独自の機械学習アノテーター(カスタム・モデル）を作ってしまえば、Discoveryではそのアノテーター(モデル)を使って100万文書からの抽出を自動的に/楽に行える、ってことです。

:notes: WKSのモデルの取り込みはDiscovery Toolingからは行えません。APIを使う必要があります。(cURLで代用できます）

### Smart Document Understanding(SDU)
SDUは2019/2月にGAになった新しい機能です。「エンリッチ」とはちょっと違うのですが、毛色が似ているのでここでご紹介します。

![SDU-01.gif](https://qiita-image-store.s3.amazonaws.com/0/108535/43867aed-e057-5f31-a450-3a1e5edc396a.gif)

要は構造の決まっていない文書に対して、上記のように文書を表示しながら「ここ、タイトルだよ～」とか対話式に教えてあげると、それを**学んでよしなにメタデータを抜いてくれる**、って話で、前掲の「Watson Knowlegde Studio」の簡易版のようなもの？と思ってます。

 :newspaper: 「[Watson Discovery の新機能のベータ公開に伴い、一部UIパネルの操作が変わりました(＋ちょっとだけSDUのご紹介)](https://qiita.com/ishida330/items/95070fcbe39be4f04246)」で、もう少しだけ詳しくご紹介しています。

## 3) 正規化(Normalize)

インデックスを作る前の最後の調整やお掃除を行いますが、殆どの場合デフォルトでよろしいかと。

- フィールドを移動、マージ、コピー、削除
- データが無い空白のフィールドを削除するかどうか

APIを使えば[CSS Selectorを書いて独自の複雑な変換を行う](https://console.bluemix.net/docs/services/discovery/building.html#normalizing-entities)こともできます。

# 照会(Query)

(冒頭の絵を再掲しますが)照会はUIツールとAPIのどちらでも行えます

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/c2a59d05-9c78-5370-85c7-346827093b04.png)

## Discoveryでの照会の種類

大きくDQL(Discovery Query Language)を用いたQueryと自然言語による照会が可能です。

| 種類 | 用語 | 方法 | UIツール | API | 
|:---|:---|:---|:---|:---| 
| 照会 | Query |  DQL  | :white_check_mark:  | :white_check_mark: | 
| 絞り込み | Filter | DQL | :white_check_mark:  | :white_check_mark: | 
| 集約 | Aggregation | DQL | :white_check_mark: | :white_check_mark:  | 
| 自然言語照会 | Natural Language Query(NLQ) | 自然言語 | :white_check_mark: | :white_check_mark: | 

## Discovery Query Language(DQL)

Collectionを照会する際にはDiscovery独自の照会言語であるDQLを利用できます。どんなものかの感覚を掴んでいただくためにいくつか例をお示しします。

| DQL | 意味 | 注 | 
|:---|:---|:---| 
| text:Watson,text:Macy's |  Watson 及び(and) Macy'sという単語を含む文書 |   シンプルな全文検索 | 
| enriched_text.entities.text:IBM | EntityのtextにIBMを含む文書 |   | 
| enriched_text.entities.sentiment.label::positive | センチメントがpositiveの文書 |  | 
| term(enriched_text.concepts.text).top_hits(10) | コンセプトのTop10 |  | 
| max(product.price) | 商品価格の最大値 | DBなどの構造化データ利用時 | 


- 上記で:us:のマークがついているものでは「エンリッチ」で追加されたフィールドに対する照会のため、日本語環境では現時点は利用できません
- 集約で面白い機能として（APIのみですが）①histogram(数値を使ってヒストグラムを作れる) ②timeslice(時系列に並べる)などもあります。なお、timesliceでは時間経過に伴う外れ値の検知(Anomary Detection)もできます

[Query building](https://console.bluemix.net/docs/services/discovery/query-reference.html#query-building)のドキュメントにDQLの構文が掲載されています。

## Visual Query Builder(VQB)
Visual Query BuilderというUIツールでDQLを組み立てられますので、慣れるまではUIツールで実行するのがよいでしょう。

Visual Query Builderでの照会はこんな感じです
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/17ccbb49-7a7f-f7da-0322-11943cd0f532.png)

Queryの条件を指定すると下の方にDQLが表示されます
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/b8d54ad3-be2e-0e82-cc7a-379822d07a9a.png)

他にもオプションを指定できます
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/b688e274-1e28-53cd-d4fd-a45a690a8117.png)

- 複数のCollectionを跨る照会はVQBでは未サポート。APIで実行する必要があります

#### QueryとFilterはどう違う?
[Difference between the filter and query parameters](https://console.bluemix.net/docs/services/discovery/query-reference.html#query-building)

QueryとFilterは、どちらも「条件に合う文書に絞り込む」という意味で非常に似ていますが、Discoveryの仕組み上は下記の違いがあります。

| 種類 | 用語 | 結果の並べ替え | 結果のキャッシュ | 
| :--- | :--- | :--- | :--- | 
| 1 | Filter |  行わない（順番は保証されない)  | する | 
| 2 | Query | 適切(Relevancy)の高い順に並べ替える | しない | 


- FilterとQueryはDQLで同時に指定できます
- 同時に指定した場合は①まずFilterが適用され②次にQueryで結果を並べ替えます
- 非常に小規模なデータセットではどちらも似たようなもの
- 大規模なデータセットではまずFilterを先に実行すべき(キャッシュで高速化が期待できる)

## 自然言語による照会( Natural Language Query)

DQLを使わず、普通の話し言葉で質問することもできます。(日本語も使えます)
以下のようにツールから入力することもできます
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/22afc057-ed8b-80a0-7d9d-c52aac29fea3.png)

## 「この質問への回答はこっちの方が適切だよ！」( Relevancy Training )

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/974852df-4c07-1508-938e-f2ff76303d2b.png)

「質問に対する回答の適切さ・優先順位のトレーニング」は従来Document ConverstionとR&Rで行っていましたが、Discoveryではより簡単になりました。今までは①DCで文書を変換 ②Apache Solrの構成 ③R&Rへの文書の登録(GT作成) ④優先度のトレーニングと様々な手順を踏む必要がありまして、正直「面倒くさい！」感じでしたが、Discoveryでは①～③は一気通貫で自動的に行われますので、文書をIngestしたら④のトレーニングをするだけで済みます。なお、**Relevancy Trainingは自然言語照会に対して行うモノ**です。前述のDQLに対しては適用できません。

以下はトレーニングの画面例です（APIでも行えます)

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/ea3d6fa0-89ff-3173-6ae0-a5b78df44dd3.png)
 
- R&Rで以前提供されていたUIのトレーニングツールと同じようなもの
- 1 Environmentあたり最大4Collectionまで適用可能
- 最低でも49個の質問について適・不適を回答する必要がある
- 質問-回答作業を継続し、所定の品質に達するとパネル上部の表示が消えてトレーニングが自動的に実行される
- 質問はユーザーが実際に使った、または使うであろうものが望ましい
- 質問と回答には同じ用語が含まれるようにすると精度が上がる
- 回答の際の適切さのスコアはAPIでは0-100まで設定可能
    - ただし普通は3-4段階程度であり、そこまで幅広く構えない
    - UIツールではスコアは適=10 不適=0で計算する
    - （無いと思いますが）もし仮にUIツールとAPIの両方でトレーニングする場合は、上記スコアのスケールを合わせておかないと、精度が引っ張られるので注意(APIで0/10/50/100のスケールを使ってしまったら、UIの0-10のスケールの影響は非常に小さいものになる)

:triangular_flag_on_post: (2017/12/27) ある方から「上のトレーニングの画面って、どうやって入るの？」と聞かれたので追記します。左側の「Build Query」ボタンを押して表示されるパネルの右上「Train Watson to improve results」のリンクをクリックします。(ちょっとわかりずらいですね)
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/bf91b6dc-7a0f-6789-3bea-6b3201fb8e80.png)

## トレーニングが面倒なら「Continuous Relevancy Training」

前項のRelevancy Trainingは質問/適切な回答のペアをひたすら一定量、地道にトレーニングする必要があり**面倒だ**、との声を反映し「勝手に勉強してくれる」モード＝[Continuous Relevancy Training](https://console.bluemix.net/docs/services/discovery/continuous-training.html#crt)ができました。

- ディスカバリーが時間の経過とともに最も関連性の高い回答を自動的に学習します
- ユーザーとの対話から自動的に学習してディスカバリーの関連性を手動トレーニングの時間と労力を削減します
- モデル性能を改善するために、人工的に作られたトレーニングセットではなく、実際に使われたデータを使ってトレーニングします
- データの使われ方に沿って自動的にトレーニングを実施してモデルを更新するので、新しいトレーニングデータを手動で作成する手間を削減できます

- 有償のAdvanced plan のSmall以上またはプレミアムのご契約が必要です。残念ながら無償のLiteプランではお試しいただけません。
- CRTはEnvironmentのレベルで有効化します。より細かいCollectionのレベルで使う・使わないの制御はできません。
- 最大でコレクション5つまでCRTを有効にできます
- 学習データは実際のユーザーのクリック・イベントです。よって事前にアプリケーションでイベントAPIを使ってイベントを記録しておく必要があります。
- CLSの学習を起動するには最低1000個の(イベントに紐ついた)自然言語照会が必要です。イベントやログの保存期間は30日なので、30日間の間に最低1000個の(イベントに紐ついた)自然言語照会が必要です。(あまりヒマなシステムでは学習が起動しません）

## 「マッチするのは文書のココ！」( Passage Rertieval )

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/7d484b3b-64b1-6b51-2155-bc3e75235d27.png)

単純な「全文検索」では「キーワードを含む文書はこれ！」と文書名までは教えてくれても、次に文書内の該当箇所にたどり着くのが面倒です。Discoveryでは文書を断片(Snippet)に分解し、「該当箇所はここ！」と教えてくれます。

下記は「North Faceを含む文書」を照会した結果ですが、該当する箇所のスニペットと共に文書のid、Passageスコア、文書内でのスニペットの開始・終了位置などのメタデータも返っています。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/f277dbe1-475b-86ef-b428-4591e2634fe9.png)

ドキュメントの一部が古いようですが下記が[新しいパラメーター](https://console.bluemix.net/docs/services/discovery/query-reference.html#query-building)です
- １つのパッセージの長さは2000文字以内 (passages.characters)
- パッセージの対象フィールドを指定できる(passages.fields)
- １つのQueryで返すパッセージの数を指定できる(passages.count) 


:triangular_flag_on_post: (2017/12/27)　以下3点は2017/11～12月の追加です。今はまだ日本語では使えませんが、今後の機能強化の方向性をお示しする意味でご参考までに。

## :us:(英語のみ) Element Classification

英語のみ、かつExperimentalという位置づけですが、2017/12/15に[Element Classification](https://console.bluemix.net/docs/services/discovery/element-classification.html#element-classification)が公開されました。少し前まで「Compare & Comply」と呼ばれていたユースケースを実現するもので、「準拠すべき文書と検査対象の文書の類似度合を比較(Compare)して、ちゃんと基準を満たしているか（Comply)をチェックする」ことを目指しています。例えば「この文書は必須の事項が書いてないよ！」とか、「この部分はルールに違反しているよ！」と指摘してくれたり、長～い契約書の中から「この購買契約の提供者の責務はなんだっけ？」と簡単に検索できたりするものです。「準拠すべき文書」とは契約書や法律・法令・規制であり、適用例としては法律事務所での契約書のチェック、損害保険での事故査定時の申請文書のチェック、企業の購買契約のチェックなど色々考えられます。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/01883f5e-f27c-ca39-c11e-be32fab88133.png)

- Element Classificationは上記を実現するための第一段階で、「今まで単語レベルで行っていたメタデータのエンリッチメントを文章や文節レベルに拡張する」ものです。要は基盤固め、でありElement Classificationだけで最終目標である「準拠しているかどうか」までは判断できません。 当機能は2018年も段階的に強化されていくようです
- [ここ](https://www.youtube.com/watch?v=WfiiH7Il0Us)にデモがあります

## :us:(英語のみ) Visual Insights

こちらも英語のみ、かつExperimentalという位置づけですが、[Visual Insights](https://visual-insights.bluemix.net/)というコンテンツの可視化ツールが公開されています。コンテンツにエンリッチメントで追加されたエンティティやリレーションやコンセプトなどのメタデータを基に、それらの関連を見せてくれるものです。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/0d819e45-c3c7-b1a1-af40-e96bd8f91f38.png)

- [ここ](https://visual-insights.bluemix.net/)から試せます
- デフォルトではDiscovery Newsのコンテンツが使えるようになっています
- ログインすればご自身のCollectionも対象にできます。ただし日本語Collectionは現在NLUエンリッチメントが未サポートのため、意味のある結果が表示されません。（WKSでエンリッチすれば使えるような気もしますが、試していません）

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/4bc5dfb9-0a4e-6b84-0bb7-cd7a72a2c4da.png)

## :us:(英語かつAdvancedプラン限定) Knowledge Graph

英語のみのベータ、かつAdvanced（拡張）プランのお客様限定なので私も実際に触ってないのですが、[Knowledge Graph](https://console.bluemix.net/docs/services/discovery/building-kg.html#watson-discovery-knowledge-graph)という機能が出ました。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/baa8e696-a5a2-a584-5203-3d04db5776e6.png)

- NLUエンリッチメントの結果を使ってエンティティ間の関連を機械学習で整理・拡張してカスタム知識グラフを構築します
- 利用者から見ると、従来の「ドキュメントに対する単語・キーワードや自然言語によるサーチ」だけではなく「関係・関連に基づくサーチ」が出来るようになります。以下はドキュメントからの例です。

     - 曖昧さの回避。「Steve」のサーチで、「Apple」の文脈(context)なら「Steve Jobs」。「Microsoft」の文脈なら「Steve Ballmer」 
     -  回答のランク付け。「Obama」を「Health」の文脈で検索するなら「Affordable Care Act」（オバマケア）が最適、と判定
     -  文書間の推論および集約からの洞察・知見。XさんとYさんはどう繋がっているか？Aさんのデータアクセスパターンは普通の人とどう異なっているか?　Bさんの周囲への影響力はどのくらい?
     
 

# その他
## node-redのノードもありますよ!
日本語のEnvironmentやCollectionを管理するところまでは未対応ですが、Discovery-Toolingで作った日本語環境のCollectionは普通に照会できました。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/bdb99ab0-8580-19f2-6829-4b10bec88020.png)

## Performance
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/ef35687b-ee33-2490-bd94-95d6aeb45ddc.png)

(データが少なくて恐縮ですが ) Performanceパネルでは照会の状況を見たり

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/ef1cd5f5-d99d-6d23-3131-375793ee965a.png)
実行された照会を取り込んでRelevancy Trainingに使ったりして、検索の精度を上げることができます。

# サービスのプラン

:triangular_flag_on_post: 2018/07/02にブログで[Watson Discovery 利用料金変更のお知らせ](https://www.ibm.com/blogs/solutions/jp-ja/pricing-changes-watson-discovery/)が出ました。2018/8/1からは以下のようになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/ec37a158-35db-9f63-1614-b8c52c166aaa.png)

以前はプラン毎に課金の考え方や計算方法が違ってたりして計算が複雑だったので、「簡単にした」んだろうと思います。

- ライトプランの文書数上限を2000→1000に変更
- Standardプランを廃止してLite/Advanced/Premiumの3つに減らした
- 課金モデルを「文書の数」のラダーに統一(「 ~文書までなら一律xx円」という形)

[IBM Cloudのカタログ](https://console.bluemix.net/catalog/services/discovery)にDiscoveryのプランや料金が掲載されていますのでご参照ください。(無償の**Liteプランでは１ケ月間使わないと削除されます**のでご注意ください)

# 参考文献
[Discovery - Document](https://console.bluemix.net/docs/services/discovery/)
[Discovery - API Reference](https://www.ibm.com/watson/developercloud/discovery/api/v1/)
[Discovery - API Explorer](https://watson-api-explorer.mybluemix.net/apis/discovery-v1)
[Viewデモ](https://discovery-news-demo.mybluemix.net/?cm_mc_uid=55709377368915068186198&cm_mc_sid_50200000=1506934484&cm_mc_sid_52640000=1506934484)

# 改訂履歴
[Release notes](https://console.bluemix.net/docs/services/discovery/release-notes.html#release-notes)みると、最近機能強化が続いているので、記事に改訂履歴をつけることにしました。本文の更新した箇所は :new: をつけておきますね。

| Release Notes日付 | 記事更新日  | 内容  | 
| :--- | :--- | :--- | 
|  2017/10/03 |  2017/10/06 | [Document Segmentation](https://console.bluemix.net/docs/services/discovery/building.html#doc-segmentation)が利用可能に | 
|  2017/10/09 |     | **インスタンス再作成要** Visual Query BuilderでHistogram と Timeslice が利用可能に  | 
|     |     | **インスタンス再作成要** Data schema explorer でのRun Queryメニューの追加  | 
|  2017/10/16 | 2017/10/18  | Discovery Toolingが機能強化され画面が変更になったので記事を更新  | 
|  2017/11/15 | 2017/11/17  | Discovery Toolingで日本語Collectionの定義方法が変更になったので記事を更新  | 
|  -  | 2017/12/14  | snbsntrさんのコメント=Passage Retrievalは実際はまだ使えない点を記載  | 
|  -  | 2017/12/27  | Element Classification他最近の機能追加を簡単に記載  | 
|  2018/06/28 | 2018/06/26  | Discovery 日本語フルサポートしたことを追記(記事本体は未修正)  |
|  2018/07/30 | 2018/07/31  | Discovery 日本語フルサポート&日本語ニュース＆価格改定で記述更新  |
|  2018/08/02 | 2018/08/06  | Box, Salesforce, and SharePoint Online接続で日本語サポートを追加  |
|  2018/09/25 | 2018/10/11 | Continuous Relevancy Trainingとlonger query |
|  - | 2019/02/14 | 全体的な見直しとアップデート|