在做文章系統的時候,很多時候需要為這篇文章推薦最相近的文章。
解決思路是:給文章設定關鍵詞然后模糊查詢進行匹配。找到包含這個關鍵詞的標題,然后給顯示出來,作為最接近的文章。
但是有問題:這樣的文章,排列順序並不是我們想要的。
例如:兩篇文章:第一篇:“用靈芝泡茶的功效”,第二篇:“泡茶的功效與作用”。我們發布一篇文章設定的關鍵詞是:“茶”“功效”。
通過這樣進行匹配,查詢出來的結果是包含“茶”和“功效”的所有文章。
在顯示上,第一篇排在第二篇的上面。
但是:很明顯第二篇文章比第一篇的相似度更高。對“茶”和“功效”的相似度更高。
那么,如何做到最匹配的文章呢?
我想到一個簡單的方法:計算關鍵詞在標題上出現的位置的大小進行排序;
$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.'%'));