在做文章系统的时候,很多时候需要为这篇文章推荐最相近的文章。
解决思路是:给文章设定关键词然后模糊查询进行匹配。找到包含这个关键词的标题,然后给显示出来,作为最接近的文章。
但是有问题:这样的文章,排列顺序并不是我们想要的。
例如:两篇文章:第一篇:“用灵芝泡茶的功效”,第二篇:“泡茶的功效与作用”。我们发布一篇文章设定的关键词是:“茶”“功效”。
通过这样进行匹配,查询出来的结果是包含“茶”和“功效”的所有文章。
在显示上,第一篇排在第二篇的上面。
但是:很明显第二篇文章比第一篇的相似度更高。对“茶”和“功效”的相似度更高。
那么,如何做到最匹配的文章呢?
我想到一个简单的方法:计算关键词在标题上出现的位置的大小进行排序;
$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.'%'));