机器翻译-subword-nmt预处理语料

论坛 期权论坛 脚本     
匿名技术用户   2021-1-15 00:38   38   0

在机器翻译中,目前都采用的方法是bpe切分子词的方法来处理翻译中的未登录词。

如何使用?

https://github.com/rsennrich/subword-nmt这里面已经写了详细的方法,本文主要记录我处理中英语料时的步骤。

1.共享词典

直接clone了这个项目,但是没有安装的情况下,我们使用python命令来处理。否则参考原文给出的命令处理语料。

如果我们进行翻译的双语是共享字母表的,那么我们可以为这两种语言建立一个共享词典,比如:

python subword-nmt/learn_joint_bpe_and_vocab.py --input corpus.tc.en corpus.tc.de -s 32000 -o bpe32k --write-vocabulary vocab.en vocab.de

通过上述方法我们可以得到bpe32k这个子词词表和 vocab.en,vocab.de的双语词典(里面是这两种语言的子词及其出现的频率)

接下来我们使用以下命令来对双语的语料进行subword切分处理,以下是对训练集进行处理,我们使用相同的命令来对验证集和测试集进行处理。

python subword-nmt/apply_bpe.py -c bpe32k --vocabulary vocab.en --vocabulary-threshold 50 < corpus.tc.en > corpus.bpe32k.en
python subword-nmt/apply_bpe.py -c bpe32k --vocabulary vocab.de --vocabulary-threshold 50 < corpus.tc.de > corpus.bpe32k.de

2.不共享词典

对于中英翻译,中文和英文的字母表是不共享的,所以我们需要单独处理这两类语料。

step1:生成子词词典

subword-nmt learn-joint-bpe-and-vocab -i ./train.en -s 32000 -o ./use_bpe/bpe32k.en --write-vocabulary ./use_bpe/vocab.en
subword-nmt learn-joint-bpe-and-vocab -i ./train.zh -s 32000 -o ./use_bpe/bpe32k.zh --write-vocabulary ./use_bpe/vocab.zh

step2:根据第一步生成的词典过滤双语语料

subword-nmt apply-bpe -c bpe32k.en --vocabulary vocab.en --vocabulary-threshold 50 < ../train.en > train.BPE.en
subword-nmt apply-bpe -c bpe32k.zh --vocabulary vocab.zh --vocabulary-threshold 50 < ../train.zh > train.BPE.zh
subword-nmt apply-bpe -c bpe32k.en --vocabulary vocab.en --vocabulary-threshold 50 < ../valid.en > valid.BPE.en
subword-nmt apply-bpe -c bpe32k.zh --vocabulary vocab.zh --vocabulary-threshold 50 < ../valid.zh > valid.BPE.zh
subword-nmt apply-bpe -c bpe32k.en --vocabulary vocab.en --vocabulary-threshold 50 < ../test.en > test.BPE.en
subword-nmt apply-bpe -c bpe32k.zh --vocabulary vocab.zh --vocabulary-threshold 50 < ../test.zh > test.BPE.zh

然后我们就可以使用bpe切分后的双语语料进行nmt训练了。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP