Thinkphp5整合结巴分词实现网站模糊搜索

 4280

最近在升级站长图库网站的时候,将一直苦恼的网站搜索功能一并升级了一下,原来是关键词精准搜索,也就是用户输入关键词,通过 like 模糊查询匹配出内容。

但是这样有一个大问题:就是用户输入的关键词(其实很多时候用户输入的都是比较长的一句话,或者类似百度等搜索引擎习惯的空格分割的关键词)这样的话,基本是很难匹配到网站内容数据的,除非单个比较短的关键词才会有。

之前一直想做一下分词搜索,看了很多接口,也试过挺多的方法,都不太理想;最近花了点时间研究了一下,觉得“结巴分词”是目前比较好的一个解决方案,好了废话不多说,看实操~~


Thinkphp5整合结巴分词实现网站模糊搜索


关于结巴分词

“结巴”中文分词:做最好的PHP中文分词,中文断词组件。/“结巴”(中文为“口吃”)中文分词:建立最好的PHP中文分词模块。

目前翻译版为jieba-0.33版本,未来再慢慢往上升级,效能也需要再改善,请有兴趣的开发者一起加入开发!若想使用Python版本请前往 https://github.com/fxsjy/jieba

现在已经可以支援繁体中文!只要将字典切换为大模式即可!


结巴分词特征

支持三种分词模式:

1)默认精确模式,试图将句子最精确地切开,适合文本分析;

2)全模式,把句子中所有的可以成词的词语都扫描出来,但是不能解决歧义。(需要充足的字典)

搜寻引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜寻引擎分词。

支持繁体断词

支持自定义词典


结巴分词的介绍就到这里,具体更多的介绍去 https://github.com/fukuball/jieba-php 这里看吧!(Gitee地址:  https://gitee.com/RandolfJay/jieba-php


thinkphp5的整合结巴分词:

首先:通过 composer 安装结巴分词模块

  1. composer require fukuball/jieba-php:dev-master

然后就不用管了,直接写控制器:

  1. <?php
  2. namespace app\index\controller;
  3.  
  4. // 必须有,且内存不小于1024M
  5. ini_set('memory_limit', '1024M');
  6. use think\Controller;
  7.  
  8. // 结巴分词PHP模块
  9. use Fukuball\Jieba\Jieba;  //必须
  10. use Fukuball\Jieba\Finalseg;
  11. use Fukuball\Jieba\JiebaAnalyse;   //关键词提取
  12.  
  13. Jieba::init(); //必须
  14. Finalseg::init();
  15. JiebaAnalyse::init();
  16.  
  17. class Search extends Controller
  18. {
  19.     public function index()
  20.     {
  21.         $keyword = urldecode(input('keyword/s'));
  22.         if (!empty($keyword)) {
  23.             // 使用关键词提取,返回 5 个 TF/IDF 权重最大的关键词,默认为 20 个
  24.             $fenci =  JiebaAnalyse::extractTags($keyword, 5);
  25.             $keywords_fenci = [];
  26.             foreach ($fenci as $key => $value) {
  27.                 // 将关键词组合为 Like 所需格式的数组
  28.                 $keywords_fenci[] = '%' . $key. '%';
  29.             }
  30.             // 搜索标题和简介字段
  31.             $where['title|description'] = array('like', $keywords_fenci);
  32.             $list = db('Article')->where($where)->select();
  33.         } else {
  34.             // 空白搜索页
  35.             $this->error('关键词为空!');
  36.         }
  37.         return $this->fetch('');
  38.     }
  39. }

以上是核心代码,其他部分大家根据自己的业务拓展~~

这样便实现了牧户搜索功能,如果还想让前台将提取的关键词标红(就像本站这样)可以是用以下方法:

  1. /**
  2.  * [关键词标红]
  3.  * @param  [type] $info       [内容]
  4.  * @param  [type] $search_arr [关键词数组]
  5.  * @return [type]             [description]
  6.  */
  7. function keyword_red($info, $search_arr)
  8. {
  9.     foreach ($search_arr as &$value) {
  10.         $info = str_ireplace($value, '<span>' . $value . '</span>', $info);
  11.     }
  12.     return $info;
  13. }

将其作用在前台搜索结果页的 title 和 description 字段上,再将<span></span>标签字体颜色变红即可。


是不是很简单,其实结巴分词还有很多种用法,具体大家可以去看看文档,写的都很完整,不过目前PHP版的结巴分词仅提供了 jieba.cut 用于分词,完整的应该是 Python版结巴分词,不过小编不会,也就没有深究了,够用就好,你觉得呢~~


本文网址:https://www.zztuku.com/index.php/detail-9120.html
站长图库 - Thinkphp5整合结巴分词实现网站模糊搜索
申明:如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