Amazon Translate で用語リストを参照して翻訳する

前回、投稿でTranslateが、用意したテキストをスラっと別の言語に変換できる話をしましたが、今回はその翻訳精度をコントロールする機能です。

用語機能を利用することで、翻訳時の結果に自分の適用したい用語や名称を自由に設定できます。
通常の翻訳とは違って、毎回設定した用語や名称がそのまま翻訳後の文章に適用されます。
設定した用語や名称は作成時に暗号化され、作成したユーザーのみアクセス可能です。
登録済み用語と同じ内容をインポートすると、サポートされているマージはOVERWRITEのみで、既存の用語を上書きします。
用語上書きインポートは、キャッシュポリシーによって、使用できるようになるまでに最大10分かかります。

APIリファレンス

Translate   import_terminologyメソッド

機能    用語の登録

構文

import_terminology{
   "Description": "string",
   "EncryptionKey": { 
      "Id": "string",
      "Type": "string"
   },
   "MergeStrategy": "string",
   "Name": "string",
   "TerminologyData": { 
      "File": blob,
      "Format": "string"
   }
}

戻り値

{
   "TerminologyProperties": { 
      "Arn": "string",
      "CreatedAt": number,
      "Description": "string",
      "EncryptionKey": { 
         "Id": "string",
         "Type": "string"
      },
      "LastUpdatedAt": number,
      "Name": "string",
      "SizeBytes": number,
      "SourceLanguageCode": "string",
      "TargetLanguageCodes": [ "string" ],
      "TermCount": number
   }
}

構文説明

[Description]	
	
	インポートされるカスタム用語の説明。
	タイプ:文字列
	長さの制約:最大長=256
	パターン: [\P{M}\p{M}]{0,256}
	指定は必須ではない
	
[EncryptionKey]	
	
	インポートされるカスタム用語の暗号化キー。
	タイプ:EncryptionKeyオブジェクト
	指定は必須ではない
	
[MergeStrategy]	
	
	インポートされるカスタム用語のマージ戦略。
	現在、OVERWRITEマージ戦略のみがサポートされています。
	この場合、インポートされた用語は同じ名前の既存の用語を上書きします。
	タイプ:文字列
	有効な値: OVERWRITE
	指定は必須
	
[Name]	
	
	インポートされるカスタム用語の名前。
	タイプ:文字列
	長さの制約:最小長=1 最大長=256
	パターン: ^([A-Za-z0-9-]_?)+$
	指定は必須
	
[TerminologyData]
	
	インポートされるカスタム用語の用語データ。
	タイプ:TerminologyDataオブジェクト
	指定は必須

戻り値説明

アクションが成功すると、サービスはHTTP200応答を送り返します。	
次のデータは、サービスによってJSON形式で返されます。	
	
[TerminologyProperties]	
	
	インポートされるカスタム用語のプロパティ。
	タイプ:TerminologyPropertiesオブジェクト

エラー内容

InternalServerException	
	
	内部サーバーエラーが発生しました。リクエストを再試行してください。
	HTTPステータスコード:500
	
InvalidParameterValueException	
	
	パラメータの値が無効です。修正に使用しているパラメーターの値を確認してから、操作を再試行してください。
	HTTPステータスコード:400
	
LimitExceededException	
	
	指定された制限を超えました。リクエストを確認し、指定された制限を下回る数量で再試行してください。
	HTTPステータスコード:400
	
TooManyRequestsException	
	
	短期間でリクエストが多すぎます。しばらく待ってから、リクエストを再試行してください。
	HTTPステータスコード:400

Translate   list_terminologiesメソッド

機能   登録名の一覧を取得する。(登録名の一覧を含む辞書を取得)

構文

list_terminologies{
   "MaxResults": number,
   "NextToken": "string"
}

戻り値

{
   "NextToken": "string",
   "TerminologyPropertiesList": [ 
      { 
         "Arn": "string",
         "CreatedAt": number,
         "Description": "string",
         "EncryptionKey": { 
            "Id": "string",
            "Type": "string"
         },
         "LastUpdatedAt": number,
         "Name": "string",
         "SizeBytes": number,
         "SourceLanguageCode": "string",
         "TargetLanguageCodes": [ "string" ],
         "TermCount": number
      }
   ]
}

構文説明   リクエストは、JSON形式で次のデータを受け入れます。

[MaxResults]	
	
	リストリクエストごとに返されるカスタム用語の最大数。
	タイプ:整数
	有効な範囲:最小値=1 最大値=500
	指定は必須ではない
	
