一、背景
最近在做RedisSearch的中文分词效果调研,底层的中文分词插件使用的就是Friso,目前手里的Linux环境上yum镜像仓库有问题导致没法安装gcc,又急于验证Friso分词效果,便根据仓库说明使用CygWin进行编译。
关于Friso
Friso 是使用 c 语言开发的一款开源的高性能中文分词器,使用流行的mmseg算法实现。完全基于模块化设计和实现,可以很方便的植入其他程序中, 例如:MySQL,PHP,并且提供了php5, php7, ocaml, lua的插件实现。源码无需修改就能在各种平台下编译使用,加载完 20万的词条(UTF-8字典仅为2.53MB),内存占用稳定为 14.5M.
二、安装CygWin
关于CygWin
Cygwin 是一个在 Windows 上运行的类 Unix 环境。它提供了一个大型的 GNU 和 Open Source 工具集合,这些工具可以在 Windows 上运行,并且提供了类似于 Linux 的功能。Cygwin 还包括一个动态链接库(cygwin1.dll),它为程序提供了一个类似于 POSIX 的 API,使得在 Windows 上可以运行许多 Unix 程序。主要功能包括:
- 提供 Unix 风格的 shell 和命令行工具:如
bash
、grep
、awk
、sed
等。- 支持编译和运行 Unix 程序:通过提供 GCC 编译器和其他开发工具,可以在 Windows 上编译和运行 Unix 程序。
- 与 Windows 系统的集成:可以访问 Windows 文件系统、注册表等资源。
Cygwin 适用于需要在 Windows 环境中使用 Unix 工具和脚本的开发者和系统管理员。
注: 阿里CygWin镜像仓库说明参见:
https://developer.aliyun.com/mirror/cygwin
下载地址:https://cygwin.com/setup-x86_64.exe?spm=a2c6h.13651104.d-4008.4.135c4a58iCGiVh&file=setup-x86_64.exe
下载成功后,运行安装文件,一直下一步,选择安装目录、软件包存储目录、选择阿里的镜像地址:
选择需要安装的软件:gcc-core、make
可先选择 视图完整
,然后搜索需要的软件包如gcc
,然后点击右侧箭头选择需要安装的版本:
之后一直下一步直到安装完成即可。
安装完成后再次点击安装文件(亦可通过该方法继续安装新的软件),一直下一步可查看所有已安装的软件如下图:
之后桌面出现如下图标,点击即可进入CygWin命令行环境:
三、编译Friso
1)从Friso的Github仓库的Tag列表中,下载最新版本:
https://github.com/lionsoul2014/friso/releases/tag/v1.6.4-release
2)解压后如下图:
3)进入src目录,删除原有的 Makefile, 更改 Makefile.cygwin 为 Makefile,注意删除Makefile中的--mno-cygwin
选项,否则后续执行make编译报错。
4)打开 cygwin 的终端,cd 到 src 目录,运行make
命令:
luohq@myorg /cygdrive/e/RedisStack/Search/friso-1.6.4-release-win/src
$ make
gcc -O2 -Wall -shared friso.c friso_array.c friso_hash.c friso_lexicon.c friso_link.c friso_string.c friso_ctype.c friso_UTF8.c friso_GBK.c -o friso.dll -Wl,--output-def,friso.def,--out-implib,friso.lib
gcc -O2 -Wall -c tst-friso.c
gcc tst-friso.o -o ./friso -L. -lfriso
四、运行Friso
退出到src的上一层目录,即Friso的根目录,执行命令:
./src/friso -init ./friso.ini
friso.ini即对应friso的配置文件,可根据需要进行调整。
Friso的具体使用示例如下:
luohq@myorg /cygdrive/e/RedisStack/Search/friso-1.6.4-release-win
$ ./src/friso -init ./friso.ini
Initialized in 0.109000sec
Mode: Complex
+-Version: 1.6.4 (UTF-8)
+---------------------------------------------------------------+
| Friso - a Chinese word segmentation writen by c. |
| bug report email - [email protected]. |
| or: visit https://github.com/lionsoul2014/friso. |
| java version for https://github.com/lionsoul2014/jcseg |
| type 'quit' to exit the program. |
+---------------------------------------------------------------+
friso>> 你好中国
分词结果:
你好 中国
Done, cost < 0.000000sec
friso>>
五、Friso分词效果测试
# default mode for friso.
# 1 : simple mode - simply maxmum matching algorithm.
# 2 : complex mode - four rules of mmseg alogrithm.
# 3 : detect mode - only return the words that the do exists in the lexicon
friso.mode = 2
切换不同friso.mode
进行分词,具体结果见下表:
文档内容 | friso.mode = 1 分词结果 | friso.mode = 2 分词结果 | friso.mode = 3 分词结果 |
---|---|---|---|
234234 | 234234 | 234234 | |
问题2 | 问题 2 | 问题 2 | 问题 |
以色列国防部长被解职 | 以色列 国防部长 被 解职 | 以色列 国防部长 被 解职 | 以色列 国防部长 被 解职 |
以色列国防部部长被解职 | 以色列 国防部 军事部 防卫厅 部长 被 解职 | 以色列 国防部 军事部 防卫厅 部长 被 解职 | 以色列 国防部 军事部 防卫厅 部长 被 解职 |
深圳又叫深圳市 | 深圳 又叫 深圳市 | 深圳 又叫 深圳市 | 深圳 又叫 深圳市 |