Thinkphp5整合结巴分词实现网站模糊搜索
最近在升级站长图库网站的时候,将一直苦恼的网站搜索功能一并升级了一下,原来是关键词精准搜索,也就是用户输入关键词,通过 like 模糊查询匹配出内容。
但是这样有一个大问题:就是用户输入的关键词(其实很多时候用户输入的都是比较长的一句话,或者类似百度等搜索引擎习惯的空格分割的关键词)这样的话,基本是很难匹配到网站内容数据的,除非单个比较短的关键词才会有。
之前一直想做一下分词搜索,看了很多接口,也试过挺多的方法,都不太理想;最近花了点时间研究了一下,觉得“结巴分词”是目前比较好的一个解决方案,好了废话不多说,看实操~~
关于结巴分词
“结巴”中文分词:做最好的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 安装结巴分词模块
composer require fukuball/jieba-php:dev-master
然后就不用管了,直接写控制器:
<?php namespace app\index\controller; // 必须有,且内存不小于1024M ini_set('memory_limit', '1024M'); use think\Controller; // 结巴分词PHP模块 use Fukuball\Jieba\Jieba; //必须 use Fukuball\Jieba\Finalseg; use Fukuball\Jieba\JiebaAnalyse; //关键词提取 Jieba::init(); //必须 Finalseg::init(); JiebaAnalyse::init(); class Search extends Controller { public function index() { $keyword = urldecode(input('keyword/s')); if (!empty($keyword)) { // 使用关键词提取,返回 5 个 TF/IDF 权重最大的关键词,默认为 20 个 $fenci = JiebaAnalyse::extractTags($keyword, 5); $keywords_fenci = []; foreach ($fenci as $key => $value) { // 将关键词组合为 Like 所需格式的数组 $keywords_fenci[] = '%' . $key. '%'; } // 搜索标题和简介字段 $where['title|description'] = array('like', $keywords_fenci); $list = db('Article')->where($where)->select(); } else { // 空白搜索页 $this->error('关键词为空!'); } return $this->fetch(''); } }
以上是核心代码,其他部分大家根据自己的业务拓展~~
这样便实现了牧户搜索功能,如果还想让前台将提取的关键词标红(就像本站这样)可以是用以下方法:
/** * [关键词标红] * @param [type] $info [内容] * @param [type] $search_arr [关键词数组] * @return [type] [description] */ function keyword_red($info, $search_arr) { foreach ($search_arr as &$value) { $info = str_ireplace($value, '<span>' . $value . '</span>', $info); } return $info; }
将其作用在前台搜索结果页的 title 和 description 字段上,再将<span></span>标签字体颜色变红即可。
是不是很简单,其实结巴分词还有很多种用法,具体大家可以去看看文档,写的都很完整,不过目前PHP版的结巴分词仅提供了 jieba.cut 用于分词,完整的应该是 Python版结巴分词,不过小编不会,也就没有深究了,够用就好,你觉得呢~~
本文网址:https://www.zztuku.com/detail-9120.html
站长图库 - Thinkphp5整合结巴分词实现网站模糊搜索
申明:如有侵犯,请 联系我们 删除。
您还没有登录,请 登录 后发表评论!
提示:请勿发布广告垃圾评论,否则封号处理!!