[NextToken]	
	
	ListTerminologiesへのリクエストの結果が切り捨てられた場合は、NextTokenを含めて、
	カスタム用語の次のグループをフェッチします。
	タイプ:文字列
	長さの制約:最大長=8192
	パターン: \p{ASCII}{0,8192}
	指定は必須ではない

戻り値説明

アクションが成功すると、サービスはHTTP200応答を送り返します。	
次のデータは、サービスによってJSON形式で返されます。	
	
[NextToken]	
	
	ListTerminologiesへの応答が切り捨てられた場合、NextTokenはカスタム用語の次のグループをフェッチします。
	タイプ:文字列
	長さの制約:最大長は8192です。
	パターン: \p{ASCII}{0,8192}
	
[TerminologyPropertiesList]	
	
	リストリクエストで返されるカスタム用語のプロパティリスト。
	タイプ:TerminologyPropertiesオブジェクトの 配列

エラー内容

[InternalServerException]	
	
	内部サーバーエラーが発生しました。リクエストを再実行します。
	HTTP ステータスコード: 500
	
[InvalidParameterValueException]	
	
	パラメータの値は無効です。使用しているパラメーターの値を確認して修正し、操作を再試行します。
	HTTP ステータスコード: 400
	
[TooManyRequestsException]	
	
	しばらくお待ちください。しばらく待ってから、もう一度試してください。
	HTTP ステータスコード: 400

Translate   get_terminologyメソッド

機能   用語データを取得する。(用語データの場所を含む辞書を取得)

構文

get_terminology{
   "Name": "string",
   "TerminologyDataFormat": "string"
}

戻り値

{
   "TerminologyDataLocation": { 
      "Location": "string",
      "RepositoryType": "string"
   },
   "TerminologyProperties": { 
      "Arn": "string",
      "CreatedAt": number,
      "Description": "string",
      "EncryptionKey": { 
         "Id": "string",
         "Type": "string"
      },
      "LastUpdatedAt": number,
      "Name": "string",
      "SizeBytes": number,
      "SourceLanguageCode": "string",
      "TargetLanguageCodes": [ "string" ],
      "TermCount": number
   }
}

構文説明  リクエストは、JSON形式で次のデータを受け入れます。

[Name]	
	
	取得するカスタム用語の名前。
	タイプ:文字列
	長さの制約:最小長=1 最大長=256
	パターン: ^([A-Za-z0-9-]_?)+$
	指定は必須
	
[TerminologyDataFormat]	
	
	取得するカスタム用語のデータ形式(CSVまたはTMX)。
	タイプ:文字列
	有効な値: CSV | TMX
	指定は必須

戻り値説明

アクションが成功すると、サービスはHTTP200応答を送り返します。	
次のデータは、サービスによってJSON形式で返されます。	
	
[TerminologyDataLocation]	
	
	取得されるカスタム用語のデータの場所。
	カスタム用語ファイルは、有効期限が30分の事前署名されたURLで返されます。
	タイプ:TerminologyDataLocationオブジェクト
	
[TerminologyProperties]	
	
	取得されるカスタム用語のプロパティ。
	タイプ:TerminologyPropertiesオブジェクト

エラー内容

[InternalServerException]	
	
	内部サーバーエラーが発生しました。リクエストを再実行します。
	HTTP ステータスコード: 500
	
[InvalidParameterValueException]	
	
	パラメータの値は無効です。使用しているパラメーターの値を確認して修正し、操作を再試行します。
	HTTP ステータスコード: 400
	
[ResourceNotFoundException]	
	
	お探しのリソースが見つかりませんでした。探しているリソースを確認し、
	別のリソースがニーズを満たしているかどうかを確認してから、改訂されたリクエストを再試行してください。
	HTTP ステータスコード: 400
	
[TooManyRequestsException]	
	
	しばらくお待ちください。しばらく待ってから、もう一度試してください。
	HTTP ステータスコード: 400

Translate   delete_terminologyメソッド

機能   用語データを削除する。

構文

delete_terminology{
   "Name": "string"
}

戻り値   アクションが成功すると、サービスは空のHTTPボディを含むHTTP200応答を送り返します。

構文説明  リクエストは、JSON形式で次のデータを受け入れます。

[Name]	
	
	削除されるカスタム用語の名前。
	タイプ:文字列
	長さの制約:最小長=1 最大長=256
	パターン: ^([A-Za-z0-9-]_?)+$
	指定は必須

