这篇文章主要详细记录了GIZA++的运行报告,所使用的语言模型为CMU-Cam_Toolkit-v2,解码器使用的是isi-rewrite-decoder-r1.0.0a,使用的操作系统是Ubuntu9.10 ,gcc 的版本是G++4.4.1.都是比较新的运行环境,有需要的学习者可以参考。有不明白的可以留言。其中文中参考的论文为刘洋老师的《利用现有软件构建统计机器翻译系统》。
-----------------------------------------------
GIZA++运行情况记录和结果对比
田亮 澳门大学
2009-12-15——2009-12-22
----------------------------------------------
本次总结主要是对运行过程中的步骤及其出现的情况进行记录,并对运行中出现的可执行文件的功能进行说明与讲解。目的就是总结出一份详细的运行报告,以便其他试图运行该软件的研究者能够顺利调试。文章的结构是在正文的部分给出运行成功的过程,而在文中的附录部分给出各种异常的情况和各种可执行文件的解释,最后给出相关的论文。
文章的总体结构图如下(这里省略):
1. 工具的准备
- 安装linux系统,这里我使用的是Ubuntu 9.10,gcc版本是4.4.1。
- 双语语料库。这里使用1000句中英文对照翻译的句子。
- CMU-Cambridge Statistical Language Modeling Toolkit v2。语言模型工具,用于生成语言模型,以便解码器调用。
- GIZA++。这里使用最新版本“giza-pp-v1.0.3.tar”,里面包含其辅助工具“mkcls”,用于生成word class
- 汉语和英语的分词工具。汉语使用ICTCAL, 英语使用EGYPT自带的一个工具:tokenizeE.perl.tmpl
2. 处理语料库
1.下载中英文语料库
从网上下载的1500句(http://www.nlp.org.cn/ 中文自然语言开放平台)是有问题的,主要是有部分中文语句占据了两行,导致对齐效果不好,所以事先更正了一下。这里为了和语言模型使用的句子相区别,使用了前1000句,作为对齐语料库,而把英文的1500句作为语言模型。
其中源语言1500句——1500.txt的输入形式为:
For this reason it is often convenient to overlay the geochemical map with a geological map transparency.
由于这个缘故,最好用透明的地质图蒙在地球化学图上。
Trains and tunnels are overlaid with the multicoloured names and slogans of youths.
青年人在车辆上和隧道中涂满了各种颜色的姓名和口号。
….
2.分离语料库
接下来,我们要做的就是对其进行分离,也就是说,把这个文档分别分成中文和英文,并把它们命名为:chinese和english。在linux中可以使用如下的命令把它分离:
tianliang@ubuntu:~$ grep '[aeiou]' 1500.txt > english
分离后,会有四句含有中文,然后将english中含有中文句手工删除。
tianliang@ubuntu:~$ grep -v '[aeiou]' 1500.txt > chinese
然后将chinese中含有全角标点的英文句手工删除。
选择分离后的语言文件:english和chinese中的前1000句作为接下来的输入文件。并把分离后的1500句重命名为english1500。
分离后的语言english和chinese的格式 如下:
english
For this reason it is often convenient to overlay the geochemical map with a geological map transparency.
Trains and tunnels are overlaid with the multicolored names and slogans of youths.
…
chinese
由于这个缘故,最好用透明的地质图蒙在地球化学图上。
青年人在车辆上和隧道中涂满了各种颜色的姓名和口号。
…
3.添加语言模型的识别标志
由于这次使用的解码器isi-rewrite-decoder 采用XML文件格式作为输入文件,而它把<s> 和</s>作为语句的区别的标志,为了能够让解码器识别语句,这里需要事先对语言模型的语句做些处理,即要对“english1500”添加<s> 和</s> 标记。使用如下的步骤即可:
(1) 运行命令:
tianliang@ubuntu:~$ cp english1500 english.tag
生成了english1500的一个复本english.tag。 当然可以使用图形化的操作直接复制一份即可。做这步的目的是保留源文件,以免出现异常情况后,源文件损坏。
(2)用vi打开english.tag,使用如下两个命令:
:%s#^#<s> #
:%s#$# </s>#
注意<s>之后以及</s>之前各有一个空格。这样就给每个句子的头和尾加上了标记。保存( wq!)并退出vi。
最终生成的加标记的文件的形式为:
<s> For this reason it is often convenient to overlay the geochemical map with a geological map transparency. </s>
<s> Trains and tunnels are overlaid with the multicolored names and slogans of youths. </s>
….
3. 安装软件
1. 下载软件
分别下载所需的软件
语言模型工具:CMU-Cambridge Statistical Language Modeling Toolkit v2
下载地址:http://svr-www.eng.cam.ac.uk/~prc14/toolkit.html
解码器:isi-rewrite-decoder-r1.0.0a.tar.gz
下载地址:http://www.isi.edu/natural-language/software/decoder/
翻译模型工具:Giza-pp-v1.0.3.tar (里面包含GIZA++-v2和mkcls-v2)
下载地址:http://code.google.com/p/giza-pp/
分词工具包:EGYPT (这里仅使用它自带的英语分词功能)
下载地址:http://www.clsp.jhu.edu/ws99/projects/mt/toolkit/
这里介绍一个统计机器翻译的专门网站http://www.statmt.org/ ,从这里你可以了解到相关的统计机器的论文和会议情况,还可以下载所需要的各种有关的语料库和工具。
2. 编译安装软件
首先,建立一个文件夹用来放置本次调试的软件包:/home/tianliang/research
然后,把解压后的软件包复制到该目录下即可。这里解压可以使用图形化的操作方式,直接右键解压,或者使用命令行,如解压EGYPT包:# tar –xzvf EGYPT.tar.gz 。
最后,从终端进入该目录,然后输入命令“make” 编译即可。
详细过程如下:
(1)把三个解压后的文件包放置在research目录下,使用如下的命令,以及查询目录下的软件包情况:
tianliang@ubuntu:~$ mkdir research
tianliang@ubuntu:~$ cd research
tianliang@ubuntu:~/research$ ls
CMU-Cam_Toolkit_v2 giza-pp isi-rewrite-decoder-r1.0.0a
(2)安装CMU-Cam_Tookit_v2
安装这个软件前,要事先更改一下代码,方法就是进入该包的src目录下,找到Makefile,将里面的“#BYTESWAP_FLAG=-DSLM_SWAP_BYTES”中的“#”去掉。
tianliang@ubuntu:~/research$ cd CMU-Cam_Toolkit_v2
tianliang@ubuntu:~/research/CMU-Cam_Toolkit_v2$ cd src
tianliang@ubuntu:~/research/CMU-Cam_Toolkit_v2/src$ make install
gcc -O -DSLM_SWAP_BYTES -c -o bo_ng_prob.o bo_ng_prob.c
gcc -O -DSLM_SWAP_BYTES -c -o calc_mem_req.o calc_mem_req.c
gcc -O -DSLM_SWAP_BYTES -c -o compute_back_off.o compute_back_off.c
gcc -O -DSLM_SWAP_BYTES -c -o compute_discount.o compute_discount.c
gcc -O -DSLM_SWAP_BYTES -c -o compute_unigram.o compute_unigram.c
gcc -O -DSLM_SWAP_BYTES -c -o get_ngram.o get_ngram.c
gcc -O -DSLM_SWAP_BYTES -c -o increment_context.o increment_context.c
gcc -O -DSLM_SWAP_BYTES -c -o lookup_index_of.o lookup_index_of.c
gcc -O -DSLM_SWAP_BYTES -c -o short_indices.o short_indices.c
gcc -O -DSLM_SWAP_BYTES -c -o two_byte_alphas.o two_byte_alphas.c
gcc -O -DSLM_SWAP_BYTES -c -o write_lms.o write_lms.c
gcc -O -DSLM_SWAP_BYTES -c -o num_of_types.o num_of_types.c
gcc -O -DSLM_SWAP_BYTES -c -o guess_mem.o guess_mem.c
gcc -O -DSLM_SWAP_BYTES -c -o counts.o counts.c
gcc -O -DSLM_SWAP_BYTES -c -o arpa_bo_ng_prob.o arpa_bo_ng_prob.c
gcc -O -DSLM_SWAP_BYTES -c -o calc_prob_of.o calc_prob_of.c
gcc -O -DSLM_SWAP_BYTES -c -o decode_bo_case.o decode_bo_case.c
gcc -O -DSLM_SWAP_BYTES -c -o gen_fb_list.o gen_fb_list.c
gcc -O -DSLM_SWAP_BYTES -c -o load_lm.o load_lm.c
load_lm.c: In function ‘load_arpa_lm’:
load_lm.c:350: warning: ignoring return value of ‘fgets’, declared with attribute warn_unused_result
gcc -O -DSLM_SWAP_BYTES -c -o parse_comline.o parse_comline.c
gcc -O -DSLM_SWAP_BYTES -c -o perplexity.o perplexity.c
gcc -O -DSLM_SWAP_BYTES -c -o stats.o stats.c
gcc -O -DSLM_SWAP_BYTES -c -o validate.o validate.c
gcc -O -DSLM_SWAP_BYTES -c -o pc_libs/pc_comline.o pc_libs/pc_comline.c
gcc -O -DSLM_SWAP_BYTES -c -o pc_libs/pc_message.o pc_libs/pc_message.c
gcc -O -DSLM_SWAP_BYTES -c -o rr_libs/parse_line.o rr_libs/parse_line.c
gcc -O -DSLM_SWAP_BYTES -c -o rr_libs/quit.o rr_libs/quit.c
rr_libs/quit.c: In function ‘quit’:
rr_libs/quit.c:30: warning: incompatible implicit declaration of built-in function ‘exit’
gcc -O -DSLM_SWAP_BYTES -c -o rr_libs/rd_wlist_arry.o rr_libs/rd_wlist_arry.c
gcc -O -DSLM_SWAP_BYTES -c -o rr_libs/read_voc.o rr_libs/read_voc.c
gcc -O -DSLM_SWAP_BYTES -c -o rr_libs/read_wlist_si.o rr_libs/read_wlist_si.c
gcc -O -DSLM_SWAP_BYTES -c -o rr_libs/rr_calloc.o rr_libs/rr_calloc.c
gcc -O -DSLM_SWAP_BYTES -c -o rr_libs/rr_feof.o rr_libs/rr_feof.c
gcc -O -DSLM_SWAP_BYTES -c -o rr_libs/rr_fexists.o rr_libs/rr_fexists.c
gcc -O -DSLM_SWAP_BYTES -c -o rr_libs/rr_filesize.o rr_libs/rr_filesize.c
gcc -O -DSLM_SWAP_BYTES -c -o rr_libs/rr_fopen.o rr_libs/rr_fopen.c
gcc -O -DSLM_SWAP_BYTES -c -o rr_libs/rr_fread.o rr_libs/rr_fread.c
gcc -O -DSLM_SWAP_BYTES -c -o rr_libs/rr_fseek.o rr_libs/rr_fseek.c
gcc -O -DSLM_SWAP_BYTES -c -o rr_libs/rr_fwrite.o rr_libs/rr_fwrite.c
gcc -O -DSLM_SWAP_BYTES -c -o rr_libs/rr_iopen.o rr_libs/rr_iopen.c
gcc -O -DSLM_SWAP_BYTES -c -o rr_libs/rr_malloc.o rr_libs/rr_malloc.c
gcc -O -DSLM_SWAP_BYTES -c -o rr_libs/rr_oopen.o rr_libs/rr_oopen.c
gcc -O -DSLM_SWAP_BYTES -c -o rr_libs/salloc.o rr_libs/salloc.c
gcc -O -DSLM_SWAP_BYTES -c -o rr_libs/sih.o rr_libs/sih.c
rr_libs/sih.c: In function ‘sih_val_read_from_file’:
rr_libs/sih.c:255: warning: comparison between pointer and integer
rm -f SLM2.a
ar r SLM2.a bo_ng_prob.o calc_mem_req.o compute_back_off.o compute_discount.o compute_unigram.o get_ngram.o increment_context.o lookup_index_of.o short_indices.o two_byte_alphas.o write_lms.o num_of_types.o guess_mem.o counts.o arpa_bo_ng_prob.o bo_ng_prob.o calc_prob_of.o decode_bo_case.o gen_fb_list.o load_lm.o lookup_index_of.o parse_comline.o perplexity.o short_indices.o stats.o two_byte_alphas.o validate.o num_of_types.o counts.o load_lm.o write_lms.o short_indices.o two_byte_alphas.o num_of_types.o stats.o counts.o get_ngram.o pc_libs/pc_comline.o pc_libs/pc_message.o rr_libs/parse_line.o rr_libs/quit.o rr_libs/rd_wlist_arry.o rr_libs/read_voc.o rr_libs/read_wlist_si.o rr_libs/rr_calloc.o rr_libs/rr_feof.o rr_libs/rr_fexists.o rr_libs/rr_filesize.o rr_libs/rr_fopen.o rr_libs/rr_fread.o rr_libs/rr_fseek.o rr_libs/rr_fwrite.o rr_libs/rr_iopen.o rr_libs/rr_malloc.o rr_libs/rr_oopen.o rr_libs/salloc.o rr_libs/rr_malloc.o rr_libs/rr_oopen.o rr_libs/salloc.o rr_libs/sih.o
ar: creating SLM2.a
if [ `uname` = SunOS -o `uname` = Linux ] ; then ranlib SLM2.a ; fi
gcc -O -DSLM_SWAP_BYTES -o idngram2lm idngram2lm.c SLM2.a -lm
gcc -O -DSLM_SWAP_BYTES -o evallm evallm.c SLM2.a -lm
gcc -O -DSLM_SWAP_BYTES -o text2wngram text2wngram.c SLM2.a -lm
gcc -O -DSLM_SWAP_BYTES -o text2idngram text2idngram.c SLM2.a -lm
gcc -O -DSLM_SWAP_BYTES -o binlm2arpa binlm2arpa.c SLM2.a -lm
gcc -O -DSLM_SWAP_BYTES -o ngram2mgram ngram2mgram.c SLM2.a -lm
gcc -O -DSLM_SWAP_BYTES -o idngram2stats idngram2stats.c SLM2.a -lm
gcc -O -DSLM_SWAP_BYTES -o wfreq2vocab wfreq2vocab.c SLM2.a -lm
gcc -O -DSLM_SWAP_BYTES -o text2wfreq text2wfreq.c SLM2.a -lm
gcc -O -DSLM_SWAP_BYTES -o wngram2idngram wngram2idngram.c SLM2.a -lm
gcc -O -DSLM_SWAP_BYTES -o mergeidngram mergeidngram.c SLM2.a -lm
gcc -O -DSLM_SWAP_BYTES -o interpolate interpolate.c SLM2.a -lm
for i in idngram2lm evallm text2wngram text2idngram binlm2arpa ngram2mgram idngram2stats wfreq2vocab text2wfreq wngram2idngram mergeidngram interpolate; do /
./install-sh $i ../bin; /
done
./install-sh SLM2.a ../lib
然后进入giza-pp目录,安装mkcls和GIZA++
(3)安装mkcls-v2
tianliang@ubuntu:~/research/CMU-Cam_Toolkit_v2/src$ cd ..
tianliang@ubuntu:~/research/CMU-Cam_Toolkit_v2$ cd ..
tianliang@ubuntu:~/research$ cd giza-pp
tianliang@ubuntu:~/research/giza-pp$ cd mkcls-v2
tianliang@ubuntu:~/research/giza-pp/mkcls-v2$ make
g++ -Wall -W -DNDEBUG -O3 -Wno-deprecated -c GDAOptimization.cpp –o GDAOptimization.o
g++ -Wall -W -DNDEBUG -O3 -Wno-deprecated -c HCOptimization.cpp -o HCOptimization.o
g++ -Wall –W -DNDEBUG -O3 -Wno-deprecated -c Problem.cpp -o Problem.o
g++ -Wall -W -DNDEBUG -O3 -Wno-deprecated -c IterOptimization.cpp -IterOptimization.o
g++ -Wall -W -DNDEBUG -O3 -Wno-deprecated -c ProblemTest.cpp -o ProblemTest.o
g++ -Wall -W -DNDEBUG -O3 -Wno-deprecated -c RRTOptimization.cpp -o RRTOptimization.o
g++ -Wall -W -DNDEBUG -O3 -Wno-deprecated -c MYOptimization.cpp -o MYOptimization.o
g++ -Wall -W -DNDEBUG -O3 -Wno-deprecated -c SAOptimization.cpp -o SAOptimization.o
g++ -Wall -W -DNDEBUG -O3 -Wno-deprecated -c TAOptimization.cpp -o TAOptimization.o
g++ -Wall -W -DNDEBUG -O3 -Wno-deprecated -c Optimization.cpp -o Optimization.o
g++ -Wall -W -DNDEBUG -O3 -Wno-deprecated -c KategProblemTest.cpp –oKategProblemTest.o
g++ -Wall -W -DNDEBUG -O3 -Wno-deprecated -c KategProblemKBC.cpp -o KategProblemKBC.o
g++ -Wall -W -DNDEBUG -O3 -Wno-deprecated -c KategProblemWBC.cpp -o KategProblemWBC.o
g++ -Wall -W -DNDEBUG -O3 -Wno-deprecated -c KategProblem.cpp -o KategProblem.o
g++ -Wall -W -DNDEBUG -O3 -Wno-deprecated -c StatVar.cpp -o StatVar.o
g++ -Wall -W -DNDEBUG -O3 -Wno-deprecated -c general.cpp -o general.o
g++ -Wall -W -DNDEBUG -O3 -Wno-deprecated -c mkcls.cpp -o mkcls.o
g++ -Wall -W -DNDEBUG -O3 -Wno-deprecated -o mkcls GDAOptimization.o HCOptimization.o Problem.o IterOptimization.o ProblemTest.o RRTOptimization.o MYOptimization.o SAOptimization.o TAOptimization.o Optimization.o KategProblemTest.o KategProblemKBC.o KategProblemWBC.o KategProblem.o StatVar.o general.o mkcls.o