[文章/程序 作者:张宴 本文版本:v1.3 最后修改:2009.07.06 转载请注明原文链接:http://blog.zyan.cc/phpcws_v100/]

  注:最新的分词系统 HTTPCWS 已经发布,用来取代 PHPCWS。

  请点击以下网址下载 HTTPCWS:


  http://code.google.com/p/httpcws

  原来的 PHPCWS 停止更新。




  名称:PHPCWS(PHP中文分词扩展)
  协议:New BSD License
  作者:张宴
  网址:http://code.google.com/p/phpcws/
  SVN:http://code.google.com/p/phpcws/source/browse/#svn/trunk/phpcws

  一、PHPCWS 简介

  1、什么是 PHPCWS ?
  PHPCWS 是一款开源的PHP中文分词扩展,目前仅支持Linux/Unix系统。

  PHPCWS 先使用“ICTCLAS 3.0 共享版中文分词算法”的API进行初次分词处理,再使用自行编写的“逆向最大匹配算法”对分词和进行词语合并处理,并增加标点符号过滤功能,得出分词结果。

  ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System)是中国科学院计算技术研究所在多年研究工作积累的基础上,基于多层隐马模型研制出的汉语词法分析系统,主要功能包括中文分词;词性标注;命名实体识别;新词识别;同时支持用户词典。ICTCLAS经过五年精心打造,内核升级6次,目前已经升级到了ICTCLAS3.0,分词精度98.45%,各种词典数据压缩后不到3M。ICTCLAS在国内973专家组组织的评测中活动获得了第一名,在第一届国际中文处理研究机构SigHan组织的评测中都获得了多项第一名,是当前世界上最好的汉语词法分析器。

  ICTCLAS 3.0 商业版是收费的,而免费提供的 ICTCLAS 3.0 共享版不开源,词库是根据人民日报一个月的语料得出的,很多词语不存在。所以本人对ICTCLAS分词后的结果,再采用逆向最大匹配算法,根据自己补充的一个9万条词语的自定义词库(与ICTCLAS词库中的词语不重复),对ICTCLAS分词结果进行合并处理,输出最终分词结果。

  由于 ICTCLAS 3.0 共享版只支持GBK编码,因此,如果是UTF-8编码的字符串,可以先用PHP的iconv函数转换成GBK编码,再用phpcws_split函数进行分词处理,最后转换回UTF-8编码。

  2、PHPCWS 中文分词在线演示

  演示网址:http://blog.zyan.cc/demo/phpcws/

  3、PHPCWS 分词速度及用途

  初次使用时,Apache 或 php-cgi(FastCGI) 进程,需要加载一次词库到内存中,需要0.0X秒。58字节的一句话——“2009年2月13日,我编写了一款PHP中文分词扩展:PHPCWS 1.0.0。”,分词速度只需0.0003秒。

  PHPCWS 属于《亿级数据的高并发通用搜索引擎架构设计》的一部分,用作“搜索查询接口”的关键字分词处理。在此架构中,Sphinx索引引擎对于CJK(中日韩)语言支持一元切分,假设【反恐行动是国产主视角射击网络游戏】这段文字,Sphinx会将其切成【反 恐 行 动 是 国 产 主 视 角 射 击 网 络 游 戏】,然后对每个字建立反向索引。如果用这句话中包含的字组成一个不存在的词语,例如【恐动】,也会被搜索到,所以搜索时,需要加引号,例如搜索【"反恐行动"】,就能完全匹配连在一起的四个字,不连续的【"恐动"】就不会被搜索到。但是,这样还有一个问题,搜索【"反恐行动游戏"】或【"国产网络游戏"】就会搜索不到。所以,我在搜索层写了个PHP中文分词扩展,搜索“反恐行动游戏”、“国产网络游戏”,会被PHPCWS中文分词函数分别切分为“反恐行动 游戏”、“国产 网络游戏”,这时候,用PHP函数给以空格分隔的词语加上引号,去搜索【"反恐行动" "游戏"】或【"国产" "网络游戏"】,就能搜索到这条记录了。由于PHPCWS位于搜索层,中文分词词库发生增、删、改,只需平滑重启一次Web服务器或php-cgi进程即可,无需重建搜索索引。

  根据上述情况,对于那些采用二元交叉切分的搜索引擎,PHPCWS用在前端搜索层对用户输入的搜索关键字、短语进行分词处理,同样适合。PHPCWS开发的目的正在于此,对于短句、小文本中文分词切分,速度非常之快。

  4、自定义词库

  自定义词库名称为userdict.tch,格式为 Tokyo Cabinet DBM 的 Abstract key-value 内存哈希数据库(key为GBK编码的词语名词,value为词频。目前词频均填1,暂时用不上)。自定义词库的修改在安装步骤中会详细介绍。



  二、phpcws 1.0.1 安装步骤

  1、安装 Tokyo Cabinet 数据库:
