中文分词实现的技术指南

参考:http://www.xunsearch.com/scws/download.php

https://www.cnblogs.com/martinzhang/p/3209696.html

https://www.cnblogs.com/glory-jzx/p/3509975.html

 中文分词,一般使用在全文搜索场景中,如果关键词中存在一些固定或常用的词汇,可以将他们分开返回给搜索逻辑,一般会查询数据库来分别匹配分词查询得到结果。关键词如果作为一个整体传递给数据库查询可能匹配不到任何结果,分词后会匹配到结果,这就是中文分词的作用。详细的可以在网上搜索一下。

分词演示:http://www.xunsearch.com/scws/demo/v48.php

http://www.xunsearch.com/scws/demo/v48.cht.php

我们的应用案例语言环境是PHP、phpstudy服务器

我们使用php5.4.45-nts-apache

 下载php_scws.dll,放入php环境下的ext目录


 

下载分词规则文件

配置php.ini

extension = php_scws.dll
scws.default.charset = utf8
scws.default.fpath = "D:/scws/etc"

测试运行环境是否支持scws

中文分词测试脚本

<?php
//phpinfo();exit;
header('Content-Type:text/html;charset=UTF-8');
echo '<pre>';
//////////////////////////////////////////////////////////////////////////////
echo $text="我是一个中国人,我会C++语言,我也有很多T恤衣服,我想知道奥迪A6与第八代索纳塔哪个油耗低,谢谢花好月圆二手奥拓芽菜好吃悦翔V3怎么样卧槽日系车Q5";

echo '<br />';

$so = scws_new();           //创建并返回一个 `SimpleCWS` 类操作对象
$so->set_charset('utf8');   //设定分词词典、规则集、欲分文本字符串的字符集(utf8 和 gbk)
$so->set_dict('D:/scws/etc/dict.utf8.xdb');  //强行设定分词所用的词典(注:如果做此设置会使php.ini中已设置的词典失效,如无需要可不设此项)
$so->set_rule('D:/scws/etc/rules.utf8.ini'); //强行设定分词所用的新词识别规则集(用于人名、地名、数字时间年代等识别)(注:如果做此设置会使php.ini中已设置的规则失效,如无需要可不设此项)
$so->set_ignore('yes');     //设定分词返回结果时是否去除一些特殊的标点符号之类
$so->set_duality(false);    //设定是否将闲散文字自动以二字分词法聚合

//设定分词返回结果时是否复式分割,如“中国人”返回“中国+人+中国人”三个词。
//也可用 1-15 来表示:(1)短词  (2)二元(将相邻的2个单字组合成一个词) (4)重要单字  (8)全部单字
$so->set_multi(0);

//发送设定分词所要切割的文本
//执行本函数时,若未加载任何词典和规则集,则会自动试图在 ini 指定的缺省目录下查找缺省字符集的词典和规则集
$so->send_text($text);

$getWords = $so->get_words('~v'); //n,nz,un,ns,i
/*
   根据 send_text 设定的文本内容,返回系统中词性符合要求的关键词汇
   > **参数 attr** 是一系列词性组成的字符串,各词性之间以半角的逗号隔开,
   > 这表示返回的词性必须在列表中,如果以~开头,则表示取反,词性必须不在列表中,若为空则返回全部词。  
   > **返回值** 成功返回符合要求词汇组成的数组,返回 false。返回的词汇包含的键值参见 `scws_get_result`
*/
print_r($getWords);

echo '<br />---------------------------------------------------------------------<br />';

$getTops = $so->get_tops(20,'~v,~r');
/*
  根据 send_text 设定的文本内容,返回系统计算出来的最关键词汇列表
   > **参数 limit** 可选参数,返回的词的最大数量,缺省是 10  
   > **参数 attr** 可选参数,是一系列词性组成的字符串,各词性之间以半角的逗号隔开,
   > 这表示返回的词性必须在列表中,如果以~开头,则表示取反,词性必须不在列表中,缺省为NULL,返回全部词性,不过滤。  
   > **返回值** 成功返回统计好的的词汇组成的数组,返回 false。返回的词汇包含的键值如下:
   >   word   _string_ 词本身
   >   times  _int_   词在文本中出现的次数
   >   weight _float_ 该词计算后的权重
   >   attr   _string_ 词性
*/
print_r($getTops);

echo '<br />/////////////////////////////////////////////////////////////////////<br />';

while($getResult = $so->get_result()){
    /*
      根据 send_text 设定的文本内容,返回一系列切好的词汇
       > word _string_ 词本身
       > off  _int_    该词在原文本路的位置-
       > len  _int_    词长度 
       > idf  _float_  逆文本词频 
       > attr _string_ 词性
    */
    print_r($getResult);
}


echo $version = $so->version(); //获取版本

$so->close(); //关闭

?>

 运行结果

持续完善,待续...

发布了179 篇原创文章 · 获赞 16 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/yan_dk/article/details/95004899