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

前言

由于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
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值