wget http://tokyocabinet.sourceforge.net/tokyocabinet-1.4.17.tar.gz
tar zxvf tokyocabinet-1.4.17.tar.gz
cd tokyocabinet-1.4.17/
./configure --prefix=/usr/local/tokyocabinet-1.4.17
make && make install
mkdir -p /usr/local/tokyocabinet-1.4.17/lib/static/
cp -f /usr/local/tokyocabinet-1.4.17/lib/*.a /usr/local/tokyocabinet-1.4.17/lib/static/
echo "/usr/local/tokyocabinet-1.4.17/lib" >> /etc/ld.so.conf
/sbin/ldconfig
cd ../


  2、安装 PHPCWS 扩展:
wget http://phpcws.googlecode.com/files/phpcws-1.0.1.tar.gz
tar zxvf phpcws-1.0.1.tar.gz
cd phpcws-1.0.1/
/usr/local/webserver/php/bin/phpize
./configure --with-php-config=/usr/local/webserver/php/bin/php-config --with-tc=/usr/local/tokyocabinet-1.4.17
make && make install
cd ../

  注:其中/usr/local/webserver/php/为您的PHP安装目录。

  3、安装 ICTCLAS 3.0 词库和 PHPCWS 自定义词库(词库汉字编码均为GBK):
cd /usr/local/
wget http://phpcws.googlecode.com/files/phpcws-dict-1.0.0.tar.gz
tar zxvf phpcws-dict-1.0.0.tar.gz
mv phpcws-dict-1.0.0 phpcws


  您可以往自定义词库内增加自己的词语,方法如下:
cd /usr/local/phpcws/

#如果userdict.tch已经被PHP加载,请拷贝一个备份
cp userdict.tch userdict_new.tch

#添加新词语
/usr/local/tokyocabinet-1.4.11/bin/tcamgr put userdict_new.tch 词语一 1
/usr/local/tokyocabinet-1.4.11/bin/tcamgr put userdict_new.tch 词语二 1

查询某个词语是否已经在词库内
/usr/local/tokyocabinet-1.4.11/bin/tcamgr get userdict_new.tch 词语名词

#删除一个词语
/usr/local/tokyocabinet-1.4.11/bin/tcamgr out userdict_new.tch 词语名称

#将修改后的新词库覆盖回原词库
mv userdict_new.tch userdict.tch

#重启您的Apache服务器,或php-cgi(FastCGI)进程。
#例如重启php-cgi(FastCGI)进程:
/usr/local/webserver/php/sbin/php reload

  您可以从搜狗细胞词库网站下载自己需要的行业分类文本词库,整合到PHPCWS自定义词库中。

  4、修改您的php.ini文件,增加以下几行内容:
[phpcws]
extension = "phpcws.so"
phpcws.dict_path = "/usr/local/phpcws"


  5、重启您的Apache服务器,或php-cgi(FastCGI)进程

  6、查看您的phpinfo信息,如果搜索到以下内容,则表明安装成功:

  点击在新窗口中浏览此图片



  三、phpcws 1.0.1 调用方式

  1、PHPCWS扩展拥有一个PHP函数:
  string phpcws_split ( string $text [, string $interpunction ] )

  参数说明:
  $text 为GBK编码的文本内容;

  $interpunction 为可选参数,用来控制是否过滤标点符号。
  ①、值为空时,表示不过滤;

  ②、值为"default"时,过滤掉默认的标点符号,即以下标点符号:
  ,.!!"#¥%&`'()〔〕〈〉《》「」『』〖〗【】.*+,-.。、?…—·ˉˇ¨‘’“”々~‖∶"/:;|〃<=>?@[\]^_`{|} ̄

  ③、值为其他字符串时,表示过滤掉自定义的标点符号,例如值为",.!,。!"即过滤掉半角、全角的逗号、句号、感叹号。

  2、PHP中文分词实例:

  ①、对GBK编码的字符串进行中文分词处理(example_gbk.php):

  ②、对UTF-8编码的字符串进行中文分词处理(example_utf8.php):

  输出结果为:
分词结果为:
2009年 2月 13日 , 我 编写 了 一款 PHP 中文 分词 扩展 : PHPCWS 1.0.0 。

过滤掉默认标点符号的分词结果为:
2009年 2月 13日 我 编写 了 一款 PHP 中文 分词 扩展 PHPCWS 1.0.0

过滤掉全角逗号与冒号的分词结果为:
2009年 2月 13日 我 编写 了 一款 PHP 中文 分词 扩展 PHPCWS 1.0.0 。


  以上两个实例PHP程序文件可以从SVN中获取:







技术大类 » 搜索引擎技术 | 评论(116) | 引用(0) | 阅读(128145)
dengjiuhong
2009-2-17 00:56
好东西,深夜感谢分享。
hai
2009-2-17 09:19
感觉不错的。。。 测试了一下 “面包房车”,分词效果是 “面包房  车”2个次! 根据使用频率“面包房  房车” 或者 “面包  房车”
airwin
2009-2-17 09:26
很强,崇拜一下
残缺 Email Homepage
2009-2-17 10:05
张兄,感谢你的工作!
请问下在sphinx中对关键字建立索引的时候是分词后建立还是每个汉字都建立索引?在中文索引方面能不能指点一下?
谢谢!
张宴 回复于 2009-2-17 10:47
Sphinx 对UTF-8字符集的中英文混合字符串,会按照一元切分,将英文切分为英文单词,中文则切分为单个汉字,对每个汉字建立反向索引。检索时利用单字查询结果集合的方式,加上引号时会判断单字之间是否前后连续关系,然后输出检索结果。
叶茂盛 Homepage
2009-2-17 10:09
太强了zan
deng
2009-2-17 11:07
项目刚好用到
不知如何与sphinx结合起来呢?
望得到指点。
blueflycn
2009-2-17 13:56
你好,真是巧合,我最近也写了一个php分词扩展,不过是基于MMSEG和darts的(http://www.bluefly.cn/wordpress/2009/01/%e4%b8%ad%e6%96%87%e5%88%86%e8%af%8d-xsplit-002-alpha-%e5%8f%91%e5%b8%83/)。最近又加了一些功能,包括建立词典,词频统计,多种分词算法,基于darts的应用等,但是还没有公开。
不过这方面我只是一个amateur,希望能有机会跟你交流一下,谢谢~
dodge Email
2009-2-17 22:01
不错,但分词集成到php环境对服务器的负荷毕竟太大了,我用ICTCLAS原生的系统测试过上万字的文章,分词也要几秒时间。如果这个能转嫁到浏览器端来承担,应该实际很多,只是疲于转化ICTCLAS的算法库
草根网 Email Homepage
2009-2-18 11:13
收藏至20ju.com
haha
2009-2-18 14:38
真强!~
piaofen Homepage
2009-2-18 17:43
很牛,很强大,继续关注
xiaojun Homepage
2009-2-18 19:42
这套分词系统不错。推荐一下
http://www.ftphp.com/scws/

动态

   * 2008-12-21 SCWS 划入 FTPHP 项目,作为子项目重建本网站。
   * 2006 - 2007 陆续开发纯 PHP 实现的 PSCWS 第二版与第三版,2007-06-09 发布 scws-0.0.1 pre 版,功能基本完整,2008-03-08 发布 scws-1.0.0 正式版。

简介 - SCWS 是 Simple Chinese Words Segmentation 的缩写,即简易中文分词系统。

   这是一套基于词频词典的机械中文分词引擎,它能将一整段的汉字基本正确的切分成词。词是汉语的基本语素单位,而书写的时候不像英语会在词之间用空格分开,所以如何准确而又快速的分词一直是中文分词的攻关难点。

   SCWS 在概念上并无创新成分,采用的是自行采集的词频词典,并辅以一定程度上的专有名称、人名、地名、数字年代等规则集,经小范围测试大概准确率在 90% ~ 95% 之间,已能基本满足一些中小型搜索引擎、关键字提取等场合运用。 SCWS 采用纯 C 代码开发,以 Unix-Like OS 为主要平台环境,提供共享函数库,方便植入各种现有软件系统。此外它支持 GBK,UTF-8,BIG5 等汉字编码,切词效率高。

   [推荐]首个搭载 SCWS 分词系统的中小型站内全文检索解决方案 - FTPHP!
版本列表
版本   类型   平台   性能   其它
SCWS-1.0.x   C 代码   *Unix*/*PHP*   准确: 95%, 召回: 91%, 速度: 1.2MB/sec
PHP扩展分词速度: 250KB/sec   [下载] [文档] [安装说明]
php_scws.dll(1)   PHP扩展库   Windows/PHP 4.4.x   准确: 95%, 召回: 91%, 速度: 40KB/sec   [下载] [文档] [安装说明]
php_scws.dll(2)   PHP扩展库   Windows/PHP 5.2.x   准确: 95%, 召回: 91%, 速度: 40KB/sec   [下载] [文档] [安装说明]
PSCWS23   PHP源代码   不限 (不支持UTF-8)   准确: 93%, 召回: 89%, 速度: 960KB/min   [下载] [文档]
PSCWS4   PHP源代码   不限   准确: 95%, 召回: 91%, 速度: 160KB/min   [下载] [文档]
neil
2009-2-19 10:29
测试"开源PHP中文分词扩展:PHPCWS在线演示,更多内容请访问"
效果不错,可惜不识别"开源"一词
wesley
2009-2-19 13:42
very powerful thank you
zxb888
2009-2-21 22:01
我也在用http://www.ftphp.com/scws/ 还不错
visee
2009-2-22 12:58
分别对PHPCWS、SCWS中文分词扩展比较测试了一下,发现PHPCWS在歧义识别、语义识别、未登录词识别等分词效果、准确率上要比SCWS好一些:

