天天看點

基于使用者投票的排名算法(二):Reddit基于使用者投票的排名算法(二):Reddit

基于使用者投票的排名算法(二):Reddit

作者: 阮一峰

日期: 2012年3月 7日

(不好意思,這個系列中斷了近兩周,我會盡快在這幾天,把後面幾篇寫完。)

上一次,我介紹了Hacker News的排名算法。它的特點是使用者隻能投贊成票,但是很多網站還允許使用者投反對票。就是說,除了好評以外,你還可以給某篇文章差評。

基于使用者投票的排名算法(二):Reddit基于使用者投票的排名算法(二):Reddit

Reddit是美國最大的網上社群,它的每個文章前面都有向上和向下的箭頭,分别表示"贊成"和"反對"。使用者點選進行投票,Reddit根據投票結果,計算出最新的"熱點文章排行榜"。

怎樣才能将贊成票和反對票結合起來,計算出一段時間内最受歡迎的文章呢?如果文章A有100張贊成票、5張反對票,文章B有1000張贊成票、950張反對票,誰應該排在前面呢?

Reddit的程式是開源的,使用Python語言編寫。排名算法的代碼大緻如下:

基于使用者投票的排名算法(二):Reddit基于使用者投票的排名算法(二):Reddit

這段代碼考慮了這樣幾個因素:

(1)文章的新舊程度t

  t = 發貼時間 - 2005年12月8日7:46:43

t的機關為秒,用unix時間戳計算。不難看出,一旦文章發表,t就是固定值,不會随時間改變,而且文章越新,t值越大。至于2005年12月8日,應該是Reddit成立的時間。

(2)贊成票與反對票的差x

  x = 贊成票 - 反對票

(3)投票方向y

  

基于使用者投票的排名算法(二):Reddit基于使用者投票的排名算法(二):Reddit

y是一個符号變量,表示對文章的總體看法。如果贊成票居多,y就是+1;如果反對票居多,y就是-1;如果贊成票和反對票相等,y就是0。

(4)文章的受肯定(否定)的程度z

  

基于使用者投票的排名算法(二):Reddit基于使用者投票的排名算法(二):Reddit

z表示贊成票與反對票之間差額的絕對值。如果對某個文章的評價,越是一邊倒,z就越大。如果贊成票等于反對票,z就等于1。

結合以上幾個變量,Reddit的最終得分計算公式如下:

  

基于使用者投票的排名算法(二):Reddit基于使用者投票的排名算法(二):Reddit

這個公式可以分成兩個部分來讨論:

(一)

  

基于使用者投票的排名算法(二):Reddit基于使用者投票的排名算法(二):Reddit

這個部分表示,贊成票與反對票的差額z越大,得分越高。

需要注意的是,這裡用的是以10為底的對數,意味着z=10可以得到1分,z=100可以得到2分。也就是說,前10個投票人與後90個投票人(乃至再後面900個投票人)的權重是一樣的,即如果一個文章特别受到歡迎,那麼越到後面投贊成票,對得分越不會産生影響。

當贊成票等于反對票,z=1,是以這個部分等于0,也就是不産生得分。

(二)

  

基于使用者投票的排名算法(二):Reddit基于使用者投票的排名算法(二):Reddit

這個部分表示,t越大,得分越高,即新文章的得分會高于老文章。它起到自動将老文章的排名往下拉的作用。

分母的45000秒,等于12.5個小時,也就是說,後一天的文章會比前一天的文章多得2分。結合前一部分,可以得到結論,如果前一天的文章在第二天還想保持原先的排名,在這一天裡面,它的z值必須增加100倍(淨贊成票增加100倍)。

y的作用是産生加分或減分。當贊成票超過反對票時,這一部分為正,起到加分作用;當贊成票少于反對票時,這一部分為負,起到減分作用;當兩者相等,這一部分為0。這就保證了得到大量淨贊成票的文章,會排在前列;贊成票與反對票接近或相等的文章,會排在後面;得到淨反對票的文章,會排在最後(因為得分是負值)。

(三)

這種算法的一個問題是,對于那些有争議的文章(贊成票和反對票非常接近),它們不可能排到前列。假定同一時間有兩個文章發表,文章A有1張贊成票(發帖人投的)、0張反對票,文章B有1000張贊成票、1000張反對票,那麼A的排名會高于B,這顯然不合理。

結論就是,Reddit的排名,基本上由發帖時間決定,超級受歡迎的文章會排在最前面,一般性受歡迎的文章、有争議的文章都不會很靠前。這決定了Reddit是一個符合大衆口味的社群,不是一個很激進、可以展示少數派想法的地方。

[參考資料]

  * How Reddit ranking algorithms work

(完)

轉載于:https://www.cnblogs.com/wufawei/archive/2012/03/12/2392543.html