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

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

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

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

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

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

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

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

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

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

$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.'%'));
原文地址:https://www.cnblogs.com/e0yu/p/9178045.html