[机器翻译]——pivot-based zero-shot translation based on fairseq

文章目录

  • 前言
  • 翻译到en
    • 生成"伪"的、到英语的数据文件
    • 把每一个zs语言对翻译到en
    • 从fairseq-generate生成的文件中,抽取纯en文件
  • 把en数据和所有zs语言对的tgt数据形成平行语料,然后做预处理
    • 形成en到tgt的平行语料
    • 预处理
  • 在en到tgt语言的"伪"平行语料上评估pivot zs translation的性能
  • direct zs translation VS pivot-based zs translation

前言

由于any2en和en2any的同时训练,一方面,encoder端将不同语种编码成国际语(靠近英语?);另一方面,decoder具备把encoder输出翻译成任意一种语言的能力,因此,multilingual translation model具备any2any的翻译能力。由于实际并没有使用除了以英语为中心以外的平行语料进行训练,这种翻译又被称为zero-shot translation。
本文默认为以英语为中心的多语言机器翻译训练,en语言是pivot language,此时,multilingual translation model做zero-shot translation主要有两种方式:

  • direct zs translation:即直接把要翻译的tgt语种告诉decoder,直接生成(会出现严重的off-target问题)
  • pivot-based zs translation:即先把src翻译成en,再把en翻译成tgt(一个强zs translation baseline)

本文记录使用fairseq工具,完成pivot-based zs translation的代码步骤。考虑de-fr的pivot-based zero-shot translation,主要分为以下三步:

  • 把de的语料翻译成en
  • 对翻译得到的en做预处理,并和fr的语料组成平行语料
  • 在en-fr的"伪"平行语料上评估zs translation的性能

本文使用opus100,考虑的zs语言对为:ar-de ar-fr ar-nl ar-ru ar-zh de-fr de-nl de-ru de-zh fr-nl fr-ru fr-zh nl-ru nl-zh ru-zh de-ar fr-ar nl-ar ru-ar zh-ar fr-de nl-de ru-de zh-de nl-fr ru-fr zh-fr ru-nl zh-nl zh-ru
假设我们已经对zs的数据进行了bpe-encode,binarize(fairseq-preprocess)等操作,即,已经有zs数据的data-bin文件:
在这里插入图片描述
下面开始!

翻译到en

生成"伪"的、到英语的数据文件

我们首先使用上述的data-bin-zero-shot文件夹,对于每一个语言对(如ar-de),来生成一个"伪"的、到英语的数据文件(对应为ar-en)。

具体运行如下代码:

# general_scripts/opus100/create_pivot_data.py
import argparse
import os
import json
import shutildef parse_opt():parser = argparse.ArgumentParser()parser.add_argument('--zero-shot-data-bin', type=str, default="data/opus-100-corpus/v1.0/data-bin-zero-shot")parser.add_argument('--save-path', type=str, default="data/opus-100-corpus/v1.0/fake-to-en-data-bin-zero-shot")parser.add_argument('--zero-shot-langs', type=str, default="ar,de,fr,nl,ru,zh")return parser.parse_known_args()[0]def main():opts = parse_opt()zero_shot_data_bin = opts.zero_shot_data_binzero_shot_langs = opts.zero_shot_langs.split(",")save_path = opts.save_pathfor src in zero_shot_langs:for tgt in zero_shot_langs:if src == tgt:continuest_src, st_tgt = sorted([src, tgt])lang_pair = f"{src}-{tgt}"lang_pair_dir = os.path.join(save_path, lang_pair)os.makedirs(lang_pair_dir, exist_ok = True)# dictold_path = os.path.join(zero_shot_data_bin, f"dict.{src}.txt")new_path = os.path.join(save_path, lang_pair, f"dict.{src}.txt")shutil.copyfile(old_path, new_path)shutil.copyfile(new_path, os.path.join(save_path, lang_pair, f"dict.en.txt")) # fake# binold_path = os.path.join(zero_shot_data_bin, f"test.{st_src}-{st_tgt}.{src}.bin")new_path = os.path.join(save_path, lang_pair, f"test.{src}-en.{src}.bin")shutil.copyfile(old_path, new_path)shutil.copyfile(new_path, os.path.join(save_path, lang_pair, f"test.{src}-en.en.bin")) # fake# idxold_path = os.path.join(zero_shot_data_bin, f"test.{st_src}-{st_tgt}.{src}.idx")new_path = os.path.join(save_path, lang_pair, f"test.{src}-en.{src}.idx")shutil.copyfile(old_path, new_path)shutil.copyfile(new_path, os.path.join(save_path, lang_pair, f"test.{src}-en.en.idx")) # fakeif __name__ == "__main__":main()

还是以ar-de这个语言对为例,它对应、"伪"的、到英语的数据文件应有:dict.ar.txt, dict.en.txt, test.ar-en.ar.bin, test.ar-en.ar.idx, test.ar-en.en.bin, test.ar-en.en.idx,而从上述代码可以看到,里面的dict.ar.txt, test.ar-en.ar.bin, test.ar-en.ar.idx是从data-bin-zero-shot文件夹复制过来的真实的文件,关于en的文件则分别从ar的这三个文件直接copy过来,是伪数据。
后续我们使用fairseq-generate来生成en数据时,只会使用ar的数据dict.ar.txt, test.ar-en.ar.bin, test.ar-en.ar.idx来做实际的生成(我们需要),而en的伪数据dict.en.txttest.ar-en.en.bin, test.ar-en.en.idx被用于打分(我们并不需要)。

得到的结果如下:
在这里插入图片描述

把每一个zs语言对翻译到en

上一步得到的fake-to-en-data-bin-zero-shot被用于这一步的生成,具体的生成使用的是fairseq-generate。

具体代码如下:

# evaluate_commond/generate_pivot_to_en.sh
for lang_pair in ar-de ar-fr ar-nl ar-ru ar-zh de-fr de-nl de-ru de-zh fr-nl fr-ru fr-zh nl-ru nl-zh ru-zh de-ar fr-ar nl-ar ru-ar zh-ar fr-de nl-de ru-de zh-de nl-fr ru-fr zh-fr ru-nl zh-nl zh-ru; dosrc_tgt=($(echo $lang_pair | tr "-" "\n"))src=${src_tgt[0]}tgt=${src_tgt[1]}CUDA_VISIBLE_DEVICES=0 python3 evaluate_commond/evaluate.py --config evaluate_commond/evaluate_zero_shot.yml \--lang-pairs ${src}-en \--data-bin ../../data/opus-100-corpus/v1.0/fake-en-centrial-data-bin-zero-shot/${src}-${tgt} \--true-lang-pair ${src}-${tgt} \--pivot
done
# evaluate_commond/evaluate.py 略

上面关键的参数为:

  • lang-pairs:对于所有语言对,都是把这个语言对的src语言,翻译到en(实际的翻译方向)
  • true-lang-pair:这个只是用来创建结果文件夹,保存翻译的结果

得到的翻译结果如下:
在这里插入图片描述

从fairseq-generate生成的文件中,抽取纯en文件

以上述pivot_results/ar-de/generate_ar-en.log为例,里面的内容如下:
在这里插入图片描述
我们需要从中抽取D开头的纯en文本。具体使用的代码如下:

# general_scripts/opus100/extract_puretext_pivot.sh
#!/usr/bin/env bash
path="$1"
direction="$2"
for lang_pair in ar-de ar-fr ar-nl ar-ru ar-zh de-fr de-nl de-ru de-zh fr-nl fr-ru fr-zh nl-ru nl-zh ru-zh de-ar fr-ar nl-ar ru-ar zh-ar fr-de nl-de ru-de zh-de nl-fr ru-fr zh-fr ru-nl zh-nl zh-ru; doecho ${lang_pair}src_tgt=($(echo $lang_pair | tr "-" "\n"))tmp1=${src_tgt[0]}tmp2=${src_tgt[1]}lp1=${tmp1}-${tmp2}lp2=${tmp2}-${tmp1}outprefix=${path}/${lp1}genpath=${outprefix}/generate_${tmp1}-en.loghyppath=${outprefix}/engrep -P "^D" ${genpath} | LC_ALL=C sort -V | cut -f 3- > ${hyppath}
done

需要注意的是,fairseq-generate得到的generate_xxx-en.log文件中,结果是按照句子长度排序的,所以需要使用LC_ALL=C sort -V来按照D后面的sample-id来把它恢复到原来的顺序。如下文件:
在这里插入图片描述
在这里插入图片描述
至此,我们完成了第一步骤。

把en数据和所有zs语言对的tgt数据形成平行语料,然后做预处理

