1. 程式人生 > >基於KNN的相關內容推薦

基於KNN的相關內容推薦

  如果做網站的內容運營,相關內容推薦可以幫助使用者更快地尋找和發現感興趣的資訊,從而提升網站內容瀏覽的流暢性,進而提升網站的價值轉化。相關內容推薦最常見的兩塊就是“關聯推薦”和“相關內容推薦”,關聯推薦就是我們常說的購物籃分析,即使用購買了某商品的使用者同時購買了什麼這個規則來發現商品間的潛在聯絡,之前有相關的文章介紹——向上營銷、交叉營銷與關聯推薦;關聯推薦是基於使用者行為分析的推薦,而相關內容推薦是基於內容固有特徵的推薦,只與內容本身有關,與使用者的行為完全無關,所以相關內容推薦的模型是一種“冷啟動”的演算法,不需要任何歷史瀏覽訪問資料的支援。

內容固有屬性

  相關內容推薦因為完全不借助使用者瀏覽行為的資料,所以底層資料不依賴於網站的點選流日誌,唯一的基礎資料就是內容的固有屬性及完整資訊。我們以豆瓣網的幾大塊內容為例來看看對於這些內容一般包含哪些固有屬性:

書籍 書名、作者、出版時間、出版社、分類、標籤
音樂 專輯名、歌手、發行時間、發行方、風格流派、標籤
電影 電影名稱、導演、演員、上映時間、製片方、型別、標籤

  豆瓣很多地方都使用了“標籤”這個詞,用貼標籤的形式來完成內容的分類和標識,但其實標籤又分為很多種,有些標籤是在內容生成時就被貼上的,有些可能是後續使用者貼上去的,而且豆瓣一般為內容和標籤定義了原始分類,如書籍分為文學、流行、文化……既然分類和標籤內容源生就帶有,那同樣可以作為內容的固有屬性。

  還需要說明的是,這裡不涉及文字挖掘和字元切分模糊匹配等問題,因此內容的標題、簡介和全文不參與文字相似度的分析,雖然這些可能在構建完整的相關內容模型中不可缺少,但這裡只考慮一些固有屬性是否相同實現簡單應用。基於上述豆瓣幾類內容的屬性特徵,選擇和整理適合分析的內容屬性如下:

attributes-of-content

  “作者”就是指內容的創造者,“來源”指內容的釋出方或獲取渠道,“分類”為內容歸屬的類別,“標籤”可以包含對內容的各類描述資訊和關鍵詞等。這裡為了能夠儘可能清晰地描述整個分析模型和思路只選取了大部分內容都包含的一些屬性,如果要構建更加高效的相關內容分析模型,需要更完整的內容屬性,可以根據自身內容的特徵進行屬性的定義和選取。

KNN演算法及應用

  KNN(K-Nearest Neighbor algorithm),K最近鄰演算法,通過計算樣本個體間的距離或者相似度尋找與每個樣本個體最相近的K個個體,演算法的時間複雜度跟樣本的個數直接相關,需要完成一次兩兩比較的過程。KNN一般被用於分類演算法,在給定分類規則的訓練集的基礎上對總體的樣本進行分類,是一種監督學習(Supervised learning)方法。

KNN

  這裡我們不用KNN來實現分類,我們使用KNN最原始的演算法思路,即為每個內容尋找K個與其最相似的內容,並推薦給使用者。相當於每個內容之間都會完成一次兩兩比較的過程,如果你的網站有n個內容,那麼演算法的時間複雜度為Cn2,即n(n-1)/2。但是用內容固有屬性有一個好處就是因為固有屬性一旦建立後基本保持不變,因此演算法輸出的資料一旦計算好之後不需要重複計算去重新整理,也就是對於網站內容而言,原有內容的資料在首次初始化之後可以不斷重複使用,只要更新新增內容的資料就可以,資料的統計計算可以使用增量更新的形式,這樣可以有效地減少伺服器的計算壓力。

相關內容模型

  有了基礎資料和演算法的支援,我們就可以建立資料模型了。先看下基礎資料的型別,作者、分類、來源和標籤都是字元型,其中作者、分類、來源基本可以當做是單個值的屬性,標籤一般包含多個值。首先由於都是字元可以確定屬性之間相似性的判定只能通過“是否相同”,無法體現數值上的差異,所以對於作者、分類、來源這幾個單值屬性而言,比較的結果就是一個布林型的度量,相同或者不相同;對於標籤這個多值屬性可以考慮使用Jaccard相關係數,但因為每個內容標籤的個數存在較大差異,使用驗證後的結果並不理想,所以不考慮使用(當然,如果內容的標籤個數比較固定,Jaccard相關係數是有效的)。因此,直接建立加權相似度模型如下,首先是標籤的相似度分值設定:

相同標籤數 圖書比例 相似度分值
0 70% 0
1 20% 1
2 6% 2
3 3% 4
>=4 1% 5

  再結合作者、分類和來源,通過加權設定總體的相似度分值:

屬性 相同時分值 不同時分值 權重 加權分值分佈
作者 1 0 25 [0,25]
分類 1 0 10 [0,10]
來源 1 0 15 [0,15]
標籤 [1,5] 0 10 [0,50]

  將所有屬性加權相似度分值的結果相加應該分佈在[0,100],分值越高說明內容間的相似度越高。對於這種簡單的加權相似度評分模型,估計又有很多人要問權重是怎麼確定的,確實,這裡的權重並沒有通過任何定量分析模型的方法去計算,只是簡單的經驗估計,但估計的過程經過反覆地調整和優化,也就是不斷地嘗試調整各屬性的權重係數並輸出結果,抽樣檢驗結果是否符合預期、是否有提升優化的空間。

  基於上述內容間相似度的計算結果,套用KNN的原理實現相關內容推薦就異常簡單了,只要根據每個內容與之比較的所有內容的相似度分值降序排列取前K個內容作為該內容的最相關內容推薦給使用者就可以了。當然中間可能會涉及相同相似度分值的內容如何排序的問題(因為模型的關係分值分佈可能不會很離散),建議如果相似度分值相同使用隨機排序,以保證推薦結果有一定的變化,均勻內容的曝光。

  好了,所有的分析流程介紹完了,好像跟前一篇的距離和相似度度量完全沒有關係,其實距離和相似度度量是KNN的基礎演算法,因為KNN的個體相似度或鄰近的距離都會選擇距離度量和相似度度量中的某種方法進行計算,但這裡考慮到了現實的資料情況和應用環境,並不是KNN就一定要硬套歐氏距離,其實換一種簡單的方法可能反而更加適合整個模型,而且模型的最終效果可能會更理想。所以一切的資料探勘演算法的選擇和使用都是基於資料模型的有效性和輸出結果的效果來決定的,並不是簡單的演算法效果就一定不好,而高階複雜的演算法一定更加有效。對了,如果你已經做了相關內容推薦,那麼優化相關內容推薦這篇文章裡面介紹的一些方法將是檢驗推薦效果的一個很好的參考。