日期:2014-05-16  浏览次数:20455 次

ICTCLAS2012分词库在C环境下的使用

最近帮同学做一个数据库搜索比较统计功能的项目。项目流程大概如下:

(一)抓取信息源,生成数据库。

(二)提取数据库中的中文信息。

(三)将中文信息进行分词操作。

(四)利用tf-idf算法统计对文本中得词进行加权统计。

(五)利用加权统计结果 获得相似度高的文件组。

(六)将相似度相关的文件组利用图形方式描述并且关联出来,看到直观的统计效果。


这里顺便说一句。在做第二步的时候,本来想写个c语言的程序提取xml文件中特定标签中的信息。

然后就一直苦恼要考虑字符分析和各种特殊情况。

后来经大家点拨,明白了解决问题的方法不止一种。对于类似这样的操作,可以利用正则表达式轻松提取。

除了c语言之外,利用php, python, shell脚本编写可能会更加效率的解决问题。

后来在同学的帮助之下利用php解决了问题。

这件事情让我明白了:有时候不要在一棵树上吊死。有时候换种方法,换种工具,换种思维,可能会更快的解决问题。


这篇文章主要说说第三步的操作。这里使用了ICTCLAS分词系统提供的API接口。

直接下载ICTCLAS2012的链接:

http://www.nlpir.org/download/ICTCLAS2012-SDK-u0106.rar

ICTCLAS官网:

http://ictclas.org/

下面以2012版本为例子,简单说明一下。

该版本提供了License.dll,貌似有效期只有1个月。一个月后证书会失效。大家如果有能力可以自己尝试破解。

下载下来之后其实使用的头文件,dll还有lib文件都还是2011版本的。

简单看了一下头文件中的API接口,发现提供了多种中文编码的API。GBK, UTF8,  Big5等。

然后有个example的例子,再简单看一下,发现使用还是很方便的。有什么问题可以看接口文档。

http://ictclas.org/ictclas_files.html

这里我们首先做下准备工作。下面文件放在运行目录下面

ICTCLAS2011.h

ICTCLAS2011.dll

ICTCLAS2011.lib


Configure.xml 这个是配置文件,也是必要的。

License.dll证书文件,必要的。

ICTCLAS2012.user 同样也是必要的。

Data词典文件。

下面以UTF8为例子。说下面三个函数(摘自2011版接口文档):

 ICTCLAS_Init

依据指定的路径初始化系统词典和配置信息。

声明

bool ICTCLAS_Init(const char* pszInitDir=NULL);

Routine

Required Header

ICTCLAS_Init

<ICTCLAS50.h>

返回值

如果初始化成功返回true, 否则返回false. 如初始化不成功,请查看ictclas.log文件了解详细错误原因.

参数

pszInitDir:初始化路径,应包含配置文件(Configure.xml)和词典目录(Data目录)以及授权文件(user.lic). 如果这些文件及目录在系统运行当前目录下,此参数可以为null。

说明

ICTCLAS_Init必须在调用系统其它任何操作前进行调用,以初始化系统的基本配置信息及加载词典文件。当停止使用ICTCLAS后,应调用ICTCLAS_Exit方法清理内存缓冲区。

ICTCLAS_Init加载失败有可能是以下原因造成:

1) 缺少系统加载所需的词典文件
系统的词典都保存在Data目录下,请确保初始化路径下有Data目录,且词典文件完整。

2) 缺少配置文件
系统配置文件名为Configure.xml,用于保存系统所需的配置信息,请确保初始化路径下包含正确的Configure.xml文件。

3) 缺少授权文件user.lic
试用授权文件名为user.lic,缺少合法的授权文件将无法正常加载。

4) 其他未知的加载错误,请查看ICTCLAS.log日志文件。


当时自己老是初始化错误,后来发现没有包含以上文件。如果初始化失败,会自动生成以时间命名的txt文档日志,里面记录了错误信息。自己后来查看错误信息发现了错误。初始化以后支持遍历目录。

CTCLAS_Exit

退出ICTCLAS分词系统,释放词典占用的系统内存空间。

声明

bool ICTCLAS_Exit( );

Routine

Required Header

ICTCLAS_Exit

<ICTCLAS50.h>

返回值

成功返回true;否则返回false。

说明

ICTLCAS_Exit此方法应该在您的应用程序退出前调用,以便释放词典所占用的内存空间。此方法会清空ICTCLAS占用的词典内存空间,清除临时缓冲区及其他系统资源。

如果您需要再次调用ICTCLAS进行分词,请重新调用ICTLCAS_Init()加载基本信息。

ICTCLAS_FileProcess

Process a text file

bool ICTCLAS_FileProcess(const char *sSrcFilename,eCodeType eCt,const char *sDsnFilename,int bPOStagged);

Routine

Required Header

ICTCLAS_FileProcess

<ICTCLAS50.h>

Return Value

Return true if&nbs