Thinkphp 3.2 中词分词 加权搜索

 原文地址:http://www.cnblogs.com/kekukele/p/4544349.html

 前段时间,利用业余时间做了一个磁力搜索的网站Btdog,其中使用到了简单的中文分词与加权搜索,在这里分享给大家,供大家参考。

  在我的网站中,中文分词使用的是SCWS分词系统,这个分词系统提供PHP两种使用方式:一种是你可以采用源码安装,具体安装步骤请参考这里

另外一种是使用其提供的API接口,具体方法参考这里

  下面,我们假设你已经掌握了SCWS的使用,事实上,其使用也非常简单,若你不会其使用,也不影响本文下面的阅读。 

  SCWS系统中其每个分好的词包括以下属性/键值:

  1. word 词的内容
  2. off 该词在未分词文本中的偏移位置
  3. idf 该词的 IDF 值
  4. attr 词性 (北大标注格式) 参见这里

  在这里我们重点介绍下分词属性中的idf,这个是我们在我们的分词算法中需要用到的。

  IDF全称inverse document frequency(逆向文档频率)是一个词普遍重要性的度量,某一特定词的IDF值,用总文件数除以包含该词的文章数量,再将得到的商取对数(log)。计算公式:IDF = log(D/Dt),D为文章总数,Dt为该词出现的文章数量。IDF的主要思想是:如果包含词条t的文档越少,也就是Dt越小,IDF越大,则说明词条t具有很好的类别区分能力。

  我们举例说明下,如 搜索内容 ”复仇者的联盟“,其SCWS的分词结果如下:

  可以看出,其分词结果中,关键词”复仇者“的idf为9.06,最具区分能力,而关键词”的“的idf值为0,基本没有区分能力,”联盟“的idf为4.34也具有较强的区别能力。因此,我们在我们的分词搜索中,可以简单地使用idf值作为加权排序的依据。

  在scws分词系统中,其idf的取值为0-10,因此在我们下面给出的算法中,我们把内容全文匹配的权重设为10,即最大。其他分词后关键词的权重值设为其idf值,然后根据权重大小将结果逆序排列。这要我们就实现了简单的中文分词加权排序。核心代码具体如下: 

 //@param:需要分词的内容    //Return:mysql查询条件字符串,加权排序字符串,关键词    private function split_words($text){
        $split_words = scws_new();
        $split_words->set_charset(‘utf-8‘);
        $split_words->set_ignore(true);
        $split_words->set_dict(‘/usr/local/scws/etc/dict.utf8.xdb‘);
        $split_words->set_rule(‘/usr/local/scws/etc/rules.utf8.ini‘);
        $split_words->send_text($text);
        $weight=10;
        $condition[‘where‘] = "name LIKE ‘%".$text."%‘";
        $condition[‘order‘] = "(CASE WHEN name LIKE ‘%".$text."%‘ THEN $weight ELSE 0 END)";  //设置全文匹配最大权重
        while ($words_result = $split_words->get_result())
        {
            foreach($words_result as $word_arr){
                    $condition[‘where‘] .= " OR name LIKE ‘%".$word_arr[‘word‘]."%‘";            //设置分词后关键词的权重为其idf的值                    $condition[‘order‘] .= " + (CASE WHEN name LIKE ‘%".$word_arr[‘word‘]."%‘ THEN ".$word_arr[‘idf‘]." ELSE 0 END)";
                $condition[‘keywords‘][$cnt++] = $word_arr[‘word‘];
            }
        }
        $split_words->close();
        return $condition;
    }

  当然,更复杂的分词还要考虑词的词频TF,不过即使简单的这样,我们也基本能达到比较好的效果了,具体效果,大家可以到http://btdog.com.cn体验下。

时间: 2024-10-07 17:32:59

Thinkphp 3.2 中词分词 加权搜索的相关文章

lucene.net 3.0.3、结合盘古分词进行搜索的小例子(转)