戻り値説明  アクションが成功すると、サービスは空のHTTPボディを含むHTTP200応答を送り返します。

エラー内容

InternalServerException	
	
	内部サーバーエラーが発生しました。リクエストを再試行してください。
	HTTPステータスコード:500
	
InvalidParameterValueException	
	
	パラメータの値が無効です。修正に使用しているパラメーターの値を確認してから、操作を再試行してください。
	HTTPステータスコード:400
	
ResourceNotFoundException	
	
	探しているリソースが見つかりません。改訂されたリクエストを再試行する前に、探しているリソースを確認し、
	別のリソースがニーズを満たしているかどうかを確認してください。
	HTTPステータスコード:400
	
TooManyRequestsException	
	
	短期間でリクエストが多すぎます。しばらく待ってから、リクエストを再試行してください。
	HTTPステータスコード:400

用語のCSVファイルの形式

1行目 				翻訳元の言語コード , 翻訳先の言語コード
2行目以降			翻訳元の用語 , 翻訳先の用語
					
(複数の翻訳先を登録する場合)			
1行目 				翻訳元の言語コード , 翻訳先Aの言語コード, 翻訳先Bの言語コード,・・・
2行目以降			翻訳元の用語 , 翻訳先Aの用語 , 翻訳先Bの用語,・・・
ja,en
みこらぼ工房,Mikolabo Works
御子柴システム,"MIKOSHIBA SYSTEM CO.,LTD"

①用語を登録するプログラム trans_termino_import.py

import boto3
translate = boto3.client('translate')
with open('termino_ja.csv', 'rb') as file:
    translate.import_terminology(
        Name='termino_ja',
        MergeStrategy='OVERWRITE',
        TerminologyData={'File': file.read(), 'Format': 'CSV'})
PS C:\Users\mikol\translate> python trans_termino_import.py

※ メッセージがなにも出力されなかったので、登録は成功!!

②用語を使って翻訳するプログラム trans_termino_enabled.py

import boto3
translate = boto3.client('translate')
text = 'みこらぼ工房の新しい技術が御子柴システムから発表されました。'
result = translate.translate_text(
    Text=text, SourceLanguageCode='ja', TargetLanguageCode='en',
    TerminologyNames=['termino_ja'])
print(result['TranslatedText'])
PS C:\Users\mikol\translate> python trans_termino_enabled.py

The new technology of Mikolabo Works has been announced from the Mikoshiba system.

③登録名の一覧を取得するプログラム trans_termino_list.py

import boto3
import pprint
translate = boto3.client('translate')
result = translate.list_terminologies()
pprint.pprint(result)
(まだ、用語を登録していない状態)
PS C:\Users\mikol\translate> python trans_termino_list.py

{'ResponseMetadata': {'HTTPHeaders': {'content-length': '32',
                                      'content-type': 'application/x-amz-json-1.1',
                                      'date': 'Wed, 30 Jun 2021 23:19:53 GMT',
                                      'x-amzn-requestid': 'a3f33e74-90ea-42b3-8cf7-999999999999'},
                      'HTTPStatusCode': 200,
                      'RequestId': 'a3f33e74-90ea-42b3-8cf7-999999999999',
                      'RetryAttempts': 0},
 'TerminologyPropertiesList': []}
( termino_ja を登録した後に実行)
PS C:\Users\mikol\translate> python trans_termino_list.py
{'ResponseMetadata': {'HTTPHeaders': {'content-length': '283',
                                      'content-type': 'application/x-amz-json-1.1',
                                      'date': 'Wed, 30 Jun 2021 23:21:22 GMT',
                                      'x-amzn-requestid': 'dc1d8546-51eb-4da6-930e-999999999999'},
                      'HTTPStatusCode': 200,
                      'RequestId': 'dc1d8546-51eb-4da6-930e-999999999999',
                      'RetryAttempts': 0},
 'TerminologyPropertiesList': [{'Arn': 'arn:aws:translate:ap-northeast-1:999999999999:terminology/termino_ja/LATEST',
                                'CreatedAt': datetime.datetime(2021, 7, 1, 8, 20, 57, 167000, tzinfo=tzlocal()),
                                'LastUpdatedAt': datetime.datetime(2021, 7, 1, 8, 20, 57, 392000, tzinfo=tzlocal()),
                                'Name': 'termino_ja',
                                'SizeBytes': 92,
                                'SourceLanguageCode': 'ja',
                                'TargetLanguageCodes': ['en'],
                                'TermCount': 2}]}

