MS Cognitive APIs: NLP関係API

Microsoft社のCognitive APIsのうち、自然言語処理に関係するものを調査した。

調査した日: 2016/12/27

# 検索系
## [Bing Autosuggest API](https://www.microsoft.com/cognitive-services/en-us/Bing-autosuggest-API/documentation) / [Bing Web Search API](https://www.microsoft.com/cognitive-services/en-us/bing-web-search-api/documentation)
* BingのAutosuggest, Web Searchを利用するAPI
* Cognitive APIsの中に列挙されているが、通常のBing APIと同じっぽい。

## [Knowledge Exploration Service](https://www.microsoft.com/cognitive-services/en-us/KES/documentation/overview)
* 構造化された知識ベースを構築、検索するサービスと、それを操作するAPI
* 文書に対して著者、作成日時など様々な属性情報を付与し、英語に近い文法で検索できる。
    * 例: "Papers about information retrieval by susan dumais"
    * どんな属性名を持っているか、クエリでどんな文法を使えるか、は、schemaやgrammerを定義することでカスタマイズできる。(JSON形式)
* 社内で使う知識ベースを検索可能にしたいような場合に使うものか。

## [Academic Knowledge API](https://www.microsoft.com/cognitive-services/en-us/Academic-Knowledge-API/documentation/overview)
* Microsoftの持っている学術情報グラフデータ(MAG)を検索するAPI
* 概ね [academic.microsoft.com](https://academic.microsoft.com/) と同等の情報が得られる？

# テキスト処理系

## [Bing Spell Check API](https://www.microsoft.com/cognitive-services/en-us/Bing-Spell-check-API/documentation)
* Spell Check
* 英語のみ対応

## [Entity Linking Intelligence Service API](https://www.microsoft.com/cognitive-services/en-us/EntityLinking-API/documentation/overview)
* 与えられた文章内で何らかの事物を指している言葉（Named Entity）を抽出し、それらの位置を返す。
* Wikipediaに記事が存在する場合は、そのIDを付与する。
* "Entity Linking"は一般的な自然言語処理タスクのひとつ。 [Wikipedia: Entity linking](https://en.wikipedia.org/wiki/Entity_linking)

## [Language Understanding Intelligent Service (LUIS)](https://www.microsoft.com/cognitive-services/en-us/LUIS-api/documentation/home)
* ユーザの発言（自然文）から意図を理解するシステムを構築・運用するためのサービス
* ユーザの発言から ***Intent***(意図,目的) と ***Entity***(対象,もの) を抽出して返すようなAPIを作る。
    * ユーザインタフェースや、このAPIの出力を解釈して実際にアクションをする部分は、別途自分で作成する必要がある。
* LUISを使うための手順はおおむね以下の通り。
    1. 新規にApplicationを作る
    1. Intent, Entity を定義する
    1. 例文(utterance)を与えて、その文に対してどのようにIntent,Entityを抽出するかを指示する
    1. APIを呼んでみて、正しく抽出できているか確認する。
* 使い方の概要は、[Tutorial](https://www.luis.ai/Help/)のビデオを見るとわかりやすい。
    * ただし、このビデオは少し古いのか、現在のUIと微妙に違うので注意が必要。
    * YouTubeに上がっているやつのほうがまだ最新版に近い？ https://www.youtube.com/watch?v=jWeLajon9M8
* 運用
    * LUISの売りは、運用中に実際にユーザが入力した文、解析失敗した文を見て新たな例文にするといった運用までカバーされていること。
* 機能
    * Active Learning: ユーザの発言にあったが、まだルールの作成がされていない文を一覧表示する機能。これを使って新たな文への対応や精度向上を継続的にやっていく。
    * Dialog Support: ユーザの発言の中で足りていない情報を訊き返して埋める機能。
        * たとえば「今日の天気を教えて」に対して「どこの？」と訊き返すようにできる。
    * Pre-built entities: 日付時刻、金額、など予め定義された汎用的なEntity
* 2016/12/27時点でまだ日本語はサポートされていない。アプリケーション作成時にJapaneseを選択はできるが、ちゃんと使えるかどうかは不明。（ちょっとさわってみた感触では単語分割の結果にセンシティブで、扱いが難しそうだった。）

## [Web Language Model API](https://www.microsoft.com/cognitive-services/en-us/web-language-model-api/documentation)
* Bingが持っているWeb規模のテキストコーパスから作られたn-gram言語モデルを利用できる。
    * Linguistic Analysis APIが形態素解析と構文解析に基づく「言語学的な」言語モデルを扱うのに対して、Web Language Modelはn-gramと出現頻度に基づく「統計的な」言語モデルを扱う。言語に対するアプローチが異なる。
* n-gramベースなので、原理的には言語非依存のはず。（元となるコーパスに含まれるかどうかに依存）
* 品詞や構文などの情報は取れないので、深い意味解析には向かない。サジェストや入力補完などが主な用途になるか。
* 出力される確率値はすべて対数(log10)となっている。

| API | 説明 |
|:--|:--|
| Break Into Words | 文を単語に分割し、単語境界にスペースを入れて返す。<br> 品詞情報は付かない。 |
| Calculate Conditional Probability | 指定された単語列のあとに指定された単語が続く条件付き確率を求める。 |
| Calculate Joint Probability | 指定された単語列が出現する確率（同時確率）を求める。 |
| Generate Next Words | 指定された単語列から、次に続く単語を確率付きで予測する。（候補を上位n件まで取得可能） |

## [Linguistic Analysis API](https://www.microsoft.com/cognitive-services/en-us/Linguistic-Analysis-API/documentation/overview)
* テキストに対して言語学的な解析を行うAPI
* 用途に応じて用意されたAnalyzerを選択して呼び出す仕組みになっている。

| API | 説明 |
|:--|:--|
| Analyzers | Analyzerの一覧を得る。 |
| Analyze | 指定されたAnalyzer(複数指定可能)を使ってテキストを解析する。 |

| Analyzer | 説明 |
|:--|:--|
| Tokens | 単語分割(形態素解析)を行う。原型(NormalizedToken)は付くが、品詞は付かない。 |
| POS Tags | 品詞タグを付ける。 |
| Constituency Tree | 構文木を出力する。 |

## [Text Analytics API](https://www.microsoft.com/cognitive-services/en-us/text-analytics/documentation)
* テキスト解析を行う。
* Web Language API や Linguistic Analysis APIよりもレイヤーが高い感じ。

| API | 説明 |
|:--|:--|
| Sentiment Analysis | テキストの感情分析を行う。0〜1の間の値として推定する。(0がnegative, 1がpositive) |
| Key Phrase Extraction | 与えられた文の中でキーフレーズと思われる箇所(複数)を抽出する。 |
| Topic Detection | テキストに対して関連するトピックと、それぞれの関連度を推定する。レビューやアンケートなどの短い文が対象とのこと。 |
| Language Detection | テキストの言語(英語、中国語、日本語・・・)を推定する。 |

# 音声系

## [Bing Speech API](https://www.microsoft.com/cognitive-services/en-us/Speech-api/documentation/overview)

## [Speaker Recognition API](https://www.microsoft.com/cognitive-services/en-us/speaker-recognition-api/documentation)

## [Custom Recognition Intelligent Service (CRIS)](https://www.cris.ai/)
- カスタムの音響モデル、言語モデルを持つSpeech-to-textを構築できるサービス
    - 音声認識は、一般に語彙や文法を制限するなどしてモデルを単純にすれば精度が向上する。
    - 特定のコマンドのみ受け付けるUIなど、大規模な語彙が必要ない場合にはSpeech APIよりもCRISを使ったほうが良い結果になるはず。
- 2016/12/27時点でPrivate Previewのため、細かい機能は確認できていない。


# 日本語対応状況 (2016/12/27時点)


※ここでいう日本語のサポートとは、APIドキュメントやコンソールが日本語化されていることでなく、日本語の文章やクエリの処理に対応していることを指す。


| API | 多言語対応 | 日本語 | コメント |
|:--|:--|:--|:--|
| Bing Autosuggest API | [mktパラメータ](https://msdn.microsoft.com/en-us/library/mt711395.aspx#Anchor_2)でロケールを指定 | ○ |  |
| Bing Web Search API | [mktパラメータ](https://dev.cognitive.microsoft.com/docs/services/56b43eeccf5ff8098cef3807/operations/56b4447dcf5ff8098cef380d)でロケールを指定 | ○ |  |
| Academic Knowledge API | 記載なし | ○ | 特に明記されていないが、日本語クエリも通ることは通る。 |
| Knowledge Exploration Service API | 記載なし | ○？ | データに日本語を含めることはできそうだが、クエリが英語風なのは変えられなさそう |
| Bing Spell Check API | [Overview](https://www.microsoft.com/cognitive-services/en-us/bing-spell-check-api/documentation)に記載<br>英語の各方言にのみ対応 | × |  |
| Entity Linking API | 記載なし(en-USのみ？) | × | 試しに日本語文を投げてみたが空の応答が返ってきた。 |
| LUIS | [Overview](https://www.microsoft.com/cognitive-services/en-us/LUIS-api/documentation/home)に記載<br>English, French, Italian, Spanish, Chinese | × | utterlanceとして日本語を入力できなくはないが、動作は未知。 |
| Web Language Model API | en-USのみ | × | 現時点でen-USのモデルしか無い。ja-JPもそのうち対応されるだろう。 |
| Linguistic Analysis API | 記載なし | × | Analyzers APIで、各Analyzerの対応言語一覧を取得できる。現時点で"en"しか無い。 |
| Text Analytics API | [Getting Started](https://azure.microsoft.com/en-us/documentation/articles/cognitive-services-text-analytics-quick-start/)に記載<br>Sentiment: [en,es,fr,pt]<br>Key phrases: [en,es,de,ja]<br>Topic Detection: English | "Key phrases"のみ対応 |  |
| Bing Speech API | [Overview](https://www.microsoft.com/cognitive-services/en-us/Speech-api/documentation/overview)に記載 | ○ |  |
| Speaker Recognition API | APIドキュメントの`Create Profilにsupported localesの記載あり。<br>[Verification](https://dev.projectoxford.ai/docs/services/563309b6778daf02acc0a508/operations/563309b7778daf06340c9652): en-US<br>[Identification](https://dev.projectoxford.ai/docs/services/563309b6778daf02acc0a508/operations/5645c068e597ed22ec38f42e): en-uS  | × |  |
| CRIS | en-US, zh-CN | × | private previewのため、利用申請が必要 |