当前位置: 首页 > news >正文

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: 词条在原始文本的offsettask->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

相关资料:

  • Friso分词接口一个完整的demo
  • C语言调用friso库实现中文分词器
http://www.lryc.cn/news/333071.html

相关文章:

  • MySQL中drop、truncate和delete的区别
  • Deep Image Prior
  • leetcode148. 排序链表
  • 【深度学习环境配置】一文弄懂cuda,cudnn,NVIDIA Driver version,cudatoolkit的关系
  • C语言中的字符与字符串:魔法般的函数探险
  • 【JAVASE】带你了解面向对象三大特性之一(继承)
  • Git 如何去使用
  • C语言 | Leetcode C语言题解之第12题整数转罗马数字
  • 【软件工程】测试规格
  • Nginx中间件服务:负载均衡(调度算法)
  • dm8数据迁移工具DTS
  • 【QT教程】QML与C++的交互
  • idea maven 打包 内存溢出 报 GC overhead limit exceeded -> [Help 1]
  • wordpress全站开发指南-面向开发者及深度用户(全中文实操)--创建新主题
  • docker从入门到熟悉
  • 国家开放大学《消费者权益保护法》形考任务答案
  • element-ui card 组件源码分享
  • MPLS基本转发过程,隧道特性、对TTL的处理、BGP路由黑洞
  • ubuntu16.04安装vscode那些事
  • 分类预测 | Matlab实现TCN-BiGRU-Mutilhead-Attention时间卷积双向门控循环单元多头注意力机制多特征分类预测/故障识别
  • 不重复数字
  • C# 访问修饰符 默认
  • 使用向量检索和rerank 在RAG数据集上实验评估hit_rate和mrr
  • Java栈和队列的实现
  • 我的C++奇迹之旅:内联函数和auto关键推导和指针空值
  • Redis主从集群-主从复制(通俗易懂)
  • 【C++算法竞赛 · 图论】图论基础
  • Java解析实体类的属性和属性注释
  • 机器学习KNN最邻近分类算法
  • 分享一个Python爬虫入门实例(有源码,学习使用)