Amazon Translateに再入門する(2023年01月版)

2023.01.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんちには。

データアナリティクス事業本部 機械学習チームの中村です。

本記事ではAmazon Translateに再入門していきます。

なお、本記事は年末のアドベントカレンダーで投稿したAWSのフルマネージドな機械学習サービスの入門記事の流れを継続しています。

過去分含めてアドベントカレンダーの方も興味がございましたらぜひご確認ください。

Amazon Translateとは

Amazon Translateは高速で高品質かつカスタマイズ可能な言語翻訳を提供する、機械翻訳サービスです。

翻訳には、深層学習モデルが使用されており、従来の翻訳アルゴリズムよりも正確で自然な翻訳を提供することが可能となっています。

Pricing(料金)

今回も使用する前にPricingを確認していきましょう。

Pricingを確認することでおおよその機能概要も把握できます。

翻訳には以下の2種類があります。

  • Standard Translation
  • Active Custom Translation

1M charactersあたりの料金が示されており、Standardの方が安価となっています。

処理自体には、リアルタイム翻訳とバッチ翻訳がありますが、共に料金はcharacters辺りの料金で統一されます。

またActive Custom Translationを使う際のparallel data storageのストレージについては、アカウント毎に200GBの無料枠が提供されます。この無料枠からオーバーする部分については、parallel data storageについての容量あたりの支払いが発生するようです。

対応言語

75種類以上の言語に対応しています。

組み合わせ次第で使えるものが変わってくるため詳細は以下を参照ください。

機能概要

リアルタイム翻訳とバッチ翻訳

Translateもその他のフルマネージドな機械学習サービスと同様に、リアルタイム処理とバッチ処理の双方に対応しています。

  • リアルタイム翻訳 : 入力テキストを直接APIなどで与える推論
  • バッチ翻訳 : 入力テキストをS3バケットに配置してジョブを定義してバッチ実行する推論

注意点としてはバッチ翻訳がまだ東京リージョンで対応してない点です。

対応リージョンについては以下を参照ください。

本記事では一通りの機能を試すため、us-east-1リージョンで実施します。

またバッチ翻訳は複数のフォーマットに対応しています。

フォーマットや制限については以下を参照ください。

言語の自動識別

Translateは、ソース言語が指定されていない場合、自動的にソース言語を識別します。

言語の識別には、Comprehendの現誤検出APIが使用されます。

また最近のアプデートにより、バッチ翻訳の場合でもファイル毎に自動で言語識別が可能となっています。

これによって、入力のS3バケットに複数種類のソース言語のファイルがあっても自動で識別して、ターゲット言語に翻訳することが可能です。

詳細は以下のブログもぜひご確認ください。

Do-not-translate tags : 翻訳禁止の指定

タグをソーステキスト内に付与することで、翻訳を実施しない場所を指定することが可能となっています。

<span translate="no">翻訳しないテキスト</span>

Custom terminology : カスタム用語

カスタム用語を使用することにより、特定の組織、ドメイン、および業界に固有の用語や名前の翻訳方法を定義することが可能です。

これもカスタマイズの一部と見なせますが、よりシンプルな仕組みでカスタムが可能となります。

具体的には、Aというサービス名が別の言語の国では、Bというサービス名になっている場合、AをBに置き換えて翻訳するといったように動作するようです。

公式の例では、Aが「Amazon Family」Bが「Amazon Famille」となっています。

Profanity : 冒涜表現のマスク

冒涜的な単語やフレーズを翻訳出力でマスクするためにするための機能で、ターゲット言語の表現でマスクするものを指定します。

ソース言語とターゲット言語が同じ場合、翻訳リクエスト側はマスクされず、あくまで出力結果に対して働きます。

そのため、ソース言語では冒涜的だった表現が、翻訳された出力では自然に無難な表現になることもあり、このような場合、マスキングは適用されません。

あくまで文字単位で見てマスクするため、文脈上問題ないケースでもマスクされることがあります。

現在この機能は一部の言語ではサポートされていませんが、日本語についてはサポートされています。

詳細は以下のドキュメントや弊社のブログも参照ください。

Formality : フォーマルな表現の切り替え

こちらは、くだけた表現で翻訳するか、フォーマルな表現で翻訳するかを設定可能な機能となっています。

日本語もサポートされています。

Active Custom Translation : 詳細なカスタム

Active Custom Translation(ACT)は、お客様のデータをTranslateにインポートすることで、翻訳結果をニーズに合わせてカスタマイズする機能となっています。

カスタム用語と比較してより詳細なニュアンスをカスタマイズするイメージのようです。

Active Custom Translationを使用する際に、モデルの構築や維持などの作業は不要で、何度でも無償で更新することができます。(ただし前述のようにParallel Dataの容量のみに対して料金が発生します)

こちらの機能は一部のリージョンのみで利用可能で、リアルタイム翻訳では使えず、バッチ翻訳のみで使用可能です。

詳細は公式ドキュメントを参照ください。

使ってみた

リアルタイム翻訳

まずはマネジメントコンソールから使ってみたいと思います。

リージョンは全ての機能が使用可能な us-east-1 を選択しておきます。

Translateのページにいくと以下のようなメニューとなります。項目は結構シンプルです。

テキストを入力すると即座に翻訳が開始されます。

今回は以下のテキストを使用してみました。

I got to know my teacher in Kamakura. I was still a young calligrapher at the time. I received a letter from a friend who went swimming during the summer vacation saying that they should come, so I spent some money and decided to go out. I spent two or three days working on money. However, less than three days after I arrived in Kamakura, my friend who invited me suddenly received a telegram asking me to return from Kunimoto. There was a message on the telegram saying that my mother was sick, but my friend didn't believe it. My friend had been forced to get married for some time not recommended by her parents in Kunimoto. According to modern custom, he was too young to get married. Also, the essential person in question didn't like it. So I purposely avoided places I should have gone back to during summer vacation and played close to Tokyo. He showed me his telegram and discussed what to do. I didn't know what to do. However, in fact, if his mother was sick, he should have gone home from Gutsu. So he finally decided to go home. Having come all the way, I was left alone.

結果は以下のようになっています。

鎌倉で先生と知り合いました。当時、私はまだ若い書家でした。夏休みに泳ぎに行った友人から、来てくださいという手紙が届いたので、少しお金をかけて出かけることにしました。2、3日はお金の勉強に費やしました。しかし、鎌倉に着いて3日も経たないうちに、私を招待してくれた友人が突然、国本から帰ってほしいという電報が届きました。電報には母が病気だというメッセージがありましたが、私の友人はそれを信じませんでした。私の友人は、しばらくの間、国本の両親に勧められずに結婚を余儀なくされていました。現代の慣習によると、彼は結婚するには若すぎた。また、問題の本質的な人はそれが気に入らなかった。だから、夏休みに帰るべき場所をあえて避け、東京の近くで遊びました。彼は私に電報を見せて、どうしたらいいか話し合った。どうしたらいいのかわからなかった。しかし、実は母親が病気だったら、グッツから帰ればよかったのに。それで彼はついに家に帰ることに決めました。せっかく来たので、私はひとりぼっちになった。

リアルタイム翻訳では以下の機能が追加設定により使用できるようです。

ためしに、FormalityをFormal、Informalに切り替えて結果を見てみます。

  • Formalの場合

鎌倉の先生と知り合いになりました。当時、私はまだ若い書道家でした。夏休みに泳ぎに行った友人から、来てほしいという手紙が届いたので、お金を使って出かけることにしました。お金の勉強に2、3日費やしました。しかし、鎌倉に着いて3日も経たないうちに、私を招待した友人が突然、国本から帰るようにという電報を受け取りました。電報には、母が病気だというメッセージがありましたが、私の友人はそれを信じていませんでした。私の友人は、しばらくの間、国本の両親に勧められずに結婚を余儀なくされていました。現代の習慣によると、彼は結婚するには若すぎました。また、問題の本質的な人はそれが気に入らなかったのです。だから、夏休みに帰るべき場所をあえて避け、東京の近くでプレーしました。彼は私に電報を見せて、何をすべきかを話し合いました。どうしたらいいのかわかりませんでした。しかし、実際には、もし彼の母親が病気だったら、彼はガツから家に帰ったはずです。それで彼はついに家に帰ることに決めました。せっかく来たので、私は一人ぼっちになりました。

  • Informalの場合

鎌倉の先生と知り合った。当時、私はまだ若い書道家だった。夏休みに泳ぎに行った友人から、来てほしいという手紙が届いたので、お金を使って出かけることにした。お金の勉強に2、3日費やした。しかし、鎌倉に着いて3日も経たないうちに、私を招待した友人が突然、国本から帰るようにという電報を受け取った。電報に母が病気だというメッセージがあったが、私の友人はそれを信じなかった。私の友人は、国本の両親に勧められずに、しばらくの間結婚を余儀なくされていた。現代の習慣によると、彼は結婚するには若すぎた。また、問題の本質的な人はそれが気に入らなかった。だから、夏休みに帰るべき場所をあえて避け、東京の近くでプレーした。彼は私に電報を見せて、何をすべきかを話し合った。どうしたらいいのかわからなかった。しかし、実際には、もし彼の母親が病気だったら、彼はガツから家に帰るべきだった。それで彼はついに家に帰ることにした。せっかく来て、私は一人ぼっちになった。

