• ICTCLAS中文分词库的使用


    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 ", ICTCLAS_API_PATH);
            exit(EXIT_FAILURE);
        }
        printf("init ICTCLAS succeed ");
        //# 设置词性标注集
        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: %s ", resTxt);
        free(resTxt);
        resTxt = NULL;
        //导入用户词典(文本文件:一行一词(词和词性使用`@@`分隔,词性可以省略,且可以自定义任意词性),例如:中科院@@nr或北京市)
        unsigned int itemsNum = ICTCLAS_ImportUserDictFile("./userdict.txt", CODE_TYPE_UNKNOWN);
        printf("%d items loaded ", 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 ", itemsNum);
        */
        //如果保存用户词典,则下次分词的时候依然有效
        ICTCLAS_SaveTheUsrDic();
        //导入用户词典之后分词
        resTxt = (char *) malloc(srcLen * 6);
        resLen = ICTCLAS_ParagraphProcess(srcTxt, srcLen, resTxt, CODE_TYPE_UNKNOWN, 1);
        printf("after: %s ", 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 1024
    char 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 ", ICTCLAS_API_PATH);
            exit(EXIT_FAILURE);
        }
        printf("init ICTCLAS succeed ");
        
        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:
    %d
    
    ", fromfd);
        while (tofd = open(tofile,O_WRONLY|O_APPEND), tofd == -1 && errno == EINTR);
        printf("tofd:
    %d
    
    ", 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: %s ", resTxt);
        printf("before: %d ", resLen);
        resLen=strlen(resTxt);
        if((byteswritten = write(tofd,resTxt,resLen))==-1) break;
        printf("byteswritten:
    %d
    
    ", byteswritten);
        }
        ICTCLAS_Exit();
        return 0;
    }
                                                                                            
    */
     

    编译和运行(推荐静态编译):


    g++ test.c -L./ICTCLAS_API -lICTCLAS50 -DOS_LINUX -o test -static
    ./test  

    根据输出的结果,可以得到ICTCLAS支持:用户词典,自定义词性等。

  • 相关阅读:
    数据库常用连接字符串(网址)
    WPF布局(2)控件拖动
    TreeView templete(code project)
    寄宿(host)和应用程序域(appdomain)
    C#DSN操作
    WPF布局(3)坐标(转)
    C#注册表操作
    程序集加载与反射
    关于RichTextBox 及 RTF格式文件的保存
    Ajax实现不刷屏的前提下实现页面定时刷新
  • 原文地址:https://www.cnblogs.com/liuchaogege/p/5405267.html
Copyright © 2020-2023  润新知