例1:俄罗斯民调显示梅德韦杰夫人气急升。
PHPCWS分词结果为:俄罗斯 民调 显示 梅德韦杰夫 人气 急升 。
SCWS分词结果为:俄罗斯 民调 显示 梅德 韦杰 夫人 气急 升 。
SCWS切分成“夫人”、“气急”是不符合语义的。

例2:奥巴马上台后中美关系如何变革?
PHPCWS分词结果为:奥 巴马 上台 后 中美关系 如何 变革 ?
SCWS分词结果为:奥巴 马上 台后 中美关系 如何 变革 ?
两者分词的词库内都没有“奥巴马”这个词,但PHPCWS根据整句话的语义识别,进行了正确的分词,而SCWS切分成了“马上”、“台后”,在整个语句中是错误的。

例3:结合成分子时
PHPCWS分词结果为:结合 成 分子 时
SCWS分词结果为:结合 成分 子时
“结合成分子时”这句话就有好几种切分方法:“结合 成分 子时”、“结 合成 分子 时”、“结合 成 分子 时”等。但是正确的只有最后一种,能正确的进行歧义切分是分词的一个难点,PHPCWS能够正确切分,而SCWS不能。

例4:哪个人生下来就会算算术呢
PHPCWS分词结果为:哪个 人 生下来 就会 算 算术 呢
SCWS分词结果为:哪个 人生 下来 就 会 算 算术 呢

