[Azure] Cognitive Servicesを使ってみる(Translator Text API／Bing Search API)

# Cognitive Servicesとは

Microsoft Cognitive Servicesは、人間の認知機能をモデル化し、そのモデルをAPIとして提供しているサービス群の総称です。

言語、音声、視覚、知識、検索(Bing)等を、簡単かつ効率的に処理出来るSDK/APIサービスが提供されています(本記事を作成した 2017/3/31時点でAzureポータルからは17 APIが作成可能でした)。

# Azure Potalでアカウント作成

Cognitive Servicesを利用するためには、Azure Portalで 新規 → Cognitive Services APIs で検索してアカウントを新規作成します。

![cognitive01.png](https://qiita-image-store.s3.amazonaws.com/0/172826/7fdbee1a-8128-9ac0-dcfd-724d4908b3a7.png)

必須項目を入力して 作成 ボタンを押してみますが・・・

![cognitive02.png](https://qiita-image-store.s3.amazonaws.com/0/172826/952d0c45-7503-6086-8c58-c5451ffbae0a.png)

エラーになってしまいました。

![cognitive03.png](https://qiita-image-store.s3.amazonaws.com/0/172826/b65ac814-4b4a-7f28-9876-1a76345c9381.png)

```
Update setting failed.
You are unauthorized to enable Transfer Text API for this subscription, please contact Azure Account Administrator or your company or department IT to help you!
```

どうやら、サブスクリプション所有者でないと作成できないようです。

検証用のアカウントはサブスクリプション管理グループ(役割：所有者)には属していますが、Azureではこのようにサブスクリプション所有者自身しかできない操作がいくつかあります(旧ポータルでのActive Directory操作などもそうですね)。

![cognitive05.png](https://qiita-image-store.s3.amazonaws.com/0/172826/0e940df9-d352-f0dd-e87f-9e6d739eaa18.png)

そこで、サブスクリプション所有者に同じ操作を行ってもらうと、無事アカウントが作成できました。

![cognitive04.png](https://qiita-image-store.s3.amazonaws.com/0/172826/e8dc6754-ae04-53c2-5b03-f594720a321f.png)

普段は権限が無いのでたくさん作ってしまいましたが、今回はこの中からTranslator Text API(テキスト翻訳)とBing Search API(Web検索)を試してみます。

# Translator Text APIを使ってみる

Translator Text APIとは、自動テキスト翻訳を行うAPIです。月200万文字までの無料枠があります。

## 1) キーの確認

Azureポータルで、先ほど作ったアカウントのキーを確認します。ブレードで"Keys"を選択するとキーが2つ表示されるので、どちらかコピーしておきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/172826/2792d677-3a42-b330-4df0-2840bad494dd.png)

## 2) API実行

APIを実行するため、まずトークンを取得します。

http://docs.microsofttranslator.com/oauth-token.html

にアクセスし、"Ocp-Apim-Subscription-Key"に先ほど取得したキーを入力して、"Try it out!"を押します。

![image](https://qiita-image-store.s3.amazonaws.com/0/172826/238f3404-5c38-bacb-d123-14e986f876a1.png)

キーを入力して実行すると、"Response Body"にトークンが出力されます。実行されたcurlコマンドもそのまま出力してくれているので、処理を自動化する際の参考になります。

![image](https://qiita-image-store.s3.amazonaws.com/0/172826/76389cc1-982a-9f85-3322-98c5332c046b.png)

トークンは有効期限が10分なのでこの後少し急ぎます。

http://docs.microsofttranslator.com/text-translate.html#!/default/get_AddTranslation

にアクセスし、"GET /Transfer"を展開して必要な項目を入力します。今回は、先日のAzure障害通知(RSS通知)を翻訳してみます。

| Parameter | 設定内容 |
|:-----------|:-------------|
| appid | (必須項目)認証ヘッダ。"Bearer " + 先ほど取得したアクセストークンを設定します。 |
| text | (必須項目)翻訳元のテキスト |
| from | (任意項目)翻訳元の言語。一応"en"を設定しておきます。 |
| to | (必須項目)翻訳先の言語。"ja"を設定します。 |
| contentType | (任意項目)一応"text/plain"を設定しておきます。 |
| category | (任意項目)"generalnn"を指定するとニューラルネットワークモデルを用いた翻訳が行われます。 |

![image](https://qiita-image-store.s3.amazonaws.com/0/172826/78849acc-163d-fb24-f7ee-bff553236a9c.png)

"Try it out!"で実行すると、結果が出力されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/172826/844801c5-f10a-06a8-5029-aa593ada91d8.png)

このように翻訳されました。

```
2017年3月27日 18:04 utc に日本西部の顧客のサブセットは、この地域でホストされている azure リソースにアクセスすると、
パフォーマンス低下、ネットワークの低下、またはタイムアウトが発生する可能性があります。影響を受けるサービスは、
azure の状態のヘルスダッシュボードに表示されます。エンジニアはこの問題を認識し、積極的に調査しています。 
エンジニアは根本的な原因の調査を続けており、緩和手順を適用します。次の更新は60分、またはイベント令状として提供されます。
```

結構分かりやすくなっていますね。自動で翻訳してSlackに通知するなどの使い方ができそうです。

ちなみに、カテゴリーを"general"にすると以下のような昔ながら(?)の翻訳結果になります．．．

```
18:04 から始まる UTC 2017 年 3 月 27 日西日本の顧客のサブセットを発生ことがありますパフォーマンスの低下、
ネットワーク滴またはタイムアウト Azure リソースこの地域でホストにアクセスするとき。影響を受けるサービスは、
Azure ステータス正常性ダッシュ ボードに表示されます。エンジニアはこの問題を認識して、積極的に調査しています。 
エンジニアは彼らの根本的な原因の調査と対策手順を適用を継続しています。次の更新は、60 分、
またはイベントの令状として提供されます。
```

# Bing Search APIを使ってみる

Bing Search APIとは、Bingの検索結果を取得するAPIです。

## 1) キーの確認

Translator Text APIと同じように、Azureポータルでキーを確認します。ブレードで"Keys"を選択するとキーが2つ表示されるので、どちらかコピーしておきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/172826/04d31df6-1531-51a1-e535-9606ca7e99e1.png)


## 2) API実行

[Web Search API Reference](https://msdn.microsoft.com/en-us/library/dn760794.aspx)

Web Search APIはキーだけで実行可能です。curlコマンドで、弊社の社名をキーに検索を実行してみます。

```sh
$ curl -s -X GET --header 'Ocp-Apim-Subscription-Key: ＜ポータルで確認したキー＞' 'https://api.cognitive.microsoft.com/bing/v5.0/search?q=visionarts&mkt=ja-jp' | jq -r
{
  "_type": "SearchResponse",
  "webPages": {
    "webSearchUrl": "https://www.bing.com/cr?IG=B3DBC70A42C644D9806FE29C340858AB&CID=36573A57345A6CAE379C3003356B6D8D&rd=1&h=mZaWOPCVUd1MPKqpgw3_IVUH83zxNZESIo-CdtnpjoI&v=1&r=https%3a%2f%2fwww.bing.com%2fsearch%3fq%3dvisionarts&p=DevEx,5291.1",
    "totalEstimatedMatches": 5700,
    "value": [
      {
        "id": "https://api.cognitive.microsoft.com/api/v5/#WebPages.0",
        "name": "Visionarts | ヴィジョンアーツ株式会社",
        "url": "http://www.bing.com/cr?IG=B3DBC70A42C644D9806FE29C340858AB&CID=36573A57345A6CAE379C3003356B6D8D&rd=1&h=gDI7JuTZl0qltPtxg8AVHYE49Pd6oP_Brcx555ZqTRI&v=1&r=http%3a%2f%2fvisionarts.co.jp%2f&p=DevEx,5082.1",
        "displayUrl": "visionarts.co.jp",
        "snippet": "ヴィジョンアーツは、クラウドソリューション提供、インターネットをベースに新しい技術の創出、ネットワークデバイスや次世代プラットフォーム開発を行います。AWSコンサルティングパートナーとして導入から構築・運用保守まで ...",
        "dateLastCrawled": "2017-03-23T10:41:00"
      },
      {
        "id": "https://api.cognitive.microsoft.com/api/v5/#WebPages.1",
        "name": "ヴィジョンアーツについて | Visionarts",
        "url": "https://www.bing.com/cr?IG=B3DBC70A42C644D9806FE29C340858AB&CID=36573A57345A6CAE379C3003356B6D8D&rd=1&h=1jy-YTwDx9pm-lgGhoozUQHOL50DtZw7KMJIdN3wfWY&v=1&r=https%3a%2f%2fwww.visionarts.co.jp%2fabout%2f&p=DevEx,5096.1",
        "displayUrl": "https://www.visionarts.co.jp/about",
        "snippet": "私たちヴィジョンアーツは、あなたが思い描いている「Vision」をひとつひとつ「Action」に変えていきます。「想いは、遂に、カタチに。」クラウドの導入設計から構築・運用保守までサポート。",
        "dateLastCrawled": "2017-03-23T13:52:00"
      },
      ※以下、10件まで表示されます※
```

検索できることが確認できました。

Bing Search APIは無料枠が無くなってしまいましたが、[トークン無しで試せるデモサイト](https://www.microsoft.com/cognitive-services/en-us/bing-web-search-api)も提供されているので、パラメタの確認などで活用できます。

# 参考資料

- [Cloud Solution Architect チームブログ：Microsoft Cognitive Services](https://blogs.technet.microsoft.com/azure-sa-members/cognitive-services/)

- [de:code 2016：有能な AI アシスタントを手に入れる! Microsoft Cognitive Services 入門](https://channel9.msdn.com/Events/de-code/2016/DBP-018)