lucene.net 3.0.3.结合盘古分词进行搜索的小例子(分页功能) 添加:2013-12-25 更新:2013-12-26 新增分页功能. 更新:2013-12-27 新增按分类查询功能,调整索引行新增记录的图片字段. //封装类 [csharp] view plaincopyprint? using System; using System.Collections.Generic; using System.Linq; using System.Web; using Lucene.Ne

lucene3.0+版本中文分词测试+搜索结果+创建索引测试

lucene3.0+版本中文分词测试+搜索结果+创建索引测试 import java.io.File; import java.io.IOException; import java.io.StringReader; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.tokenattributes.

悟空分词的搜索和排序源码分析之——索引

转自:http://blog.codeg.cn/2016/02/02/wukong-source-code-reading/ 索引过程分析 下面我们来分析索引过程. // 将文档加入索引 // // 输入参数: // docId 标识文档编号,必须唯一 // data 见DocumentIndexData注释 // // 注意: // 1. 这个函数是线程安全的,请尽可能并发调用以提高索引速度 // 2. 这个函数调用是非同步的,也就是说在函数返回时有可能文档还没有加入索引中,因此 // 如果立

ThinkPHP之中getlist方法实现数据搜索功能

自己在ThinkPHP之中的model之中书写getlist方法,其实所谓的搜索功能无非就是数据库查询之中用到的like  %string%,或者其他的 字段名=特定值,这些sql语句拼接在and语句之中: HTML之中: 1 <form action="" method="get"> 2 <table class="account_table" width="100%" cellpadding="

lucene.net 3.0.3、结合盘古分词进行搜索的小例子(分页功能)

转自:http://blog.csdn.net/pukuimin1226/article/details/17558247 添加:2013-12-25 更新:2013-12-26 新增分页功能. 更新:2013-12-27 新增按分类查询功能,调整索引行新增记录的图片字段. 最新盘古分词dll和词典管理工具下载:http://pangusegment.codeplex.com/ 词典下载:http://pangusegment.codeplex.com/releases/view/47411 L

ThinkPHP 分页中带入查询(搜索)条件

parameter 属性赋值 例如要检索用户表中状态为 1 (status=1) 并且电子包含 163 的用户,当提交表单时(注意表单是 GET 方式提交),形成的 URL 地址大致如下: http://www.5idev.com/index.php/Index/search/status/1/email/163 在搜索操作(search)中主要代码如下: public function search(){ $Dao = M("User"); // 构造查询条件 $condition[

elasticsearch中文分词+全文搜索

安装ik中文分词器 我在百度上搜索了下,大多介绍的都是用maven打包下载下来的源码,这种方法也行,但是不够方便,为什么这么说? 首先需要安装maven吧?其次需要下载源码吧?最后需要打包吧? 我直接下载打包好的多方便? 下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases 最上面elasticsearch-analysis-ik-5.5.1.zip就是打包好的,直接下载下来用就行了 下面两个都是源码包,需要用maven

使用ES对中文文章进行分词,并进行词频统计排序

前言:首先有这样一个需求,需要统计一篇10000字的文章,需要统计里面哪些词出现的频率比较高,这里面比较重要的是如何对文章中的一段话进行分词,例如"北京是中华人民共和国的首都","北京","中华人民共和国","中华","华人","人民","共和国","首都"这些是一个词,需要切分出来,而"京是""民共"这些就

搜索引擎技术揭密:中文分词技术

http://www.williamlong.info/archives/333.html 信息的飞速增长,使搜索引擎成为人们查找信息的首选工具,Google.百度.中国搜索等大型搜索引擎一直是人们讨论的话题.随着搜索市场价值的不断增加,越来越多的公司开发出自己的搜索引擎,阿里巴巴的商机搜索.8848的购物搜索等也陆续面世,自然,搜索引擎技术也成为技术人员关注的热点. 搜索引擎技术的研究,国外比中国要早近十年,从最早的Archie,到后来的Excite,以及altvista.overture.g