moses(mosesdecoder)&BPE数据预处理

mosesdecoder&BPE数据预处理

moses数据预处理

源码链接:

https://github.com/moses-smt/mosesdecoder

做机器翻译的小伙伴应该会moses很熟悉,这是一个很强大的数据预处理工具,虽然已经用了很多年了,但现在依然非常流行。

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

中文的预处理好做很多,除了分词,可做的就不多了,相比之下,英文的预处理就变得繁琐了很多,比如在bpe的子词词典中,我们可以看到American’s 和american’s同时存在于词典,并且英文的标点符号和单词之间是没空格分隔的,所以如果直接对英文按照空格进行分词,cat和cat.就可能占据词典中两个词的位置,这些都是不合理的,会浪费词典的位置。所以对英文的处理是及其有必要的。

mosesdecoder作为统计机器翻译工具,常用的预处理方法如下:

normalize:对标点符号进行规范化。

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

其中-l en是选择语言,de类似

tokenisation:分词

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

de类似

cleaning:长句和空语句可引起训练过程中的问题,因此将其删除,同时删除明显不对齐的句子。–将句子长度控制在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。

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

  1. 需要训练一个truecase模型。注意:只能使用训练集训练truecase模型。
perl path/to/mosesdecoder/scripts/recaser/train-truecaser.perl -corpus data/train.norm.tok.clean.en -model path/to/truecase-model.en
  1. 应用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分词

如果想按子词来分词,则要用到BPE算法,在使用BPE算法之前最好先使用moses做数据预处理,然后将moses处理好的数据输入到BPE算法中。

项目链接:

https://github.com/glample/fastBPE

BPE分词一般有以下四个步骤(第四个不常用):

learnbpe nCodes input1 [input2]           从1到2个文件中学习 BPE codes 
applybpe output input codes [vocab]    应用 BPE codes 对输入文件做分词
getvocab input1 [input2]                       从1到2个文件中抽取词汇
applybpe_stream codes [vocab]           apply BPE codes to stdin and outputs to stdout
  1. Learn codes
./fast learnbpe 40000 train.de train.en > codes

从train.de 、train.en两个文件中学习BPE codes并输出到codes文件中,40000为BPE codes的个数(取排名前40000的子词)。

对于使用子词作为基本单位进行训练的神经机器翻译模型,训练的第一步就是根据语料生成bpe的codes资源,以英文为例,该资源会将训练语料以字符为单位进行拆分,按照字符对进行组合,并对所有组合的结果根据出现的频率进行排序,出现频次越高的排名越靠前,排在第一位的是出现频率最高的子词。如图所示:a n为出现频率最高的子词,出现了22968671次,e s< /w>出现了21090192次,其中 < /w> 表示这个s是作为单词结尾的字符。训练过程结束,会生成codes文件。BPE codes的个数为40000,所以codes文件中总共有40000行。codes文件内容如下:

moses(mosesdecoder)&BPE数据预处理
2. Apply codes to train

./fast applybpe train.de.40000 train.de codes
./fast applybpe train.en.40000 train.en codes

通过生成的codes文件,对train.de、train.en分词,生成train.de.40000、 train.en.40000文件。
train.en.40000文件内容如下:

moses(mosesdecoder)&BPE数据预处理
3. Get train vocabulary

./fast getvocab train.de.40000 > vocab.de.40000
./fast getvocab train.en.40000 > vocab.en.40000
./fast getvocab train.de.40000 train.en.40000  > vocab.de-en.40000

从train.de.40000中抽取词汇并保存到vocab.de.40000中。
从train.en.40000中抽取词汇并保存到vocab.en.40000中。
从train.de.40000、train.en.40000*同抽取词汇并保存到 vocab.de-en.40000中。
vocab.en.40000文件内容如下:

moses(mosesdecoder)&BPE数据预处理

moses(mosesdecoder)&BPE数据预处理moses(mosesdecoder)&BPE数据预处理 小小鸟要高飞 发布了52 篇原创文章 · 获赞 7 · 访问量 4万+ 私信 关注
上一篇:线性回归 python 代码实现


下一篇:对于DARTS的理解