Huggingface MarianMT 翻译器会丢失内容,具体取决于模型

问题描述

背景

我通过 Python 使用 MarianMT von Huggingface 将文本从源语言翻译成目标语言。

预期行为

我将一个序列输入到 MarianMT 模型中,然后将该序列翻译回来。为此,我使用了相应的语言模型和分词器。我输入的所有句子也都回来了。这些句子被视为一个序列。

当前行为

根据语言模型,模型不会翻译所有内容,而只会返回部分内容在这个例子中,缺少最后一句:

原文(德语): Ein Nilpferd lief im Dschungel rum und musste aufs WC。 Da traf es einen Kakadu und fragte nach dem Weg。 Der sagte wenn du Kaka musst,dann pass mal ganz kurz auf。 Ich sag dir wo du hidehen musst,ich kenn mich hier gut aus。

结果(英语): 一只河马在丛林中跑来跑去,不得不上厕所。有一只鹦鹉,问路。他说如果你非要卡卡的话,那就当心一分钟。 我会告诉你你要去哪里,我知道这里的路。

结果(荷兰语): Een nijlpaard liep rond in de丛林 en moest naar het 厕所... en een kaketoe vroeg naar de weg... die zei dat als je Kaka moest,ik even最直接。

当前代码

from transformers import AutoTokenizer,AutoModelForSeq2SeqLM


def translate_text(input,source,target):

    # Prepare output
    output = ""

    model = AutoModelForSeq2SeqLM.from_pretrained("Helsinki-NLP/opus-mt-" + source + "-" + target)
    tokenizer = AutoTokenizer.from_pretrained("Helsinki-NLP/opus-mt-" + source + "-" + target)

    inputs = tokenizer.encode(input[:512],return_tensors="pt",padding='longest')
    outputs = model.generate(inputs,max_length=4000,num_beams=4,early_stopping=True)

    for t in [tokenizer.convert_ids_to_tokens(s) for s in outputs.tolist()[0]]:
        output = output + t.replace("▁"," ").replace("</s>","")

    output.replace("<pad>","")

    return output


print(translate_text("Ein Nilpferd lief im Dschungel rum und musste aufs WC. Da traf es einen Kakadu und fragte nach dem Weg. Der sagte wenn du Kaka musst,dann pass mal ganz kurz auf. Ich sag dir wo du hingehen musst,ich kenn mich hier gut aus.","de","nl"))
print(translate_text("Ein Nilpferd lief im Dschungel rum und musste aufs WC. Da traf es einen Kakadu und fragte nach dem Weg. Der sagte wenn du Kaka musst,"en"))

需要帮助

我想念什么?为什么缺少某些序列部分?

解决方法

在这种情况下,您可以通过英语翻译:

de_en = translate_text("Ein Nilpferd lief im Dschungel rum und musste aufs WC. Da traf es einen Kakadu und fragte nach dem Weg. Der sagte wenn du Kaka musst,dann pass mal ganz kurz auf. Ich sag dir wo du hingehen musst,ich kenn mich hier gut aus.","de","en")

en_nl = translate_text(de_en,"en","nl")

print(en_nl)

结果: Een nijlpaard rende rond 在 de 丛林 en moest naar het 厕所。 Er was een kaketoe en vroeg om de weg。 Hij zei als je moet Kaka,dan uitkijken voor een minuut。 Ik zal je vertellen waar je moet gaan,Ik weet mijn weg hier。


最后一句没有消失,只是质量低了点。 De->En 和 En->Nl 模型可能在他们的训练数据中有比 De->Nl 更长的句子(你永远不知道),这就是为什么最后一个句子没有从翻译。但同时,翻译成英文可能会造成一些信息丢失(例如du/Sie -> you)。

给定模型的名称(在 OPUS 语料库上训练),理论上您可以在此处看到的句子有多大:http://opus.nlpl.eu/Europarl/v8/de-nl_sample.html 或此处:http://opus.nlpl.eu/MultiParaCrawl/v7.1/de-nl_sample.html; 或其他opus.nlpl.eu 上的 de-nl 样本

此处提供更多信息:https://github.com/Helsinki-NLP/Opus-MT

tl;dr 事实上,这些模型翻译粘在一起的多个句子很可能只是一种副作用,不应依赖。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...