Hadoop實例:二度人脈與好友推薦

在新浪微博、人人網等社交網站上,爲了使用戶在網絡上認識更多的朋友,社交網站每每提供相似「你可能感興趣的人」、「間接關注推薦」等好友推薦的功能。一直很好奇這個功能是怎麼實現的。 java

 

其實,社交網站上的各個用戶以及用戶之間的相互關注能夠抽象爲一個圖。如下圖爲例: git

clip_image002

頂點A、B、C到I分別是社交網站的用戶,兩頂點之間的邊表示兩頂點表明的用戶之間相互關注。那麼如何根據用戶之間相互關注所構成的圖,來向每一個用戶推薦好友呢?可能你們都據說過六度人脈的說法,所謂六度人脈是指:地球上全部的人均可以經過五層之內的熟人鏈和任何其餘人聯繫起來。通俗地講:「你和任何一個陌生人之間所間隔的人不會超過六個,也就是說,最多經過六我的你就可以認識任何一個陌生人。」這個理論在社交網絡中一樣成立。 github

 

如今咱們以上圖爲例,介紹下如何利用用戶之間相互關注所構成的圖,來向每一個用戶推薦好友。首先咱們不得不假設的是若是兩用戶之間相互關注,那麼咱們認爲他們認識或者說是現實中的好友,至少應該認識。假設咱們如今須要向用戶I推薦好友,咱們發現用戶I的好友有H、G、C。其中H的好友還有A,G的好友還有F,C的好友還有B、F。那麼用戶I、H、G、C、A、B、F極有多是同一個圈子裏的人。咱們應該把用戶A、B、F推薦給用戶I認識。進一步的想,用戶F跟兩位I的好友C、G是好友,而用戶A、B都分別只跟一位I的好友是好友,那麼相對於A、B來講,F固然更應該推薦給用戶I認識。 算法

 

可能你會發現,在上面的分析中,咱們使用了用戶I的二度人脈做爲他的推薦好友,並且咱們對用戶I的每一個二度人脈進行了投票處理,選舉出最優推薦。其實,我以爲,二度人脈的結果只能看看某個用戶的在社交網站上的人際關係鏈,而基於投票選舉產生的二度人脈纔是好友推薦功能中所須要的好友網絡

 

另外你也可能已經認識到所謂的N度人脈,其實就是圖算法裏面的寬度優先搜索。寬度優先搜索的主要思想是From Center To Outer,咱們以用戶I爲起點,在相互關注所構成的圖上往外不退回地走N步所能到的頂點,就是用戶I的N度好友。 app

無標題

下面是Python寫的N度人脈的算法,能夠輸出某個用戶的N度好友,代碼詳見這裏oop

下面幾點是其與寬度優先搜索的不一樣之處: 測試

1. 寬度優先搜索搜索的是起始頂點可達的全部頂點,N度人脈不須要,它只須要向外走N步,走到N步的頂點處便中止,不須要再往外走了。 網站

2. 走過N步以後,結果中包含起始頂點往外走一、2……N-1步所能到達的全部頂點,返回結果以前需將這些點刪除。 spa

3. 變量pathLenFromStart記錄這N步具體的走法。

 

上訴的算法看似可行,其實在實際中並不適用。社交網站上的用戶量至少是千萬級別的,不可能把全部用戶之間相互關注的關係圖放進內存中,這個時候就能夠依賴Hadoop了。下面的實例中,咱們的輸入是deg2friend.txt,保存用戶之間相互關注的信息。每行有兩個用戶ID,以逗號分割,表示這兩個用戶之間相互關注即認識。

二度好友的計算須要兩輪的MapReduce。第一輪MapReduce的Map中,若是輸入是「H,I」,咱們的輸出是key=H,value=「H,I」跟key=I,value=「H,I」兩條結果。前者表示I能夠經過H去發現他的二度好友,後者表示H能夠經過I去發現他的二度好友。

 

根據第一輪MapReduce的Map,第一輪MapReduce的Reduce 的輸入是例如key =I,value={「H,I」、「C,I」、「G,I」} 。其實Reduce 的輸入是全部與Key表明的結點相互關注的人。若是H、C、G是與I相互關注的好友,那麼H、C、G就多是二度好友的關係,若是他們之間不是相互關注的。對應最上面的圖,H與C是二度好友,G與C是二度好友,但G與H不是二度好友,由於他們是相互關注的。第一輪MapReduce的Reduce的處理就是把相互關注的好友對標記爲一度好友(「deg1friend」)並輸出,把有多是二度好友的好友對標記爲二度好友(「deg2friend」)並輸出。

 

第二輪MapReduce則須要根據第一輪MapReduce的輸出,即每一個好友對之間是不是一度好友(「deg1friend」),是否有多是二度好友(「deg2friend」)的關係,確認他們之間是否是真正的二度好友關係。若是他們有deg1friend的標籤,那麼不多是二度好友的關係;若是有deg2friend的標籤、沒有deg1friend的標籤,那麼他們就是二度好友的關係。另外,特別能夠利用的是,某好友對deg2friend標籤的個數就是他們成爲二度好友的支持數,即他們之間能夠經過多少個都相互關注的好友認識。

 

兩輪MapReduce的代碼,詳見這裏

根據上述兩輪的MapReduce的方法,我以部分微博的數據進行了測試,測試的部分結果以下:

經過與我(@Intergret)相互關注的138位好友,兩輪的MapReduce向我推薦的二度好友前三位是:2010963993(@可樂要改變),2022127621(@琥珀露珠)和2572979357(@趙鴻澤),他們都是我本科的同窗,有不少共同的好友,但我跟他們三目前還沒有相互關注,因此推薦結果還算靠譜。

轉自個人博客:http://www.datalab.sinaapp.com/

相關文章
相關標籤/搜索