④用語データを取得するプログラム trans_termino_get.py

import boto3
import pprint
translate = boto3.client('translate')
result = translate.get_terminology(
    Name='termino_ja', TerminologyDataFormat='CSV')
pprint.pprint(result)
PS C:\Users\mikol\translate> python trans_termino_get.py

{'ResponseMetadata': {'HTTPHeaders': {'cache-control': 'no-cache',
                                      'content-length': '2006',
                                      'content-type': 'application/x-amz-json-1.1',
                                      'date': 'Wed, 30 Jun 2021 23:02:18 GMT',
                                      'x-amzn-requestid': 'a4dce0b9-6997-4441-92c7-999999999999'},
                      'HTTPStatusCode': 200,
                      'RequestId': 'a4dce0b9-6997-4441-92c7-999999999999',
                      'RetryAttempts': 0},
 'TerminologyDataLocation': {'Location': 'https://aws-translate-terminology-prod-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/999999999999/termino_ja/LATEST/3d1e3a25-1d30-4718-a05e-6dfc8d5755a5/CSV/termino_ja.csv?X-Amz-Security-Token=IQoJb3JpZ2luX2VjENb%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaDmFwLW5vcnRoZWFzdC0xIkgwRgIhAMwFxz4aql%2Bmg%2Fv0IuNLs8vYd2VE%2FiH5P0TKjQovI0dqAiEApJE%2FGOhATU4rGGqg0HqRPt9%2B311PkZWlpjpAod4DYGoqjQQIr%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARACGgwzMDEwMzM2NzkwODkiDBolz%2BaCrLDAKS6Q7irhA%2BiJaqwp7zM0%2F1TogmZUtYgY1YSpaurpUT%2FEE3Fwl4l0rwKocoJ2YXwnYUSNj3GtR8utfxVGEpTnRxvmwAW2zOeouZrBBNUyCh59NmMaaKwvZ7lFcqkIXR0Wi4wVoGR01fiB4yKssdI700ZyfEbC9GXcABSs9wcURbcvUTwEfa5P0QF9tnuDcKGvwrPiBuRJ%2FNqCE4enUrI0%2Fgot%2BBrn0XORsEjP6aVz%2FwGfdyqS%2Feh3xQkPKUNe1X7Dal7i33z9%2Fz1J01JpmhBCei%2FYJIgckZ%2BDEtkvGmWPqayBwh5SweezmuAVIY16%2Fmhh4d7uLu890aCdk%2FX9sGKmpzduek9LHfgq%2BQAL7ySQQvpF6uiusgLnmNdcNHdd5uZ%2Ba2nVPqGXR925BrQ3tZjZ4D65VA6PKJjv6VoYjtfaoO7nb2rNvz4nvOfRyugv6tMln3ITbn4SFzLksUmok6tcGkvs%2FePnaOEybRUdrzPnm09RnRp7RtzamBKqu1m6pgDaLE2s6C5fX4H%2FCGgnL7iJP29eMjaIGySDfCnoOVZwrJJDafxNDQ8zRKkKADu3wjxrDO2MF2gc0F77T%2FXD%2FtNL45oCu4EbOL5O3J2dvrLHgJEJzQcyQ13E%2BvUJRYNy6Fdom82yYNlqE%2BwwjtXzhgY6pAEEy2fRUc4fQq4xnks2ORxyfWFt6WR6%2Fu5vucsCZvWFHr3dQn%2BSlZzcWBU1WQt5vWxZFDblMm5k4gVsHecriJrpYjaxrXlTdh9Q5%2BRNo5DCHwstjUHJBI3j5d8JM5YwAP6ySRD%2FYGelB2JUaJphq1o1%2Bhd1MhoeC3BvUZ6BqSJQtO00onNYPb6OQKt8SEHgORE5JVecjQsnFATjNaM3QoadfShOww%3D%3D&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20210630T230219Z&X-Amz-SignedHeaders=host&X-Amz-Expires=1800&X-Amz-Credential=ASIAUMFYBNDYVOD6M44E%2F20210630%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-Signature=44b247b922b2d093f950caa2f236daf3d1cd8c2d70af37236935c520e5e97518',
                             'RepositoryType': 'S3'},
 'TerminologyProperties': {'Arn': 'arn:aws:translate:ap-northeast-1:999999999999:terminology/termino_ja/LATEST',
                           'CreatedAt': datetime.datetime(2021, 7, 1, 8, 0, 41, 383000, tzinfo=tzlocal()),
                           'LastUpdatedAt': datetime.datetime(2021, 7, 1, 8, 0, 41, 561000, tzinfo=tzlocal()),
                           'Name': 'termino_ja',
                           'SizeBytes': 108,
                           'SourceLanguageCode': 'ja',
                           'TargetLanguageCodes': ['en'],
                           'TermCount': 2}}

