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

如何解决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 事实上,这些模型翻译粘在一起的多个句子很可能只是一种副作用,不应依赖。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?