我们拿到了上面的pivot_results文件夹,该文件夹的下一级文件夹以zs语言对为命名,每一个zs语言对文件夹里面的en文件,为这个zs语言对的src数据,翻译过来的en纯文本数据。

对于每一个语言对,我们接下来需要把en纯文本数据和这个语言对的tgt端数据形成平行语料,然后做预处理。

形成en到tgt的平行语料

具体使用如下代码:

# data/opus-100-corpus/v1.0/create_en_to_pivot_data.py
import argparse
import os
import json
import shutildef parse_opt():parser = argparse.ArgumentParser()parser.add_argument('--zero-shot-path', type=str, default="zero-shot")parser.add_argument('--generated-en-path', type=str, default="pivot_results")parser.add_argument('--save-path', type=str, default="en_to_pivot_data")parser.add_argument('--zero-shot-langs', type=str, default="ar,de,fr,nl,ru,zh")return parser.parse_known_args()[0]def main():opts = parse_opt()zero_shot_path = opts.zero_shot_pathgenerated_en_path = opts.generated_en_pathzero_shot_langs = opts.zero_shot_langs.split(",")save_path = opts.save_pathfor src in zero_shot_langs:for tgt in zero_shot_langs:if src == tgt:continuest_src, st_tgt = sorted([src, tgt])lang_pair = f"{src}-{tgt}"lang_pair_dir = os.path.join(save_path, lang_pair)os.makedirs(lang_pair_dir, exist_ok = True)# enold_path = os.path.join(generated_en_path, lang_pair, "en")new_path = os.path.join(lang_pair_dir, f"opus.en-{tgt}-test.en")shutil.copyfile(old_path, new_path)# tgtold_path = os.path.join(zero_shot_path, f"{st_src}-{st_tgt}", f"opus.{st_src}-{st_tgt}-test.{tgt}")new_path = os.path.join(lang_pair_dir, f"opus.en-{tgt}-test.{tgt}")shutil.copyfile(old_path, new_path)if __name__ == "__main__":main()

从而得到平行语料:
在这里插入图片描述

预处理

就是正常做bpe-encode和binarize,使用代码如下:

# data/opus-100-corpus/v1.0/encode-spm-pivot.sh
bpe=bpe-pivot
tmp=tmp
rm -r $bpe
mkdir -p $bpe# apply bpe
for file_name in ar-de ar-fr ar-nl ar-ru ar-zh de-fr de-nl de-ru de-zh fr-nl fr-ru fr-zh nl-ru nl-zh ru-zh de-ar fr-ar nl-ar ru-ar zh-ar fr-de nl-de ru-de zh-de nl-fr ru-fr zh-fr ru-nl zh-nl zh-ru;doecho ${file_name}src_tgt=($(echo $file_name | tr "-" "\n"))src=${src_tgt[0]}tgt=${src_tgt[1]}mkdir ${bpe}/${file_name}python fairseq/scripts/spm_encode.py \--model ${tmp}/spm.bpe.model \--output_format=piece \--inputs en_to_pivot_data/${file_name}/opus.en-${tgt}-test.en en_to_pivot_data/${file_name}/opus.en-${tgt}-test.${tgt} \--outputs ${bpe}/${file_name}/test.en-${tgt}.bpe.en ${bpe}/${file_name}/test.en-${tgt}.bpe.${tgt}
done# data/opus-100-corpus/v1.0/binarize-pivot.sh
#!/usr/bin/env bash
# create share dict
path=data-bin-pivot
rm -r $path
mkdir -p $path#for lang in ar de es fa he it nl pl en; do
#  cp $path/dict.txt $path/dict.${lang}.txt
#done
#be nb km mt ur sv es lt rw gu pt tk or ml da mr eo sq id ro oc et uk fa br zu vi dz pl yi ig tt af yo lv hu sh el mk ga te ta de ky fy se bs fr kn hy nn pa as mg it zh fi mn li ne am ug uz ru ja bn ku eu hi sr my kk xh cy cs ka sk is hr ps az ko no tg he si gd an wa ha th sl ms ar ca bg gl nl; dofor lang_pair in ar-de ar-fr ar-nl ar-ru ar-zh de-fr de-nl de-ru de-zh fr-nl fr-ru fr-zh nl-ru nl-zh ru-zh de-ar fr-ar nl-ar ru-ar zh-ar fr-de nl-de ru-de zh-de nl-fr ru-fr zh-fr ru-nl zh-nl zh-ru; doecho ${lang_pair}mkdir $path/${lang_pair}src_tgt=($(echo $lang_pair | tr "-" "\n"))src=${src_tgt[0]}tgt=${src_tgt[1]}fairseq-preprocess \--source-lang en --target-lang $tgt \--testpref bpe-pivot/${lang_pair}/test.en-${tgt}.bpe \--destdir $path/${lang_pair} \--srcdict data-bin/dict.txt \--tgtdict data-bin/dict.txt
done

