机器翻译最后一个大作业需要使用moses搭建一个机器翻译系统。其中有一步中要调用ICTCLA api实现中文分词,晚上稍稍熟悉了一下ICTCLA,大概了解了它的原理和使用方法,在此将使用它的方法和实验过程加以简述,以备忘。
我是在ubuntu 9.10系统中进行实验的,故而需要下载linux版本的ICTCLA。我首先下的是java版本,但是在ubuntu中使用时出现了问题,后换成了C++版本。在解决了实验过程中在C++版本里出现的问题之后,回头看java版本,之前遇到的是一样的问题。在此以c++版本为例说明。
完成一个汉语分词程序的过程:
首先,下载C++ ICTCLA for linux,解压,出现4个文件夹api, Demo, Doc和Simple。Demo中放的是在windows中使用的一个GUI的程序,Doc是说明文档,Sample是一个示例,api中存放的是使用C++ api是在工程中必须存在的一些文件和文件夹,可视作各个库和配置文件。
其次,建立一个C++工程CTestProject,在这个工程的文件夹里拷入上述api文件夹内的所有东东。下一步很重要,修改ICTCLAS50.h头文件,我不晓得为什么这个文件会有问题,不过改后确实好了。这个文件中需要注释掉各个函数声明之前的“ICTCLAS_API”,不然编译报错(我估计是开发人员忘记将这个字符串放入注释了)。
写程序test.cpp(一个简单的调用api进行中文分词的程序):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ICTCLAS50.h"
int main(int argc, char* argv[])
{
if(!ICTCLAS_Init())
{
printf("Init fails/n");
return -1;
}
ICTCLAS_FileProcess("c.txt", "Test_result.txt",CODE_TYPE_UTF8,0);
ICTCLAS_Exit();
return 0;
}
然后编译程序(我的C++程序名为test.cpp):
g++ test.cpp -Xlink libICTCLA50.a -o test
这里要加入一个编译时刻的链接libICTCLA50.a,不然无法找到头文件中声明的函数体实现。
编译成功,生成二进制文件test。./test运行,出现Init fails,检查ICTCLAS.log文件,其中记录了出错的日志,发现Data文件夹缺少东西,不要紧,如果我们不用用户字典的话只需要修改一下配置文件Configure.xml就可以了,将其中的UserDict, FieldDict以及UserDictPrior标签值置为Off。重新跑,依然出错,继续检查错误日志。发现Data文件夹中的部分文件命名的大小写有问题,将ictpos.map和pku.map的文件名改为ICTPOS.map和PKU.map即可~~这样修改后,程序应该可以跑成功了,就是将c.txt中的中文进行切分,结果记录在Test_result.txt文件中。
调用java api中遇到的问题大抵类似,只是少了修改头文件这一步骤,但是需要将用到的libICTCLA50.so文件拷入/usr/lib中。只要程序可以编译通过,运行时出现的问题都记录在了ICTCLAS.log中,可以随时查看问题所在,对症下药~~
以上简记,谨备忘~~