Bootstrap

Redis Search系列 - 第七讲 Windows(CygWin)编译Friso

一、背景

最近在做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 程序。主要功能包括:

  1. 提供 Unix 风格的 shell 和命令行工具:如 bashgrepawksed 等。
  2. 支持编译和运行 Unix 程序:通过提供 GCC 编译器和其他开发工具,可以在 Windows 上编译和运行 Unix 程序。
  3. 与 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
分词结果
234234234234234234
问题2问题 2问题 2问题
以色列国防部长被解职以色列 国防部长 被 解职以色列 国防部长 被 解职以色列 国防部长 被 解职
以色列国防部部长被解职以色列 国防部 军事部 防卫厅 部长 被 解职以色列 国防部 军事部 防卫厅 部长 被 解职以色列 国防部 军事部 防卫厅 部长 被 解职
深圳又叫深圳市深圳 又叫 深圳市深圳 又叫 深圳市深圳 又叫 深圳市
;