从而得到了第三步需要用的到,从en到tgt语言的data-bin文件夹:
在这里插入图片描述

在en到tgt语言的"伪"平行语料上评估pivot zs translation的性能

这一步和第一步的“ 把每一个zs语言对翻译到en”类似,我们使用如下代码:

# evaluate_commond/evaluate_pivot.sh
for lang_pair in ar-de ar-fr ar-nl ar-ru ar-zh de-fr de-nl de-ru de-zh fr-nl fr-ru fr-zh nl-ru nl-zh ru-zh de-ar fr-ar nl-ar ru-ar zh-ar fr-de nl-de ru-de zh-de nl-fr ru-fr zh-fr ru-nl zh-nl zh-ru; dosrc_tgt=($(echo $lang_pair | tr "-" "\n"))src=${src_tgt[0]}tgt=${src_tgt[1]}CUDA_VISIBLE_DEVICES=0 python3 evaluate_commond/evaluate.py --config evaluate_commond/evaluate_zero_shot.yml \--lang-pairs en-$tgt \--data-bin ../../data/opus-100-corpus/v1.0/fake-en-to-data-bin-zero-shot/${src}-${tgt} \--true-lang-pair ${src}-${tgt} \--pivot
done
# evaluate_commond/evaluate.py 略

至此,我们得到了pivot based zs translation的最终结果文件,如下图中的"generate_en-de.log":
在这里插入图片描述

direct zs translation VS pivot-based zs translation

最终,我们比较了用multilingual translation model来1. direct zs translation;2. pivot-based zs translation的结果对比:

  1. direct:BLEU:4.52 | LANG_ACC:28.85%
  2. pivot:BLEU:14.61| LANG_ACC:87.76%

可以看到,pivot-based zs translation是一个强baseline。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/63280.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大语言模型的多语言机器翻译能力分析

来自:南大NLP 进NLP群—>加入NLP交流群 01 研究动机 以ChatGPT为代表的大语言模型(Large Language Models, LLM)在机器翻译(Machine Translation, MT)任务上展现出了惊人的潜力。通过情景学习(In-Contex…

嗖的一下第二弹,这些好看的皮肤直接一键收下~~

✨前言 📢首先祝大家假期愉快🚀 这个假期,大家是怎么玩的呢❓ 小博主我趁着假期也摆了几天😜 因此有好几天没有更新文章了…… 今天偷偷的发一篇文章,浅浅做个样子吧😬 今儿写的文章是继上次写的&#xff…

为什么国内APP热衷于皮肤特效

微博跟腾讯学到了精髓,功能不够皮肤来凑 这不是吐槽呀,是有一定心理学在里面的,人们普遍希望跟身边的人有差异性的,就好像打游戏我买个皮肤在战场上可以秀一下;在游戏中我买个xxx刀,可以打出火花星星等效果…

云炬Android开发教程0 jdk下载与安装教程(小白)

第一步:jdk下载 (1)oracle官网地址下载:点我进官网下载 (2)百度云连接下载(提供8u211版本): 链接:https://pan.baidu.com/s/1i74YGO8zXuGxumZYGakKKw 提取码…

墨墨背单词

墨墨背单词 推荐一款背单词软件:墨墨背单词(无限单词版) 下载链接:https://download.csdn.net/download/EQ_cyc/12438004

将有道云词典单词本导入到墨墨背单词

有道云词典导出.XML文件用EXCEL导入.XML文件。点击:数据>自其他来源>来自XML数据导入 导入后会提示以下界面,全部点击确定即可 导入数据后变成这样子 每一行的间距可能特别大,不用管直接复制第一列,放到一个新建的txt文件…

墨墨背单词(最新无限单词版---持续更新)

----------2020年5月27日更新---------- 废话不多说先上图 用户可以直接登录账号,由于现在直接注册功能系统会提示更新到最新系统导致无法注册账户,但是可以通过忘记密码的形式来曲线注册账户,方法如下 软件的下载连接为: https://down…

获取墨墨背单词里面的单词书中的单词

首先,其实是直接尝试抓包获取的,不过在抓包的信息中没发现类似的内容,然后就去百度了以下,发现还是有聪明人。 把下载的 apk 文件解压缩一下,把里面的 assets 文件夹里面的 maimemo.v3.db 直接拖到navicat中&#xff…

[小小项目]背单词的程序---1.0_纯C语言_单文件版本

文章目录 前言:可以学到什么?一、功能介绍以及演示二、准备工作1)准备所需的单词的文本2)任意的C语言开发环境 三、代码1)读取文件,不存在则爆出异常2)开辟空间来存放读取出来的内容3&#xff0…

