マッスルしちゃったときの Custom Translator ~ Microsoft Translator のカスタム翻訳モデル作成

日本って難読地名が結構ありますね。(特に北海道＆沖縄)
今回は、[#堺マッスル](https://twitter.com/hashtag/堺マッスル) してしまったときに対応できる、Microsoft Translator API のカスタム翻訳モデルが作成できる Custom Translator の使い方を紹介します。

# Microsoft Translator とは

マイクロソフトが提供する翻訳ツールと API で、アプリからテキスト、音声、画像 (OCR) による翻訳が可能なほか、テキストや音声を翻訳する Web API が提供されています。
今回利用するのは、Translator Text API の Custom Translator 機能です。Translator Text API は "人工知能 API" である Cognitive Services の仲間で、Custom Translator 機能を使って特定ドメインで使われる翻訳例を用いてトレーニングを行ったり、用語やフレーズなどを辞書として登録することで翻訳精度を向上することができます。
今回はより簡単に利用できる用語辞書を追加してカスタマイズしてみます。

# 準備

## Azure サブスクリプション & マイクロソフトアカウント

- Microsoft アカウント
    - Azure サブスクリプション申し込みに必要です。Custom Translator Portal も同じものを使いましょう。
    - [Microsoft アカウント登録手続き](https://www.microsoft.com/ja-jp/msaccount/signup/default.aspx)
- Azure サブスクリプション
    - 無料試用版で充分です。上記↑で取得した Microsoft アカウントで申し込みを行います。
    - [Azure 無料アカウントを今すぐ作成](https://azure.microsoft.com/ja-jp/free/)

## 用語辞書ファイル

今回は、日本語→英語 の翻訳を試すので、日本語と英語がペアになった用語ファイル(テキストファイル)を作成します。横浜市の難読地名をピックアップしてみました。(参考: [はまれぽ.com「コレなんて読む？市内の難読地名をご紹介！」](https://hamarepo.com/story.php?story_id=1434))

- 各言語で1ファイル作成し、**同じ行に対になる翻訳語** を入力します
- それぞれのテキストファイルは **UTF-8** で保存しておきます

<img alt="20190326_01.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/117583/2d1be3f4-6318-d1c4-8353-59595ef1cb34.png" width="50%">

# 手順

## 1. Azure Portal から Translator Text API サブスクリプションの作成

[Cognitive Services Translator Text API のサブスクリプション作成](https://qiita.com/annie/items/f8c5964bce2d15c26253#21-cognitive-services-translator-text-api-%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B) の手順で、Translator Text API サブスクリプションを作成します。今回は F0(無償版) でなく S0(従量課金) を選択する必要があります。
作成したサブスクリプションの Key1 をローカルに保存しておくのを忘れずに。
<img alt="20190326_02.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/117583/5e8816eb-a9ef-bc84-952e-efd6ed326afe.png" width="25%">


## 2. Custom Translator Portal からカスタム翻訳モデルの作成

### 2.1. Custom Translator を使う準備

ブラウザーから [Custom Translator Portal](https://portal.customtranslator.azure.ai/) にアクセスし、ページ右上の **Sign In** をクリックし、Microsoft アカウントでサインインします。
![20190326_03.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/72d3b732-7aa7-f4cb-db70-6fd0059d06fa.png)

初期画面が表示されます。ページの左側メニューから **Settings** をクリックして API Key のセットを行います。
![20190326_04.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/2a061aeb-d245-f1c9-c496-634ea06c73f7.png)

*Subscription Key* の欄にある **[+ Add Key]** をクリックします。ローカルに保存しておいた Translator API Key をペーストして **[Add]** をクリックして追加します。
![20190326_05.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/6633557b-e2ab-2e6a-a5e7-bcc6dca509b9.png)
![20190326_05-02.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/6cd82342-e626-cf25-29e3-42be75d0fb2a.png)


### 2.2. Project の作成

ページの左側メニューから **Project** をクリックして初期画面に戻ります。Custom Translator モデルの置き場となる Project を作成します。**[Create Project]** をクリックします。
![20190326_04.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/2a061aeb-d245-f1c9-c496-634ea06c73f7.png)

Project の概要を入力します。

- **Project Name** : お好きな(＆見分けやすい) 名前を入力
- Description : 見分けやすい説明を入力
- **Language Pair** : 今回は **Japanese->English** を選択
- **Category** : 今回は地名の翻訳なので **Geography** を選択

入力したら、**[Create]** をクリックして Project を作成します。
![20190326_06.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/5b58d374-5bc1-579a-70c9-776eeebb1208.png)

Project が作成されると Project のページが表示されます。
この時に表示される **Category ID** をコピーしてローカルに保存しておきます。
![20190326_07.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/6993fd5a-ccf6-8151-ed3d-c79ffc3ce858.png)


### 2.3. 用語辞書の登録

用語辞書の登録を行います。ページの左側メニューから **Document** を選択します。
Document のページで **[Upload Files]** をクリックします。
![20190326_09.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/b5205e67-4a19-5e0c-caf7-45f8c0214eaa.png)

*Upload Files* のダイアログボックスで以下を入力＆設定します。

- **Document Type** : 今回は **Phrase Dictionary** を選択
- **Language Pair** : 今回は **Japanese->English** を選択
- Parallel Data
    - *Source(ja) Files* に日本語、*Source(ja) Files* に英語の用語辞書ファイルを、それぞれ **[Browse Files]** をクリックしてアップロードします
- **Document Name** : お好きな(＆見分けやすい) 用語辞書の名前を入力します

**[Upload]** をクリックして、用語辞書の登録を行います。
![20190326_08.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/05856f00-2b9c-37cb-350f-501f80aaa2d4.png)

登録した用語辞書が表示されたら完了です。
![20190326_10.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/0847c2f6-29c7-1510-57d9-28d7022a0da1.png)


### 2.3. カスタム翻訳モデルの学習、デプロイ

登録した用語辞書を使った翻訳モデルの学習を行います。ページの左側メニューから **Project** をクリックします。表示される登録済みの用語辞書を選択 (✓(チェック) をつける)して、**[Create Model]** をクリックします。
![20190326_11.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/401eec37-c4da-37ce-5d49-b55c0b1139f1.png)

お好きな(＆見分けやすい) 翻訳モデルの名前を入力し **[Train Model]** をクリックして、モデルの作成を行います。
![20190326_12.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/2b818671-616e-6011-0567-43caf32f004e.png)

*Project* ページで *Model* タブをクリックすると、作成した翻訳モデルが表示されます。Status が *Training Succeeded* と表示されていたら翻訳モデルの作成は完了です。

> このプロセスは(登録単語数が少なくても)時間がかかりますので気長に待ちます

![20190326_13.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/4a51b377-4d15-e052-06c3-4f728f59fde4.png)

作成した翻訳モデルをデプロイ(Web API で利用できるように公開)します。作成した翻訳モデルの欄にある **[Deploy]** をクリックします。

**Undeployed** を **Deployed** に変更して、**[Save]** をクリックして公開します。
![20190326_14.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/94f97a11-3377-3086-bccf-59a19f7ab44c.png)

翻訳モデルの Status が *Deployed* と表示されていたら翻訳モデルのデプロイは完了です。

> このプロセスも時間がかかりますので気長に待ちます

![20190326_15.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/bba2e9e8-3e00-c979-bc83-bfc49e4b8581.png)


## 3. 作成したカスタム翻訳モデルの確認

Postman などの Web API ツールを使って、作成したカスタム翻訳モデルの動作を確認します。
[docs.microsoft.com > Translator Text API : Translate]
(https://docs.microsoft.com/ja-jp/azure/cognitive-services/translator/reference/v3-0-translate)

> 基本的な使い方は Translator Text API (v3) と同じです。Custom Translator で作成した翻訳モデルを利用したい場合、**category** というパラメーターで設定を行えば OK です。

- Method: Post
- Base URL: https://api.cognitive.microsofttranslator.com/translate
- Parameter: 
    - api-version=3.0
    - from=ja
        - 翻訳元の言語を指定します(今回は日本語)
    - to=en
        - 翻訳する言語を設定します(今回は英語)
    - category=*Custom Translator Portalから取得した ID*
- Header:
    - Ocp-Apim-Subscription-Key= *Azure Portalから取得した Key1*
    - Content-Type=application/json
- Body: 
    - [{"Text":"翻訳したい言葉"}] というフォーマット(Json)に構成します

まずは Custom Translator なし(category パラメーターなし) で送信してみます。
掃部山(かもんやま) が正しく翻訳されていません。
![20190326_16.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/e03915b3-23e6-aa64-f1d7-bd0b9ec09d0b.png)

次に作成した Custom Translator を使って(category パラメーターあり) で送信してみます。
掃部山(かもんやま) が正しく翻訳されるようになりました。
![20190326_17.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/93634c81-79a2-742a-e84d-304f0c7067ab.png)