当前位置:   article > 正文

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

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();
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

问题

程序问题:

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

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

#define friso_set_mode( friso, mode )\
do {\
    friso->mode = mode;\
} while (0)
  • 1
  • 2
  • 3
  • 4

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

修改参数名解决问题

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

  • 1
  • 2
  • 3
  • 4
  • 5

中文分词不正确

打开配置文件 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

相关资料:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/373628
推荐阅读
相关标签
  

闽ICP备14008679号