Discovery Premiumやってみた　～Dynamic Facets編～

Watson Discoveryの Premiumプランで提供されている機能を使ってみました。

# Dynamic Facetsとは？

その前に、「ファセット」ってあまり聞き慣れない言葉ですね。
一言でいうと、「分析の切り口」でしょうか？

ファセットは以前から、IBM Watson Explorer（通称WEX）の、Analytics EditionやoneWEXで、主要な機能として活用されているものです。
ここ最近は、DiscoveryのPremiumプランでも、ファセットの機能が提供されるようになっています。
（詳細については、[公式Document](https://cloud.ibm.com/docs/discovery-data?topic=discovery-data-facets)をご覧ください）


基本的なファセットの機能は、ユーザーが決めた切り口にて定義するものです。
例えば、「色にまつわる単語で文書データを絞り込みたい」と思った時には、「色」というファセットをあらかじめ定義しておきます。その上で、色とは何か？の具体的な値は、ユーザー辞書で定義したり、または投入するデータの「列」とマッピングさせておきます。これで赤・ブルー・モスグリーンなどいろいろな色をWatsonに教えることができます。

対して、当記事でやってみた「Dynamic Facets（動的ファセット）」は、ファセットそのものを自動生成してくれるという機能です！しかも、事前にユーザーが何か学習をさせたりする必要なしに、直ぐに使える便利機能とのことです。
使う前からわくわくしますね。

# 使い方
実際にやってみました。
今まで、Watson Discoveryの下位プランは利用したことがありますが、Premiumプランは初めて触ります。
プランが違うだけで同じものかと思いきや、UIのレイアウトや機能はまったく別物な印象です。正直な感想としては、やりたいことや使いたい機能がどこにあるのか、直感的に分かりませんでした・・・。
ということで、Dynamic Facetsを使いたい場合の手順を紹介します。

まずは、DiscoveryのProject、Collectionはそれぞれ作成済み前提とします。なお補足として、DiscoveryのPremiumプランでは、「Document Retrieval」と「Content Mining」の2種類のCollectionを作成することができます。当記事で紹介するDynamic Facetsは、Document RetrievalのCollectionでのみ利用できる機能のようです。

Document RetrievalのCollectionを作成したら、検索対象とするドキュメントを投入しておきます。
ここからDynamic Facetsの機能を有効にしていきます。
Improve and customizeのメニューを開くと、右側にImprovement toolsという項目が出てきます。こちらで、一番上の「customize display」→「Facets」をクリックして開きます。
![dynamicfacets1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1544580/38ba4cc4-96da-2193-22db-a4cfc6d8ca61.png)


Facetsをクリックすると、右下のほうに「Dynamic Facets」という項目がひっそりと見つかります。こちらのトグルボタンにて、Dynamic Facetsのオン/オフを切り替えることが出来ます。
初期状態はオフになっていると思うので、クリックしてオンの状態に変更してみます。
![dynamicfacets2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1544580/2bf1d692-8495-e4b5-86f8-02ccda308be2.png)


事前の設定は以上です！
それではさっそく、検索を試してみます。
Searchウィンドウに検索文字列（図の例では「故障」と入れてみています）を入力し、検索を行いました。すると、検索結果の左側にDynamic Facetsの項目が現れました。絞り込み推奨項目を自動的に出力していることが分かります。（図中、緑枠で囲っているところです）
![facet1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1544580/7d9e7c56-851b-6ab6-8fc9-ce08d162fcf7.png)



ではDynamic Facetsで提案された項目で更に検索結果を絞り込んでいきます。例として「O2センサー」にチェックを入れます。すると、先ほどの検索結果のうち、さらに「O2センサー」と言う言葉を含むドキュメントのみを絞り込んでくれました。
初回の検索実行時には、1028件の文書がヒットしていましたが、絞り込みによって対象文書が24件まで絞り込まれています。（上図および下図の青枠箇所を参照）
Dynamic Facetsはこれを更に絞り込むための候補も挙げてくれています。まさに動的です。

![facet2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1544580/182e821d-de39-2054-c2a0-6a21b8aaa54f.png)


Discoveryが提供するGUIの管理画面を使った検証結果は以上です。とても簡単に使えました。

# APIによるDynamic Facetsの取得
Discoveryを業務に適用して利用するケースでは、アプリからAPIをコールしてDynamic Facetsの機能を利用できる必要があると思います。
APIでもDynamic Facetsが取得できるかどうか、実際に試してみました。

[APIリファレンス](https://cloud.ibm.com/apidocs/discovery-data?code=python#query) を参考に、今回はPythonでサンプルコードを実行してみます。

Dynamic Facetsを取得したい場合の要件は

*  クエリーは(queryではなく）natural_language_queryを使用する
*  パラメータQueryLargeSuggestedRefinementsを指定する

の2点のようです。

```python:sample.py
import json
from ibm_watson import DiscoveryV2
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator

discovery = DiscoveryV2(
  version='2019-11-22',
  IAMAuthenticator('{APIKEY}')
)
discovery.set_service_url('{SERVICE_URL}')

# こちらがDiscoveryをコールしている箇所。必要なパラメータを渡します。
# 先ほどGUIで試した内容に合わせて、検索文字は'故障'としています
# project_idは、別のAPI（List Projects）を使って調べるか、または管理画面で対象プロジェクトを開いておくとURLに値が含まれています
response = discovery.query(
  project_id='{project_id}',
  natural_language_query='故障',
  QueryLargeSuggestedRefinements={'enabled':True,'count':5}
).result["suggested_refinements"]

#Dynamic Facetsの値は、レスポンスの中の'suggested_refinments'フィールドに含まれているので、対象データのみ絞り込んで出力
print(response)
```

Discoveryから返されたDynamic Facetsの値は以下でした。

```text:response
[{'text': '型式の車両'}, {'text': '酸素センサーの故障'}, {'text': 'ｋｍ程度の使用'}, {'text': 'Ｏ２センサー'}, {'text': '廃車'}]
```

APIであれば、戻りの個数も任意に指定が出来るので、アプリケーションの仕様に合わせたカスタマイズが可能そうです。

# おわりに
こんなにも、ユーザーが何もしなくてもすぐに使うことが出来る機能はとても便利で良いですね。
メンテナンスが大変なシステムは、手入れが負担ゆえに陳腐化してしまう事もよくあると思うので、こういう仕組みは心からいいなと思いました。
ファセット機能自体も、玉石混交な情報の中から、自分が探しているものをうまく探し出すためのアシストをしてくれるものなので、身の回りの検索システムにこういう機能が取り込まれていくと良いなと思います。