Hugging Face のコードで翻訳処理が簡単にできるか試してみた

翻訳を簡単にしてみたいです

huggingfaceにそのコードがあるぞ

huggingfaceすげー

環境構築

Google Colabで動作確認をします。下記のリンクに環境構築方法を記述しています。

翻訳

まず必要なライブラリを導入します。

! pip install transformers sentencepiece

下記のコードで動作確認をします。

from transformers import MarianMTModel
from transformers.models.marian.tokenization_marian import MarianTokenizer

src_text = [
    '>>jap<< All things are full of labour; man cannot utter it: the eye is not satisfied with seeing, nor the ear filled with hearing.',
    '>>jap<< The elders of his house arose beside him, to raise him up from the earth: but he would not, neither did he eat bread with them.',
    '>>jap<< We shall find all precious substance, we shall fill our houses with spoil.'
]

model_name = 'Helsinki-NLP/opus-mt-en-jap'
tokenizer = MarianTokenizer.from_pretrained(model_name)
model = MarianMTModel.from_pretrained(model_name)
translated = model.generate(**tokenizer.prepare_seq2seq_batch(src_text, return_tensors="pt"))
tgt_text = [tokenizer.decode(t, skip_special_tokens=True) for t in translated]
tgt_text

使用した例文はhuggingfaceが提供しているテストデータの中の一部を抜粋しました。

下記サイトからテストデータを取得できます。

https://huggingface.co/Helsinki-NLP/opus-mt-en-jap

取得する学習済みモデルの指定を下記の形式で記述できます。’src’が翻訳元言語、’tgt’が翻訳先言語になります。

Helsinki-NLP/opus-mt-{src}-{tgt}

今回は英語を日本語に翻訳したかったのでHelsinki-NLP/opus-mt-en-japに指定しています。

利用可能な言語ペアは下記から探せます。

https://huggingface.co/Helsinki-NLP

学習済みモデルだけでなくtokenizerも簡単に取得できます。下記のコードでトークナイズされたデータを取得できます。

  • tokenizer.prepare_seq2seq_batch

トークナイズに関しては下記の記事を参照ください。

今回は推論だけなので元の英文だけトークナイズしています。

下記のような結果になります。数値IDに自動で変換しています。

{'input_ids': tensor([[    1,   559,   187,    81,   658,     9,  3028,    26,   106,  1608,
          3347,    51,    32,     3,  1330,    42,    54,  3325,    48,  1890,
             2,   271,     3,  1364,  1027,    48,  3386,     4,     0, 46275,
         46275, 46275],
        [    1,   100,   867,     9,    34,   126,  1029,  1547,    45,     2,
            14,  2207,    45,   111,    71,     3,   213,    32,   113,    30,
           359,    54,     2,   277,   180,    30,   324,   474,    48,    49,
             4,     0],
        [    1,   813,    28,    29,   928,    53,  2003,  3453,     2,   152,
            28,    29,  2740,   189,  1001,    48,  1432,     4,     0, 46275,
         46275, 46275, 46275, 46275, 46275, 46275, 46275, 46275, 46275, 46275,
         46275, 46275]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
         1, 1, 1, 1, 1, 0, 0, 0],
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
         1, 1, 1, 1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0]])}

下記で推論しています。

  • model.generate

https://huggingface.co/transformers/main_classes/model.html?highlight=generate#transformers.generation_utils.GenerationMixin.generate

このgenerate関数に関しては下記のリンクに詳細な解説があります。

https://huggingface.co/blog/how-to-generate

結果は数値ラベルの状態なので人間が読める形式に変換する必要があります。下記で変換できます。

  • tokenizer.decode

動作結果は下記のようになりました。適切な変換内容に見えます。

原文:[All things are full of labour; man cannot utter it: the eye is not satisfied with seeing, nor the ear filled with hearing.',
'The elders of his house arose beside him, to raise him up from the earth: but he would not, neither did he eat bread with them.',
'We shall find all precious substance, we shall fill our houses with spoil.'
]

翻訳文:['すべて の 事 は 人 を 飽 か せ, 人 は これ を 語 る こと が でき な い. 目 は 見 る こと に 飽き る こと が な く, 耳 は 聞 く こと に 満足 する こと が な い.',
 'また 彼 の 家 の 長老 たち も, 彼 の かたわら に 立 っ て 彼 を 地 から 起 そ う と し た が, 彼 は 起き よう と は せ ず, また 彼 ら と 一緒 に 食事 を し な かっ た.',
 'われわれ は, さまざま の 尊 い 貨財 を 得, 奪い取 っ た 物 で, われわれ の 家 を 満た そう.']

では例文を変えてみます。もっと簡単な内容にしてみます。

from transformers import MarianMTModel
from transformers.models.marian.tokenization_marian import MarianTokenizer

src_text = [
     '>>jap<< this is a sentence in english that we want to translate to french',
     '>>jap<< This should go to portuguese',
     '>>jap<< And this to Spanish'
]

model_name = 'Helsinki-NLP/opus-mt-en-jap'
tokenizer = MarianTokenizer.from_pretrained(model_name)
model = MarianMTModel.from_pretrained(model_name)
translated = model.generate(**tokenizer.prepare_seq2seq_batch(src_text, return_tensors="pt"))
tgt_text = [tokenizer.decode(t, skip_special_tokens=True) for t in translated]
tgt_text

下記のような結果になります。

['これ は 弁明 の ため で あ る. わたし たち は, 積荷 を 身 に 負 う こと に な っ て い る.',
 'この 人 が ネコ に 行 き なさ い.',
 'この 人 に つ い て は, ノン から や り なさ い.']

思ったより性能が悪いようです。

学習したデータのドメインだと適切に翻訳できるが、それ以外だと十分な性能が出ないようです。

簡単に試せましたが性能はまだまだな面もありますね。

これからの性能向上に期待だ!

Hugging Faceを用いて日本語のデータのポジネガ分析を行い方は下記をご覧ください。

Close Bitnami banner
Bitnami