• web分词程序和算法


    注:最新的分词系统 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.s135.com/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):
    1. <?php  
    2. @header('Content-Type: text/html; charset=gb2312');  
    3. $text = "2009年2月13日,我编写了一款PHP中文分词扩展:PHPCWS 1.0.0。";  
    4.   
    5. echo "分词结果为:<BR>";  
    6. $result = phpcws_split($text);  
    7. echo $result . "<BR><BR>";  
    8.   
    9. echo "过滤掉默认标点符号的分词结果为:<BR>";  
    10. $result = phpcws_split($text"default");  
    11. echo $result . "<BR><BR>";  
    12.   
    13. echo "过滤掉全角逗号与冒号的分词结果为:<BR>";  
    14. $result = phpcws_split($text",:");  
    15. echo $result . "<BR><BR>";  
    16. ?>  

      ②、对UTF-8编码的字符串进行中文分词处理(example_utf8.php):
    1. <?php  
    2. @header('Content-Type: text/html; charset=utf-8');  
    3. $text = "2009年2月13日,我编写了一款PHP中文分词扩展:PHPCWS 1.0.0。";  
    4. $text = iconv("UTF-8""GBK//IGNORE"$text);  
    5.   
    6. echo "分词结果为:<BR>";  
    7. $result = phpcws_split($text);  
    8. $result = iconv("GBK""UTF-8//IGNORE"$result);  
    9. echo $result . "<BR><BR>";  
    10.   
    11. echo "过滤掉默认标点符号的分词结果为:<BR>";  
    12. $result = phpcws_split($text"default");  
    13. $result = iconv("GBK""UTF-8//IGNORE"$result);  
    14. echo $result . "<BR><BR>";  
    15.   
    16. echo "过滤掉全角逗号与冒号的分词结果为:<BR>";  
    17. $result = phpcws_split($text",:");  
    18. $result = iconv("GBK""UTF-8//IGNORE"$result);  
    19. echo $result . "<BR><BR>";  
    20. ?>  

      输出结果为:
    分词结果为:
    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中获取:

  • 相关阅读:
    【题解】JSOI2009游戏
    【考试记录】4.8 Path (网络流 —— 劲题)
    【考试记录】4.8 Table ( 数论数学 --组合数 & 杨辉三角)
    【题解】HNOI2016树
    【算法】最小乘积生成树 & 最小乘积匹配 (HNOI2014画框)
    【加油!】
    [bzoj4916] 神犇和蒟蒻 [杜教筛]
    [CQOI2015][bzoj3930] 选数 [杜教筛+莫比乌斯反演]
    [luogu3768] 简单的数学题 [杜教筛]
    春季学习记录
  • 原文地址:https://www.cnblogs.com/tdalcn/p/2587490.html
Copyright © 2020-2023  润新知