PHP使用friso实现中文分词

发布于:2022-08-24 11:20:28

查看源图像

一、Friso是什么?

Friso 是使用 c 语言开发的一款开源的高性能中文分词器,使用流行的mmseg算法实现。完全基于模块化设计和实现,可以很方便的植入其他程序中, 例如:MySQL,PHP,并且提供了php5, php7, ocaml, lua的插件实现。源码无需修改就能在各种平台下编译使用,加载完 20 万的词条,内存占用稳定为 14.5M。

二、Friso核心功能:

中文分词:mmseg算法 + Friso 独创的优化算法,四种切分模式。

关键字提取:基于textRank算法。

关键短语提取:基于textRank算法。

关键句子提取:基于textRank算法。

三、安装Friso

点击查看Friso安装过程

四、Friso插件PHP扩展安装

注意:friso最新版在centos上编译无法通过,原因未知,在centos上使用1.6.1编译即可,但1.6.1下的php插件仅支持php7以下版本,在php7以上环境使用新版的friso插件即可,文章末尾附件即可下载

1、安装friso

按照【C语言高性能中文分词器Linux编译安装】过程安装friso。

2、安装friso的PHP插件

本人环境php7.3,使用friso新版中的php7插件进行编译安装,文章末尾附件下载

#编译安装 friso php 扩展:

cd /usr/local/friso-master/binding/php7/
phpize   #需要安装 php-dev
./configure
make
make install

①编译成功提示(phpize)

Configuring for:
PHP Api Version:         20180731
Zend Module Api No:      20180731
Zend Extension Api No:   320180731

②编译成功提示(configure)

.........
checking whether to build shared libraries... yes
checking whether to build static libraries... no

creating libtool
appending configuration tag "CXX" to libtool
configure: creating ./config.status
config.status: creating config.h

③编译成功提示(make)

.........
----------------------------------------------------------------------
Libraries have been installed in:
   /data/so/friso-master/binding/php7/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

Build complete.
Don't forget to run 'make test'.

④编译成功提示(make install)

Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20180731/

3、friso插件配置

打开 php.ini 配置文件,加入如下内容:

extension=friso.so
[Friso]
friso.ini_file=/usr/local/friso-1.6.1/friso.ini

其中/usr/local/friso-1.6.1/friso.ini为friso配置文件的路径

4、测试php插件

直接在服务器某目录下新建friso.php文件,内容如下

<?php

$text = '北京冬奥会作为奥林匹克格言加入“更团结”之后举办的首届冬奥会,书写了弘扬全人类共同价值、构建人类命运共同体的新篇章。';
$_timer = 0;
$_cfg = array('mode' => FRISO_SIMPLE);
$_cfg['add_syn'] = 0;
$_cfg['clr_stw'] = 0;
$_cfg['keep_urec'] = 0;
$_cfg['spx_out'] = 0;
$_cfg['en_sseg'] = 0;

$_ret = friso_split($text, $_cfg,FRISO_RET_TYPE | FRISO_RET_LEN | FRISO_RET_RLEN | FRISO_RET_OFF);//第三个参数用于返回值的配置
print_r($_ret);

在命令行下执行

php friso.php

返回值如下

Array
(
    [0] => Array
        (
            [word] => 北京
            [type] => 0
            [len] => 6
            [rlen] => 6
            [off] => 0
        )

    [1] => Array
        (
            [word] => 冬奥会
            [type] => 0
            [len] => 9
            [rlen] => 9
            [off] => 6
        )


.........


    [26] => Array
        (
            [word] => 新篇章
            [type] => 0
            [len] => 9
            [rlen] => 9
            [off] => 162
        )

    [27] => Array
        (
            [word] => 。
            [type] => 17
            [len] => 3
            [rlen] => 9
            [off] => 171
        )

)

5、friso插件说明

①常量


<?php
#friso 内部定义了很多常量,具体和含义如下:
FRISO_SIMPLE friso #简易切分模式 用在 friso_split 函数的 mode 配置中
FRISO_COMPLEX friso #复杂切分模式
FRISO_DETECT friso #检测切分模式

#返回值配置
FRISO_RET_WORD #切分结果中返回词条内容
FRISO_RET_TYPE #切分结果中返回词条类别
FRISO_RET_OFF #切分结果中返回词条的偏移量
FRISO_RET_LEN #切分结果中返回词条的优化后的长度
FRISO_RET_RLEN #切分结果中返回词条的优化前的长度
FRISO_RET_POS #切分结果中返回词条的词性

FRISO_TYP_CJK #返回的词条为 CJK 字符
FRISO_TYP_ECM #返回的词条为英中混合词
FRISO_TYP_CEM #返回的词条为中英混合词
FRISO_TYP_EPUN #返回的词条为英文标点混合词
FRISO_TYP_PUN #返回的词条为标点符号
FRISO_TYP_UNK #返回的词条为不识别词条
FRISO_TYP_OTR #返回的词条为其他类别词条

②主要函数

#friso.so 中包含了如下函数:

#string friso_charset()
#返回 friso 当前设置的编码:
#返回值:UTF8 或者 GBK

#string friso_version()
#返回 friso 当前的版本号,例如:1.6.1

#string friso_ucode_utf8(long)
#将给定的 unicode 编码数字转换为字符串(当个字)。例如:20013->中

#long friso_utf8_ucode(string)
#将给定的当个字转换为 unicode 编码序号。例如:中->20013

#Array friso_split(string, Array, long);
#这个是 friso 的核心函数也是最复杂的函数。
#string: 要被切分的字符串
#array: 自定义配置,可以为 NULL,表示使用 friso.ini 中的全局配置。
#Long: 切分结果返回选项,指定多个使用 位或 “ ”联合。
#返回结果为切分好的词条数组。

③自定义配置

可以使用任意数量的配置选项,key 为 friso.ini 中的配置(friso.charset 除外),值和 friso.ini 中提的供可选值一样。

例如:复杂模式,最大匹配长度为 5, 去除停止词,追加同义词配置如下:

array(
'max_len'=>5, //最大匹配长度
'add_syn'=>1,
'clr_stw'=>1,
'mode'=>FRISO_COMPLEX
);

④切分结果

你可以自定义 friso 返回切分词条以及相关信息,主要如下:

FRISO_RET_WORD #词条内容,例如:” “ 研究
FRISO_RET_TYPE #词条类别,对应上面包含 TYP 的常量。
FRISO_RET_LENGTH #词条长度,friso 优化后的词条的字节数。
FRISO_RET_RLEN #词条真实长度,friso 优化前的实际字节数(全角转半角)
FRISO_RET_OFF #词条在原文中的偏移量,词条在原文的开始位置
FRISO_RET_POS #词条词性说明符号,例如:n(待实现)
#例如:返回词条,长度和偏移量,则设置第三个参数为:
friso_split($text, $_cfg,FRISO_RET_WORD | FRISO_LENGTH | FRISO_OFF);

具体案例参考friso-master/binding/php7/demo/friso.fun.php

⬇⬇⬇⬇⬇⬇⬇⬇⬇friso新版下载(2022/02/21)⬇⬇⬇⬇⬇⬇⬇⬇


附件:点击下载
阅读 801