個性化閱讀中的推薦系統(一)

最近要爲一個資訊類的項目加入個性化推薦的邏輯,以給用戶展示更加符合其閱讀偏好的文章,提高點擊率。之前研究過相關理論,這次在工程中應用上,也屬於一邊摸索一邊實踐的過程。

概述

推薦系統中常用的推薦算法有:
- 基於內容的推薦content-based
- 協同過濾collaborative filtering
- 基於模型的推薦,隱語義模型(LFM, latent factor model)推薦,機器學習的模型等

不同的推薦算法有着不同的效果、優點、缺點,適合不同的場景,這個系列的文章用於記錄這幾種算法的實現過程。

基於內容的推薦

基於內容的推薦算法主要思想是爲用戶推薦與過去喜歡的item類似的item,比如一個用戶看過絕地求生98K好用嗎的的文章,那麼就可以給他推薦絕地求生98k怎麼好用的文章。
基於內容的推薦可以分爲以下三步:

  1. 建立文章的特徵向量,用來描述這篇文章的關鍵信息,這裏可以使用TF-IDF模型建立一個特徵矩陣來描述文章的特徵
  2. 建立用戶模型,用來描述用戶具有哪些偏好,可以通過計算用戶瀏覽過的文章的TF-IDF矩陣的均值作爲用戶模型
  3. 在推薦過程中,根據用戶模型檢索類似的文章,可以通過檢索Top N個與用戶模型特徵向量相似的文章向量,作爲用戶的推薦

但是在這個流程中有一個問題,第3步在工程實現中,如果文章的數量很大,需要計算每篇文章與用戶模型的相似度,時間和空間複雜度會很高,所以這裏進行了簡化,取用戶當前瀏覽的文章作爲用戶模型,這樣可以通過離線計算的方式,提前計算出每篇文章的相似結果。

準備階段

無論是在構建TF-IDF矩陣還是爲文章打標籤的過程中,分詞都是一個重要的階段,而目前的數據中大部分是遊戲相關的文章,多數主流的分詞工具都是基於人民日報語料進行訓練得到的詞典,所以第一步需要對詞典進行完善。也就是從這些語料中提取王者榮耀、絕地求生、陰陽師、天美工作室這樣的領域化的詞語。

這裏參考了互聯網時代的社會語言學:基於SNS的文本數據挖掘這個博客中提出的方法,後面會單獨寫一篇文章講解這個思路和實現方式

將發現出的領域詞彙增加到分詞工具詞典中,這裏使用了清華大學的分詞工具thulac,使得分詞過程中可以提取出這些詞語。

對500萬字的語料進行分析,提取了16000個詞,包括了貪玩藍月、紅蓮斗篷、反傷刺甲等詞

基於內容推薦

第一步:將文章向量化
語言都是由詞和句組成的,利用出現在文章中的詞表示該篇文章,每個詞的權重使用信息檢索中的TF-IDF來計算,利用這種方法,就將一篇文章用一個向量來表示。可以很方便的使用scikit-learn提供的函數計算。

第二步:計算文章相似度
現在已經將每一篇文章用一個向量表示,那麼下一步就是要找到與某一篇文章相似的文章,也就是與一個向量相似的向量。計算向量相似度的方法有很多,像歐幾里得公式、餘弦相似度公式、傑卡德公式等。這裏使用了餘弦相似度進行計算,這個計算方法也比較好理解,空間上的兩個向量其夾角越小即越相似,也就是餘弦值越接近1越相似。
這裏寫圖片描述
scikit-learn同樣提供了方便的函數進行計算,可以參考這篇文章,通過計算所有文章向量之間的相似度,得到了一篇文章與哪些文章相似,將其存在redis等存儲中。

第三步:推薦給用戶
當用戶點擊一篇文章時,讀取存儲中與該篇文章相似度前K的文章,推薦給用戶。

效果觀察

在實現了第一版後,發現存在兩個問題:
一是當文章比較多時,需要兩兩計算餘弦相似度,計算量比較大
二是當文章不夠多時,推薦算法召回的文章數量過少

解決方案:由於資訊類文章具有一部分時效性,所以每次只計算3天或者一週內的相似文章,做一個折中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章