由於開發了一個新聞推薦系統的模塊,在推薦算法這一塊涉及到了基於內容的推薦算法(Content-Based Recommendation),因而藉此機會,基於本身看了網上各類資料後對該分類方法的理解,用盡可能清晰明瞭的語言,結合算法和本身開發推薦模塊自己,記錄下這些過程,供本身回顧,也供你們參考~html
1、基於內容的推薦算法 + TFIDFgit
2、在推薦系統中的具體實現技巧程序員
主流推薦算法大體可分爲:github
基於內容(類似度)的推薦算法
基於用戶/物品類似度的協同過濾數據庫
熱點新聞推薦(你看到的那些頭條新聞)編程
基於模型的推薦(經過輸入一些用戶特徵進入模型,產生推薦結果)json
混合推薦(以上十八般兵器一塊兒耍!)服務器
(本文只詳述基於內容的推薦,其它的推薦方法你們能夠另行搜索。)函數
基於內容類似度的推薦:顧名思義,把與你喜歡看的新聞內容類似新聞推薦給你。基於內容的推薦算法的主要優點在於無冷啓動問題,只要用戶產生了初始的歷史數據,就能夠開始進行推薦的計算。並且隨着用戶的瀏覽記錄數據的增長,這種推薦通常也會愈來愈準確。
這裏有兩個重要的關鍵點須要首先有個基本理解:
用戶有歷史的瀏覽記錄,咱們能夠從這些用戶歷史瀏覽的新聞中」提取」能表明新聞主要內容的關鍵詞,看哪些關鍵詞出現的最多。好比能夠有」手機「,」電腦遊戲「,」發佈會「等等關鍵詞。
或者,統計這些新聞所屬的領域是哪些,好比國際政治、社會、民生、娛樂,找出用戶看的新聞來源最多的幾個領域。不過按這種方式判斷用戶興趣容易太寬泛,哪怕是同一個領域下的新聞,可能也會差別很大。好比某用戶可能喜歡A女星,而不喜歡B女星,而若是你只是認爲該用戶喜歡娛樂新聞,結果把B女星的新聞不停給用戶推,那就確定很差。而上述的關鍵詞就能夠比較好地規避這個問題。
找到定義用戶喜愛的方法——關鍵詞,那麼咱們天然而然就能夠想到,能不能提取出兩個新聞的關鍵詞,而後對比看它們兩的關鍵詞是否是相同的呢?恩!思路正確,不過畢竟一個新聞能夠有好幾個關鍵詞,要想所有同樣,仍是比較困難的。因此咱們須要對兩個新聞的關鍵詞匹配程度作一個合理的量化。
那麼這時就要說到TFIDF算法了。
給你們一個連接去看TFIDF算法的具體原理,而此處只是簡單地解釋:TFIDF算法能夠可以返回給咱們一組屬於某篇文本的」關鍵詞-TFIDF值」的詞數對,這些關鍵詞最好地表明瞭這篇文本的核心內容,而這些關鍵詞的相對於本篇文章的關鍵程度由它的TFIDF值量化。
好了,那咱們如今也有了提取關鍵詞並量化關鍵程度的方法,那麼咱們如今就能夠來對比兩篇文本的類似程度了。公式以下:
$$Similarity(A,B)= \Sigma_{i\in m}TFIDF_A*TFIDF_B$$
m是兩篇文章重合關鍵詞的集合。此即將兩篇文本的共同關鍵詞的TFIDF的積所有加在一塊兒,得到最終表明兩篇文本的類似度的值。
舉例: 剛抓進系統的兩個新聞,分別提取出關鍵詞與TFIDF值以下: A新聞:「美女模特」:100,「女裝」:80,「奔馳」:40 B新聞:「程序員」:100,「女裝」:90,「編程」:30 兩篇文章只有一個共同關鍵詞「女裝」,故類似度爲:80*90=7200。
可是實際操做中,以上思路有一個問題了,用戶之前看了辣麼多新聞,每一個新聞有好些個關鍵詞,咱們難道拿剛抓進系統的新聞跟它們一個個比對嗎?
爲了解決這個問題,咱們須要引入新的東西:喜愛關鍵詞表。
其實很好理解:咱們爲每一個用戶在數據庫裏維持一個map,這個map裏放的都是「用戶喜愛的關鍵詞-喜愛程度」這樣的Key-Value對。而這個map最開始固然是空的,而從任意時刻開始,咱們能夠開始跟蹤某用戶的瀏覽行爲,每當該用戶新瀏覽了一條新聞,咱們就把該新聞的「關鍵詞-TFIDF值」「插入」到該用戶的喜愛關鍵詞表中。固然這個「插入」要考慮關鍵詞表裏已經預先有了某預插入的關鍵詞的狀況,那麼在這個基礎上,咱們能夠將預插入的關鍵詞的TFIDF值直接和詞表裏的值加起來。
固然,考慮到存儲問題,咱們能夠爲用戶的喜愛關鍵詞表設定一個容量上限,好比最多1000個詞,固然具體數值仍是須要在實際運行過程根據效果作調整。
最後一個問題。
咱們你們會不會想到,咱們的興趣點多是會隨時間改變的呢?好比這段時間蘋果出了一款新產品,我關注一下,但一個月後,我可能就徹底不在乎這件事了,可是可能蘋果相關的關鍵詞還一直在個人關鍵詞表裏,那會不會致使我依然收到類似的我已經不關心的新聞的推薦呢?也就是如何處理這種興趣遷移問題呢?
爲了解決這個問題,咱們能夠引入一個衰減機制,即讓用戶的關鍵詞表中的每一個關鍵詞喜愛程度都按必定週期保持衰減。考慮到不一樣詞的TFIDF值可能差別已經在不一樣的數量級,咱們考慮用指數衰減的形式來相對進行公平的衰減。即引入一個$\lambda$係數,$1>\lambda>0$,咱們每隔一段時間,對全部用戶的全部關鍵詞喜愛程度進行*$\lambda$的衰減,那麼就完成了模擬用戶興趣遷移的過程。
固然,一直衰減下去,也會使得一些原本就已經徹底不感興趣的關鍵詞可能衰減到了0.0000001了,還在衰減,還死皮賴臉地待在詞表裏佔位置,那麼天然而然,咱們能夠設置一個閾值L,規定對每一個用戶的每次衰減更新完成後,將詞表裏喜愛值小於L的關鍵詞直接清除。
本身實現的推薦系統,包括了協同過濾、基於內容的推薦和基於熱點新聞的推薦,放在Github上了,歡迎拍磚!
這裏TFIDF值的提取我用的是ANSJ,有直接的TFIDF庫函數,直接調用就行,都不用本身分詞。
而在數據庫裏存儲與讀取用戶的關鍵詞表時,我用的是Json形式,相關的工具備fastjson和Jackson,你們選擇本身喜歡的用均可以。
另外,推薦過程是用Quartz定時任務庫定製在天天0點開始執行,包括像衰減機制,各個推薦算法生成各自的推薦結果,都是這個時候完成的。因此這個推薦並非實時的,固然作成實時的徹底也沒問題,只要服務器性可以好。
這裏只是提出本身的一個實現思路,思路的造成過程也是在看了許多推薦系統相關的學術文獻並進行了本身的總結與改變,並不是權威的作法,歡迎各位提出修正意見。
據說幾年前開始,ACM有一個每一年舉辦的推薦系統學術會議叫RecSys,有興趣的小夥伴們也能夠關注一下。
有問題歡迎私信我!