內容型網站常需「相關文章推薦」。傳統做法建立關鍵詞索引、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,000 | 1-10ms | 可接受,建議快取 |
| 20,000+ | 3-5 秒 | 嚴重效能問題,不可即時計算 |
if (strlen($text) > 20000) return [];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;
}
| 場景 | 推薦做法 |
|---|---|
| 小型部落格/ CMS | similar_text() 標題比對 + 快取 |
| 中型內容平台 | 分類/標籤過濾 + similar_text() 重排 |
| 大型推薦系統 | 向量嵌入 + 近鄰搜尋 / 協同過濾 |
similar_text() 雖非專業 NLP 工具,但零依賴、零配置、語義直覺不錯,是中小型專案快速上線推薦功能的最佳選擇。