文章目录
前言
由于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 shutil
def 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_bin
zero_shot_langs = opts.zero_shot_langs.split(",")
save_path = opts.save_path
for src in zero_shot_langs:
for tgt in zero_shot_langs:
if src == tgt:
continue
st_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)
# dict
old_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
# bin
old_path

最低0.47元/天 解锁文章
1060





