12.04 AMD64 运⾏行于VMware fusion 5.0.3
Boost 1.48.0
1.Boost的安装(可参考官⽅方⺴⽹网站http://www.boost.org)由于Moses编译需要boost和其他依赖库⽂文件,所以需要⾸首先安装Boost Library.⾸首先需要安装⼀一些依赖包:
apt-get install python-dev
apt-get install libbz2-dev #如果编译出现错误:bzlib.h: No suchfile or directory
下载boost 1.48.0,在终端解压到/home/apple中,执⾏行以下命令:$./bootstrap.sh
$./b2--prefix=/home/apple/boost-bin/ --libdir=/home/apple/boost-bin/lib64 --layout=tagged link=static,shared threading=multiinstallprefix后⾯面可以指定你⾃自⼰己希望安装boost的路径。若不指定,则使⽤用系统默认路径:/usr/local/include
2.安装GIZA++
下载GIZA++v1.0.7: http://giza-pp.googlecode.com/files/giza-pp-v1.0.7.tar.gz
$tar xzvf giza-pp-v1.0.7.tar.gz
$cd giza-pp
$make
经过这⼀一步会⽣生成⼏几个可执⾏行⽂文件,位于~/giza-pp/GIZA++-v2/GIZA++, ~/giza-pp/GIZA++-v2/snt2cooc.out and ~/giza-pp/mkcls-v2/mkcls. 需要把它们拷⻉贝到⼀一个moses可以找到的路径下:
$cd ~/mosesdecoder
$mkdir tools
$cp ~/giza-pp/GIZA++-v2/GIZA++ ~/giza-pp/GIZA++-v2/snt2cooc.out ~/giza-pp/mkcls-v2/mkcls tools
3.安装srilm
⾸首先,安装依赖的软件包:
1.C/C++ compiler:编译器gcc 3.4.3及以上版本,本机实验环境为gcc 4.5.22.GNU make:构建和管理⼯工程的⼯工具,解释Makefile⾥里的指令,描述了整个⼯工程所有⽂文件的编译顺序和编译规则。这⾥里是为了控制 SRILM 的编译和安装
3.GNU gawk:GNU所做的awk程序语⾔言。对于⽂文字资料的修改,对⽐比,抽取等处理,使⽤用c或passcal等不⽅方便且费时,awk 能够以很短的程序完成。这⾥里是处理SRILM⾥里的⼀一些脚本⽂文件
4.GNU gzip:使⽤用C语⾔言编写的⼀一种解压缩软件。这⾥里是为了使 SRILM 能够处理.Z和.GZ后缀的压缩⽂文件5.bzip2:数据压缩软件,压缩效率更⾼高。这⾥里是使SRILM能处理.bz2后缀的压缩⽂文件6.P7zip:数据压缩软件。这⾥里是使SRILM能处理7-Zip的压缩⽂文件
7.csh:Unix shell的⼀一种
I <安装>本机环境:
下载SRILM安装包:
链接:http://www.speech.sri.com/projects/srilm/download.html,创建安装的⺫⽬目录,并把压缩包解压到该⺫⽬目录。我的安装⺫⽬目录是:/home/apple/srilm修改makefile⽂文件
1.找到:# SRILM = /home/speech/stolcke/project/srilm/devel,另起⼀一⾏行输⼊入 SRILM 的安装路径 SRILM = $(PWD)
2.找到:MACHINE_TYPE := $(shell $(SRILM)/sbin/machine-type),在其前加#注释掉,并另起⼀一⾏行输⼊入:MACHINE_TYPE := i686-m64。3.需要同时修改sbin/machine-type,将其中对应位置改为 set MACHINE_TYPE =i686-m64
1.编译 SRILM
make World
2.修改环境变量
运⾏行命令 export PATH=/home/srilm/bin/i686-m64:/home/srilm/bin:$PATH
3.测试
编译通过不等于编译成功,必须利⽤用 SRILM 提供的测试模块进⾏行测试,进⼊入 SRILM根⺫⽬目录
make test
注:SRILM 从1.5.10开始,test ⽂文件已不在主⺫⽬目录下,⽽而是分别位于 lm flmlattice下
需要等待⼀一段时间,如果出现多是 IDENTICAL,就证明 SRILM 编译成功了!
4.安装moses在编辑Moses之前⼀一定要安装所有的依赖包,否则⽆无法编译通过,请安装以下软件包:$sudo apt-get install autoconf automake texinfo zlib1g zlib1g-devzlib-bin zlibc libtool libboost-all-dev libxmlrpc-c3-dev build-essential
apt-get install mpi-default-dev #安装mpi库
apt-get install libicu-dev #⽀支持正则表达式的UNICODE字符集
安装完成这些依赖包后,下⾯面进⾏行Moses的编译:下载moses.这⾥里使⽤用了moses-smt-mosesdecoder-388f5a2.zip
编译moses:
$nohup ./bjam -j1 --with-srilm=/home/apple/srilm --with-boost=/home/apple/boost-bin >& log.m &
./bjam -jx.其中x说明是⼏几核的可以加快处理速度,另外两个参数分别指定srilm和boost的安装位置。
可以查看log⽇日志⽂文件看是否在编译过程中存在错误。
注意:Moses编译不成功往往都是由于依赖包没有安装完整,⽐比如boost库没有装好。II<测试流程>
在完成上述的环境搭建过程后,就可以开始完成测试的流程。
1.准备语料要训练翻译系统,我们需要平⾏行语料(翻译成两种语⾔言的⽂文本),⽽而且必须是已经句⼦子对⻬齐的。有很多这样的语料可供选择,我们将选取⼀一个有130000句的⼩小的语料库,在home/apple下创建corpus⽂文件夹,执⾏行:
cd
mkdir corpus
cd corpus
wget http://www.statmt.org/wmt12/training-parallel.tgz
tar zxvf training-parallel.tgz在~/corpus/training⺫⽬目录下可以看到europarl和news-commentary⽂文件,有多种语⾔言可供选择。我们将构建⼀一个法语到英语的翻译系统,使⽤用news-coommentary语料库。当然你也可以使⽤用其他语⾔言的语料库。
要准备数据,⾸首先执⾏行如下步骤:
a.tokenisation 这⼀一步会在词汇、标点之间插⼊入空格。
b.truecasing 每句话的第⼀一个词将转换为最合适的⼤大⼩小写状态。
c.cleaning 过⻓长的句⼦子和空句⼦子将会被除去,因为它们可能导致训练过程中的⼀一些错误,同时错误对⻬齐的句⼦子也被除去了。
分词(tokenisation)的执⾏行过程:~/mosesdecoder/scripts/tokenizer/tokenizer.perl -l en < ~/corpus/
training/news-commentary-v7.fr-en.en \
> ~/corpus/news-commentary-v7.fr-en.tok.en
~/mosesdecoder/scripts/tokenizer/tokenizer.perl -l fr < ~/corpus/
training/news-commentary-v7.fr-en.fr \
> ~/corpus/news-commentary-v7.fr-en.tok.fr
下来要改变⼤大⼩小写状态,⾸首先truecaser需要经过训练来抽取⽂文本的统计信息:~/mosesdecoder/scripts/recaser/train-truecaser.perl --model ~/corpus/truecase-model.en --corpus \
~/corpus/news-commentary-v7.fr-en.tok.en
~/mosesdecoder/scripts/recaser/train-truecaser.perl --model ~/
corpus/truecase-model.fr --corpus \
~/corpus/news-commentary-v7.fr-en.tok.fr
trucase需要使⽤用Moses中的另⼀一个脚本⽂文件:~/mosesdecoder/scripts/recaser/truecase.perl --model ~/corpus/
truecase-model.en < ~/corpus/news-commentary-v7.fr-en.tok.en \
> ~/corpus/news-commentary-v7.fr-en.true.en
~/mosesdecoder/scripts/recaser/truecase.perl --model ~/corpus/
truecase-model.fr < ~/corpus/news-commentary-v7.fr-en.tok.fr \
> ~/corpus/news-commentary-v7.fr-en.true.fr最后我们进⾏行clean,把句⼦子⻓长度限制在80词以内:~/mosesdecoder/scripts/training/clean-corpus-n.perl ~/corpus/news-commentary-v7.fr-en.true fr en \
~/corpus/news-commentary-v7.fr-en.clean 1 80
2.训练语⾔言模型
语⾔言模型(language model)⽤用来保证翻译输出的流畅度,其实就是让翻译出来的话更像是⺫⽬目标语⾔言⼈人说的⾃自然语⾔言。⺫⽬目前有多种训练语⾔言模型的⽅方法可供使⽤用,⽐比如SRILM和IRSTLM,本实验中选⽤用SRILM。具体的安装过程已经在上⾯面讲过。下⾯面将⽤用SRILM训练⼀一个3元语⾔言模型,使⽤用kndiscount平滑⽅方法,命令如下:
mkdir ~/lm
cd ~/lm
./ngram-count -text news-commentary09.fr-en.clean.en -lm news-commentary09.fr-en.lm.en -order 3 -interpolate -kndiscount 参数说明:
-text:要训练的⽂文本,⼀一⾏行⼀一句
-lm:输出⽂文件名
-order n:语⾔言模型的元数
-unk:未登录词,默认是移除未登录词
-wbdiscount:平滑
-interpolate:插值
⾄至此,语⾔言模型训练完成。如此训练的到的语⾔言模型在真正使⽤用的时候会载⼊入速度会⽐比较慢,为此,我们需要将它⼆二进制化:
~/mosesdecoder/bin/build_binary news-commentary09.fr-en.lm.ennews-commentary09.fr-en.blm.en
可以测试⼀一下语⾔言模型:
$echo "is this an English sentence ?" | ~/mosesdecoder/bin/querynews-commentary09.fr-en.blm.en
3.训练翻译模型下⾯面开始了主要的步骤,这⼀一步会使⽤用GIZA++进⾏行词语对⻬齐,短语抽取和打分,构建词汇重排表并创建Moses配置⽂文件:moses.ini。
mkdir ~/working
cd ~/working
nohup nice ~/mosesdecoder/scripts/training/train-model.perl -
root-dir train -corpus ~/corpus/news-commentary09.fr-en.clean \
-f fr -e en -alignment grow-diag-final-and -reordering msd-
bidirectional-fe \
-lm 0:3:$HOME/lm/news-commentary09.fr-en.blm.en:8 -external-bin-dir ~/mosesdecoder/tools >& training.out &如果你的电脑有多核处理器,可以使⽤用-cores参数指定核⼼心数⺫⽬目来加快并⾏行处理速度。
这⼀一步会占⽤用2⼩小时左右时间。结束后会在~/working/train/model⺫⽬目录下⽣生成moses.ini配置⽂文件。你需要使⽤用这个配置⽂文件进⾏行解码。同样,为了加快处理速度,需要先把短语表和重排序表进⾏行⼆二进制转化;其次,还有⼀一个问题就是moses对于各种模型的分配权重并没有得到最优化,你可以查看Moses.ini⽂文件看到它们的默认权重被设置为0.2,0.3这样的数值。为了优化权重,我们需要调整权重,这⼀一步通常会花掉很⻓长的时间。
4.调整权重这是整个过程最慢的⼀一部。调整权重需要⼀一部分开发集语料,可以从http://www.statmt.org/wmt12/dev.tgz下载到语料,并在~/corpus⺫⽬目录下进⾏行解压。我们将使⽤用news-test2008进⾏行调整权重,⾸首先需要对原始语料进⾏行分词、⼤大⼩小写转化。
cd ~/corpus
~/mosesdecoder/scripts/tokenizer/tokenizer.perl -l en < dev/news-
test2008.en > news-test2008.tok.en
~/mosesdecoder/scripts/tokenizer/tokenizer.perl -l fr < dev/news-
test2008.fr > news-test2008.tok.fr
~/mosesdecoder/scripts/recaser/truecase.perl --model truecase-
model.en < news-test2008.tok.en > news-test2008.true.en
~/mosesdecoder/scripts/recaser/truecase.perl --model truecase-
model.fr < news-test2008.tok.fr > news-test2008.true.fr
现在可以开始调整权重了(可以干些别的事情,因为这⼀一步我花了将近6个⼩小时^.^):
cd ~/working
nohup nice ~/mosesdecoder/scripts/training/mert-moses.pl ~/corpus/news-test2008.true.fr ~/corpus/news-test2008.true.en \
~/mosesdecoder/bin/moses train/model/moses.ini --mertdir ~/
mosesdecoder/bin/ &> mert.out &
经过tuning,会在~/working/mert-work/moses.ini⽣生成新的配置⽂文件。
5.测试⼀一下翻译的效果为了让这个过程更加快速,如上所述,需要将⼆二进制化的短语表和词汇重排序表的位置告诉给moses.可以如下操作:
mkdir ~/working/binarised-model
cd ~/working
~/mosesdecoder/bin/processPhraseTable -ttable 0 0 train/model/
phrase-table.gz -nscores 1 -out binarised-model/phrase-table
~/mosesdecoder/bin/processLexicalTable -in train/model/
reordering-table.wbe-msd-bidirectional-fe.gz -out binarised-model/
reordering-table
把moses.ini⽂文件拷⻉贝到~/working.binarised-model⺫⽬目录下。然后打开moses.ini⽂文件修改其中的路径参数:
找到0 0 0 5 /home/bhaddow/working/train/model/phrase-table.gz修改为:1 0 0 5 /home/bhaddow/working/binarised-model/phrase-table找到0-0 wbe-msd-bidirectional-fe-allff 6 /home/bhaddow/working/train/model/reordering-table.wbe-msd-bidirectional-fe.gz
修改为0-0 wbe-msd-bidirectional-fe-allff 6 /home/bhaddow/working/binarised-model/reordering-table
现在翻译过程将⾮非常迅速:
apple@ubuntu:~/working$ echo "faire revenir les militants sur leterrain et convaincre que le vote est utile ." | ~/mosesdecoder/bin/moses -f binarised-model/moses.ini
Defined parameters (per moses.ini or switch):
" config: binarised-model/moses.ini
" distortion-file: 0-0 wbe-msd-bidirectional-fe-allff 6 /home/ apple/working/binarised-model/reordering-table
" distortion-limit: 6
" input-factors: 0
" lmodel-file: 8 0 3 /home/apple/lm/news-commentary09.fr- en.blm.en
" mapping: 0 T 0
" ttable-file: 1 0 0 5 /home/apple/working/binarised-model/ phrase-table
" ttable-limit: 20
" weight-d: 0.0682203 0.0955797 0.00663694 0.022609 0.0597706 0.101574 0.0816536
" weight-l: 0.099719
" weight-t: 0.0467871 0.0649766 0.0496845 0.107051 0.0467517
" weight-w: -0.148986 Loading lexical distortion models...have 1 models Creating lexical reordering... weights: 0.096 0.007 0.023 0.060 0.102 0.082 binary file loaded, default OFF_T: -1 Start loading LanguageModel /home/apple/lm/news-commentary09.fr- en.blm.en : [1.000] seconds
Finished loading LanguageModels : [1.000] seconds
Start loading PhraseTable /home/apple/working/binarised-model/
phrase-table : [1.000] seconds
filePath: /home/apple/working/binarised-model/phrase-table
Finished loading phrase tables : [1.000] seconds
IO from STDOUT/STDIN
Created input-output object : [1.000] seconds
Translating line 0 in thread id 140033287264000
Translating: faire revenir les militants sur le terrain et
convaincre que le vote est utile .
reading bin ttable
size of OFF_T 8
binary phrasefile loaded, default OFF_T: -1
binary file loaded, default OFF_T: -1
Collecting options took 0.580 seconds
Search took 1.200 seconds
bring activists on the ground and convince that the vote is
useful .
BEST TRANSLATION: bring activists on the ground and convince that
the vote is useful . [111111111111111] [total=-9.637] <<0.000,
-13.000, 0.000, -3.348, 0.000, 0.000, -4.486, 0.000, 0.000,
-77.057, -9.337, -21.849, -5.445, -14.024, 6.999>>
Translation took 1.210 seconds
Finished translating
6.运⾏行解码器并且测试BLEU值现在,你可能需要知道这个翻译系统的实际性能的量化指标如何,这就需要我们使⽤用另⼀一个test集。我选⽤用了newstest2011,如前所述,需要先进⾏行token和truecase:
cd ~/corpus
~/mosesdecoder/scripts/tokenizer/tokenizer.perl -l en < dev/
newstest2011.en > newstest2011.tok.en
~/mosesdecoder/scripts/tokenizer/tokenizer.perl -l fr < dev/
newstest2011.fr > newstest2011.tok.fr
~/mosesdecoder/scripts/recaser/truecase.perl --model truecase-
model.en < newstest2011.tok.en > newstest2011.true.en
~/mosesdecoder/scripts/recaser/truecase.perl --model truecase-
model.fr < newstest2011.tok.fr > newstest2011.true.fr
cd ~/working
~/mosesdecoder/scripts/training/filter-model-given-input.pl
filtered-newstest2011 mert-work/moses.ini ~/corpus/
newstest2011.true.fr \
-Binarizer ~/mosesdecoder/bin/processPhraseTable
下⾯面⽤用测试集测试⼀一下解码器,然后运⾏行bleu脚本:
nohup nice ~/mosesdecoder/bin/moses -f ~/working/filtered-newstest2011/moses.ini < ~/corpus/newstest2011.true.fr \
> ~/working/newstest2011.translated.en 2> ~/working/
newstest2011.out &
~/mosesdecoder/scripts/generic/multi-bleu.perl -lc ~/corpus/
newstest2011.true.en < ~/working/newstest2011.translated.en
最终我得到如下结果:
BLEU = 18.97, 56.0/24.9/12.9/7.2 (BP=1.000, ratio=1.022,hyp_len=76434, ref_len=74753)
⼀一些有价值的参考⺴⽹网⻚页:
配置boost http://www.boost.org/doc/libs/1_53_0/more/getting_started/unix-variants.htmlhttp://blog.sina.com.cn/s/blog_8588208901015o9b.html安装moses教程http://mynoteweb.com/node/13358(其中⼏几步解压参数需要修改)http://www.leexiang.com/how-to-run-moses
SRILM训练语⾔言模型http://blog.csdn.net/zhoubl668/article/details/7759042