机器翻译--Moses脚本进行数据处理,Bleu值计算

机器翻译–Moses脚本进行数据处理,Bleu值计算

数据预处理包括标点规范化,分词,大小写字母等;Blue值计算使用perl直接计算。

Moses

这是一个很强大的数据预处理工具,虽然已经用了很多年了,但现在依然非常流行。

github地址,主要使用里面的perl脚本进行数据预处理。确保电脑上已经安装配置好了perl(ubuntu自带)。

很多人做数据预处理都会用到BPE算法,30000个子词几乎可以表示词典中所有的单词。但是如果我们要用词级别的翻译,那词典太大了,在机器翻译中词典受限的情况下,很多词就会变为未登录词。为了让词典尽可能的能囊括更多的单词,可以对双语语料进行预处理操作。

中文的预处理好做很多,除了分词,可做的就不多了,但是英文的预处理就变得繁琐了很多,英文的标点符号和单词之间是没空格分隔的,所以如果直接对英文按照空格进行分词,big和big.就可能占据词典中两个词的位置。

下面数据预处理包括标点规范化,分词,大小写字母等等。

Normalize punctuation

标点规范化

perl dir_name/mosesdecoder/scripts/tokenizer/normalize-punctuation.perl -l en < data/train.en > data/train.norm.en

-l en是选择语言,同样例如德语:de等等。

同样的操作应用于验证集和测试集。

Tokenizer

分词,并且应用于验证集和测试集。如果文本已经分好词了,可以省去。

perl dir_name/mosesdecoder/scripts/tokenizer/tokenizer.perl -a -l en < data/train.norm.en > data/train.norm.tok.en

Clean corpus

数据集中过长的句子删掉。例如设置有效长度在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

Truecase不同于lowercase,lowercase相当于把数据中所有的字母小写,而truecase则会学习训练数据,判断句子中的名字、地点等需要大写的内容并将其保留,其余则小写,提升翻译时候的准确性。

  • 需要训练一个truecase模型。注意:只能使用训练集训练truecase模型。
perl path/to/mosesdecoder/scripts/recaser/train-truecaser.perl -corpus data/train.norm.tok.clean.en -model path/to/truecase-model.en
  • 应用apply:将训练得到的英语truecase模型应用到训练集、校验集和测试集的英文上。
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模型。

BPE

这是subword mt的一种思想,将单词进行bpe编码,来自论文《Neural Machine Translation of Rare Words with Subword Units》,代码:https://github.com/rsennrich/subword-nmt

bpe将原有的单词拆解成了更小单元的高频词进行翻译,有效的解决了未登录词的问题。

我们使用里面的python脚本对数据进行处理。

  • 同样需要对英语和德语进行学习bpe模型。
python path/to/subword_nmt/learn_bpe.py -s 10000 < data/train.norm.tok.clean.tc.en > data/codes.en

-s 后接着的是bpe operations操作的次数,这里设置为10000。同样只对训练集进行训练

  • apply:在训练集、校验集和测试集上进行应用。
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用法总结

猜你喜欢

转载自blog.csdn.net/ganxiwu9686/article/details/104464654
今日推荐