附录1(Appendix A)(异常情况处理)
这里将给出运行过程中出现的问题,当你尝试运行的时候,如果出现下面这些情况,可以作为参考以便改正。
u 当进行编译单词分类工具mkcls的时候,在这个操作系统下将会出现下面的情况:
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
make: g++: Command not found
make: *** [GDAOptimization.o] Error 127
出现这种情况的原因是,所采用的系统中没有安装g++这个软件包,不过在Ubuntu这个最新的操作系统下,软件包中含有这个软件,只是没有安装而已,采用如下的命令,就可以安装这个软件包了,之后就可以解决这个问题,命令行如下:
tianliang@ubuntu:~$ sudo apt-get install g++
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
g++-4.4 libstdc++6-4.4-dev
Suggested packages:
g++-multilib g++-4.4-multilib gcc-4.4-doc libstdc++6-4.4-dbg
libstdc++6-4.4-doc
The following NEW packages will be installed:
g++ g++-4.4 libstdc++6-4.4-dev
0 upgraded, 3 newly installed, 0 to remove and 154 not upgraded.
Need to get 4,703kB/6,193kB of archives.
After this operation, 20.8MB of additional disk space will be used.
Do you want to continue [Y/n]? y
Get:1 http://us.archive.ubuntu.com karmic/main g++-4.4 4.4.1-4ubuntu8 [4,701kB]
Get:2 http://us.archive.ubuntu.com karmic/main g++ 4:4.4.1-1ubuntu2 [1,446B]
Fetched 4,270kB in 5min 23s (13.2kB/s)
Selecting previously deselected package libstdc++6-4.4-dev.
(Reading database ... 117121 files and directories currently installed.)
Unpacking libstdc++6-4.4-dev (from .../libstdc++6-4.4-dev_4.4.1-4ubuntu8_i386.deb) ...
Selecting previously deselected package g++-4.4.
Unpacking g++-4.4 (from .../g++-4.4_4.4.1-4ubuntu8_i386.deb) ...
Selecting previously deselected package g++.
Unpacking g++ (from .../g++_4%3a4.4.1-1ubuntu2_i386.deb) ...
Processing triggers for man-db ...
Setting up libstdc++6-4.4-dev (4.4.1-4ubuntu8) ...
Setting up g++-4.4 (4.4.1-4ubuntu8) ...
Setting up g++ (4:4.4.1-1ubuntu2) ...
update-alternatives: using /usr/bin/g++ to provide /usr/bin/c++ (c++) in auto mode.
可以看出这个g++的版本也是非常新的。
注意,当你在安装这个软件的时候,如果你还在运行其他程序或者更新你的操作系统,系统会给你提示,不允许你安装这个软件,即命令行将不会执行:
tianliang@ubuntu:~$ sudo apt-get install g++
E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
所以,为了安装的顺利,一定要关闭更新程序。(当时在调试的时候,我在更新自己的软件包)
u 在语言模型里,当想生成“english.idngram”文件的时候,必须切换到root的身份,否则系统不允许命令行的执行,就如下面的错误提示:
tianliang@ubuntu:~/research/CMU-Cam_Toolkit_v2/bin$ ./text2idngram -vocab english.vocab -buffer 5 <english.tag> english.idngram
text2idngram
Vocab : english.vocab
N-gram buffer size : 5
Hash table size : 200000
Temp directory : /usr/tmp/
Max open files : 20
FOF size : 10
n : 3
Initialising hash table...
Reading vocabulary...
Allocating memory for the n-gram buffer...
Reading text into the n-gram buffer...
20,000 n-grams processed for each ".", 1,000,000 for each line.
Sorting n-grams...
Writing sorted n-grams to temporary file /usr/tmp/text2idngram.temp.ubuntu.5149.1
rr_fopen: problems opening /usr/tmp/text2idngram.temp.ubuntu.5149.1 for "w".
当然这个错误,可从 “/usr/tmp/text2idngram.temp.ubuntu.5149.1”这句话看出。实际上就算不以root的身份运行这个命令,只要能够在usr的目录下建立一个根目录叫做“tmp”,同样可以运行这个程序。不过想要在usr中建立新目录还得以root的身份进入。使用如下命令建立:
$mkdir tmp
现在在重新运行命令就可以了。这里有一点要注意,在Ubuntu系统下,不是简单的输入“su”后就可以进入root的身份的,这里要做些操作。
$sudo passwd root
Now, you can use su command as below:
tianliang@ubuntu:~/research/CMU-Cam_Toolkit_v2/bin$ su
Password:
u 在进行英汉词语对齐的时候,由于这里的GCC版本和操作系统都是最新的,调试的时候是通不过的,当运行对齐命令的时候将会出现如下的状况:
tianliang@ubuntu:/home/tianliang/research/giza-pp/GIZA++-v2/test# ./GIZA++ -S english.vcb -T chinese.vcb -C english_chinese.snt
*** buffer overflow detected ***: ./GIZA++ terminated
======= Backtrace: =========
[0x816acbc]
[0x816ac62]
[0x816aa78]
[0x81532de]
[0x81779bb]
[0x816ab14]
[0x816aa6d]
[0x806b97d]
[0x806c253]
[0x8072db0]
[0x813defa]
[0x8048191]
======= Memory map: ========
00fb3000-00fb4000 r-xp 00000000 00:00 0 [vdso]
08048000-081e8000 r-xp 00000000 07:00 144861 /home/tianliang/research/giza-pp/GIZA++-v2/test/GIZA++
081e8000-081ea000 rw-p 001a0000 07:00 144861 /home/tianliang/research/giza-pp/GIZA++-v2/test/GIZA++
081ea000-081f2000 rw-p 00000000 00:00 0
09e3a000-09eae000 rw-p 00000000 00:00 0 [heap]
bfef1000-bff06000 rw-p 00000000 00:00 0 [stack]
Abort
这个错误出现在GIZA++-v2目录下的file_spec.h中的Get_File_Spec()函数中。这个函数的目的就是检测缓存溢出的异常情况,查看源文件,试着更改其中的缓存大小,再次运行试试!这里把原函数摘录下来,其中更改的地方,给予了红色标记。
**************************************************************************************
--- 37,49 ---
struct tm *local;
time_t t;
char *user;
! char time_stmp[17];
char *file_spec = 0;
t = time(NULL);
local = localtime(&t);
! sprintf(time_stmp, "%02d-%02d-%02d.%02d%02d%02d.", local->tm_year,
(local->tm_mon + 1), local->tm_mday, local->tm_hour,
local->tm_min, local->tm_sec);
user = getenv("USER");
--- 37,49 ----
struct tm *local;
time_t t;
char *user;
! char time_stmp[19];
char *file_spec = 0;
t = time(NULL);
local = localtime(&t);
! sprintf(time_stmp, "%04d-%02d-%02d.%02d%02d%02d.", 1900 + local->tm_year,
(local->tm_mon + 1), local->tm_mday, local->tm_hour,
local->tm_min, local->tm_sec);
user = getenv("USER");
**************************************************************************************
就更改了这几处,非常幸运,程序正常运行了!
同样在这个地方,如果在编译程序之前没有把“makefile”中的“-DBINARY_SEARCH_FOR_TTABLE”删除,那么在运行对齐命令“GIZA++ -S english.vcb -T chinese.vcb -C english_chinese.snt”的时候,运行的结果将会出现下面的提示:
..
ERROR: NO COOCURRENCE FILE GIVEN!
Abort
解决的方法就是进入GIZA++-v2目录,找到“Makefile”文件,把其中的一句叫做“-DBINARY_SEARCH_FOR_TTABLE”删除,这里给出其所在文件的大致位置,请看源文件的前十行:
INSTALLDIR ?= /usr/local/bin/
CXX = g++
CFLAGS = $(CFLAGS_GLOBAL) -Wall -W -Wno-deprecated
CFLAGS_OPT = $(CFLAGS) -O3 -DNDEBUG -DWORDINDEX_WITH_4_BYTE -DBINARY_SEARCH_FOR_TTABLE
CFLAGS_PRF = $(CFLAGS) -O2 -pg -DNDEBUG -DWORDINDEX_WITH_4_BYTE
CFLAGS_DBG = $(CFLAGS) -g -DDEBUG -DWORDINDEX_WITH_4_BYTE
CFLAGS_NRM = $(CFLAGS) -DWORDINDEX_WITH_4_BYTE
CFLAGS_VDBG = $(CFLAGS) -g -DDEBUG -DWORDINDEX_WITH_4_BYTE -DVDEBUG
SRC = *.cpp
TYPE =
注意:有些时候你在Makefile中就是找不到这句,原因就是你下载的版本已经被人更改过,已经事先删除了,所以运行的时候不会出现这种类似的情况。我在网上下载的GIZA++前一个版本“GIZA++.2003-09-30.TAR,GZ”就是可以直接运行,而不会出现这种错误。后来查看源文件才知道,Makefile中就没有这句话,所以可以正常运行。
u 在生成“FZeroWords”中执行查看繁殖概率为零的单词的命令时,首先要更改“rewrite.mkZeroFert.perl”的权限,否则将出现如下的错误:
tianliang@ubuntu:~/research/isi-rewrite-decoder-r1.0.0a/util$ ./rewrite.mkZeroFert.perl 2009-12-17.154417.tianliang.trn.src.vcb 2009-12-17.154417.tianliang.n3.final
bash: ./rewrite.mkZeroFert.perl: Permission denied
使用如下的命令可以解决这个问题。
tianliang@ubuntu:~/research/isi-rewrite-decoder-r1.0.0a/util$ chmod 766 rewrite.mkZeroFert.perl
u 在最后运行结果的时候仍然会出现一系列的问题,其中主要的是以下两个问题;
tianliang@ubuntu:~/research/isi-rewrite-decoder-r1.0.0a/linux$ ./decoder.linux.public --config decoder.cfg input.xml
(1)./decoder.linux.public: error while loading shared libraries: libstdc++-libc6.2-2.so.3: cannot open shared object file: No such file or directory
出现这个异常情况,说明目前机器的运行库(library)不可用,我们应该安装它。通过查阅资料得知“libstdc++-libc6.2-2.so.3”就包含在“libstdc++2.10-glibc2.2”这个软件包中。有两种安装方法,一种是使用如下的命令:
$sudo apt-get install libstdc++2.10-glibc2.2
另一种是,自己下载,下载的安装包直接双击安装即可。下载的地址是:http://packages.ubuntu.com/dapper/i386/libstdc++2.10-glibc2.2/download
我先采用的是第一种方法,不过始终不能成功,最终选择的是自己下载安装。现在知道,Ubuntu系统的软件管理器中没有包含这个软件。
(2)./decoder.linux.public: error while loading shared libraries: libicudata.so.22: cannot open shared object file: No such file or directory
这种情况比较常见,造成这种情况的原因是,没有导入环境变量,或者说是运行的路径不正确,避免这种情况的发生的方法是从新导入环境变量命令:
tianliang@ubuntu:~/research/isi-rewrite-decoder-r1.0.0a/linux$ export LD_LIBRARY_PATH=/home/tianliang/research/isi-rewrite-decoder-r1.0.0a/linux
现在再运行就应该OK了!