Word-based统计机器翻译中的常见异常情况总结及处理方法!

来源:互联网 发布:淘宝怎么可以买到rush 编辑:程序博客网 时间:2024/06/07 05:42

附录1Appendix 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了!