首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP similar_text() 實現簡易「相關文章推薦」功能

     編輯:PHP 綜合知識

內容型網站常需「相關文章推薦」。傳統做法建立關鍵詞索引、TF-IDF 計算較複雜。PHP 內建 similar_text() 可快速計算兩字串相似度,零配置實現標題級推薦。

核心函數

similar_text(string $first, string $second, float &$percent = null): int
// 回傳相同字元數,$percent 為相似百分比

完整推薦函數實作

<?php
/**
 * 根據標題相似度推薦相關文章
 * @param string $currentTitle 當前文章標題
 * @param array  $candidateTitles 候選標題陣列
 * @param int    $limit 推薦數量
 * @return array 推薦標題陣列(按相似度降序)
 */
function getRelatedTitles($currentTitle, $candidateTitles, $limit = 5) {
    $scored = [];
    foreach ($candidateTitles as $title) {
        if ($title === $currentTitle) continue; // 排除自己
        similar_text($currentTitle, $title, $percent);
        $scored[] = ['title' => $title, 'score' => $percent];
    }

    // 按相似度降序排序
    usort($scored, fn($a, $b) => $b['score'] <=> $a['score']);

    return array_column(array_slice($scored, 0, $limit), 'title');
}

// 測試資料
$current = "簡明現代魔法";
$candidates = [
    "簡單易懂的現代魔法",
    "簡單明了的現代魔法",
    "簡明扼要的古代魔法",
    "不簡單的現代魔法",
    "很難懂的現代魔法",
    "完全無關的主題",
];

$related = getRelatedTitles($current, $candidates, 3);
print_r($related);
/* 輸出:
Array (
    [0] => 簡單明了的現代魔法
    [1] => 簡單易懂的現代魔法
    [2] => 簡明扼要的古代魔法
)
*/

效能測試與限制

文字長度耗時建議
< 1,000 字元< 1ms即時計算無壓力
1,000 - 10,0001-10ms可接受,建議快取
20,000+3-5 秒嚴重效能問題,不可即時計算

優化策略

  • 只比對標題:標題短、特徵明顯,避免比對全文
  • 預計算快取:發文/編輯時離線計算 Top-N 存入資料庫
  • 長度過濾:if (strlen($text) > 20000) return [];
  • 中文分詞優化:結合 Jieba/PSCWS 分詞後比較詞集合,語義更準確

進階:結合標籤/分類的混合推薦

function hybridRecommend($articleId, $limit = 5) {
    // 1. 同分類優先
    $sameCat = Article::where('category_id', $article->category_id)
        ->where('id', '!=', $articleId)
        ->latest()->limit($limit * 2)->pluck('title')->toArray();

    // 2. 標題相似度排序
    $related = getRelatedTitles($article->title, $sameCat, $limit);

    // 3. 不足時補熱門文章
    if (count($related) < $limit) {
        $hot = Article::where('id', '!=', $articleId)
            ->orderBy('views', 'desc')
            ->limit($limit - count($related))
            ->pluck('title')->toArray();
        $related = array_merge($related, $hot);
    }
    return $related;
}

適用場景總結

場景推薦做法
小型部落格/ CMSsimilar_text() 標題比對 + 快取
中型內容平台分類/標籤過濾 + similar_text() 重排
大型推薦系統向量嵌入 + 近鄰搜尋 / 協同過濾

similar_text() 雖非專業 NLP 工具,但零依賴、零配置、語義直覺不錯,是中小型專案快速上線推薦功能的最佳選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved