MSの機械翻訳[Microsoft Translator Text]と、機械学習で独自辞書を追加できる[Custom Translator]を知る

# はじめに
本記事は2019/03/03に執筆しました。
これ系の技術は常にアップデートされているため、将来的に古くなる可能性があります。


# Translator TextとCustom Translator

## Translator Textとは
Microsoftが展開している「Cognitive Services」の1つで、いわゆる機械翻訳です。
https://azure.microsoft.com/ja-jp/services/cognitive-services/
Cognitive Servicesの他には、音声解析や画像解析機能が提供されています。

[Bing翻訳](https://www.bing.com/translator)の内部も、どうやら同様のエンジンを使用していそうです。（推測）

基本的にTranslator Textは、Rest APIから実行します。
なので時折、「Translator Text API」と呼んでいたりもします。
https://azure.microsoft.com/ja-jp/services/cognitive-services/translator-text-api/

Translator Text APIは、Azureから設定を行います。
設定方法などは、公式のリファレンスを参照ください。
https://docs.microsoft.com/ja-jp/azure/cognitive-services/translator/translator-info-overview


## Custom Translatorとは
上記のTranslator Text APIでは、一般的な翻訳の結果しか適用されません。
つまり、自社独自であったり、業界独特の文章や単語は、翻訳結果に反映されないわけです。

そこで登場するのが、この「Custom Translator」です。
https://www.microsoft.com/ja-jp/translator/business/customization/

Custom Translatorは「ニューラル機械翻訳（NMT：Neural Machine Translation）」という仕組みを採用しており、機械翻訳結果をより自然に、人の翻訳のように反映させるものです。（詳しくは後述）

Custom Translatorでは、人の手で行われた翻訳結果の対照テキスト一覧（例：日本語⇔英語）を、事前に管理者がシステムにアップロードし、学習させます。
これは各環境（プロジェクト）ごとに学習させるため、自社独自の辞書であったり、独自の業界の言葉や言い回しを、オンリーミーとして学習させる事ができるわけです。

システム連携をすることで、Translator Textには、Custom Translatorで学習させた内容が反映されます。
これで、Translator Text APIを、ほとんど変えることなく今まで通り（ちょこっと変わるけど）呼び出すだけで、独自の辞書結果を反映してくれます。

本投稿は、このCustom Translatorについて、さわりを超ざっくり解説していきます。


# Custom Translatorの概要
## ニューラル機械翻訳（NMT：Neural Machine Translation）
上記の通り、Custom Translatorは「ニューラル機械翻訳（NMT：Neural Machine Translation）」という仕組みを採用しております。
ニューラル機械翻訳（NMT：Neural Machine Translation）については、[この記事](https://www.crosslanguage.co.jp/blog/nmt_release/)が非常に分かりやすかったです。
超ざっくりいうと、

- これまで(ルールベース機械翻訳)：文法ルールと辞書情報を基に訳文を生成するので、翻訳結果が機械的になることが多かった
- NMT：**実際に人間が翻訳した文章で学習する**ので、結果も自然になる
- ただし：**学習させていない単語**の翻訳にはとことん弱い

こんな特徴を持ちます。

## Custom Translatorの使用まで
実際にCustom Translatorを使用するまでは、以下の内容を参考にしました。

- [公式リファレンス](https://docs.microsoft.com/ja-jp/azure/cognitive-services/translator/custom-translator/quickstart-build-deploy-custom-model)
- [Custom Translator をちょっとさわってみた](https://blog.beachside.dev/entry/2018/12/08/232353)

実際に触ってみて、少しだけ補足したいことがあったので、こちらに記載します。

### 学習のためのsentenceは10,000文以上必要
まず、機械学習のための学習データを作成時に、翻訳前⇔翻訳後の文章をアップロードします。
その後、学習データのモデルを作成するのですが、文章が足りないと、
「Please select one or more parallel documents with a minimum of 10,000 sentences to start your training.」
と表示されます。
これは、「トレーニングを開始するには、少なくとも1万の文章を含む1つ以上の並列ドキュメントを選択してください。」ということです。要するに**Custom Translatorの使用には、翻訳前⇔翻訳後の文章がそれぞれ1万文章以上必要ってことです。**
「うちには少し、専門用語のAAAとBBBとCCCがあるから、それらを翻訳結果に反映させたいな！」ぐらいのニーズだと、とても実現ができなそうです。
まあ機械学習はデータ量が肝だから仕方ないね。このサービスは大企業向けの内容でしょう。

ちなみに自分は、検証用として、青空文庫の「吾輩は猫である」を、日本語と、機械翻訳した英語の本文をそれぞれ作成し、アップロードして試しています。機械翻訳した内容を再度NMTに学習させるという笑

### Custom TranslatorのAPI
Custom TranslatorのAPIは用意されています。（ただし2019/03/03現在Preview版）
[こちら](https://custom-api.cognitive.microsofttranslator.com/swagger/)がリファレンス・・・なのですが、どうもこのリファレンスは不足がけっこうありそうです。
色々探りまくったら、GitHubにサンプルソースがあったので、こちらをご参照ください。→[CustomTranslatorApiSamples](https://github.com/MicrosoftTranslator/CustomTranslatorApiSamples)


Microsoft Graph APIでの認証方法とほとんど同じなのですが、注意するのが「resourceUri」が "https://graph.microsoft.com" ではなく "api://6981666b-e0e0-47d6-a039-35318677bf79/access_as_user" という文字列なことです。なんじゃそりゃ。
将来的にGAされたときに変わるんですかね？とりあえずこの文字列を使用すれば大丈夫そうですね。

APIがあれば、例えば各部署の担当者が、学習のための翻訳前⇔翻訳後ファイルアップロードを、Custom Translatorのサービスページにアクセスさせなくても実行できるようになるはずです。（Custom Translatorのサービスページにみんなをアクセスさせちゃうと、非常に危険ですよね）
また、翻訳機能を埋め込んだアプリを実行時に、ワークスペース一覧、カテゴリ一覧を表示し、
翻訳サービスの利用者に、ワークスペースやカテゴリなどを選んでもらって、翻訳させる・・・なんてことも出来るかもしれません。
（権限的に、管理者でないユーザーがワークスペース一覧、カテゴリ一覧を取得出来るか、未検証ですが・・・）


### Translator Text APIにCustom Translatorの結果を反映

> 2020/01/22修正しました

Translator Text APIに、Custom Translatorの結果を反映させるためには、APIの[Translate](https://docs.microsoft.com/ja-jp/azure/cognitive-services/translator/reference/v3-0-translate?tabs=curl#request-parameters)のクエリ文字列に、「category=(カテゴリID)」を追加してあげます。

なおカテゴリIDは、Custom TranslatorのProjectに記載しております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204834/c4dd3cac-f27b-6465-8b60-e3815fca60c0.png)
プロジェクトなのにカテゴリIDなんですね。分かりづらry

# まとめ
- Custom Translatorは、機械翻訳に独自の翻訳結果を追加できる機能
- 方式はニューラル機械翻訳で、自然な翻訳結果には長けているが、学習していない言葉には弱い
- 使用には10,000文以上必要。「この何個かの単語を結果に反映させてほしいな」ぐらいの用途には向かない
- Custom Translator APIをうまく絡めれば、管理もしやすそう。ただし、現在プレビュー版