• 一个简单的计算文章相似度功能!


    在做文章系统的时候,很多时候需要为这篇文章推荐最相近的文章。

    解决思路是:给文章设定关键词然后模糊查询进行匹配。找到包含这个关键词的标题,然后给显示出来,作为最接近的文章。

    但是有问题:这样的文章,排列顺序并不是我们想要的。

    例如:两篇文章:第一篇:“用灵芝泡茶的功效”,第二篇:“泡茶的功效与作用”。我们发布一篇文章设定的关键词是:“茶”“功效”。

    通过这样进行匹配,查询出来的结果是包含“茶”和“功效”的所有文章。

    在显示上,第一篇排在第二篇的上面。

    但是:很明显第二篇文章比第一篇的相似度更高。对“茶”和“功效”的相似度更高。

    那么,如何做到最匹配的文章呢?

    我想到一个简单的方法:计算关键词在标题上出现的位置的大小进行排序;

    $words = "茶,功效";
    $oTitle = "用灵芝泡茶的功效";
    $oTitleTwo = "泡茶的功效与作用";
    echo(strpos($oTitle,'茶'))."<br>";
    echo(strpos($oTitle,'功效'))."<br>"; 
    echo "<hr>";
    echo(strpos($oTitleTwo,'茶'))."<br>";
    echo(strpos($oTitleTwo,'功效'))."<br>";
    echo "<hr>";
    

    输出的结果:

    12
    18


    3
    9

    然后计算结果:

    第一篇:12+18 = 30,第二篇:3+9 = 12;

    让后用这个从小到大排序;就完成了一个简单的相似度排序。

    示例代码:

    $words = "茶,功效";
    $where['title'] = $this->createArr($words);
    $keywordsList
    = $keywordsDB->where($where)->select(); foreach($keywordsList as $k => $v){ $keywordsList[$k]['poslike'] = $this->posLike($words,$v['title']); }; //array_multisort(array_column($keywordsList,'poslike'),SORT_DESC,$keywordsList); array_multisort(array_column($keywordsList,'poslike'),SORT_ASC,$keywordsList); foreach($keywordsList as $v){ echo "<br>".$v['poslike']."---".$v['id']."---".$v['title']; };

    获取相似度:

    /*
     * 计算出现的位置来判断相关性
     * 计算出 $words依次在 $str出现的位置
     * $words 关键词字符串 用 , 隔开
     * $str 字符串
     */
    private function posLike($words,$str){
        $sum = 0;
        $wordsArr = explode(',',$words);
        foreach($wordsArr as $v){
            $sum += strpos($str,$v);
        };
        return $sum;
    }

     生成查询数组:

    /*
     *     生成模糊查询的数组
     */
    private function createArr($words){
        $wordsArr = explode(',',$words);
        $whereArr = array();
        foreach($wordsArr as $k=>$v){
            $arr = array();
            if(!$v)unset($wordsArr[$k]); 
            array_push($arr,'like');
            array_push($arr,'%'.$v.'%');
            array_push($whereArr,$arr);
        }
        return $whereArr;
    }
    // $where['title'] = array('like','%'.$words.'%');
    // $where['title'] = array('like',array('%'.$words.'%','%'.$wordss.'%'));
    // $where['title'] = array(array('like','%'.$words.'%'),array('like','%'.$wordss.'%'));
  • 相关阅读:
    Django 事务 多表操作
    python oss上传图片
    WARNINGS: ?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
    解决VMware服务起不来的问题
    go-用法
    go-基础语法
    django_filters导入失败
    Git
    windows10安装ubuntu18.04(64位)双系统教程
    Ubuntu系统运行Steam中VR游戏的相关软件环境配置说明
  • 原文地址:https://www.cnblogs.com/e0yu/p/9178045.html
Copyright © 2020-2023  润新知