文章将介绍在机器翻译时需要使用到的数据预处理方法,包括tokenize、truecase、bpe等等,好的预处理方法才能提升机器翻译的质量。下文会以en-de双语为例进行讲解。
这是Moses的github地址,它是一个统计机器翻译模型,我们主要使用里面的perl脚本进行数据预处理。所以确保电脑上已经安装配置好了perl(ubuntu自带)。
其实我也不太懂这个操作,规范化标点?
perl dir_name/mosesdecoder/scripts/tokenizer/normalize-punctuation.perl -l en < data/train.en > data/train.norm.en
其中-l en
是选择语言,同样例如德语:de等等。同样的操作应用于校验集和测试集。
分词,同样对校验集和测试集做同样的操作。
perl dir_name/mosesdecoder/scripts/tokenizer/tokenizer.perl -a -l en < data/train.norm.en > data/train.norm.tok.en
控制句子有效长度,将数据集中过长的句子删掉。例如设置有效长度在1~80个单词之间。
perl path/to/mosesdecoder/scripts/training/clean-corpus-n.perl data/train.norm.tok en de data/train.norm.tok.clean 1 80
这样会同时将双语语料进行操作,生成两个处理后的文件train.norm.tok.clean.en和train.norm.tok.clean.de。
Truecase不同于lowercase,lowercase相当于把数据中所有的字母小写,而truecase则会学习训练数据,判断句子中的名字、地点等需要大写的内容并将其保留,其余则小写,提升翻译时候的准确性。
perl path/to/mosesdecoder/scripts/recaser/train-truecaser.perl -corpus data/train.norm.tok.clean.en -model path/to/truecase-model.en
perl dir_name/mosesdecoder/scripts/recaser/truecase.perl -model path/to/truecase-model.en < data/train.norm.tok.clean.en > data/train.norm.tok.clean.tc.en
同样德语也需要训练一个truecase模型。
这是subword mt的一种思想,将单词进行bpe编码,来自论文
Neural Machine Translation of Rare Words with Subword Units
开源代码在这里。https://github.com/rsennrich/subword-nmt
bpe将原有的单词拆解成了更小单元的高频词进行翻译,有效的解决了未登录词的问题。
BPE 方法拆解成子字单元的具体效果可以通过下面的例子来进行说明:
我们使用里面的python脚本对数据进行处理。
python path/to/subword_nmt/learn_bpe.py -s 10000 < data/train.norm.tok.clean.tc.en > data/codes.en
-s 后接着的是bpe operations操作的次数,这里设置为10000。同样只对训练集进行训练
python path/to/subword_nmt/apply_bpe.py -c data/codes.en < data/train.norm.tok.clean.tc.en > data/train.pre.en
【注意】翻译的时候使用的数据均是经过bpe编码的,因此翻译得到的result也是bpe后的,因此需要对result进行还原,还原回bpe之前的(即norm、tok、clean、tc处理后的)状态,再用它和bpe之前的 test.norm.tok.clean.tc.xxx
计算bleu值。
还原的方法:
cat result.bpe.de | sed -E 's/(@@ )|(@@ ?$)//g' > result.de
在ubuntu上不需要安装sed,windows需要。
BLEU 值的计算:
perl multi-bleu.perl test.norm.tok.clean.tc.de < result.de