基于用戶投票的排名算法(一):Delicious和Hacker News
互聯網的出現,意味著"信息大爆炸"。
用戶擔心的,不再是信息太少,而是信息太多。如何從大量信息之中,快速有效地找出最重要的內容,成了互聯網的一大核心問題。
各種各樣的排名算法,是目前過濾信息的主要手段之一。對信息進行排名,意味著將信息按照重要性依次排列,并且及時進行更新。排列的依據,可以基于信息本身的特征,也可以基于用戶的投票,即讓用戶決定,什么樣的信息可以排在第一位。
下面,我將整理和分析一些基于用戶投票的排名算法,打算分成四個部分連載,今天是第一篇。
一、Delicious
最直覺、最簡單的算法,莫過于按照單位時間內用戶的投票數進行排名。得票最多的項目,自然就排在第一位。
舊版的 Delicious,有一個"熱門書簽排行榜",就是這樣統計出來的。
它按照"過去 60 分鐘內被收藏的次數"進行排名。每過 60 分鐘,就統計一次。
這個算法的優點是比較簡單、容易部署、內容更新相當快;缺點是排名變化不夠平滑,前一個小時還排在前列的內容,往往第二個小時就一落千丈。
二、Hacker News
Hacker News 是一個網絡社區,可以張貼鏈接,或者討論某個主題。
每個帖子前面有一個向上的三角形,如果你覺得這個內容很好,就點擊一下,投上一票。根據得票數,系統自動統計出熱門文章排行榜。但是,并非得票最多的文章排在第一位,還要考慮時間因素,新文章應該比舊文章更容易得到好的排名。
Hacker News 使用 Paul Graham 開發的 Arc 語言編寫,源碼可以從 arclanguage.org 下載。它的排名算法是這樣實現的:
將上面的代碼還原為數學公式:
其中,
P 表示帖子的得票數,減去 1 是為了忽略發帖人的投票。
T 表示距離發帖的時間(單位為小時),加上 2 是為了防止最新的帖子導致分母過小(之所以選擇2,可能是因為從原始文章出現在其他網站,到轉貼至 Hacker News,平均需要兩個小時)。
G 表示"重力因子"(gravityth power),即將帖子排名往下拉的力量,默認值為1.8,后文會詳細討論這個值。
從這個公式來看,決定帖子排名有三個因素:
第一個因素是得票數P。
在其他條件不變的情況下,得票越多,排名越高。
從上圖可以看到,有三個同時發表的帖子,得票分別為 200 票、60票和 30 票(減 1 后為 199、59和 29),分別以黃色、紫色和藍色表示。在任一個時間點上,都是黃色曲線在最上方,藍色曲線在最下方。
如果你不想讓"高票帖子"與"低票帖子"的差距過大,可以在得票數上加一個小于 1 的指數,比如(P-1)^0.8。
第二個因素是距離發帖的時間T。
在其他條件不變的情況下,越是新發表的帖子,排名越高。或者說,一個帖子的排名,會隨著時間不斷下降。
從前一張圖可以看到,經過 24 小時之后,所有帖子的得分基本上都小于1,這意味著它們都將跌到排行榜的末尾,保證了排名前列的都將是較新的內容。
第三個因素是重力因子G。
它的數值大小決定了排名隨時間下降的速度。
從上圖可以看到,三根曲線的其他參數都一樣,G的值分別為1.5、1.8和2.0。G值越大,曲線越陡峭,排名下降得越快,意味著排行榜的更新速度越快。
知道了算法的構成,就可以調整參數的值,以適用你自己的應用程序。
[參考文獻]
* How Hacker News ranking algorithm works
* How to Build a Popularity Algorithm You can be Proud of