C语言中文分词 Friso的使用教程

Friso是使用C语言开发的一款高性能中文分词器,使用流行的mmseg算法实现。完全基于模块化设计和实现,可以很方便的植入到其他程序中,例如:MySQL,PHP等。同时支持对UTF-8/GBK编码的切分。

官方地址:https://code.google.com/p/friso/

Demo

#include "src/friso.h"
//#include "src/friso_API.h" //加不加都不影响该demo
//#include "src/friso_ctype.h"//加不加都不影响该demo
int main()
{

    /* 第一步:申明三个对象 */
    friso_t friso;         /* Friso 分词对象 */
    friso_config_t config; /* Friso 配置对象 */
    friso_task_t task;     /* Friso 任务对象 */

    /* 第二步:初始化相应的对象 */
    friso = friso_new();
    config = friso_new_config();
    task = friso_new_task();

    /* 从friso.ini配置文件中初始化 friso */
    if (friso_init_from_ifile(friso, config, "friso.ini") != 1)
    {
        puts("friso 初始化失败");
    }

    /*
     * 切分模式默认来自friso.ini中的设置
     * 可以通过friso_set_mode函数自定义切分模式(简易,复杂,检测模式)
     * 简易模式:__FRISO_SIMPLE_MODE__
     * 复杂模式:__FRISO_COMPLEX_MODE__
     * 检测模式:__FRISO_DETECT_MODE__
     * 例如,这里设置为使用复杂模式分词:
     */
    friso_set_mode(config, __FRISO_COMPLEX_MODE__);

    /* 第三步:设置分词内容 */
    char *s = "本人英文名Eric,自从16岁开始我学习各种编程语言目前已经初步掌握了C语言和C++另外还学习了python语言和JavaScript。\
我喜欢的电影有《肖生克的救赎》 、《西红柿首富》。我喜欢的书籍有《三国演义》、《平凡的世界》还有《人性的弱点》。我有个小目标就是3年内赚到1000万。";
    friso_set_text(task, s);

    /* 第四步:获取分词内容 */
    while ((friso_next(friso, config, task)) != NULL)
    {
        /*
          task存储了分词的结果,
          task->hits->word: 词条内容
          task->hits->offset: 词条在原始文本的offset
          task->hits->length: 词条的长度(字节数)
          task->hits->rlen: 词条的真正字节数(Friso转换后的长度-字节数)
        */
        printf("%s [%d, %d]\n", task->hits->word,
               task->hits->offset, task->hits->length);
    }

    /* 第五步:释放对象 */
    friso_free_task(task);
    friso_free_config(config); // 添加这行,后面的代码将不再执行,编译时没问题,运行时出错,原因还没找到
    friso_free(friso);

    /*
    备注:
        第三步和第四步可以反复调用,使用friso_set_setx重置分词内容即可。
        对于多线程环境,不同线程共享friso和config对象,需要分别初始化task使用对象
    */
    puts("end\n");
    getchar();
}

问题

程序问题:

friso_set_mode(config, FRISO_COMPLEX_MODE); 报错:结构 “” 没有字段 “FRISO_COMPLEX_MODE

解决办法:按住ctrl点击鼠标左键,定位到该函数

#define friso_set_mode( friso, mode )\
do {\
    friso->mode = mode;\
} while (0)

明显这里写错了,成员变量名和参数名相同,肯定不对。在friso.ini配置文件中,friso.mode = 2 这个成员变量名mode是固定值。

修改参数名解决问题

#define friso_set_mode( friso, mode_param)\
do {\
    friso->mode = mode_param ;\
} while (0)

中文分词不正确

打开配置文件 friso.ini,friso.charset值改为 1,friso.lex_dir值改为 D:/friso/dict/GBK/

文件编译

我把项目放在 D:\friso,上面的代码放在项目目录下的test.c文件,打开D:\friso\lib\win32\vs,把friso.dll也放在项目目录下。
用vs的32位编译器编译,开始菜单找到 Visual Studio 2022 文件夹,点击 x86 Native Tools Command Prompt for VS 2022
定位命令:cd /d D:\friso
编译命令:cl /I lib\win32\vs test.c lib\win32\vs\friso.lib

相关资料:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值