一個簡單的計算文章相似度功能!


在做文章系統的時候,很多時候需要為這篇文章推薦最相近的文章。

解決思路是:給文章設定關鍵詞然后模糊查詢進行匹配。找到包含這個關鍵詞的標題,然后給顯示出來,作為最接近的文章。

但是有問題:這樣的文章,排列順序並不是我們想要的。

例如:兩篇文章:第一篇:“用靈芝泡茶的功效”,第二篇:“泡茶的功效與作用”。我們發布一篇文章設定的關鍵詞是:“茶”“功效”。

通過這樣進行匹配,查詢出來的結果是包含“茶”和“功效”的所有文章。

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

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

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

我想到一個簡單的方法:計算關鍵詞在標題上出現的位置的大小進行排序;

$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.'%'));

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM