更新于 2014-06-14 23:55:57 UEANER

系统环境:

  • CentOS 6.5 x86_64
  • PHP 5.5.9

简介

Robbe 是建立在 friso 中文分词上的一个高性能 PHP 中文分词扩展。采用流行的 mmseg 算法实现, 类似于 coreseekLibMMSeg 中文分词软件包。

安装 friso 分词组件

# wget https://friso.googlecode.com/files/friso-1.6.0-src-lib-dict.zip
# unzip friso-1.6.0-src-lib-dict.zip -d /usr/local/src/
# cd /usr/local/src/friso-1.6.0/src
# make && make install

Robbe 源码中的 README.txt 文件, 告诉我们:将friso里面的dict和friso.ini拷贝到一个好点的目录吧, 那我们就拷贝到好点的目录吧。

# cp /usr/local/src/friso-1.6.0/friso.ini /etc/

配置词典目录

编辑 /etc/friso.inifriso.lex_dir 指向我们的分词目录:

friso.lex_dir = /usr/local/src/friso-1.6.0/dict/UTF-8/

注意其他用户使用 friso 时,对 /usr/local/src/friso-1.6.0/dict/ 词典目录的访问权限。

从 1.6.0 版本后添加了 GBK 编码支持,新添了 GBKUTF-8 两个目录,friso.lex_dir 的目录配置为 /usr/local/src/friso-1.6.0/dict/UTF-8//usr/local/src/friso-1.6.0/dict/GBK/,如果是 GBK friso.charset 选项设置为 1 。

1.6.0 版本之前,请设置 friso.lex_dir 目录地址为 /usr/local/src/friso-x.x.x/dict/.

首次运行:

# /usr/local/bin/friso -init /etc/friso.ini
./friso: error while loading shared libraries: libfriso.so: cannot open shared object file: No such file or directory

解决:

# cp libfriso.so /usr/lib64/

再次运行:

# /usr/local/bin/friso -init /etc/friso.ini
Initialized in 0.150000sec
+-Version: 1.6.0 (UTF-8)
+-----------------------------------------------------------+
| friso - a chinese word segmentation writen by c.          |
| bug report email - chenxin619315@gmail.com.               |
| or: visit http://code.google.com/p/friso.                 |
|     java edition for http://code.google.com/p/jcseg       |
| type 'quit' to exit the program.                          |
+-----------------------------------------------------------+
friso>> 我是中国人
分词结果:
我 是 中国人 
Done, cost < 0.000000sec
friso>> 走路去拉萨
分词结果:
走路 去 拉萨 
Done, cost < 0.000000sec
friso>> quit
Thanks for trying friso.

friso 安装并配置完毕。

安装 Robbe PHP 扩展

# wget https://robbe.googlecode.com/files/robbe-1.6.0-src-lib-dict.zip
# unzip robbe-1.6.0-src-lib-dict.zip -d /usr/local/src/
# cd /usr/local/src/robbe-1.6.0/src/
# phpize
# ./configure

到此步需要注意:无论是64位系统还是32位系统(lionsoul 注)均需编辑 Makefile 文件,分别将 robbe.lo: 和 robbe.la: 两处的 -o 参数前 添加 -lfriso,最后为 -lfriso -o。 详情请查看:http://www.oschina.net/question/853816_119031

# make && make install

配置 PHP 添加 Robbe 扩展,编辑 php.ini 添加以下内容:

extension=robbe.so
[robbe]
robbe.ini_file=/etc/friso.ini

重新加载 php-fpm,或重启 apache:

# service php-fpm reload
OR
# service httpd restart

验证 PHP 是否已加载 Robbe 扩展:

# php -m | grep robbe
robbe

或查看 phpinfo,如图:

PHP Robbe 中文分词扩展

使用

首先我们创建一个 robbe.php 测试文件,使用 robbe 的简易分词模式进行测试,内容为:

<?php
$str = 'PHP 安装 Robbe 中文分词扩展';

$participle = array();
if (defined('RB_CMODE')) { // robbe 版本 = 1.6
    $_cfg = array('mode' => RB_CMODE);
    $splitKeywords = rb_split($str, $_cfg);
    foreach($splitKeywords as $keyword) {
        $participle[] = $keyword['word'];
    }
} else if (defined('__RB_SIMPLE_MODE__')) { // robbe 版本 < 1.6
    $participle = rb_split($str, __RB_SIMPLE_MODE__);
}

var_dump($participle);

浏览器访问 http://localhost/robbe.php,输出

array (size=5)
  0 => string 'php' (length=3)
  1 => string '安装' (length=6)
  2 => string 'robbe' (length=5)
  3 => string '中文分词' (length=12)
  4 => string '扩展' (length=6)

更多 robbe 的分词模式及使用方法请查看源码中 php 文件夹 下的文件。

从结果可以看出 friso 好像不区分大小写。(为了检索方便, friso统一将大写转换成了小写, 统一将圆角转换成了半角... lionsoul 注)

如果你使用的 sphinx/coreseek,请查看 配置官方版 Sphinx 一元分词,支持中文Linux 下配置 Sphinx(coreseek) 中文分词

Good Luck!

转载请注明出处。
本文地址:http://blog.aboutc.net/php/59/php-installation-robbe-chinese-word-extension

评论:14

lionsoul 2013-10-21 16:58:54
这个写的很详细, 终于找到了一份好文档.

有两个地方貌似可以更改过来: 

1. 无论是32bit还是64bit的系统, 只要是从源码编译安装robbe就需要编译Makefile添加-lfriso

2. 不是friso不区分大小写, 为了检索方便, friso统一将大写转换成了小写, 统一将圆角转换成了半角...
ueaner 2013-10-31 22:59:17
@lionsoul: 感谢作者的建议及说明,又对friso多了一些了解,本站也将在未来几天把搜索分词更新为friso,欢迎关注和访问。
狮子的魂 2014-02-25 00:39:36
robbe 1.6.0开始调用接口发生了变化,支持自定义配置和自定义返回选项。常量__RB_SIMPLE_MODE__, 也更改了为更短的名字。具体请查看robbe的测试文档。
狮子的魂 2014-02-25 00:40:57

        
nickfan 2014-02-25 11:55:55
虚拟机centos6.5,64位
编译安装都没问题,
friso分词init后运行没问题。
robbe编译安装显示正常(加了-lfriso)。

最后一步编写php测试代码
按照robbe.c中的名称改为了
RB_SMODE

运行直接显示
‘段错误’
大哥何解?
lionsoul 2014-02-25 18:03:05
@nickfan: 请按照robbe附件中使用demo更改测试程序。另外注意两个问题:1. php.ini中加入正确的配置。2. friso.ini中的词库路径使用绝对路径。
hujingyang 2014-12-22 18:40:17
你好,我试了你的方法安装,结果我测试:我是中中国人的时候,给我分出的结果是我 是 中 国 人,变成一个个词了,不是你例子中那种,这是什么原因呢?
hujingyang 2014-12-22 18:40:21
你好,我试了你的方法安装,结果我测试:我是中中国人的时候,给我分出的结果是我 是 中 国 人,变成一个个词了,不是你例子中那种,这是什么原因呢?
ueaner 2014-12-25 01:38:04
@hujingyang: 你应该使用的 git@oschina 上的最新版本,需要更改 friso.ini 中的 friso.lex_dir = /path/to/dict/UTF-8/ 分词词典目录为绝对路径。

改完之后如果你的分词结果只有 “中国人” 一个词,说明 friso.clr_stw 过滤停止词的配置为 1 则自动过滤,配置为 0 则不过滤,会返回 “我 是 中国人”  三个词的分词结果,请根据你的需要进行配置。

另外源码下的 friso-help-doc.pdf 帮助文档写的很详细。
dragon_os 2016-06-17 16:22:12
robbe php扩展
phpize失败提示php-dev依赖php5.3如何处理,过不去
dragon_os 2016-06-17 16:24:22
php5.5.36 centos 6.5 64位,有办法处理没
dragon_os 2016-06-20 10:12:28
php 5.3 

/bin/sh /root/robbe/src/libtool --mode=compile cc  -I. -I/root/robbe/src -DPHP_ATOM_INC -I/root/robbe/src/include -I/root/robbe/src/main -I/root/robbe/src -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib  -DHAVE_CONFIG_H  -g -O2   -c /root/robbe/src/robbe.c -lfriso -o robbe.lo
libtool: compile:  cc -I. -I/root/robbe/src -DPHP_ATOM_INC -I/root/robbe/src/include -I/root/robbe/src/main -I/root/robbe/src -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib -DHAVE_CONFIG_H -g -O2 -c /root/robbe/src/robbe.c -lfriso  -fPIC -DPIC -o .libs/robbe.o
/root/robbe/src/robbe.c: In function ‘zif_rb_split’:
/root/robbe/src/robbe.c:317: warning: comparison between pointer and integer
/root/robbe/src/robbe.c:321: error: ‘friso_task_entry’ has no member named ‘hits’
/root/robbe/src/robbe.c:324: error: ‘friso_task_entry’ has no member named ‘hits’
/root/robbe/src/robbe.c:326: error: ‘friso_task_entry’ has no member named ‘hits’
/root/robbe/src/robbe.c:328: error: ‘friso_task_entry’ has no member named ‘hits’
/root/robbe/src/robbe.c:330: error: ‘friso_task_entry’ has no member named ‘hits’
/root/robbe/src/robbe.c:332: error: ‘friso_task_entry’ has no member named 
‘hits’

如何解决
ueaner 2016-06-21 14:22:24
@dragon_os: 建议在 http://git.oschina.net/lionsoul/robbe 项目上提一个 issue。
Vic Ming 2017-08-16 16:16:13
别用了 都是bug。费劲
关闭高亮高亮 分享到新浪微博分享到新浪微博