实验室换了新机器,重新安装了最新的ubuntu8.10,这样不得不重新搭建moses测试平台。拿自己写的<<Moses相关介绍>>作参考,感觉写得不够细,这里把安装的全过程记录下来,属于一个step-by-step的过程,希望对大家有用。
一、在用户52nlp目录下建立moses平台主目录mtworkdir:
52nlp@52nlp-desktop:~$ mkdir mtworkdir
52nlp@52nlp-desktop:~$ cd mtworkdir/
二、安装语言模型工具SRILM:
1、建立srilm目录:
52nlp@52nlp-desktop:~/mtworkdir$ mkdir srilm
52nlp@52nlp-desktop:~/mtworkdir$ cd srilm/
2.下载最新的的srilm包(目前最新版本为 srilm-1.5.7.tar.gz)
52nlp@52nlp-desktop:~/mtworkdir/srilm$ wget ’ftp://ftp.speech.sri.com/pub/people/stolcke/srilm/srilm-1.5.7.tar.gz’
显示信息如下:
=> `srilm-1.5.7.tar.gz’
正在解析主机 ftp.speech.sri.com… 130.107.33.205
正在连接 ftp.speech.sri.com|130.107.33.205|:21… 已连接。
正在以 anonymous 登录 … 登录成功!
==> SYST … 完成。 ==> PWD … 完成。
==> TYPE I … 完成。 ==> CWD /pub/people/stolcke/srilm … 完成。
==> SIZE srilm-1.5.7.tar.gz … 完成。
==> PASV … 完成。 ==> RETR srilm-1.5.7.tar.gz … 完成。
长度:48526656 (46M) (非正式数据)
出现下载进度条,等待约一段时间之后,下载完毕
3.解压:tar -zxvf srilm-1.5.7.tar.gz
4.首先确认srilm依赖的这些工具是否已安装:
A template-capable ANSI-C/C++ compiler, preferably gcc version 3.4.3 or higher.
GNU make, to control compilation and installation.
GNU gawk, required for many of the utility scripts.
GNU gzip to unpack the distribution, and to allow SRILM programs to handle “.Z” and “.gz” compressed datafiles (highly recommended).
bzip2 to handle “.bz2″ compressed files (optional).
p7zip to handle “7-zip” compressed files (optional).
The Tcl embeddable scripting language library (only required for some of the test executables).
除了上面这些工具外,还需要装一个csh。Ubuntu8.10自带的软件不多,安装时用apt-get或新利得都行。
5. 修改MakeFile:
在以上工具都安装完毕后,首先修改srilm/MakeFile:
cp Makefile Makefile.bak(备份)
vi Makefile
修改或在第7行下面加上一行
# SRILM = /home/speech/stolcke/project/srilm/devel (原)
SRILM = $(PWD) (修改)
再修改srilm/common/Makefile.machine.i686:
cd common/
cp Makefile.machine.i686 Makefile.machine.i686.bak
vi Makefile.machine.i686
将第15行 # Use the GNU C compiler下的三行修改如下:
GCC_FLAGS = -mtune=pentium3 -Wreturn-type -Wimplicit
CC = gcc $(GCC_FLAGS)
CXX = g++ $(GCC_FLAGS) -DINSTANTIATE_TEMPLATES
注:我的新机器的cpu是intel64位,所以尝试了一下64位的编译方法,不太成功,这里的方法对于64位机器也是可以的。
将51行 # Tcl support (standard in Linux) 下的两行修改如下:
TCL_INCLUDE = -I/usr/include/tcl8.5
TCL_LIBRARY = -L/usr/lib/tcl8.5
注:我装的是tcl8.5,如果是其他版本,请相应修改。
6.回到srilm目录下编译:
cd ..
make World
顺利的话,srilm就编译通过了。如果出现问题,很可能就是相应的依赖工具没有装完全,请回到第4步检查。
7.进入srilm/test目录下进行测试:
编译通过不等于编译成功,必须利用srilm提供的测试模块进行测试
首先声明srilm编译成功后工具报所在的环境变量:
export PATH=$PATH:/home/52nlp/mtworkdir/srilm/bin/i686:
/home/52nlp/mtworkdir/srilm/bin
然后进入test测试:
cd test
make all
出现如下信息:
*** Running test class-ngram-simple ***
0.50user 0.11system 0:00.61elapsed 100%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+1288outputs (0major+4684minor)pagefaults 0swaps
class-ngram-simple: stdout output IDENTICAL.
class-ngram-simple: stderr output IDENTICAL.
….
需要等待一段时间,如果出现多是IDENTICAL,很少的DIFFERS,就证明srilm编译成功了!
三、安装翻译模型训练工具Giza++,mkcls
1、 在mtworkdir目录下下载并解压Giza++:
cd /home/52nlp/mtworkdir
wget http://ling.umd.edu/~redpony/software/giza++.gcc41.tar.gz
tar -zxvf giza++.gcc41.tar.gz
解压后得到GIZA++-v2/目录
2、编译Giza++:
cd GIZA++v2
make
以前这一步都比较顺利,没想到这一次出了问题:编译过程中提示stream.h文件无法找到,开始以为自己的编译环境没有配置完全,但是检查了几项必要的都安装了。在Google上搜这个问题,国内好像还没有人遇到过,最终在Google code giza-pp的issue上找到了的答案(http://code.google.com/p/giza-pp/issues/detail?id=7):
Cannot compile with gcc 4.3 or greater
Giza++不能被gcc,g++4.3或更高版本编译。这个问题也是最近被发现的,属于一个bug,而ubutu8.10默认安装的gcc,g++都是4.3版本,这个帖子里提出了几种解决方案,我用了最简单的一种:
安装g++-4.1: sudo apt-get install g++-4.1
修改GIZA++-v2里的Makefile:vi Makefile
将第5行CXX=g++
替换为:CXX=g++-4.1
OK, 可以重新make了:
make
make snt2cooc.out
一切顺利!
3、下载解压并编译mkcls:
cd ..(重新进入mtworkdir目录)
wget http://ling.umd.edu/~redpony/software/mkcls.gcc41.tar.gz
tar -zxvf mkcls.gcc41.tar.gz
cd mkcls-v2
make
这一步一般没啥问题。
4、建立bin目录,并将giza++,mkcls工具拷贝到bin目录下:
cd ..
mkdir -p bin
cp GIZA++-v2/GIZA++ bin/
cp GIZA++-v2/snt2cooc.out bin/
cp mkcls-v2/mkcls bin/
四、安装解码器Moses及相关脚本
1、建立目录,通过svn下载moses:
mkdir -p moses
svn co https://mosesdecoder.svn.sourceforge.net/svnroot/mosesdecoder
/trunk moses
ubuntu8.10下需自行安装svn.
2、下载完成后编译:
cd moses
./regenerate-makefiles.sh
./configure –with-srilm=/home/52nlp/mtworkdir/srilm
make -j 4
cd ..
注:srilm指向绝对路径。
3、安装Moses训练脚本
建立训练脚本目录:
mkdir -p bin/moses-scripts
修改makefile:
vi moses/scripts/Makefile
将第13、14行修改如下:
TARGETDIR=/home/52nlp/mtworkdir/bin/moses-scripts
BINDIR=/home/52nlp/mtworkdir/bin
编译:
cd moses/scripts/
make release
cd ../..
使用时需要声明环境:
export SCRIPTS_ROOTDIR=/home/52nlp/mtworkdir/bin/moses-scripts
/scripts-20090113-1019
4、安装Moses附加脚本及评测工具
下载scripts.tgz并解压:
wget http://www.statmt.org/wmt07/scripts.tgz
tar -zxvf scripts.tgz
这些脚本包括:
Tokenizer scripts/tokenizer.perl
Lowercaser scripts/lowercase.perl
SGML-Wrapper scripts/wrap-xml.perl
下载NIST,BLEU评测工具:
wget ftp://jaguar.ncsl.nist.gov/mt/resources/mteval-v11b.pl
完整的安装过程结束,这次安装中最大的问题是Giza++不能被gcc,g++4.3或更高版本编译,以后肯定会有很多人遇到这个问题,希望放在这里对大家有所帮助。
注:原创文章,转载请注明出处“我爱自然语言处理”:www.52nlp.cn
本文链接地址:
http://www.52nlp.cn/ubuntu-moses-platform-build-process-record/
相关文章:
你好,我在执行到make -j 4的时候报了如下的错误,不知道是什么问题导致?
mces89@ubuntu:~/mtworkdir/moses$ make -j 4
make all-recursive
make[1]: 正在进入目录 `/home/mces89/mtworkdir/moses’
Making all in kenlm
make[2]: 正在进入目录 `/home/mces89/mtworkdir/moses/kenlm’
/bin/bash ../libtool –tag=CXX –mode=compile g++ -DHAVE_CONFIG_H -I. -I.. -W -Wall -ffor-scope -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -DTRACE_ENABLE=1 -I/home/mces89/mtworkdir/srilm/include -I/home/mces89/mtworkdir/moses/kenlm -g -O2 -MT file_piece.lo -MD -MP -MF .deps/file_piece.Tpo -c -o file_piece.lo `test -f ‘util/file_piece.cc’ || echo ‘./’`util/file_piece.cc
libtool: compile: g++ -DHAVE_CONFIG_H -I. -I.. -W -Wall -ffor-scope -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -DTRACE_ENABLE=1 -I/home/mces89/mtworkdir/srilm/include -I/home/mces89/mtworkdir/moses/kenlm -g -O2 -MT file_piece.lo -MD -MP -MF .deps/file_piece.Tpo -c util/file_piece.cc -o file_piece.o
util/file_piece.cc:19: fatal error: zlib.h: 没有那个文件或目录
compilation terminated.
make[2]: *** [file_piece.lo] 错误 1
make[2]:正在离开目录 `/home/mces89/mtworkdir/moses/kenlm’
make[1]: *** [all-recursive] 错误 1
make[1]:正在离开目录 `/home/mces89/mtworkdir/moses’
make: *** [all] 错误 2
[回复]
52nlp 回复:
三月 15th, 2011 at 13:59
可能是zilib的问题吧:“fatal error: zlib.h: 没有那个文件或目录”,看看Google能不能解决:
http://www.google.com.hk/search?hl=&q=fatal+error%3A+zlib.h%3A+%E6%B2%A1%E6%9C%89%E9%82%A3%E4%B8%AA%E6%96%87%E4%BB%B6%E6%88%96%E7%9B%AE%E5%BD%95&sourceid=navclient-ff&rlz=1B3GGLL_zh-CNCN392CN393&ie=UTF-8
[回复]
mces89 回复:
三月 15th, 2011 at 22:16
谢谢,已经解决了,少装了两个包…
[回复]
ubuntu10.10 32位系统,srilm是1.5.12版本。按照上面说的编译srilm操作,编译没有问题,但是测试全部都是differs,不知道是什么问题?
[回复]
52nlp 回复:
三月 30th, 2011 at 13:41
如果编译没有问题,即使测试是differs我觉得也没啥问题,可能的问题就是你测试的路径有问题。
[回复]
mces89 回复:
三月 30th, 2011 at 16:56
哦,这个问题我后来把machine type改成i686-gcc4后解决了。然后我在按照moses那个steps步骤做到training phrase model的时候报了如下错误:
*** buffer overflow detected ***: /home/mces89/tools/bin/GIZA++ terminated
======= Backtrace: =========
[0x817af49]
[0x817aefd]
[0x817ad18]
[0x815cd3e]
[0x8187ed5]
[0x817adb4]
[0x817ad0d]
[0x806ce9d]
[0x806d903]
[0x8073b70]
[0x8147b3f]
[0x8048201]
======= Memory map: ========
00efd000-00efe000 r-xp 00000000 00:00 0 [vdso]
08048000-081fc000 r-xp 00000000 08:01 1574807 /home/mces89/tools/bin/GIZA++
081fc000-081fe000 rw-p 001b3000 08:01 1574807 /home/mces89/tools/bin/GIZA++
081fe000-08206000 rw-p 00000000 00:00 0
09fcc000-0a040000 rw-p 00000000 00:00 0 [heap]
bfd7f000-bfda0000 rw-p 00000000 00:00 0 [stack]
ERROR: Execution of: /home/mces89/tools/bin/GIZA++ -CoocurrenceFile work/giza.fr-en/fr-en.cooc -c work/corpus/fr-en-int-train.snt -m1 5 -m2 0 -m3 3 -m4 3 -model1dumpfrequency 1 -model4smoothfactor 0.4 -nodumps 1 -nsmooth 4 -o work/giza.fr-en/fr-en -onlyaldumps 1 -p0 0.999 -s work/corpus/en.vcb -t work/corpus/fr.vcb
died with signal 6, without coredump
^C
[1]+ Exit 1 nohup nice moses-scripts/scripts-20110329-2046/training/train-model.perl -scripts-root-dir moses-scripts/scripts-20110329-2046/ -root-dir work -corpus work/corpus/news-commentary.lowercased -f fr -e en -alignment grow-diag-final-and -reordering msd-bidirectional-fe -lm 0:3:/home/mces89/tools/work/lm/news-commentary.lm &>work/training.out
我的giza++是用g++4.4编译的。网上搜了下,也没搞清楚。不知道这个错误是指哪儿有问题?
[回复]
到第四单元的第二步骤
2、下载完成后编译:
cd moses
./regenerate-makefiles.sh 的时候
adam@adam-MS-7191:~/mtworkdir/moses$ ./regenerate-makefiles.sh
Calling /usr/bin/aclocal…
Calling /usr/bin/autoconf…
Calling /usr/bin/automake…
OnDiskPt/src/Makefile.am:1: library used but `RANLIB’ is undefined
OnDiskPt/src/Makefile.am:1:
OnDiskPt/src/Makefile.am:1: The usual way to define `RANLIB’ is to add `AC_PROG_RANLIB’
OnDiskPt/src/Makefile.am:1: to `configure.in’ and run `autoconf’ again.
kenlm/Makefile.am:1: Libtool library used but `LIBTOOL’ is undefined
kenlm/Makefile.am:1:
kenlm/Makefile.am:1: The usual way to define `LIBTOOL’ is to add `AC_PROG_LIBTOOL’
kenlm/Makefile.am:1: to `configure.in’ and run `aclocal’ and `autoconf’ again.
moses/src/Makefile.am:1: Libtool library used but `LIBTOOL’ is undefined
moses/src/Makefile.am:1:
moses/src/Makefile.am:1: The usual way to define `LIBTOOL’ is to add `AC_PROG_LIBTOOL’
moses/src/Makefile.am:1: to `configure.in’ and run `aclocal’ and `autoconf’ again.
automake failed
前面一次执行的时候说没装automake.装好automake1.9以后就是上面命令行。
不知道哪里错了,请帮个忙。
[回复]
52nlp 回复:
五月 17th, 2011 at 21:49
是不是还需要安装“autoconf”呢?
[回复]
以下两句话
TCL_INCLUDE = -I/usr/include/tcl8.5
TCL_LIBRARY = -L/usr/lib/tcl8.5
tcl8.5是文件夹还是什么,我实在搞不过去一直在这里错
g++ -mtune=pentium3 -Wreturn-type -Wimplicit -DINSTANTIATE_TEMPLATES -D_FILE_OFFSET_BITS=64 -I/usr/include/tcl8.5 -I. -I../../include -c -g -O3 -o ../obj/i686/Debug.o Debug.cc
make[2]: g++:命令未找到
make[2]: *** [../obj/i686/Debug.o] 错误 127
make[2]:正在离开目录 `/home/yunyin/nlptools/srilm/misc/src’
make[1]: *** [release-libraries] 错误 1
make[1]:正在离开目录 `/home/yunyin/nlptools/srilm’
make: *** [World] 错误 2
另外就是我的版本是10.10,我一直装不上g++4.1.1这个很让我纠结,不知道为什么,关系树上已经没有这个东西了貌似,应该怎么装,我装了好久了
谢谢…刚开始学习
[回复]
你好,我想问下在配置的所有情况下,总共需要哪些环境配置
在配置过程中的环境我配置了,但是不知道是路径的问题还是什么
我只能根据moses的路径进行运行,而不是直接使用命令运行
[回复]
52nlp 回复:
五月 25th, 2011 at 23:37
这个需要声明环境变量,例如:
export SCRIPTS_ROOTDIR=/home/52nlp/mtworkdir/bin/moses-scripts
/scripts-20090113-1019
[回复]
翻译模型训练:
train-model.perl -scripts-root-dir /home/bin/moses-scripts/scripts-20110315-0953/ -root-dir /home/wcr/ -corpus /home/wcr/corpus/train -f en -e ch -alignment grow-diag-final-and -reordering msd-bidirectional-fe -lm 0:3:/home/lm/ch-bz-lm.txt:0 -lm 1:3:/home/lm/bz-lm.txt:0 -translation-factors 0-0,1
这里 目标语言是加词性标注的, ch-bz-lm.txt是用带词性标注的语料训练出来的语言模型 bz-lm.txt是抽取词性标注后训练出来的语言模型
-lm 0:3:/……/ch-bz-lm.txt:0 -lm 1:3:/…../bz-lm.txt:0
3表示三元模型型吧!? 0,1分别表示什么?我这里这样写对吗?
运行后,出来的moses配置文件moses.ini中,
mapping
0 T 0
不是应该o T 0,1吗?
请帮我分析分析^_^
[回复]
/home/wcr/bin/moses-scripts/scripts-20110315-0953/training/train-model.perl -scripts-root-dir /home/wcr/moses-scripts/scripts-20110315-0953/ -root-dir /home/wcr/mg-ch-bz/ -corpus /home/wcr/mg-ch-bz/corpus/train -f mg -e ch -alignment grow-diag-final-and -reordering msd-bidirectional-fe -lm 0:3:/home/wcr/mg-ch-bz/lm/ch-bz-lm.txt:0 -lm 1:3:/home/wcr/mg-ch-bz/lm/bz-lm.txt:0 -translation-factors 0-0,1 >& /home/wcr/mg-ch-bz/training.out &
这里ch-bz-lm.txt 是”表面词形|词性”的语言模型 bz-lm.txt是”词性标注”的语言模型
这里的0,1代表什么呢?
运行该命令后生成的moses.ini配置文件中
[mapping]
0 T 0
应该是0 T 0,1 不是吗?
[回复]
52nlp 回复:
七月 1st, 2011 at 19:06
0代表的是“表面词形”,1代表的是“词性”吧?
抱歉,我好长时间没有碰Moses,都有点忘了;建议好好看一下Moses官方关于factor model的例子及文档,印象写得很清楚。
[回复]
用层次短语模型的情况下,最小错误率训练为什么结果都零呢?
运行命令如下:
/home/…/mtworkdir/bin/moses-scripts/scripts-20110907-2221/training/mert-moses.pl /home/…/hb-3/tuning/ch /home/…/hb-3/tuning/references /home/…/mtworkdir/moses/moses-chart-cmd/src/moses_chart /home/…/hb-3/model/moses.ini –working-dir /home/…/hb-3/tuning/mert -rootdir /home/…/mtworkdir/bin/moses-scripts/scripts-20110907-2221/ –decoder-flags “-v 0″ >& /home/…/hb-3/tuning/mert.out &
很快能运行完,里头出来两个run.moses.ini,其结果为0.00000
我在哪里出问题了呢?
[回复]
52nlp 回复:
十月 16th, 2011 at 17:01
印象mert训练需要一定的时间,这样很快的训练完,是不是那个指定有问题?建议检查一下它的log输出,看是否有error方面的log. 另外层次短语的训练我还没玩过,所以以上回答仅限猜测!
[回复]
wcr2011 回复:
十月 16th, 2011 at 17:58
好的!谢谢!
[回复]