数据预处理包括标点规范化,分词,大小写字母等;Blue值计算使用perl直接计算。
这是一个很强大的数据预处理工具,虽然已经用了很多年了,但现在依然非常流行。
github地址,主要使用里面的perl脚本进行数据预处理。确保电脑上已经安装配置好了perl(ubuntu自带)。
很多人做数据预处理都会用到BPE算法,30000个子词几乎可以表示词典中所有的单词。但是如果我们要用词级别的翻译,那词典太大了,在机器翻译中词典受限的情况下,很多词就会变为未登录词。为了让词典尽可能的能囊括更多的单词,可以对双语语料进行预处理操作。
中文的预处理好做很多,除了分词,可做的就不多了,但是英文的预处理就变得繁琐了很多,英文的标点符号和单词之间是没空格分隔的,所以如果直接对英文按照空格进行分词,big和big.就可能占据词典中两个词的位置。
下面数据预处理包括标点规范化,分词,大小写字母等等。
标点规范化
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~512个单词之间。
perl path/to/mosesdecoder/scripts/training/clean-corpus-n.perl data/train.norm.tok en de data/train.norm.tok.clean 1 512
这样会同时对英德进行操作,生成两个处理后的文件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将原有的单词拆解成了更小单元的高频词进行翻译,有效的解决了未登录词的问题。
我们使用里面的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
使用Moses脚本进行数据预处理
moses(mosesdecoder)数据预处理&BPE分词&moses用法总结