表現が切り替わっていることが分かります。

(設定しない場合はFormalityがどちらも含まれるような表現となっていたことが分かりました)

Profanity maskingも有効にできます。

今回は結果は変わらなかったため、今回特に問題となる表現はなかったようです。

カスタム用語の作成

カスタム用語を翻訳時に使用するには、カスタム用語のリソースを作成しておく必要があります。

ここは公式の例に沿って「Amazon Family」を「Amazon Famille」に置き換えるカスタム用語を作成してみます。

カスタム用語をクリックします。

用語の作成をクリックします。

以下のようなCSVファイルを作成しておきます。

(公式の例ではfrですが、わかりやすいようjaにしています)

en,ja
Amazon Family,Amazon Famille

ファイルの選択によりCSVファイルをアップロードします。

データ形式はCSVを、DirectionalityはUni-directionalを選択しておきます。

(Uni-directionalだとソース言語が1つのみとなり、そのソース言語からそれ以外の言語へのみ変換が効く形となります。

Multi-directionalにすると、双方向にカスタム用語集が効く形となります。)

最後に用語の作成をクリックします。

ソース言語は指定するメニューが無く、CSVファイルの最も左の列がソース言語と見なされるようです。

作成が終わると以下の画面になります。

カスタム用語の使用

英語から日本語へのリアルタイム翻訳を試してみます。例文は以下とします。

Have you ever shopped with Amazon Family?

カスタム用語の使用しない場合は、以下が翻訳結果です。

Amazonファミリーで買い物をしたことがありますか?

次に追加設定で先ほどのカスタム用語集を設定して実行します。

Amazon Famille で買い物をしたことがありますか?

翻訳結果が意図通りに変わることが確認できました。

Active Custom Translationの作成

次にもう一つのカスタマイズ機能であるActive Custom Translationを試してみます。

準備として、以下の内容のsample-parallel-data.csvをローカルで作成します。

"en","ja"
"See you tomorrow.","お疲れさまでした。"

「See you tomorrow.」はそのままでは「また明日。」と翻訳されますが、

これを「お疲れさまでした。」という表現になることを期待します。

作成にはメニューの「並列データ」をクリックします。

そして「並列データの作成」をクリックします。

項目は以下のように設定します。

上図のようにファイルの選択で実行する場合でコンソールバケットが無い場合は、「Create S3 bucket」を押下します。 これによりコンソールバケットが作成されるようです。

最後に「並列データの作成」を押下します。

こちらはバッチ翻訳時にしか使えないため、以降ではバッチ翻訳で比較していきます。

バッチ翻訳(通常)

まずはActive Custom Translationを使わない、通常のバッチ翻訳を作成します。

ジョブ設定は以下です。

入力データはS3バケットにアップロードする必要があります。

今回は以下の場所にアップロードしました。

  • s3://sample-translate-nakamura-2023-01-16/input/sample.txt

内容は以下です。

See you tommorow.

このオブジェクトのprefixをバッチ翻訳の入力データに指定します。

  • s3://sample-translate-nakamura-2023-01-16/input

出力も以下のprefixとしました。

  • s3://sample-translate-nakamura-2023-01-16/output

ロールは新規作成する設定で実行しました。

ジョブの作成が終わると以下のような画面に遷移します。

ジョブをクリックすると進行状況や具体的な出力prefix名が確認できます。

翻訳結果は以下のようになりました。

また明日。

バッチ翻訳(Active Custom Translationあり)

次に同様の手順でActive Custom Translationを使用してバッチ翻訳をしてみます。

Customizationで以下のようにsample-parallel-dataを指定します。

結果は以下のようになりました。

おさまでした。

結果は変化するものの、意図通りにはできなかったようなので、もう少しParallel Dataを増やした検証が必要かなと思いました。

まとめ

いかがでしたでしょうか。Amazon Translateについての一通りの使用方法について触れていきました。

基本的には日本語対応していますが、東京リージョンでは使えない機能がありますのでそこは注意が必要そうです。今後のアップデートにも期待して待ちたいと思います。

本記事が、今後Amazon Translateを活用されようとする方の一助となれば幸いです。