最近帮同学做一个数据库搜索比较统计功能的项目。项目流程大概如下:
(一)抓取信息源,生成数据库。
(二)提取数据库中的中文信息。
(三)将中文信息进行分词操作。
(四)利用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版接口文档):
依据指定的路径初始化系统词典和配置信息。
声明
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文档日志,里面记录了错误信息。自己后来查看错误信息发现了错误。初始化以后支持遍历目录。
退出ICTCLAS分词系统,释放词典占用的系统内存空间。
声明
bool ICTCLAS_Exit( );
Routine |
Required Header |
ICTCLAS_Exit |
<ICTCLAS50.h> |
返回值
成功返回true;否则返回false。
说明
ICTLCAS_Exit此方法应该在您的应用程序退出前调用,以便释放词典所占用的内存空间。此方法会清空ICTCLAS占用的词典内存空间,清除临时缓冲区及其他系统资源。
如果您需要再次调用ICTCLAS进行分词,请重新调用ICTLCAS_Init()加载基本信息。
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 processing succeed. Otherwise return false.
Parameters
sSourceFilename: The source file path to be analysized;
eCodeType: The character code type of the source file
sDsnFilename: The result file name to store the results.
bPOStagged: Judge whether need POS tagging, 0 for no tag; 1 for tagging; default:1.
Remarks
The ICTCLAS_FileProcess function works properly only if ICTCLAS_Init succeeds.
The output format is customized in ICTCLAS configure.
Example
#include <string.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("Test.txt", CODE_TYPE_GB,"Test_result.txt",1); ICTCLAS_Exit(); return 0; }
Output: Please check the “Test_result.txt”