🛰️
AWS SDK for PythonでAmazon Translate カスタム用語
概要
Amazon Translateのカスタム用語をAWS SDK for Python (Boto)で利用する際に調べた物です。
API使う上でドキュメントの内容だけでは分かりにくいところがあったので自分用にまとめました。
カスタム用語とは
- 設定することで商品名などの独自コンテンツ名を意図通りに翻訳する
- 動作の仕組み
- ソース文を読み取り解釈→翻訳を生成
- ソース文をスキャンし、完全一致するカスタム用語を検索
- 用語を見つけた場合は置き換える
翻訳後に置き換えを行うなら、カスタム用語が文章の一部として捉えられそうな場合は精度が低くなりそうだな?と思い確認して見たところ、
*カスタム用語を以下で指定
ソース言語(ja): こんにちは
ターゲット言語(en):FOO
*翻訳してみる
こんにちは
↓
FOO
こんにちはねこ
↓
FOOcat
こんにちはいかがお過ごしですか
↓
Hello how are you doing
文脈の方が優先されるようで、文章によってはカスタム用語が無視されていました。
カスタム用語が翻訳を強制する事はなく、あくまで精度を上げるための機能みたいです。
カスタム用語の登録
- CSVまたはTMX形式で登録する
- CSVファイルの例:
en fr de Amazon Amazon Amazon - 1列目がソース言語、残りの列がターゲット言語になる
- ソース言語毎にファイルが必要で、もしこの"Amazon"を3言語相互に翻訳を行いたい場合はそれぞれをソース言語としたファイルを3つ登録する必要がある
- ユースケースによってはちょっと不便ですね。相互に対応できる設定もあったらいいなと思います。
対応言語
- 翻訳後に文脈に応じて単語の形があまり変わらない言語と大幅に変わる言語がある
- 後者の言語の場合、カスタム用語を適用する事は非推奨となる
- 適用は可能
コード例(python)
カスタム用語の登録
ImportTerminology
- カスタム用語をインポートするサービス
- 指定した用語が存在するかに応じて作成・または更新(既存の用語を上書き)を行う
- 更新の場合使用可能になるまで最大 10 分かかることがある
translate = boto3.client(service_name='translate', use_ssl=True)
with open('カスタム用語csvファイル', 'rb') as f:
file_data = f.read()
response = translate.import_terminology(
# インポートするカスタム用語名
Name='terminology',
# 更新の場合のマージ方法。現在はOVERWRITEのみ
MergeStrategy='OVERWRITE',
TerminologyData={"File": file_data, "Format": 'CSV'}
)
カスタム用語の使用
TranslateTextリクエストを送る時にTerminologyNamesパラメータに登録済みのカスタム用語名を指定するだけです。
client = boto3.client(service_name='translate', use_ssl=True)
result = client.translate_text(
Text=message,
SourceLanguageCode="ja",
TargetLanguageCode="en",
# インポートしたカスタム用語をリストで指定
TerminologyNames=["terminology"]
)
ベストプラクティス
以下はドキュメントに記載があった内容です。
自動翻訳がおかしいところがあったので原文から翻訳。
- カスタム用語は最小限にとどめましょう。コントロールしたい単語や、完全に明白な単語のみを含めてください。別の意味で使うことがないことが分かっている単語のみを使用し、ひとつの方法でのみ翻訳されるようにします。ブランド名や製品名などの固有名詞に限定するのが理想的です。
- カスタム用語集では、大文字と小文字が区別されます。 大文字と小文字の両方の単語が必要な場合、それぞれのバージョンのエントリを含める必要があります。
- 同じソース用語に対して複数の異なる翻訳を含めないでください。
- 言語の中には、文脈に応じて単語の形が変わらないものがあります。このような言語では、カスタム用語集を適用することで、全体的な翻訳品質が向上する可能性が高いです。しかし、一部の言語では、単語の形が大幅に変更されます。このような言語に機能を適用することはお勧めしませんが、適用することを制限するものではありません。
翻訳のサポートの機能であって、例えば、表記揺れに対応するためにいくつもカスタム用語を登録するような使い方は正しく無いみたいです。
終わり
実際にSDKでコードを試していないので、出てきたエラーについてなどは後で追記しようと思います
Discussion