⑤用語データをダウンロードするプログラム trans_termino_download.py

import boto3
import urllib
translate = boto3.client('translate')
result = translate.get_terminology(
    Name='termino_ja', TerminologyDataFormat='CSV')
url = result['TerminologyDataLocation']['Location']
print(url)
with open('termino_ja_download.csv', 'wb') as file_out:
    with urllib.request.urlopen(url) as file_in:
        file_out.write(file_in.read())
PS C:\Users\mikol\translate> python trans_termino_download.py

https://aws-translate-terminology-prod-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/999999999999/termino_ja/LATEST/99b9e345-4a46-4a84-b4e4-999999999999/CSV/termino_ja.csv?X-Amz-Security-Token=IQoJb3JpZ2luX2VjENf%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaDmFwLW5vcnRoZWFzdC0xIkgwRgIhAMGGyfEITqJLfM11YtcEkeoB3BLz2a%2Fh6z6PmcqlN1d5AiEAgNxY2jqQ8e2W%2Bq0WanLui%2BJYIN6QJrFdASZN9wsb9NAqjQQIsP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARACGgwzMDEwMzM2NzkwODkiDJ3ZENcvh9vTVBjrNyrhA82U9cYjlxIPiW0wRcEZBpBzsZhgau9nNRwbajrzRYEF8J0KNVJ0myDR5l40hXxbF1rKY%2FyzAvVLN5Rplgz6dKIt9%2Fig5nhtNKRn3xexc2Seu5hfa2LX9wu3rXLVTsNsYCNnj%2BwIpqhgLhvpw6RnucISL8itzZViGsp17PioLdFM2ZVHjOLVfSOz9hYJmql8NOCCLnKMawc6Y9ib%2BaRT%2FtEfdkg%2Fsheg%2BlAolNAxXgcFPJk4T1ih7YL0Rq6CKp220MkJyd%2Fz2e8wM8jpBbhYPIpw74Jr4q6nk7CiCoT1bhj18fFc1hhRlvCB5CZmBZ%2BrwzQUYXPoneUMLYThY3Dx2Fdzgm7zMa3%2BKO2kjDDfrv2IX6yCd5vJ0%2By%2FpZIkC7SMvDjrPfcv0BQYVuOeilGBoERbxc5mF5oLf5%2FF5mItLOvgdZCUGvsxarYd4BK%2BDGsMRd%2FLuYqbqLmw3SDQDg3BFrnvuPIGBTx30lYnT37R59fnp%2ByLvaKOA13nb1xFeEEGdvQRunBcmpv1%2BfZYPLT%2F0nzeNMeZIGwNCJue4ZGtYcrtVLTyrvkFuMqb60yVNtK0eQKZcv%2FNWK6sJvX1%2FZFpNk9JHo1cWNztYctBvdmurKj9jI2imE8%2BqB0NNZU06MR6IRswjvHzhgY6pAGLOwsAgveAxh%2BE8%2Bcy%2FiWDlIraS3Bm4Va4tuOcJ8WOJSPytxKPAlWJazW0PDTe9xh10wlLSKI2B%2FQIC8Q%2FC6cW4poBZTWkCcWnYsjm2YPeTLIVNEF2wPOyqzMHeGG10RIq1qs00hpZZkSEPFS59SmS76moOgtf7sZ5frC8AoWhmc63BN23nAeHkHVivBQjJjCxXqR53FCaqpeCNZgTXN3IT7BM7g%3D%3D&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20210630T232813Z&X-Amz-SignedHeaders=host&X-Amz-Expires=1800&X-Amz-Credential=ASIAUMFYBNDYQXKUSL2G%2F20210630%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-Signature=ff976dd448e9cca51315b5810443808145b3085bc2452a8457533c4e2b3c7620
ja,"en"
御子柴システム,"MIKOSHIBA SYSTEM CO.,LTD"
みこらぼ工房,"Mikolabo Works"

⑥用語を削除するプログラム trans_termino_delete.py

import boto3
translate = boto3.client('translate')
translate.delete_terminology(Name='termino_ja')
PS C:\Users\mikol\translate> python trans_termino_delete.py