Azure Search の Cognitive Search 機能を使って、ドキュメントの言語解析のプロトタイプ作成

# 背景
ドキュメントには、様々な形式知が詰まっています。それを構造化されたデータセットに変換できると、様々な使い方が考えられます。いわゆる**非構造化データ**から、**構造化データ**への変換といっていいでしょう。
そのとっても良い例が `JFKFiles` です。

JFKFiles:
https://www.microsoft.com/en-us/ai/ai-lab-jfk-files

**目的**は文書を探す事です。

そのために、`Cognitive Services`や、独自の`NLP`モデルをうまく使っています。

Azure Cognitive Search における AI の概要:
https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-concept-intro

`decode18` にて、その一部の機能が、`Azure Search` に入ったこともあり、Breakout Session にて取り扱いました。文書の差分更新に強く、n-gram/形態素解析などの言語解析エンジンを持ち、かつ、全文検索エンジンたる機能をマネージドで持っている Search Engine ですから。その利便性の高さに驚いたものです。

de:code 2018 AI01:
https://www.microsoft.com/ja-jp/events/decode/2018download/archive.aspx?#AI01

それが、`MSIgnite2019` にて更に強化されていました。具体的には、以下の2つの機能が追加され、プロトタイプ作成までが、あっという間です。

Understanding AI enabled search for your apps: Azure Search technical edition:
https://myignite.techcommunity.microsoft.com/sessions/81078?source=sessions

ここでは、そのプロトタイプ作成手順を、補足していきます。

# 注意事項

ここで扱っている`ナレッジストア`は、執筆時点 (2020/1/19)、パブリックプレビューです。

# 事前準備
- Azure のサブスクリプション
    - 無料トライアル:  https://azure.microsoft.com/ja-jp/free/
- PDF、Word などのファイル
- Power BI Desktop (無料)
    - https://powerbi.microsoft.com/ja-jp/desktop/

以下、オプション:

- Azure Storage Explorer
    - Blob へのファイルアップロード用。Azure Portal からでも出来ますが。
    - https://azure.microsoft.com/ja-jp/features/storage-explorer/

# 手順

特に指定が無い限り、規定値で大丈夫です😊

## 1. クロール対象のファイル置き場の作成
  1. Azure Portal で Azure Storage Account を作成
  https://docs.microsoft.com/ja-jp/azure/storage/common/storage-account-create?tabs=azure-portal

  2. Blob Storage に、ファイルを保存する、コンテナー (フォルダー) を作成
  3. Azure Storage Explorer で、ファイルを Blob Storage にアップロード

## 2. Azure Search インスタンスの作成
  https://docs.microsoft.com/ja-jp/azure/search/search-create-service-portal

## 3. Indexer の作成 と Cognitive Services らの組み込み
  `Indexer` とは、クローラーみたいな存在です。指定した Blob のコンテナーを、指定したスケジュールでクローリングしてくれます。Azure Search では、そのクローリング時に、別のパイプライン処理を組み込むことができて、特に Deep Learning 関連のものを `コグニティブ スキルセット`と呼んでいます。それに限らずできるのですが。

面白いことに、その解析結果は、2つのデータベースに出力されます。

- 転置インデックス: Search 用
- ナレッジストア: 構造化されたデータの、2次利用 用。Azure Table Storage か、Azure Blob Storage に保存されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108143/1fc94a13-352c-407f-3ad5-603a09f464ec.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108143/631e458b-8dd7-d65a-6475-b9e54fec69cd.png)


手順はこちらを。

　　クイック スタート:Azure Cognitive Search コグニティブ スキルセットを Azure portal で作成する
　　https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-quickstart-blob

## 3. Search 用の Web アプリの HTML 作成

Azure Search の処理は、REST ですから、JavaScript などからも比較的容易に呼びやすいわけです。とはいいつつ、それなりに手間なのは事実。
なんと、Azure Search は`インデックス`のポータルから、そのHTMLを作成してくれる機能があるのです! 😍
どこでも動かせるので、プロトタイプとしては、超絶便利!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108143/014a0539-8f28-23da-a03f-d965ef58ce27.png)

手順:

クイック スタート:ポータルで検索アプリを作成する (Azure Cognitive Search):
https://docs.microsoft.com/ja-jp/azure/search/search-create-app-portal

## 4. 言葉の関連性などをグラフ表現などで、可視化して、フィルタリングしたい! --- Power BI からの接続

これ、超絶簡単で。しかも、Azure Table 上に格納された情報だけで、ここまで Power BI でやってくれる、とは...
Azure Portal の中ですと `スキルセット` から設定できます。用意されている Power BIのテンプレートファイルに、`ナレッジストア`である、Azure Storageアカウントへの接続文字列を設定するだけです😍

Power BI Template の設定項目:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108143/57cecc9f-98fd-290f-2354-4fca00ca5f3f.png)

出来ました。
- フィルタリングが容易。BIツールだから
- 自分で、グラフ表現や、固定でのフィルタリングなどの設定が容易。Power BI Desktopが、よくできたダッシュボード作成ツールでもあるから

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108143/b15a2d9f-f5e1-f391-abdf-230425bfa4a4.png)

Key Phase:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108143/62780a98-b3b6-bcfc-9abf-20dbfe37c180.png)

Entity:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108143/06389485-7aed-dfcd-0af3-54e907a6d0e6.png)

サンプル:
https://msit.powerbi.com/view?r=eyJrIjoiY2U4NzRkYWYtYTA2Ny00OTIxLWE3NjYtY2QyYWNlZTgyYzM2IiwidCI6IjcyZjk4OGJmLTg2ZjEtNDFhZi05MWFiLTJkN2NkMDExZGI0NyIsImMiOjV9

- 一番下の、Page を変えてください


手順は、こちら。

Power BI を使用してナレッジ ストアに接続する:
https://docs.microsoft.com/ja-jp/azure/search/knowledge-store-connect-power-bi

# What's Next
ここまで来ると、以下がやりたくなると思います。

- Cognitive Servicesで用意されているものではないものを、パイプライン処理で組み込みたい
    - Azure コグニティブ検索エンリッチメント パイプラインにカスタム スキルを追加する方法
    - https://docs.microsoft.com/ja-jp/azure/search/cognitive-search-custom-skill-interface
- NLP のモデルを効率的に開発したい
    - BERTに限らず、Azure を活用しての NLP モデル開発のベストプラクティスがまとまっています。
    - NLP Best Practices
    - https://github.com/microsoft/nlp-recipes

# Make Vision

以下、私の考察です。
これがあって、先の What's Next になってますね。

- 人

これは、Knowledge Managementの領域でもありますよね。となると「人」というEntityは外せません。人に着目すると、人の Activity Log にも注目したくなります。

- Data

非構造化データの**構造化**は、Computer業界の長年の**夢**であったといっていいかと思います。どんなに、動画解析エンジンが進んでも、その Speech to Textや、モーションデータを、最後は**構造化**するわけですから。
この Cognitive Search の取り組みは、そこへの再度の挑戦といっていいですよね。

整理ますと、こんな感じ。今日時点。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108143/a4965d0f-eb95-d7f5-cad7-71d5aafc4dc6.png)

Happy Hacking!