例5:三个人选一个,你会选谁?
PHPCWS分词结果为:三个人 选 一个 , 你会 选 谁 ?
SCWS分词结果为:三个 人选 一个 , 你 会 选 谁 ?
结合语义,“人选”在这里不应该是一个词,“三个 人选 一个”语义不通。

例6:2008年中国网络游戏的实际销售收入达183.8亿元人民币,比2007年增长了76.6%。
PHPCWS分词结果为:2008年 中国 网络游戏 的 实际 销售 收入达 183.8亿 元 人民币 , 比 2007年 增长了 76.6% 。
SCWS分词结果为:2008 年中 国 网络游戏 的 实际 销售 收入 达 183.8 亿 元 人民币 , 比 2007 年 增长 了 76.6 % 。
PHPCWS能够对日期(例如2008年)、数值(183.8亿)、百分比(76.6%)等进行智能识别。SCWS对这些是拆散的。
sheaven
2009-2-23 23:39
在64位系统下无法编译
张宴 回复于 2009-2-25 00:03
请提供一下出错信息。
龙飞
2009-2-24 15:58
非常感谢能够提供这样优秀的开源中文分词系统,我有个疑问,关于用户词库添加这块,比如说:“目前锡城部分楼盘的价格”
默认分词是“目前 锡 城 部分 楼盘 的 价格” 我在词库中添加了“锡城”这个词,但是实际分词的时候并没有效果 还是会拆成“锡 城”,不知道用户词库这块是如何定义的
张宴 回复于 2009-2-24 16:46
你需要保证从命令行输入的自定义词是GBK编码,而不是UTF-8编码。
小宝 Homepage
2009-2-25 10:40
希望提供windows平台的dll包与最佳安装方案,还是有部分用户在用win平台的比如我们unhappy
renothing
2009-2-25 21:15
希望波主能出个utf8和中英文混合的。
张宴 回复于 2009-2-25 22:45
现有版本能够支持中英文、数字混合。UTF-8转码PHP的iconv()函数就能够实现。
分页: 1/6 第一页 1 2 3 4 5 6 下页 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]