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

 3755

最近在升级站长图库网站的时候,将一直苦恼的网站搜索功能一并升级了一下,原来是关键词精准搜索,也就是用户输入关键词,通过 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 安装结巴分词模块

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整合结巴分词实现网站模糊搜索
申明:如有侵犯,请 联系我们 删除。

评论(0)条

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

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

    编辑推荐