Cognitive Services Containers を利用して ローカルの Docker コンテナで Text Analytics Sentiment を試す

"人工知能パーツ" Web API として提供されている [Azure Cognitive Services](https://azure.microsoft.com/ja-jp/services/cognitive-services/) の一部機能を Docker コンテナにダウンロード、構築して利用できる Azure Cognitive Services Containers が提供開始となりました。(2018年11月現在プレビュー)

ローカル環境の Docker に Cognitive Services の Text Analytics コンテナ―を作成、稼働させて利用する方法を紹介します。

### Cognitive Services Container を試すシリーズ
- Text Analytics : Sentiment (※当記事)
- LUIS
    - [(1)LUIS作成編](https://qiita.com/annie/items/e8fd635cae849ca349ba)
    - [(2)Container設定編](https://qiita.com/annie/items/718884672ff1b6def80b)

<a href="https://msdnshared.blob.core.windows.net/media/2018/11/bluesky_20181116_01.png"><img src="https://msdnshared.blob.core.windows.net/media/2018/11/bluesky_20181116_01-300x192.png" alt="" width="300" height="192" class="alignnone size-medium wp-image-20185" /></a>

# Cognitive Services Containers で利用できるサービス
Computer Vision と Face は [利用リクエストにサインアップ](https://aka.ms/VisionContainersPreview) する必要があります。(2018年11月現在)
Text Analytics はすぐに利用できるので、今回はこちらを利用します。

| Cognitive Services | サービス内容 | DockerHub |
|:-------------------|:---------------------------|:--------------------|
| Computer Vision    | 活字 OCR - 画像→文字の認識
| Face               | 顔認識 <br/> - 顔のパーツの位置 (目, 鼻, 口, ...), 性別/年齢, etc <br/>顔認証(同一人物の判定) <br/>顔識別(DBからの識別)|
| Text Analytics     | キーフレーズの抽出   | [keyphrase](https://hub.docker.com/r/microsoft/azure-cognitive-services-keyphrase/) |
| Text Analytics     | 言語判定            | [language](https://hub.docker.com/r/microsoft/azure-cognitive-services-language/)
| Text Analytics     | センチメント分析     | [sentiment](https://hub.docker.com/r/microsoft/azure-cognitive-services-sentiment/)

# Cognitive Services Containers を使ってみる
## Docker 環境の準備

今回は Windows 10 上に [Dockers for Windows](https://docs.docker.com/docker-for-windows/) をインストールして使用します。
Windows 版は Windows と Linux コンテナーを利用できますが、Cognitive Services Containers を利用するには Linux コンテナ―環境が必要です。(設定やインストール時のオプションで選択できます)

> **Cognitive Services Containers を利用できる Docker 環境**
Local on Windows*/macOS/Linux (*Windows OS では Linux コンテナ―で利用)
Azure Kubernetes Service
Azure Container Instances
Azure Stack (Kubernetes cluster)


## Azure サブスクリプションで Cognitive Services の各サービスを作成する

### Azure サブスクリプション
お持ちでない場合は、無料試用版での申し込みを行います。(無料プランを利用するため、従量課金プランでも大丈夫ですが念のため。)

>[Azure 無料アカウントを今すぐ作成](https://azure.microsoft.com/ja-jp/free/)

### Text Analytics の作成
[Azure Portal](https://portal.azure.com) を開き、[+新規作成] をクリックして検索欄に *Text Analytics* と入力して Cognitive Services Text Analytics を検索します。
[作成]をクリックして、**Create** ブレードを開き、下記のように必要な情報を入力します。

 - **Name** : (識別しやすいお好みのものを)
 - **サブスクリプション**(自動入力)
 - **場所** : お好きなAzure Datacenter を選択、ここでは 東日本(Japan East) を選択しています
 - **価格レベル** : **F0** ※Conntainerで利用する場合は F0 にしておく必要があります(2018年11月現在)
 - **Resource Group** : (識別しやすいお好みのものを)

入力したら、[作成] をクリックしてサービスを作成します。
<a href="https://msdnshared.blob.core.windows.net/media/2018/11/bluesky_20181116_02.png"><img src="https://msdnshared.blob.core.windows.net/media/2018/11/bluesky_20181116_02-300x192.png" alt="" width="300" height="192" class="alignnone size-medium wp-image-20195" /></a>

### Endpoint と Key の取得
サービスを利用するためにアクセスする URL (Endpoint)と Key を取得しておきます。

サービスの作成が完了したら、作成した Text Analytics のサービスを開きます。
メニューの **Overview** をクリックします。
Endpoint に表示される URL をコピーしてローカルに保存しておきます。

<a href="https://msdnshared.blob.core.windows.net/media/2018/11/bluesky_20181116_03.png"><img src="https://msdnshared.blob.core.windows.net/media/2018/11/bluesky_20181116_03-300x192.png" alt="" width="300" height="192" class="alignnone size-medium wp-image-20205" /></a>
次に **Resource Management** にある **Key** をクリックします。
**Key1** に表示される文字列をコピーしてローカルに保存しておきます。
<a href="https://msdnshared.blob.core.windows.net/media/2018/11/bluesky_20181116_04.png"><img src="https://msdnshared.blob.core.windows.net/media/2018/11/bluesky_20181116_04-300x192.png" alt="" width="300" height="192" class="alignnone size-medium wp-image-20215" /></a>


## Docker 環境にコンテナ―を作成する
Cognitive Services Containers で予め用意されているイメージがあるので、そちらをダウンロードして、稼働させます。

| サービス | Docker Hub | Repository |
|:--------------|:-------------------------|:---------------------|
| Keyphrase | https://hub.docker.com/r/microsoft/azure-cognitive-services-keyphrase/ | mcr.microsoft.com/azure-cognitive-services/keyphrase |
| Language | https://hub.docker.com/r/microsoft/azure-cognitive-services-language/ | mcr.microsoft.com/azure-cognitive-services/language |
| Sentiment | https://hub.docker.com/r/microsoft/azure-cognitive-services-sentiment/ | mcr.microsoft.com/azure-cognitive-services/sentiment |


### Cognitive Services Containers のイメージダウンロードと起動
Docker CLI で最新のイメージをダウンロードします。今回は Sentiment をダウンロードして利用してみます。(latest オプションで最新を取得しています)

```DockerCLI
docker pull mcr.microsoft.com/azure-cognitive-services/sentiment:latest
```
<a href="https://msdnshared.blob.core.windows.net/media/2018/11/bluesky_20181116_05.png"><img src="https://msdnshared.blob.core.windows.net/media/2018/11/bluesky_20181116_05-300x161.png" alt="" width="300" height="161" class="alignnone size-medium wp-image-20225" /></a>


こちらを以下のオプションで起動します。

 - 1CPU/メモリ 8GB
 - TCP port 5000
 - 終了後にコンテナーを削除

Cognitive Services Containers のパラメーターとして以下を設定します。

 - Billing : Azure Portal で取得した Endpoint (今回は 東日本 を設定)
 - ApiKey : Azure Portal で取得した Key1

```DockerCLI
docker run --rm -it -p 5000:5000 --memory 8g --cpus 1 mcr.microsoft.com/azure-cognitive-services/sentiment Eula=accept Billing=https://japaneast.api.cognitive.microsoft.com/text/analytics/v2.0 ApiKey=xxxxxxxxxxxxxxxxxxxxxxx
```
>最低限と推奨される CPU とメモリーのスペックは以下になっています
>
|Container  | 最低　　　　　　　| 推奨               |
|:----------|:------------------:|:-------------------:|
| Keyphrase | 1 CPU, メモリー 2GB | 1 CPU, メモリー 4GB |
| Language  | 1 CPU, メモリー 2GB | 1 CPU, メモリー 4GB |
| Sentiment | 1 CPU, メモリー 8GB | 1 CPU, メモリー 8GB |

<a href="https://msdnshared.blob.core.windows.net/media/2018/11/bluesky_20181116_06.png"><img src="https://msdnshared.blob.core.windows.net/media/2018/11/bluesky_20181116_06-300x161.png" alt="" width="300" height="161" class="alignnone size-medium wp-image-20235" /></a>


無事コンテナーが起動すると、こちらでアクセス可能になります。

```HTTP
http://localhost:5000
```
<a href="https://msdnshared.blob.core.windows.net/media/2018/11/bluesky_20181116_07.png"><img src="https://msdnshared.blob.core.windows.net/media/2018/11/bluesky_20181116_07-300x199.png" alt="" width="300" height="199" class="alignnone size-medium wp-image-20245" /></a>

Swagger で Web API の定義も確認できます。
<a href="https://msdnshared.blob.core.windows.net/media/2018/11/bluesky_20181116_08.png"><img src="https://msdnshared.blob.core.windows.net/media/2018/11/bluesky_20181116_08-300x199.png" alt="" width="300" height="199" class="alignnone size-medium wp-image-20255" /></a>

### Web API としてアクセスする

では、実際に Web API としてアクセスします

```HTTP
POST http://localhost:5000/text/analytics/v2.0/sentiment
ContentType: application/json
```

Body は下記のようなフォーマットで JSON で記述します。

```JSON
{
  "documents": [
    {
      "language": "en",
      "id": "1",
      "text": "Hello world. This is some input text that I love."
    },
    {
      "language": "ja",
      "id": "2",
      "text": "おはようございます！今日は良い天気です。"
    }
  ]
}
```

Postman でアクセスして Status: 200、Sentiment の結果が返ってくれば OK です。

<a href="https://msdnshared.blob.core.windows.net/media/2018/11/bluesky_20181116_09.png"><img src="https://msdnshared.blob.core.windows.net/media/2018/11/bluesky_20181116_09-300x236.png" alt="" width="300" height="236" class="alignnone size-medium wp-image-20265" /></a>

[Ctrl + C] で Docker コンテナーを停止します。