Huggingface MarianMT 翻译器会丢失内容,具体取决于模型
Posted
技术标签:
【中文标题】Huggingface MarianMT 翻译器会丢失内容,具体取决于模型【英文标题】:Huggingface MarianMT translators lose content, depending on the model 【发布时间】:2021-04-01 03:51:09 【问题描述】:上下文
我正在通过 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 hanghen musst, ich kenn mich hier gut aus.
结果(英文):一头河马在丛林中跑来跑去,不得不上厕所。有一只凤头鹦鹉问路。他说,如果你非要卡卡,那就留心一分钟。 我会告诉你你要去哪里,我知道我在这里的路。
结果(荷兰语): Een nijlpaard liep rond in de Jungle en moest naar het 厕所... en en 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, dann pass mal ganz kurz auf. Ich sag dir wo du hingehen musst, ich kenn mich hier gut aus.", "de", "en"))
需要帮助
我错过了什么?为什么缺少一些序列部分?
【问题讨论】:
如果您尝试使用"Ein Nilpferd ...
而不是"in Nilpferd ...
会发生什么?
感谢您突出显示我在上面修复的错字。但它不会改变所描述的行为!
你知道 Opus MT 是如何分割 training 数据的吗?模型在训练中看到过这样的序列吗?
据我所知是句句。这意味着,模型实际上并不知道更多的句子序列。但是,如果我在翻译之前拆分句子,我就会失去翻译的重要上下文!
如果模型没有经过上下文训练,那么它无论如何也不知道如何处理它。
【参考方案1】:
在这种情况下,您可以将其翻译成英文:
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丛林和 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; 或其他 de-nl 样本在 opus.nlpl.eu
更多信息在这里:https://github.com/Helsinki-NLP/Opus-MT
tl;dr事实上,这些模型可以翻译多个粘合在一起的句子,这很可能只是一个不应该依赖的副作用。
【讨论】:
以上是关于Huggingface MarianMT 翻译器会丢失内容,具体取决于模型的主要内容,如果未能解决你的问题,请参考以下文章
Transformers学习笔记3. HuggingFace管道函数Pipeline
将 HuggingFace 模型加载到 AllenNLP 中会给出不同的预测
Huggingface 转换器模型返回字符串而不是 logits
翻译: Deep Learning深度学习平台Hugging Face 开源代码和技术构建训练和部署 ML 模型