談談新浪微博背後的那些演算法
本文對微博中常見的問題的對應演算法進行了簡單的介紹,在實際應用中的演算法比介紹的要複雜的多。當然,本文覆蓋的主題並不全,比如好友推薦、熱點跟蹤等就沒有涉及到。但古人云“窺一斑而見全豹”,希望本文的介紹能幫助大家更好的理解微博這樣的社交網路應用。
微博是一個很多人都在用的社交應用。天天刷微博的人每天都會進行著這樣幾個操作:原創、轉發、回覆、閱讀、關注、@等。其中,前四個是針對短博文,最後的關注和@則針對的是使用者之間的關係,關注某個人就意味著你成為他的粉絲,而他成為你的好友;@某個人意味著你想要他看到你的微博資訊。
微博被人們認為是“自媒體”,即普通大眾分享與本身相關的“新聞”的途徑。最近,有些人使用自己在自媒體上的影響力而盈利的報導屢見不鮮。那微博上個人影響力是怎樣計算的呢?微博上還有哪些演算法作為看不見的手在管理著我們?我們的每一個行為怎樣影響著演算法呢?
直觀上看,微博其實是人類社會的一個簡單的縮影,微博網路的一些特點,也許可以啟發我們得到真實的社會網路上的規律。得益於社交網路的爆發式發展,“社會計算”尤其是社交網路分析成為資料探勘的新寵兒。下面我們就針對微博網路分析的一些演算法進行簡單的介紹,其中的有些演算法對於其他的社交應用可能也適用。
如果你對新浪微博的架構感興趣,你也可以讀讀這篇文章:億級使用者下的新浪微博平臺架構
標籤傳播
微博使用者量浩大,不同的人有不同的興趣。挖掘每個使用者的興趣有助於更加精準的廣告投放、內容推薦。為了得到每個使用者的興趣,可以為使用者打上標籤,每個標籤代表使用者的一個興趣,使用者可以擁有一個或多個標籤。為了得到最終的使用者標籤,先做第一個假設:
每個使用者的好友(或粉絲)中與該使用者具有相同興趣的人佔多數。
這就引出了本文介紹的第一個演算法,即標籤傳播演算法。在這個演算法中,每個使用者的標籤取其好友或粉絲中標籤最多的一個或多個。當然,可以將好友和粉絲的標籤都考慮進來,整合的時候可以考慮賦予好友的標籤和粉絲的標籤不同的權重。標籤傳播演算法的過程如下:
1) 對一部分使用者給出初始標籤;
2) 對每一個使用者,統計其好友和粉絲的標籤數目,賦予該使用者出現次數最多的一個或者多個標籤。
3) 迴圈進行第 2 步,直到使用者的標籤不再發生大的變化為止。
使用者相似度計算
標籤傳播演算法實現起來比較簡單,其缺點在於當所做的假設不符合事實時,比如為了社交上的禮貌,我們一般會把自己的親友新增關注,這些人不一定和我們擁有同樣的標籤;該演算法的結果就會變得很差。解決的辦法就是通過計算使用者之間的相似度來衡量好友或粉絲的標籤對使用者標籤的貢獻率。因而得到第二個假設:
與使用者越相似的好友或粉絲,其標籤越可能是使用者的標籤。
那麼,如何衡量使用者之間的相似度呢?這就需要考慮到使用者發表的微博資訊了,包括轉發的和原創的。這裡是要考慮使用者之間的相似度而不是使用者微博之間的相似度,因而在實際計算時,將某個使用者的所有微博資訊聚集到一起進行計算。一個可選的方法是使用詞袋法將微博資訊表示成詞語向量,然後直接使用餘弦方法等計算其相似度。但這個方法太過簡單,不容易達到好的結果,這裡介紹一種基於 LDA (隱含狄利克雷分佈)的相似度計算方法。
LDA 仍然使用詞袋法表示文字,但是在中間新增了一個主題層,形成了“文件-主題-詞語”三層概率模型,即每篇文件看成是主題的一種概率分佈,主題又被看成是單詞的概率分佈。在 LDA 模型下,文件可以被看成按照如下方式生成:
1) 對於每篇文件:
2) 從主題分佈中抽取一個主題;
3) 從該主題的詞語分佈中抽取一個詞語;
4) 重複第 2 步和第 3 步,直到該文件的所有詞語都生成。
LDA 模型引數的估計演算法不在本文的討論範圍之內。這裡只需要知道,通過 LDA 可以得到每個使用者的微博資訊的主題分佈。然後使用餘弦方法、KL 距離等計算相似度的方法來得到使用者間主題分佈的相似度,以之作為使用者之間的相似度。而後使用該相似度對標籤傳播進行加權。
時間因素和網路因素
上述的演算法還有什麼缺點呢?
隨著時間的變化,使用者的興趣是會變化的,計算使用者相似度的時候每次都把所有微博資訊都聚合在一起不太合理。對此,可以通過選取距離當前時間較近的N條微博。比如,對每個使用者,選取距離當前時間最近的 50 條微博聚在一起放到 LDA 中訓練。此處的N既不能太大也不能太小。太大則不容易反映使用者興趣的時間變化,太小則由於使用者發表微博的隨機性容易引起興趣的漂移。為了使效果最好,可以不拘泥於一個固定的N,比如可以考慮對每個使用者按照其發表微博的時間序列做N值的自適應。
至此,在演算法中還沒有考慮微博關係中由回覆、轉發、@等所構成的網路資訊。以轉發為例,如果在使用者的微博中頻繁的轉發某個好友的微博,那麼使用者和該好友的相似度相比其他好友來說應該會更高。這裡可以看做是假設三:
使用者轉發某好友的微博的頻率越高,使用者與該好友的興趣相似度越大。
相似的,可以得到假設四:
使用者微博中@某使用者的頻率越高,使用者與該好友的興趣相似度越大。
由此就得到了計算相似度的另外的因素。有很多方法可以新增一個新的因素到原有的相似度計算方法中,比如可以考慮將轉發頻率量化為值,作為權重新增到相似度的衡量中去。
社群發現
微博社群是指在微博中關係緊密的人組成的團體,社群內部的人之間聯絡緊密,社群之間的聯絡則比較稀疏。這裡所指的關係緊密有兩層含義,第一是社群內部的人之間的興趣相似度大;第二是指社群內部的人之間的關係要近,比如要求社群內部的兩個使用者不能超過二度關聯,二度關聯即好友的好友。
興趣相似度在上文已有敘述,關係相似度則需要利用使用者之間的關注關係來進行計算。以使用者的關注關係為單向鏈,可以將所有的微博使用者之間的關係表示為一個巨大的有向圖。使用者之間的關係相似度可以簡單的考慮,比如使用使用者間的最短路徑的倒數。但是這種方法衡量的不精確,我們知道,在現實世界中,存在著六度理論,在微博網路及其他社交網路中,往往關係會更加緊密。因而這種簡單的關係相似度只能有至多六個離散值,顯然不夠精確。
為了達到更好的效果,這裡不僅以最短路徑作為顯式量度,還要考慮一些隱式的量度。這裡先給出兩個假設,分別為假設五和假設六:
兩個使用者的共同好友越多,這兩個好友的關係相似度越高。
兩個使用者的共同粉絲越多,這兩個好友的關係相似度越高。
這裡可以借鑑 Jaccard 相似度的計算方式,將這兩種假設的量化函式表示為交集的大小與並集的大小之商。以假設五為例,其量化指標又被稱為共指向性相似度,量化時使用兩個使用者共同好友的數目除以兩個使用者所有好友的數目。假設六的量化指標被稱為共被指向性相似度,計算方式與共指向性相似度類似。從意義上講,這兩種相似度不僅僅是關係上的度量,在一定程度上也衡量了使用者之間的興趣相似程度,直觀上看,兩個使用者共同關注的好友越多,他們的興趣相似程度也越大。這兩種相似度還有一個專業的名字,是基於結構情景的相似度計算。
得到了最短路徑相似度、共指向性相似度、共被指向性相似度後,可以採用一種加權函式將它們融合起來,得到最後的相似度。之後,可以採用一些聚類演算法如K- Means、DBSCAN 等進行聚類操作,得到最後的社群簇。也可以採用相似度加權的標籤傳播演算法,把具有相同標籤的人作為一個社群。
影響力計算
在社群發現中,使用微博中的關係網路可以提高相似度計算的精確度。但關係網路能做的事情還有很多,影響力計算便是其中比較重要的應用。
說到影響力的計算,這裡借鑑了網頁排名中的演算法。網頁排名中廣為人知的演算法當屬 PageRank 了,該演算法由 google 創始人拉里·佩奇和謝爾蓋·布林發明,隨著 google 在商業上的成功而聲名鵲起。該演算法根據網頁之間的連結來確定網頁的排名,其核心在於一個假設,質量高的網頁所指向的網頁的質量必定也高。
根據 PageRank 的思想,可以得到微博上影響力的假設,稱之為假設七:
影響力高的使用者關注的使用者的影響力必定也高。
將使用者看成是 PageRank 中的網頁,將關注關係看做是網頁中的連結關係。從而,可以根據 PageRank 的演算法流程得到在微博關注網路上的影響力計算演算法:
1) 賦予所有使用者相同的影響力權重;
2) 將每個使用者的影響力權重按照其關注的人數等量分配;
3) 對每個使用者來說,其影響力等於其粉絲分配給他的權重之和;
4) 第 2 步和第 3 步迭代,直到權重不再發生大的變化為止。
在網頁排名中,基於網路關係的演算法還有 HITS、HillTop 演算法等,這些演算法也可以借鑑到影響力計算中來。
上面的演算法有什麼缺點呢?
如果只是基於關係網路的話,那麼很容易就造成,粉絲數目多的人影響力必然會很高。這樣就導致有些使用者去購買一些殭屍粉就可以達到很高的影響力了。這樣的演算法顯然是不能應對實際情況的,因為還有太多的資訊沒有用到。
使用者的影響力除了他的微博關係之外,還與他的個人屬性有很大的關係,比如使用者的活躍度、微文的質量等。使用者的活躍度可以使用其發表微博的頻度來衡量,微文的質量可以採用其被轉發的數目、被回覆的數目來得到。通過對這些值進行衡量,再加上上面演算法的結果,就可以得到更加精確的影響力結果。
當然,也可以這樣考慮,使用者之間的回覆關係、轉發關係、@關係均可以構成網路,它們也有相應的假設,分別為假設八、假設九、假設十:
影響力越高的使用者回覆的微博的影響力越高,從而使該微博主人的影響力變高。
影響力越高的使用者轉發的微博的影響力越高,從而使該微博原創作者的影響力變高。
影響力越高的使用者傾向於在其微博中@影響力高的使用者。
這樣就又得到了轉發網路、回覆網路、@網路三種網路,借鑑 PageRank 演算法,可以得到另外的三種影響力結果。將它們與關係網路的影響力結果進行融合,就可以最終的影響力結果了。這裡的融合可以簡單的考慮成結果的加權和,複雜的融合方法不在本文的範圍之內。
話題因素和領域因素
得到了影響力的計算方法之後,可以做些什麼呢?
可以對當前的熱點話題進行影響力分析,得到誰在微博上成為當前熱點話題的意見領袖。具體做法是這樣,找到和當前熱點話題相關的微文,從而找到參與當前熱點話題的使用者。如何找到和當前熱點話題相關的微文呢?有話題標籤的微文自不必說,對於沒有話題標籤的微文來說,可以使用上文中介紹的 LDA 演算法,它可以在使用者的所有微文中找到使用者的主題分佈,也可以對一條微文找到主題分佈,一般來說,由於微文的字數限制在 140 以內,比較短,因而一條微文包含的主題數目不會太多,取該微文的主題分佈中概率最高的主題當做其主題即可。
找到話題對應的微文與使用者之後,執行影響力計算演算法,就可以得到該話題中影響力較大的使用者了。這也是輿情監測、社會熱點監控的一個方面。
對於標籤傳播演算法得到的結果,對同一標籤下的使用者執行影響力計算演算法,可以得到該標籤下的影響力排名,即領域內影響力排名。比如,李開復在全部領域內的影響力或許不是最高的,但在 IT 領域,其影響力絕對是數一數二的。
垃圾使用者識別
在影響力計算中,提到要避免殭屍使用者對影響力計算的干擾。在演算法中,如果可以識別這樣的使用者,在計算影響力時將其排出在外,不僅可以提高效果,還可以降低計算量。
與影響力計算相似,垃圾使用者的識別要同時考慮使用者屬性與連結關係兩方面的因素。
對於垃圾使用者來說,有一些統計上的特徵與正常使用者不同。比如如下幾點:
垃圾使用者一般發微文具有一定的時間規律性,可以使用熵值對此進行衡量,熵是衡量隨機性的一種量度,隨機性越大,熵值越小。具體做法為將一定的粒度進行時間切片統計,得到每個時間片內的博文概率,然後依照概率進行熵值的計算。熵值越大代表使用者發微文的時間越有規律,越有可能是垃圾使用者。
垃圾使用者有些傾向於在微文中惡意的@其他人,因而有些垃圾使用者的微文中@使用的比例比一般使用者高。
有些垃圾使用者的微文中為了進行廣告的推廣,新增大量的 URL。可以通過微文中的 URL 比例進行衡量。也有些使用者為了騙取 URL 的點選,微文中的內容與 URL 對應介面的內容不一致,這時需要判斷微文與 URL 內容的一致程度,簡單的做法可以使用詞袋法將微文與 URL 對應介面表示成詞語向量,檢視微文中的詞語在 URL 對應網頁中出現的頻度。
對於那些為做廣告推銷的使用者,還可以對其微文進行文字分類,判斷其微文是否是廣告,如果某使用者的相當一部分微文是廣告,則該使用者可能是垃圾使用者。
垃圾使用者一般隨意的關注使用者,故其粉絲數目與好友數目的比例與正常使用者會有差別。而且正常使用者一般是通過好友關係新增好友的,這樣會形成關注三角形,如A看到其好友B關注了C,那麼若A也去關注C,就形成了A關注B、C,B關注C的三角形。一般來說,由於垃圾使用者關注的隨意性,其關注三角形的比例與正常使用者不同。
當然,垃圾使用者與正常使用者的不同之處不止這些,本文不再一一列舉。垃圾使用者的識別本質上是一個二分類問題,獲得了這些屬性之後,就可以將這些資訊輸入到一個機器學習的分類模型中,比如邏輯斯蒂迴歸(LR)、決策樹、樸素貝葉斯等,就可以對其進行分類了。
當然,還沒有用到連結資訊。一般來說,垃圾使用者會去關注正常使用者,而正常使用者不會關注垃圾使用者。這即是假設十一:
正常使用者不傾向於關注垃圾使用者。
這樣就可以再次使用 PageRank 演算法來對使用者是否是垃圾使用者的概率進行計算。這裡需要注意的是,演算法初始化時採用上面的分類器結果,將垃圾使用者的概率設為1,正常使用者的概率設為0。在 PageRank 計算過程中,不能通過簡單的求和公式計算,比如如果一個使用者關注了多個垃圾使用者的時候,求和後概率可能大於1;因而需要使用一些歸一化方法或指數族函式進行概率的更新。
結語
本文對微博中常見的問題的對應演算法進行了簡單的介紹,在實際應用中的演算法比介紹的要複雜的多。當然,本文覆蓋的主題並不全,比如好友推薦、熱點跟蹤等就沒有涉及到。但古人云“窺一斑而見全豹”,希望本文的介紹能幫助大家更好的理解微博這樣的社交網路應用。
在文中,可以看到黑體標出的假設,這些假設看起來都與我們的直觀感覺一致。而根據這些可以引申出很多有效的演算法。所以有時候,只要你肯發現,演算法就在身邊。
相關文章
- 張雨石:微博背後的那些演算法演算法
- 淺談美顏演算法:美顏SDK的“背後”演算法
- 如何填補友盟分享新浪微博的那些坑
- 漫談 Greenplum 開源背後的動機
- 談談 Java 中的那些“瑣”事Java
- 談談 React 那些小事React
- 肖鵬:微博資料庫那些事兒(圖靈訪談)資料庫圖靈
- 新浪微博APIAPI
- 談談引用和Threadlocal的那些事thread
- 談談java入門的那些事兒Java
- 從 React Router 談談路由的那些事React路由
- 淺談《動物森友會》背後的設計理念
- 微博春晚背後的技術故事
- 談談jQuery中Ajax那些事jQuery
- 談談Spring-Data的那些事兒Spring
- 遊戲與教育:談討遊戲背後的教育價值遊戲
- 淺談初次做外包專案及背後的思考
- iOS 仿新浪微博iOS
- 巧妙演算法背後的直覺:淺談貝葉斯最佳化之美演算法
- 談談面試小米後的感受面試
- 人人都是藝術家!談談那些奇怪的字元字元
- 破解YouTube、Facebook推薦系統背後的那些演算法演算法
- 淺談滴滴需求響應式公交背後的技術
- 淺談正規表示式背後的基本原理
- 淺談AlphaGo背後所涉及的深度學習技術Go深度學習
- 人人都是藝術家!談談那些奇怪的字元(上)字元
- 新浪微博分享不跳轉
- iOS高仿新浪微博iOS
- 讓ubuntu支援新浪微博Ubuntu
- 產業安全專家談 | 廣告刷量背後的攻與防產業
- 談談前後端的分工協作後端
- Android談談封裝那些事--BaseActivity和BaseFragment(-)Android封裝Fragment
- 新浪微博圖床架構解析圖床架構
- 再談程式設計正規化—程式語言背後的思想程式設計
- 最新訪談首次披露拍出「天價」AI畫作背後的故事AI
- 那些年曾談起的跨域跨域
- 淺談Blazor開發的那些事Blazor
- 分享到QQ空間、新浪微博、騰訊微博的程式碼!(收藏)