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

    技术2024-11-28  9

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

     

    最新回复(0)