使用 MarianMT 进行文本数据增强
Hugging Face 最近在其模型中心发布了1008 个翻译模型,用于近 140 种语言。
这些模型最初由赫尔辛基大学[语言技术研究组的Jörg Tiedemann](https://blogs.helsinki.fi/language-technology/)训练。他们使用称为MarianNMT的神经机器翻译框架在Open Parallel Corpus(OPUS)上进行了训练。
在这篇文章中,我将解释如何使用 MarianMT 模型来增强数据文本数据。
回译
我们将使用一种称为“反向翻译”的数据增强技术。在此,我们取用英文编写的原始文本。然后,我们使用 MarianMT 将其转换为另一种语言(例如法语)。我们使用 MariaMT 将法语文本翻译回英语。如果与原始英文句子不同,我们保留回译的英文文本。
[
反向翻译](https://res.cloudinary.com/practicaldev/image/fetch/s--y703ENto--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://amitness.com /images/back-translation-marianmt.png)
增强过程
首先,我们需要使用以下命令安装 Hugging Face 转换器和 Moses Tokenizers
pip install -U transformers
pip install mosestokenizer
进入全屏模式 退出全屏模式
安装后,我们现在可以导入 MarianMT 模型和分词器。
from transformers import MarianMTModel, MarianTokenizer
进入全屏模式 退出全屏模式
然后,我们可以创建一个可以将英语翻译成罗曼语的初始化模型。这是一个可以翻译成任何浪漫语言的单一模型()
target_model_name = 'Helsinki-NLP/opus-mt-en-ROMANCE'
target_tokenizer = MarianTokenizer.from_pretrained(target_model_name)
target_model = MarianMTModel.from_pretrained(target_model_name)
进入全屏模式 退出全屏模式
同样,我们可以初始化可以将罗曼语语言翻译成英语的模型。
en_model_name = 'Helsinki-NLP/opus-mt-ROMANCE-en'
en_tokenizer = MarianTokenizer.from_pretrained(en_model_name)
en_model = MarianMTModel.from_pretrained(en_model_name)
进入全屏模式 退出全屏模式
接下来,我们编写一个辅助函数来翻译一批文本,给出机器翻译模型、分词器和目标浪漫语言。
def translate(texts, model, tokenizer, language="fr"):
# Prepare the text data into appropriate format for the model
template = lambda text: f"{text}" if language == "en" else f"{language}<< {text}"
src_texts = [template(text) for text in texts]
# Tokenize the texts
encoded = tokenizer.prepare_seq2seq_batch(src_texts)
# Generate translation using model
translated = model.generate(**encoded)
# Convert the generated tokens indices back into text
translated_texts = tokenizer.batch_decode(translated, skip_special_tokens=True)
return translated_texts
进入全屏模式 退出全屏模式
接下来,我们将准备一个函数来使用上面的translate()函数进行反向翻译。
def back_translate(texts, source_lang="en", target_lang="fr"):
# Translate from source to target language
fr_texts = translate(texts, target_model, target_tokenizer,
language=target_lang)
# Translate from target language back to source language
back_translated_texts = translate(fr_texts, en_model, en_tokenizer,
language=source_lang)
return back_translated_texts
进入全屏模式 退出全屏模式
现在,我们可以使用从英语到西班牙语的反向翻译对句子列表执行数据增强,如下所示。
en_texts = ['This is so cool', 'I hated the food', 'They were very helpful']
aug_texts = back_translate(en_texts, source_lang="en", target_lang="es")
print(aug_texts)
进入全屏模式 退出全屏模式
["Yeah, it's so cool.", "It's the food I hated.", 'They were of great help.']
进入全屏模式 退出全屏模式
同样,我们可以使用完全相同的辅助方法使用英语到法语进行扩充,如下所示。
en_texts = ['This is so cool', 'I hated the food', 'They were very helpful']
aug_texts = back_translate(en_texts, source_lang="en", target_lang="fr")
print(aug_texts)
进入全屏模式 退出全屏模式
["It's so cool.", 'I hated food.', "They've been very helpful."]
进入全屏模式 退出全屏模式
链接回译
您还可以在链中运行反向翻译以获得更多多样性。例如,English -> Spanish -> English -> French -> English
en_texts = ['This is so cool', 'I hated the food', 'They were very helpful']
aug1_texts = back_translate(en_texts, source_lang="en", target_lang="es")
aug2_texts = back_translate(aug1_texts, source_lang="en", target_lang="fr")
print(aug2_texts)
进入全屏模式 退出全屏模式
["Yeah, that's cool.", "It's the food I hated.", 'They were of great help.']
进入全屏模式 退出全屏模式
可用型号
以下是您可以在上面使用的主要浪漫语言子集的语言代码。
语
法语
西班牙语
意大利语
葡萄牙语
罗马尼亚语
加泰罗尼亚语
加利西亚语
拉丁
代码
FR
es
它
pt
罗
约
升
这
语
瓦隆
奥克西坦(1500 年后)
撒丁岛
阿拉贡语
科西嘉岛
罗曼什语
代码
的
oc
锡
一个
合作
R M
要查看所有可用的语言代码,您可以运行
target_tokenizer.supported_language_codes
进入全屏模式 退出全屏模式
替代应用
除了数据增强,反向翻译过程也可用于文本释义。
同样,我们也可以将其用作对抗性攻击。假设我们有一个训练数据集,我们在该数据集上训练了一个 NLP 模型。然后,我们可以扩充训练数据集并从我们的模型对扩充文本生成预测。如果预测与我们的真实标签不同,那么我们就有一个模型失败的文本列表。通过分析这些响应,我们可以获得很好的见解。
结论
因此,MarianMT 是一个不错的免费离线替代谷歌翻译的反向翻译。
参考文献
- MarianMT - 变压器 3.0.2 文档
连接
如果您喜欢这篇博文,请随时通过Twitter与我联系,我每周都会分享新的博文。
更多推荐

所有评论(0)