android 补签控件,墨墨背单词怎么补签 看完你就懂了

现在手机的普及让不少用户在手机上面学习英语,而墨墨背单词就是一款专业的英语学习软件,它可以提醒用户每日记忆单词,还有督促你学习的签到系统,通过每日的签到不仅可以提高你学习英语的动力还能免费提升每日学习单词的上限量呢。…

未root的情况下获取墨墨背单词的databases文件夹

文章目录 前言解决思路第一步:备份下载Winhex使用abe解压备份文件结语 前言 在我的《墨墨背单词免费版本地数据找回方法》这篇博客中提到:“复制出“databases”文件”。但这个文件夹并不是那么容易复制出的,如果你的手机已经被root了&#…

C语言实现背单词软件(系统级别)

目录 一、软件需求说明书 1 引言 2 任务概述 二、可行性研究报告 1 编写目的 2 所建议的系统(技术可行性) 3 使用方面的可行性 4 结论 三、系统设计说明书 1.面向对象设计 1.1前提说明 1.2 系统设计 2.面向对象建模 四&#xf…

不背单词vs墨墨背单词 竞品分析

1. 分析背景 1.1 业界状况 根据易观千帆数据中心,2020年4月全网教育APP活跃用户共44597.16万,将近4.5亿,且仍在持续稳定增长,其中在线外语学习赛道坐拥6726.52万活跃用户,占比15%。背单词类软件作为一项外语学习人群…

【墨墨英语单词库免费开源无偿分享】小学、初中、高中、大学四六级专四专八、考研、托福、雅思等词书文本大合集

还在愁没有自己想要的词书?这不,我都给你准备好了: 纯英文txt源词库 带list分类txt词库大全 带中文释义excel词库 这些词书呢,是知乎上的一位大神用爬虫把墨墨背单词app的所有词库给爬取下来的, 而且无偿开源&…

关于电脑使用墨墨背单词使用键盘操作问题

在上班期间摸鱼的时候偶尔背背单词,用鼠标还需要平移点击,很累。 如何全用键盘操作界面? 01 Windows系统 Windows系统使用比较简单,下载一个雷电模拟器就可以解决。 默认数字123分别对应墨墨上的“认识”、“模糊”、“忘记”。…

印度网民集体删除中国APP,网友评论亮了

全世界只有3.14 % 的人关注了 爆炸吧知识 最近,国外有一款Remove China Apps火了。 这款APP只有一个功能:可以一键扫描用户手机里的应用,识别出自中国公司的应用,并进行一键删除的骚操作。 应用的主图标、界面,甚至特意…

因签署Android独家协议排除竞争对手 谷歌在印度被罚款1.62亿美元

印度反垄断监管机构日前宣布对谷歌罚款1.62亿美元 , 原因是谷歌与合作伙伴签署独家协议以排除竞争对手。 怎么排除竞争对手还是往期相同的话题:谷歌要求合作伙伴们在安卓设备里预装谷歌核心应用并设置为默认。 同时还要求合作伙伴不要开发基于安卓开源项目的定制系…

油猴脚本 使用教程

一、了解油猴 1.百度“油猴”搜索官网 2.进入官网 https://greasyfork.org/zh-CN 用户脚本是什么? 用户脚本是一段代码,它们能够优化您的网页浏览体验。安装之后,有些脚本能为网站添加新的功能,有些能使网站的界面更加易用&am…

油猴的使用

油猴 tampermonkey 【不同的人叫法也不一样】 油猴 ?? 好多人会问, 这个是什么东西?? 这个就由我来给大家介绍一下吧 我们看油猴官网介绍 https://www.tampermonkey.net/ Tampermonkey 是一款免费的浏览器扩展和最…