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