做者:July。出處:結構之法算法之道html
引言python
昨日看到幾個關鍵詞:語義分析,協同過濾,智能推薦,想着想着便興奮了。因而昨天下午開始到今天凌晨3點,便研究了一下推薦引擎,作了初步瞭解。往後,自會慢慢深刻仔細研究(往後的工做亦與此相關)。固然,此文也會慢慢補充完善。web
本文做爲對推薦引擎的初步介紹的一篇導論性的文章,將略去大部分的具體細節,側重用最簡單的語言簡要介紹推薦引擎的工做原理以及其相關算法思想,且爲了着重淺顯易懂有些援引自本人1月7日在微博上發表的文字(特意整理下,方便往後隨時翻閱),儘可能保證本文的短小。不過,事與願違的是,文章後續補充完善,越寫越長了。面試
同時,本文全部相關的算法都會在往後的文章一一陸續具體闡述。本文但求微言導論,往後但求具體而論。如有任何問題,歡迎隨時不吝賜教或批評指正。謝謝。算法
一、推薦引擎原理數據庫
推薦引擎盡最大努力的收集儘量多的用戶信息及行爲,所謂廣撒網,勤捕魚,而後「特別的愛給特別的你」,最後基於類似性的基礎之上持續「給力」,原理以下圖所示(圖引自本文的參考資料之一:探索推薦引擎內部的祕密):編程
二、推薦引擎的分類網絡
推薦引擎根據不一樣依據以下分類:數據結構
根據其是否是爲不一樣的用戶推薦不一樣的數據,分爲基於大衆行爲(網站管理員自行推薦,或者基於系統全部用戶的反饋統計計算出的當下比較流行的物品)、及個性化推薦引擎(幫你找志同道合,趣味相投的朋友,而後在此基礎上實行推薦);app
根據其數據源,分爲基於人口統計學的(用戶年齡或性別相同斷定爲類似用戶)、基於內容的(物品具備相同關鍵詞和Tag,沒有考慮人爲因素),以及基於協同過濾的推薦(發現物品,內容或用戶的相關性推薦,分爲三個子類,下文闡述);
根據其創建方式,分爲基於物品和用戶自己的(用戶-物品二維矩陣描述用戶喜愛,聚類算法)、基於關聯規則的(The Apriori algorithm算法是一種最有影響的挖掘布爾關聯規則頻繁項集的算法)、以及基於模型的推薦(機器學習,所謂機器學習,即讓計算機像人腦同樣持續學習,是人工智能領域內的一個子領域)。
關於上述第二個分類(二、根據其數據源)中的基於協同過濾的推薦:隨着 Web2.0 的發展,Web 站點更加提倡用戶參與和用戶貢獻,所以基於協同過濾的推薦機制因運而生。它的原理很簡單,就是根據用戶對物品或者信息的偏好,發現物品或者內容自己的相關性,或者是發現用戶的相關性,而後再基於這些關聯性進行推薦。
而基於協同過濾的推薦,又分三個子類:
基於用戶的推薦(經過共同口味與偏好找類似鄰居用戶,K-鄰居算法,你朋友喜歡,你也可能喜歡),
基於項目的推薦(發現物品之間的類似度,推薦相似的物品,你喜歡物品A,C與A類似,可能也喜歡C),
基於模型的推薦(基於樣本的用戶喜愛信息構造一個推薦模型,而後根據實時的用戶喜愛信息預測推薦)。
咱們看到,此協同過濾算法最大限度的利用用戶之間,或物品之間的類似相關性,然後基於這些信息的基礎上實行推薦。下文還會具體介紹此協同過濾。不過通常實踐中,咱們一般仍是把推薦引擎分兩類:
第一類稱爲協同過濾,即基於類似用戶的協同過濾推薦(用戶與系統或互聯網交互留下的一切信息、蛛絲馬跡,或用戶與用戶之間千絲萬縷的聯繫),以及基於類似項目的協同過濾推薦(盡最大可能發現物品間的類似度);第二類即是基於內容分析的推薦(調查問卷,電子郵件,或者推薦引擎對本blog內容的分析)。
三、新浪微博推薦機制
在新浪微博推薦好友的機制中:一、我與A非好友,但個人好友中有很多人與A是好友,即我和A有很多共同的好友,那麼系統便會把A也推薦給我(新浪稱之爲共同好友);二、我關注的人中有很多人關注了B,那麼系統推測我也可能會喜歡B,從而亦會把B也推薦給我(新浪稱之爲間接關注人)。
但新浪實際操做起來,這兩種方式會攪在一塊兒,如我關注的人中,有很多人關注了B,但事實上這關注B的很多人中有些也是個人好友。以上推薦方式,統稱爲基於類似用戶的協同過濾推薦(無非就是找到:用戶與用戶之間千絲萬縷的聯繫,或是從你的好友入手,或是從你關注的人入手)。
固然,還有一類好比人氣用戶推薦,即是上文所述的基於大衆行爲的推薦,即人云亦云、跟風。系統推測你們都喜歡的,可能你也會喜歡。如你們都知道姚晨新浪微博粉絲數量排第一,則爭相關注,最終粉絲量越推越高。兩種推薦方式以下圖所示:
不過,上述不管是基於用戶的推薦方式,仍是基於大衆行爲的推薦都並無真正尋找到用戶與用戶之間共同的興趣,偏好和口味,由於不少的時候,朋友的朋友不必定能成爲你本身的朋友,且有的人清高於世,大家都追求的,我偏不屑。因此,從分析用戶發表的微博的內容相關入手,找到各自共同的關注點、興趣點纔是王道。固然新浪微博最近讓用戶選擇給本身發表的微博內容打上標籤,以利於往後尋找微博內容中相關用戶共同的標籤tag,關鍵詞,此種推薦方式正是基於微博內容分析的推薦。以下圖:
只是問題是,誰會竭盡全力發完微博後,還去給它添加什麼標籤呢?因此,新浪微博還得努力,尋找另外一種更好地分析微博內容的方式。否則系統全盤掃描海里用戶的海里微博內容,則恐怕吃不消也負擔不起。
然我的以爲卻是能夠從微博關鍵詞(標籤tag雲)和每一個用戶爲本身打的標籤(打着越多的共同標籤可定義爲類似用戶)入手,以下圖左右部分所示:
也就是說,經過共同的好友和經過間接關注的人來定義類似用戶是不靠譜的,只有經過基於微博內容的分析尋找類似用戶纔是可行之道,同時,更進一步,經過微博內容分析獲得標籤tag雲後,再從中找到相同或相近的標籤tag雲尋找類似的用戶無疑比已有推薦好友方式(經過共同的好友和經過間接關注的人來定義類似用戶)更靠譜。
3.一、多種推薦方式結合
在現行的 Web 站點上的推薦每每都不是單純只採用了某一種推薦的機制和策略,他們每每是將多個方法混合在一塊兒,從而達到更好的推薦效果。
舉個例子如Amazon中除此基於用戶的推薦以外,還會用到基於內容的推薦(物品具備相同關鍵詞和Tag):如新產品的推薦;基於項目的協同過濾推薦(喜歡A,C與A相似,可能也喜歡C):如捆綁銷售and別人購買/瀏覽的商品。
總之,多種推薦方式結合,加權(用線性公式(linear formula)將幾種不一樣的推薦按照必定權重組合起來,具體權重的值須要在測試數據集上反覆實驗,從而達到最好的推薦效果。)、切換、分區、分層等混合。但不管是哪一種推薦方式,通常也就涵蓋在上文所述的推薦方式中。
四、協同過濾推薦
協同過濾是利用集體智慧的一個典型方法。要理解什麼是協同過濾 (Collaborative Filtering, 簡稱 CF),首先想一個簡單的問題,若是你如今想看個電影,但你不知道具體看哪部,你會怎麼作?大部分的人會問問周圍的朋友或者稱之爲廣義上的鄰居(neighborhood),看看最近有什麼好看的電影推薦,而咱們通常更傾向於從口味比較相似的朋友那裏獲得推薦。這就是協同過濾的核心思想。以下圖,你能從圖中看到多少信息?
4.一、協同過濾推薦步驟
作協同過濾推薦,通常要作好如下幾個步驟:
1)若要作協同過濾,那麼收集用戶偏好則成了關鍵。能夠經過用戶的行爲諸如評分(如不一樣的用戶對不一樣的做品有不一樣的評分,而評分接近則意味着喜愛口味相近,即可斷定爲類似用戶),投票,轉發,保存,書籤,標記,評論,點擊流,頁面停留時間,是否購買等得到。以下面第2點所述:全部這些信息均可以數字化,如一個二維矩陣表示出來。
2)收集了用戶行爲數據以後,咱們接下來便要對數據進行減噪與歸一化操做(獲得一個用戶偏好的二維矩陣,一維是用戶列表,另外一維是物品列表,值是用戶對物品的偏好,通常是 [0,1] 或者 [-1, 1] 的浮點數值)。下面再簡單介紹下減噪和歸一化操做:
所謂減噪:用戶行爲數據是用戶在使用應用過程當中產生的,它可能存在大量的噪音和用戶的誤操做,咱們能夠經過經典的數據挖掘算法過濾掉行爲數據中的噪音,這樣能夠是咱們的分析更加精確(相似於網頁的去噪處理)。
所謂歸一化:將各個行爲的數據統一在一個相同的取值範圍中,從而使得加權求和獲得的整體喜愛更加精確。最簡單的歸一化處理,即是將各種數據除以此類中的最大值,以保證歸一化後的數據取值在 [0,1] 範圍中。至於所謂的加權,很好理解,由於每一個人佔的權值不一樣,相似於一場唱歌比賽中對某幾個選手進行投票決定其是否晉級,觀衆的投票抵1分,專家評委的投票抵5分,最後得分最多的選手直接晉級。
3)找到類似的用戶和物品,經過什麼途徑找到呢?即是計算類似用戶或類似物品的類似度。
4)類似度的計算有多種方法,不過都是基於向量Vector的,其實也就是計算兩個向量的距離,距離越近類似度越大。在推薦中,用戶-物品偏好的二維矩陣下,咱們將一個用戶對全部物品的偏好做爲一個向量來計算用戶之間的類似度,或者將全部用戶對某個物品的偏好做爲一個向量來計算物品之間的類似度。
類似度計算算法能夠用於計算用戶或者項目類似度。以項目類似度計算(Item Similarity Computation)爲列,通性在於都是從評分矩陣中,爲兩個項目i,j挑選出共同的評分用戶,然對這個共同用戶的評分向量,進行計算類似度si,j,以下圖所示,行表明項目,列表明用戶(注意到是從i,j向量中抽出共有的評論,組成的一對向量,進行類似度計算):
因此說,很簡單,找物品間的類似度,用戶不變,找多個用戶對物品的評分;找用戶間的類似度,物品不變,找用戶對某些個物品的評分。
5)而計算出來的這兩個類似度則將做爲基於用戶、項目的兩項協同過濾的推薦。常見的計算類似度的方法有:歐幾里德距離,皮爾遜相關係數(如兩個用戶對多個電影的評分,採起皮爾遜相關係數等相關計算方法,能夠抉擇出他們的口味和偏好是否一致),Cosine類似度,Tanimoto係數。下面,簡單介紹其中的歐幾里得距離與皮爾遜相關係數:
歐幾里德距離(Euclidean Distance)是最初用於計算歐幾里德空間中兩個點的距離,假設 x,y 是 n 維空間的兩個點,它們之間的歐幾里德距離是:
能夠看出,當 n=2 時,歐幾里德距離就是平面上兩個點的距離。當用歐幾里德距離表示類似度,通常採用如下公式進行轉換:距離越小,類似度越大(同時,避免除數爲0):
餘弦類似度Cosine-based Similarity兩個項目 i ,j 視做爲兩個m維用戶空間向量,類似度計算經過計算兩個向量的餘弦夾角,那麼,對於m*n的評分矩陣,i ,j 的類似度sim( i , j ) 計算公式:
(其中 " · "記作兩個向量的內積)皮爾遜相關係數通常用於計算兩個定距變量間聯繫的緊密程度,爲了使計算結果精確,須要找出共同評分的用戶。記用戶集U爲既評論了 i 又評論了 j 的用戶集,那麼對應的皮爾森相關係數計算公式爲:
其中Ru,i 爲用戶u 對項目 i 的評分,對應帶橫槓的爲這個用戶集U對項目i的評分評分。
6)類似鄰居計算。鄰居分爲兩類:一、固定數量的鄰居K-neighborhoods (或Fix-size neighborhoods),不論鄰居的「遠近」,只取最近的 K 個,做爲其鄰居,以下圖A部分所示;二、基於類似度門檻的鄰居,落在以當前點爲中心,距離爲 K 的區域中的全部點都做爲當前點的鄰居,以下圖B部分所示。
再介紹一下K最近鄰(k-Nearest Neighbor,KNN)分類算法:這是一個理論上比較成熟的方法,也是最簡單的機器學習算法之一。該方法的思路是:若是一個樣本在特徵空間中的k個最類似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。
7)通過4)計算出來的基於用戶的CF(基於用戶推薦之用:經過共同口味與偏好找類似鄰居用戶,K-鄰居算法,你朋友喜歡,你也可能喜歡),基於物品的CF(基於項目推薦之用:發現物品之間的類似度,推薦相似的物品,你喜歡物品A,C與A類似,那麼你可能也喜歡C)。
通常來講,社交網站內如facebook宜用User CF(用戶多嘛),而購書網站內如Amazon宜用Item CF(你此前看過與此相似的書比某某也看過此書更令你信服,由於你識書不識人)。
4.二、基於項目類似度與基於用戶類似度的差別
上述3.1節中三個類似度公式是基於項目類似度場景下的,而實際上,基於用戶類似度與基於項目類似度計算的一個基本的區別是,基於用戶類似度是基於評分矩陣中的行向量類似度求解,基於項目類似度計算式基於評分矩陣中列向量類似度求解,而後三個公式分別均可以適用,以下圖:
(其中,爲0的表示未評分)
基於項目類似度計算式計算如Item3,Item4兩列向量類似度;
基於用戶類似度計算式計算如User3,User4量行向量類似度。
五、聚類算法
聚類聚類,通俗的講,即所謂「物以類聚,人以羣分」。聚類 (Clustering) 是一個數據挖掘的經典問題,它的目的是將數據分爲多個簇 (Cluster),在同一個簇中的對象之間有較高的類似度,而不一樣簇的對象差異較大。
5.一、K 均值聚類算法
K-均值(K-Means)聚類算法與處理混合正態分佈的最大指望算法很類似,由於他們都試圖找到數據中天然聚類的中心。此算法假設對象屬性來自於空間向量,目標是使各個羣組內部的均方偏差總和最小。
K均值聚類算法首先會隨機肯定K箇中心位置(位於空間中表明聚類中心的點),而後將各個數據項分配給最臨近的中心點。待分配完成以後,聚類中心就會移到分配給該聚類的全部節點的平均位置處,而後整個分配過程從新開始。這一過程會一直重複下去,直到分配過程再也不產生變化爲止。下圖是包含兩個聚類的K-均值聚類過程:
如下代碼所示便是此K-均值聚類算法的python實現: //K-均值聚類算法 import random def kcluster(rows,distance=pearson,k=4): # 肯定每一個點的最小值和最大值 ranges=[(min([row[i] for row in rows]),max([row[i] for row in rows])) for i in range(len(rows[0]))] # 隨機建立k箇中心點 clusters=[[random.random()*(ranges[i][14]-ranges[i][0])+ranges[i][0] for i in range(len(rows[0]))] for j in range(k)] lastmatches=None for t in range(100): print 'Iteration %d' % t bestmatches=[[] for i in range(k)] # 在每一行中尋找距離最近的中心點 for j in range(len(rows)): row=rows[j] bestmatch=0 for i in range(k): d=distance(clusters[i],row) if d<distance(clusters[bestmatch],row): bestmatch=i bestmatches[bestmatch].append(j) # 若是結果與上一次相同,則整個過程結束 if bestmatches==lastmatches: break lastmatches=bestmatches # 把中心點移到其全部成員的平均位置 for i in range(k): avgs=[0.0]*len(rows[0]) if len(bestmatches[i])>0: for rowid in bestmatches[i]: for m in range(len(rows[rowid])): avgs[m]+=rows[rowid][m] for j in range(len(avgs)): avgs[j]/=len(bestmatches[i]) clusters[i]=avgs # 返回k組序列,其中每一個序列表明一個聚類 return bestmatches
k-Means是一種機器學習領域中的一種非監督學習。下面,簡要介紹下監督學習與無監督學習:
監管學習的任務是學習帶標籤的訓練數據的功能,以便預測任何有效輸入的值。監管學習的常見例子包括將電子郵件消息分類爲垃圾郵件,根據類別標記網頁,以及識別手寫輸入。建立監管學習程序須要使用許多算法,最多見的包括神經網絡、Support Vector Machines (SVMs) 和 Naive Bayes 分類程序。無監管學習的任務是發揮數據的意義,而無論數據的正確與否。它最常應用於將相似的輸入集成到邏輯分組中。它還能夠用於減小數據集中的維度數據,以便只專一於最有用的屬性,或者用於探明趨勢。無監管學習的常見方法包括K-Means,分層集羣和自組織地圖。
5.二、Canopy 聚類算法
Canopy 聚類算法的基本原則是:首先應用成本低的近似的距離計算方法高效的將數據分爲多個組,這裏稱爲一個 Canopy,咱們姑且將它翻譯爲「華蓋」,Canopy 之間能夠有重疊的部分;而後採用嚴格的距離計算方式準確的計算在同一 Canopy 中的點,將他們分配與最合適的簇中。Canopy 聚類算法常常用於 K 均值聚類算法的預處理,用來找合適的 k 值和簇中心。
5.三、模糊 K 均值聚類算法
模糊 K 均值聚類算法是 K 均值聚類的擴展,它的基本原理和 K 均值同樣,只是它的聚類結果容許存在對象屬於多個簇,也就是說:它屬於咱們前面介紹過的可重疊聚類算法。爲了深刻理解模糊 K 均值和 K 均值的區別,這裏咱們得花些時間瞭解一個概念:模糊參數(Fuzziness Factor)。
與 K 均值聚類原理相似,模糊 K 均值也是在待聚類對象向量集合上循環,可是它並非將向量分配給距離最近的簇,而是計算向量與各個簇的相關性(Association)。假設有一個向量 v,有 k 個簇,v 到 k 個簇中心的距離分別是 d1,d2⋯ dk,那麼 V 到第一個簇的相關性 u1能夠經過下面的算式計算:
計算 v 到其餘簇的相關性只需將 d1替換爲對應的距離。從上面的算式,咱們看出,當 m 近似 2 時,相關性近似 1;當 m 近似 1 時,相關性近似於到該簇的距離,因此 m 的取值在(1,2)區間內,當 m 越大,模糊程度越大,m 就是咱們剛剛提到的模糊參數。
其他聚類算法本文再也不介紹。關於冷啓動、數據稀疏、可擴展性、可移植性、可解釋性、多樣性、推薦信息的價值等問題則待後續闡述。
六、分類算法
接下來,分類算法有不少,本文介紹決策樹學習,與貝葉斯定理。
6.一、決策樹學習
我們直接切入正題。所謂決策樹,顧名思義,是一種樹,一種依託於策略抉擇而創建起來的樹。
機器學習中,決策樹是一個預測模型;他表明的是對象屬性與對象值之間的一種映射關係。樹中每一個節點表示某個對象,而每一個分叉路徑則表明的某個可能的屬性值,而每一個葉結點則對應從根節點到該葉節點所經歷的路徑所表示的對象的值。決策樹僅有單一輸出,若欲有複數輸出,能夠創建獨立的決策樹以處理不一樣輸出。從數據產生決策樹的機器學習技術叫作決策樹學習, 通俗說就是決策樹。
來理論的太過抽象,下面舉兩個淺顯易懂的例子:
第一個例子:通俗來講,決策樹分類的思想相似於找對象。現想象一個女孩的母親要給這個女孩介紹男友,因而有了下面的對話:
女兒:多大年紀了? 母親:26。 女兒:長的帥不帥? 母親:挺帥的。 女兒:收入高不? 母親:不算很高,中等狀況。 女兒:是公務員不? 母親:是,在稅務局上班呢。 女兒:那好,我去見見。
這個女孩的決策過程就是典型的分類樹決策。至關於經過年齡、長相、收入和是否公務員對將男人分爲兩個類別:見和不見。假設這個女孩對男人的要求是:30歲如下、長相中等以上而且是高收入者或中等以上收入的公務員,那麼這個能夠用下圖表示女孩的決策邏輯:
也就是說,決策樹的簡單策略就是,比如公司招聘面試過程當中篩選一我的的簡歷,若是你的條件至關比如如說清華博士畢業,那麼二話不說,直接叫過來面試,若是非重點大學畢業,但實際項目經驗豐富,那麼也要考慮叫過來面試一下,即所謂具體狀況具體分析、決策。
第二個例子來自Tom M.Mitchell著的機器學習一書:
小王的目的是經過下週天氣預報尋找何時人們會打高爾夫,他了解人們決定是否打球的緣由最主要取決於天氣狀況。而天氣情況有晴,雲和雨;氣溫用華氏溫度表示;相對溼度用百分比;還有有無風。如此,咱們即可以構造一棵決策樹,以下(根據天氣這個分類決策這天是否合適打網球):
上述決策樹對應於如下表達式:(Outlook=Sunny ^Humidity<=70)V (Outlook = Overcast)V (Outlook=Rain ^ Wind=Weak)。獲得的最佳分類屬性以下圖所示:
在上圖中,計算了兩個不一樣屬性:溼度(humidity)和風力(wind)的信息增益,最終humidity這種分類的信息增益0.151>wind增益的0.048。說白了,就是在星期六上午是否適合打網球的問題訣策中,採起humidity較wind做爲分類屬性更佳,決策樹由此而來。
ID3算法決策樹的造成
OK,下圖爲ID3算法第一步後造成的部分決策樹。這樣綜合起來看,就容易理解多了。一、overcast樣例必爲正,因此爲葉子結點,總爲yes;二、ID3無回溯,局部最優,而非全局最優,還有另外一種樹後修剪決策樹。下圖是ID3算法第一步後造成的部分決策樹:
6.二、貝葉斯分類的基礎:貝葉斯定理
貝葉斯定理:已知某條件機率,如何獲得兩個事件交換後的機率,也就是在已知P(A|B)的狀況下如何求得P(B|A)。這裏先解釋什麼是條件機率:
表示事件B已經發生的前提下,事件A發生的機率,叫作事件B發生下事件A的條件機率。其基本求解公式爲:。
貝葉斯定理之因此有用,是由於咱們在生活中常常遇到這種狀況:咱們能夠很容易直接得出P(A|B),P(B|A)則很難直接得出,但咱們更關心P(B|A),貝葉斯定理就爲咱們打通從P(A|B)得到P(B|A)的道路。
下面不加證實地直接給出貝葉斯定理(公式被網友指出有問題,待後續驗證改正):
七、推薦實例擴展
7.一、閱讀推薦
先來看一段文字(摘自36kr):
」北京十分科技也很是看好閱讀推薦類的應用,他們花了很是大的精力(一年60人團隊),纔在今天推出了iPhone版「酷雲閱讀」。
爲何要投入這麼多人去作這個閱讀應用?CEO 李鵬告訴我,這個團隊超過一半的人都在作後臺相關的東西,包括語義分析、機器學習等算法。他們的目的是將互聯網「語義化」之後,把人的興趣明確,最後把每一個人感興趣的內容推薦給相關的人。在iPhone上,酷雲的大體作法和Zite iPad版相似,用戶的行爲也是有「喜歡」、「不喜歡」,以及點擊相應的媒體來源或者相關的標籤來告訴酷雲你但願之後看到更多這些內容。
這個目的是大部分閱讀推薦應用都有的,可是酷雲的作法彷佛更加變態。他們除了天天要抓取來自互聯網的超過10萬篇文章以外,還對全國200個的電視臺播出的視頻內容進行了索引,以便用戶也能夠經過文字搜索出視頻、以及對視頻內容進行同樣的推薦。大體作法是先把這些節目都錄製下來,而後把聲音轉文字,最後創建摘要和索引。「
通常的推薦系統應用的算法是有上文所述的什麼協同過濾那般複雜呢?如下是援引自本人1月21日所發在微博上的文`:
而後我還對上面的那句:先把這些視頻節目都錄製下來,而後把聲音轉文字有點疑問。咱們已經知道若是是音樂的話像豆瓣FM多是以下的作法:
你喜歡一些歌曲,而我也喜歡一些歌曲,若是你我喜歡的歌曲中有不少是重複相似的,則系統會把你我定義爲好友,即類似用戶,基於用戶的協同過濾推薦:朋友喜歡,你也可能喜歡 ;還有一個就是針對歌曲的推薦,你喜歡一首歌曲A,而另外一首歌曲B與歌曲A相似(如都是有關愛情、感傷一類的),因此係統猜想你也可能喜歡B,而把B推薦給你。這就是基於項目(物品)的協同過濾推薦。
根據所聽歌曲的重複相似斷定爲好友從而基於用戶的協同過濾進行推薦,經過某些歌曲是差很少相似的來基於項目的協同過濾進行推薦,但問題出來了,重複的好說,同一首歌曲同一個歌手嘛,可那些類似音樂歌曲又如何定義斷定呢?經過系統去分析歌曲的頻譜?區別各個歌曲節奏的快慢,音頻?此舉雖然看起來有效,但實際實行起來不太現實。
我以爲應該是爲那些音樂打上標籤tag(估計視頻也是這麼作的,便於往後查找索引。全視頻的實錄目前以爲仍是不靠譜),如打上「愛情」「感傷」一類的tag,然後tag相同的則可斷定爲類似歌曲。但關鍵是怎麼打?語音識別?
7.二、標籤tag怎麼打
初期能夠人肉,爬蟲,買數據庫,等流量上來了,能夠考慮ugc。所謂ugc,用戶產生內容。可是用戶通常不太可能本身給音樂打標籤,太繁瑣了(如最近的新浪微博的每條微博內容下多了一個「加標籤」的提示,但有多少用戶願去理它呢?),固然有的系統也會爲你自動產生一些標籤tag(固然,你也能夠自行加上一些標籤),如新浪博客:
如何作到的呢?個人想法是,
應該是系統在背後掃描你的文章一遍,而後提取一些關鍵詞做爲tag,供你選擇。取哪些關鍵詞呢?固然是取高頻詞。掃描整篇文章,統計每一個單詞出現的頻率。
而後取其前TOP K,如上面截圖中的「算法」在那篇文章中出現了4次,「博客」出現了3次,因此係統爲你自動匹配這些標籤。
至於採起何種數據結構或方法來統計這些關鍵詞的頻率呢。通常的應用hash+堆(11、從頭至尾完全解析Hash表算法),或trie樹(從Trie樹談到後綴樹)都可。但當trie樹面對的是漢字中文的時候,就比較麻煩了。因此hash+堆是比較理想的選擇。
一樣,針對視頻的話,應該也是相似的:一、經過系統或機器讀取視頻內容,把視頻轉換爲文字,而後提取其中頻率出現高的關鍵詞(如何提取關鍵詞呢,這就涉及到一個關鍵問題了:分詞。本blog往後闡述),把提取出來的這些關鍵詞做爲此視頻的標籤tag;二、而後針對這些tag創建索引摘要(什麼樣的索引?倒排索引。至於什麼是倒排索引,參考編程藝術第二十四章:第二十3、四章:楊氏矩陣查找,倒排索引關鍵詞Hash不重複編碼實踐),最終方便於往後用戶或系統的查找(此節系與編程藝術內的朋友討論整理總結而出)。
具體細節後續闡述。
八、參考文獻
本人1月7日,1月21日的發表的微博(掛在本blog左側邊欄); 探索推薦引擎內部的祕密,做者:趙晨婷,馬春娥; 集體智慧編程,TobySeganra著。 推薦系統之協同過濾概述。 http://www.cnblogs.com/leoo2sk/。 Mitchell, Tom M. Machine Learning. McGraw-Hill, 1997(機器學習領域的開山之做). http://zh.wikipedia.org/wiki/%E5%86%B3%E7%AD%96%E6%A0%91。 http://www.36kr.com/p/75415.html。 智能web算法,第三章推薦系統(實現了用戶及項目的類似度的計算,值得一看)。
後記
英雄召集令:若是哪位朋友之前搞過推薦或者檢索的,或者機器學習,數據挖掘,海量數據處理,搜索與推薦引擎任一一個領域的的請必定聯繫我,可隨時留言或評論,或微博私信,或Email:zhoulei0907@yahoo.cn。有過大型網站建設經驗的,或者編程經驗豐富老道的更歡迎隨時聯繫我。和本blog相關的文件隨時免費贈送技術知己。
最後,本blog成爲過去一年2011年csdn blog年排行榜第一位:http://blog.csdn.net/ranking.html,及csdn Feed訂閱排行榜TOP100前十:http://www.feedsky.com/feeds/topsub_csdn.html,以下圖左右部分所示: