在現今的數據驅動世界,推薦系統早已成為許多平台(如電商、串流媒體、社交網路)不可或缺的一部分。然而,傳統的推薦方法如協同過濾(Collaborative Filtering)和基於內容過濾(Content-Based Filtering)各有其局限性,例如無法處理冷啟動問題或缺乏靈活性。最近在 YouTube survey 與學習 : 關於如何利用圖形資料庫(Graph Database)提升推薦系統的方法,特別是如何透過 Neo4j 等工具實現更高效的混合推薦(Hybrid Recommendation)和 k-近鄰(k-NN)推薦。
這篇 Blog 將簡要整理我所學到的內容,主要是理論的部分,從傳統推薦方法的挑戰開始,探討如何使用圖技術來提升推薦效果,下一篇老樣子會拿一個 sample dataset 實作,並在提出實作的結果與討論,那我們開始吧!
1. Top 10 Recommendation(熱門推薦)
2. Content-Based Recommendation(基於內容的推薦)
3. Collaborative Filtering(協同過濾推薦)
雖然傳統推薦方法已在許多應用中取得不錯的成效,但隨著數據規模和需求的提升,它們的局限性逐漸顯現。這時,Graph 技術的出現為推薦系統帶來了不同的解決方案,我們能更靈活地處理複雜的關聯數據,提升推薦的質量和多樣性。
這裡會有一個疑問:是不是這些推薦方法一定得用到 graph db ? 還是現有的 relational database可以做推薦嗎?
2. 即時推薦:Real-Time Recommendations
場景:有一用戶剛看完 Toy story ,要推薦下一步他感興趣的電影。
使用 Graph 技術將以下元素建模為節點與關係:
這樣的數據模型可反映每位用戶對不同電影的觀看與評分記錄,為推薦系統提供基礎數據。
推薦查詢可分為以下幾個步驟執行:
MATCH (watched:Movie {title:"Toy Story"}) <-[r1:RATED]- (user:Person)
2. 篩選評分超過 7 分的電影 :
MATCH (user) -[r2:RATED]-> (unseen:Movie)
WHERE r2.rating > 7
3. 確保電影類型與 Toy Story 相同
AND watched.genres = unseen.genres
4. 過濾出目標用戶未觀看過的電影
AND NOT ((:Person {username:"target_user"}) -[:RATED]-> (unseen))
5. 回傳與排序推薦結果
RETURN unseen.title, COUNT(*) AS recommendation_count
ORDER BY recommendation_count DESC
LIMIT 25
在 Graph 技術中,k-近鄰(k-NN)推薦是一種基於相似性計算的推薦方法,常用於衡量用戶或項目之間的關聯性,尤其是當我們希望為用戶推薦與其偏好相近的內容時。
場景:(跟剛剛相同)有一用戶剛看完 Toy story ,要推薦下一步他感興趣的電影。
方法:尋找與目標用戶或項目最相似的 k 個鄰居,並根據這些鄰居的行為或評分來進行推薦。
餘弦相似度將每個用戶或項目視為高維向量,通過計算它們之間的角度來衡量相似性。
MATCH (m:Movie) <-[r:RATED]- (b:Person) -[s:SIMILARITY]- (p:Person {name:'Zoltan Varju'})
2. 排除已評分的電影
WHERE NOT (p)-[:RATED]->(m)
3. 計算相似度與評分
WITH m, s.similarity AS similarity, r.rating AS rating
4. 按照相似度排序
ORDER BY m.name, similarity DESC
5. 選取前 3 個鄰居的評分 :收集與 Zoltan Varju 最相似的 3 位鄰居對每部電影的評分
WITH m.name AS movie, COLLECT(rating)[0..3] AS ratings
6. 計算推薦評分
WITH movie, REDUCE(s = 0, i IN ratings | s + i)*1.0 / LENGTH(ratings) AS recommendation
7. 排序與限制結果:回傳最適合的 25 部電影
ORDER BY recommendation DESC
RETURN movie, recommendation LIMIT 25
在這篇筆記中,我們探索了如何使用 Neo4j 進行混合推薦和 KNN 推薦,透過 Graph 技術,能夠更靈活且準確地為用戶生成即時的推薦結果,無論是基於相似用戶還是相似內容。這種方法不僅提升了推薦的質量,也解決了許多傳統推薦系統面臨的瓶頸,例如冷啟動和數據稀疏問題。下回會拿一組 dataset ,並實作在 Neo4j 中構建節點與關係,和實作推薦系統。下次見囉~