ICTCLAS计算所中文分词(当前最好的汉语词法分析器)系统特点:准确度高(98.5%),性能优越(500KB/s分词速度),词性标注(POS tagging)且支持多种标注集,支持用户自定义词典,支持用户自定义词性标注,支持多平台,支持模块组合关闭(在
Configure.xml
中设置),支持多编码(UTF-8, GB(GB2312, GBK, GB10380)和BIG5)且可以自动识别编码等。更多详见官网,文档和FAQ。
使用ICTCLAS库实现中文分词(Linux 32 bit)
下载ICTCLAS:
从ICTCLAS下载
ICTCLAS2011_Linux_32_c
(ICTCLAS 2011,内核版本5.0)。
wget http://www.ictclas.org/down/50/ICTCLAS50_Linux_RHAS_32_C.rar
unrar -x ICTCLAS50_Linux_RHAS_32_C.rar
创建测试目录,并拷贝API到该目录下
mkdir test
cd test
mkdir ICTCLAS_API
cp -fR ICTCLAS50_Linux_RHAS_32_C/API/* ./ICTCLAS_API
在
test
目录下创建用户词典
userdict.txt
,填写:
洛杉矶@@LA
奥巴马@@Obama
最新动态@@nr
在
test
目录下创建文件
test.c
/* 编译动态: g++ test.c -L./ICTCLAS_API -lICTCLAS50 -DOS_LINUX -o test静态: g++ test.c -L./ICTCLAS_API -lICTCLAS50 -DOS_LINUX -o test -static*/
/* 处理字符串
#define ICTCLAS_API_PATH "ICTCLAS_API"
#include <stdio.h>#include <stdlib.h>#include <string.h>#include "ICTCLAS_API/ICTCLAS50.h"
int main(int argc, char *argv[]) {
//# 初始化 if (!ICTCLAS_Init(ICTCLAS_API_PATH)) { fprintf(stderr, "Error: init failed, please put the ICTCLAS API under `%s` directory\n\n", ICTCLAS_API_PATH); exit(EXIT_FAILURE); } printf("init ICTCLAS succeed\n");
//# 设置词性标注集 ICTCLAS_SetPOSmap(ICT_POS_MAP_SECOND);
//# 处理 const char *srcTxt = "随后奥巴马就离开了洛杉矶,预计奥巴马今天下午就回到华盛顿。以上就是今天上午的最新动态"; int srcLen = strlen(srcTxt);
//未导入用户字典之前的处理 char *resTxt = NULL; resTxt = (char *) malloc(srcLen * 6); int resLen = 0; resLen = ICTCLAS_ParagraphProcess(srcTxt, srcLen, resTxt, CODE_TYPE_UNKNOWN, 1); printf("before:\n%s\n\n", resTxt); free(resTxt); resTxt = NULL;
//导入用户词典(文本文件:一行一词(词和词性使用`@@`分隔,词性可以省略,且可以自定义任意词性),例如:中科院@@nr或北京市) unsigned int itemsNum = ICTCLAS_ImportUserDictFile("./userdict.txt", CODE_TYPE_UNKNOWN); printf("%d items loaded\n", itemsNum);
/* //也可以以字符串形式导入词典(词与词之间使用`;`分隔,如果指定词性,词与词性之间使用`@@`分隔,例如`中科院@@nr;分词@@v;系统@@adj;`或`中科院;分词;系统;`) const char *dictStr = "洛杉矶@@LA;奥巴马@@Obama;最新动态@@nr"; unsigned int itemsNum = ICTCLAS_ImportUserDict(dicStr, strlen(dicStr), CODE_TYPE_UNKNOWN); printf("%d items loaded\n", itemsNum); */
//如果保存用户词典,则下次分词的时候依然有效 ICTCLAS_SaveTheUsrDic();
//导入用户词典之后分词 resTxt = (char *) malloc(srcLen * 6); resLen = ICTCLAS_ParagraphProcess(srcTxt, srcLen, resTxt, CODE_TYPE_UNKNOWN, 1); printf("after:\n%s\n\n", resTxt); free(resTxt);
//# 释放资源 ICTCLAS_Exit(); return 0;} */
/*处理文件#define ICTCLAS_API_PATH "ICTCLAS_API"
#include <stdio.h>#include <stdlib.h>#include <string.h>#include "ICTCLAS_API/ICTCLAS50.h"
#include <unistd.h>#include "restart.h"#include <errno.h>#include <fcntl.h>#define BLKSIZE 1024char buf[BLKSIZE];int main(int argc, char *argv[]) {
if (!ICTCLAS_Init(ICTCLAS_API_PATH)) { fprintf(stderr, "Error: init failed, please put the ICTCLAS API under `%s` directory\n\n", ICTCLAS_API_PATH); exit(EXIT_FAILURE); } printf("init ICTCLAS succeed\n");
ICTCLAS_SetPOSmap(ICT_POS_MAP_SECOND);
char *fromfile=argv[1]; char *tofile=argv[2]; int fromfd; int tofd; while (fromfd = open(fromfile, O_RDONLY), fromfd == -1 && errno == EINTR) ;
printf("fromfd:\n%d\n\n", fromfd); while (tofd = open(tofile,O_WRONLY|O_APPEND), tofd == -1 && errno == EINTR);
printf("tofd:\n%d\n\n", tofd); int bytesread,byteswritten; for( ; ; ) { if ((bytesread=read(fromfd,buf,BLKSIZE))<=0) break;
char resTxt[bytesread * 3]; int resLen = 0; resLen = ICTCLAS_ParagraphProcess(buf,bytesread, resTxt, CODE_TYPE_UNKNOWN, 1); printf("before:\n%s\n\n", resTxt); printf("before:\n%d\n\n", resLen); resLen=strlen(resTxt); if((byteswritten = write(tofd,resTxt,resLen))==-1) break;
printf("byteswritten:\n%d\n\n", byteswritten);
} ICTCLAS_Exit(); return 0;}
*/
编译和运行(推荐静态编译):
g++ test.c -L./ICTCLAS_API -lICTCLAS50 -DOS_LINUX -o test -static
./test
根据输出的结果,可以得到ICTCLAS支持:用户词典,自定义词性等。
时间: 2024-10-17 03:43:28