使用ICTCLA api进行中文分词实验的过程备忘
2011-02-21 21:23
369 查看
机器翻译最后一个大作业需要使用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中,可以随时查看问题所在,对症下药~~
以上简记,谨备忘~~
我是在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中,可以随时查看问题所在,对症下药~~
以上简记,谨备忘~~
相关文章推荐
- 使用最大逆向法,利用python进行简易中文分词
- 使用C++实现mmseg,对中文句子进行分词
- 使用R语言进行中文分词
- 使用pymmseg进行中文分词
- 使用IKAnalyzer进行中文分词
- 使用Python,字标注及最大熵法进行中文分词
- 使用Python+jieba和java+庖丁分词在Spark集群上进行中文分词统计
- 使用python对中文文本进行分词
- 使用pymmseg进行中文分词
- 使用Postgresql进行中文分词
- 是先对搜索词进行中文分词呢?还是在搜索过程中进行中文分词?
- 使用ictclas4j进行中文分词
- 使用ES对中文文章进行分词,并进行词频统计排序
- 使用zend Framework的lucene进行全文检索——中文分词
- 使用Python+jieba和java+庖丁分词在Spark集群上进行中文分词统计
- python中文分词,使用结巴分词对python进行分词(实例讲解)
- Python结巴中文分词工具使用过程中遇到的问题及解决方法
- 使用python jieba库进行中文分词
- 使用ICTCLAS JAVA版(ictclas4j)进行中文分词
- 对搜狗提供的中文语料库进行文本分词过程中的java笔记