Google Cloud Translation APIの用語集機能を試してみる

f:id:aptpod_tech-writer:20201217171522j:plain

マニュアル等のドキュメント制作を担当している私は、世の中の機械翻訳エンジンの進歩を日々驚きながら観察しています。

実際に業務で使うかは別途判断するとして、「この文をこの機械翻訳エンジンに与えたら、どんな訳文が得られるのだろうか」と、試してみることもあります。

この記事では、そんなお試しの例として、Google Cloud Translation APIの「用語集」の機能を使ってみます。

aptpod Advent Calender 2020の18日目、テクニカルライターの篠崎が担当します。

(なお、この記事で扱うのは、プログラムから利用する機械翻訳ウェブAPI Google Cloud Translation APIです。ウェブブラウザーから利用する機械翻訳サービスGoogle Translateではありません。)

この記事について

  • この記事は、軽く「試してみる」だけの内容です。機械翻訳一般やGoogle Cloud Translation APIの性能や有用性を検証するためのものではありません。
  • 2020年12月に試してみた結果に基づいています。翻訳エンジンは日々更新されると思われます。また、用語集機能もアップデートされるかもしれません。
  • Google Cloud Translation APIで翻訳を実行するには料金がかかります。また、以下に挙げるコードではGoogle Cloud Storageのバケットに用語集を保存しますが、それに対しても料金が発生します。
  • 日本語から英語への翻訳を例とします。
  • あくまで1つの例としてご覧ください。

Google Cloud Translationの用語集機能とは

Google Cloud Translation APIには、用語集(Glossary)の機能が存在します。

対訳形式の用語集をあらかじめ登録しておくことで、指定された訳語を訳文の中で使用してもらうことができます。

f:id:aptpod_tech-writer:20201214145034p:plain
対訳用語集の例

Google Cloud Translation APIの公式ドキュメントでは、用語集を使用する場合の例として、「商品名」、「あいまいな単語」(意味が全く違うのに同じつづりの語)、「借用語」が挙げられています。

実際に用語集を使用するとどのような翻訳結果が得られるのか、試してみました。

試してみる

以下では、必要な準備を行ったうえで、実際に用語集を使って機械翻訳をしてみます。

準備

手元のPCからGoogle Cloud Translation APIを使用するには、一般に、以下の準備が必要です(Google Cloud Platformのアカウントは取得済みとします)。 これらについては、公式ドキュメントに詳しく説明されています。

  1. Google Cloudコンソール(以下「GCPコンソール」)で新しいプロジェクトを作る。
  2. GCPコンソールで、プロジェクトのCloud Translation API機能を有効にする。
  3. GCPコンソールで、APIを使用するためのアカウントである「サービスアカウント」を作り、適切な権限を設定する。
  4. GCPコンソールで、サービスアカウントのキー(JSONファイル)を作成し、手元のPCにダウンロードする。
  5. サービスアカウントのキーのファイルを、環境変数 GOOGLE_APPLICATION_CREDENTIALS で指定する。
  6. クライアントライブラリー(Python用ならばgoogle-cloud-translate)をインストールする。
  7. Cloud SDKをインストールする。

また、この記事で紹介する「お試しPythonコード」を実行するには、以下の準備も必要です。

  1. 使用するサービスアカウントには「Cloud Translation API 編集者」(roles/cloudtranslate.editor)と、「Storage Object管理者」(roles/storage.objectAdmin)のロールを持たせる。

    f:id:aptpod_tech-writer:20201214125222p:plain
    サービスアカウントに設定されたロール

  2. 用語集のアップロード先としてGoogle Cloud Storage(GCS)バケットを作っておく。

    f:id:aptpod_tech-writer:20201214142752p:plain
    GCSバケットを作っておく

お試しPythonコード

上記の準備をしたうえで、実際に翻訳を試してみます。

このコードには、用語集データのアップロードから後片付けまでの手順が入っています(エラー処理は省略しています)。また、用語集とテスト用の原文もコード内に入っています。

from google.cloud import storage
from google.cloud import translate_v3 as translate

# 1. 各種設定

# 日英対訳用語集(公式ドキュメントにある「単一言語ペアの用語集」の形式で作成)
# ここでは、簡単のためにCSV形式の1つの文字列として用意しました。

GLOSSARY = '''\
"メールアドレス","email address"
"健司","Takeshi"
"国立","Kunitachi"
"試験","test"
"選ぶ","select"
'''

# テスト翻訳対象の原文
SOURCE_TEXTS = [
    'メールアドレスを入力してください。',
    'メールアドレス設定画面',
    '健司さんは国立の病院に行きます。',
    '学校で試験があります。',
    '3つの選択肢から選ぶことができます。',
    '彼が選ぶものはいつも同じです。',
    '3つの選択肢から選ばなければならなないため、Aを選んだ。',
    '3つの選択肢から選ぶよう指示されたため、Aを選ぶことにした。']

# GCPのプロジェクト情報(プロジェクトは事前に作成済みとする)
PROJECT_ID = '<プロジェクトID>'

# ロケーションはいまのところus-central1のみ対応とのこと
LOCATION = 'us-central1'

# 用語集CSVのアップロード先バケット名(バケットは事前に作成済みとする)
BUCKET_NAME = '<GCSバケット名>'

# バケットに用語集を保存するときのオブジェクト名
GLOSSARY_OBJECT_NAME = 'test_ja_en_glossary.csv'

# 上記により、バケット内のCSVファイルオブジェクトへのURIが決まる。
GLOSSARY_URI = 'gs://' + BUCKET_NAME + '/' + GLOSSARY_OBJECT_NAME

# 新しく作成する用語集のID
GLOSSARY_ID = 'test_ja_en_glossary'


# 2. 用語集をアップロードして、GSCバケット内にCSVファイルとして保存する

# GCSクライアントを作成する
storage_client = storage.Client()

# 用語集のアップロード先バケットと、新たに作るオブジェクト名を指定
bucket = storage_client.bucket(BUCKET_NAME)
glossary_blob = bucket.blob(GLOSSARY_OBJECT_NAME)

# 用語集CSVを文字列として送信し、GCS上のオブジェクトにする
glossary_blob.upload_from_string(GLOSSARY)

# 3. GCSにアップロードされたCSVをもとにして、
# Google Cloud Translate用の「用語集リソース」を作る

# Google Cloud Translate v3 APIのクライアントを作成
trans_client = translate.TranslationServiceClient()

# 用語集リソースのパスを決める
glossary_name = trans_client.glossary_path(
    PROJECT_ID, LOCATION, GLOSSARY_ID)

# ソース言語とターゲット言語のペアを指定する
language_pair = translate.types.Glossary.LanguageCodePair(
    source_language_code='ja',
    target_language_code='en')

# 先ほどGCSにアップロードした用語集CSVを指定する
gcs_source = translate.types.GcsSource(input_uri=GLOSSARY_URI)
input_config = translate.types.GlossaryInputConfig(gcs_source=gcs_source)

# 上記で準備した情報を組み合わせて、用語集の情報を準備する
glossary = translate.types.Glossary(
    name=glossary_name,
    language_pair=language_pair,
    input_config=input_config)

project_location_path = trans_client.location_path(PROJECT_ID, LOCATION)

# 用語集リソースを作成する
glossary_create_operation = trans_client.create_glossary(
    parent=project_location_path, glossary=glossary)

# 用語集リソースの作成完了を待つ
glossary_create_result = glossary_create_operation.result(timeout=90)


# 4. 翻訳してみる

# 使用する用語集リソースを指定する
glossary_config = translate.types.TranslateTextGlossaryConfig(
    glossary=glossary_name)

# 翻訳対象、言語名、用語集リソース等を指定して翻訳する
response = trans_client.translate_text(
    SOURCE_TEXTS,
    'en',
    project_location_path,
    source_language_code='ja',
    glossary_config=glossary_config)

# 結果を出力する
for (source, trans, trans_with_glossary) in zip(
        SOURCE_TEXTS,
        response.translations,
        response.glossary_translations):
    print('原文:       ' + source)
    print('用語集なし: ' + trans.translated_text)
    print('用語集あり: ' + trans_with_glossary.translated_text)
    print()

# 5. 後片付け

# 用語集リソースを削除する
glossary_delete_operation = trans_client.delete_glossary(name=glossary_name)

# 用語集リソースの削除完了を待つ
glossary_delete_result = glossary_delete_operation.result(timeout=90)

# GCS内のCSVファイルを削除する
glossary_blob.delete()

得られた翻訳結果

以下のような結果が得られました。

原文:       メールアドレスを入力してください。
用語集なし: Please enter your e-mail address.
用語集あり: Please enter your email address.

用語集で指定したとおり、ハイフンなしの"email address"となりました。

原文:       メールアドレス設定画面
用語集なし: Email address setting screen
用語集あり: email address setting screen

文書内でタイトルとして使うことを想定した名詞句です。 先頭は大文字がよいのですが、用語集に入れたハイフンなしの"email address"に置換され、 小文字になってしまいました。

なお、「メールアドレス」という1つの原語に対して、"email address"と"Email address"のような2種類の訳語を登録することはできません("Can't create glossary. There are conflicting entries."というエラーになります)。

原文:       健司さんは国立の病院に行きます。
用語集なし: Kenji goes to a national hospital.
用語集あり: Takeshi goes to a Kunitachi hospital.

「たけし」さんと「くにたち」の話であることがあらかじめ分かっているときは、このような置換は効果を発揮しそうです。 ただし、"hospital in Kunitachi"のようにはならず、単純な置き換えになっているようです。

原文:       学校で試験があります。
用語集なし: I have an exam at school.
用語集あり: I have an test at school.

ここでは、単純に"exam"が"test"に置換された結果、"a test"ではなく"an test"となってしまいました。

原文:       3つの選択肢から選ぶことができます。
用語集なし: You can choose from three options.
用語集あり: You can select from three options.

動詞の例です。「選ぶ」が"select"に置換されました。(このような一般的な動詞は用語集に入れないほうが良いと思いますが、試しにやってみました。)

原文:       彼が選ぶものはいつも同じです。
用語集なし: The one he chooses is always the same.
用語集あり: The one he select is always the same.

単純に"select"に置換された結果、"he selects"ではなく、"he select"となってしまいました。

原文:       3つの選択肢から選ばなければならなないため、Aを選んだ。
用語集なし: I chose A because I had to choose from three options.
用語集あり: I chose A because I had to choose from three options.

「選ぶ」を用語集に入れましたが、活用形である「選ば」、「選ん」は用語集に入れていないので置換されないようです。

原文:       3つの選択肢から選ぶよう指示されたため、Aを選ぶことにした。
用語集なし: I was instructed to choose from three options, so I decided to choose A.
用語集あり: I was instructed to select from three options, so I decided to select A.

「選ぶ」に完全に一致する文字列(連体形)の場合は置換されました。

おわりに

用語集の効果がどのようなものか、軽く試してみることができました。

用語集の項目の立て方を工夫して、他のケースも試してみたいですが、 上記のようなコードを用意しておけば、用語集のアップロードから、翻訳結果取得、用語集削除まで、いっぺんにできるので便利です。

なお、Cloud Translation APIには、対訳コーパスを使ってカスタム翻訳モデルをトレーニングし、 それを使って翻訳を行うAutoML Translationという機能もあります。 こちらも、いつか試してみたいところです。

参考文献