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

openkk 12年前發布 | 18K 次閱讀 算法

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

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

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

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

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

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

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

        (1)帖子的新舊程度t

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

</blockquote>

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

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

x = 贊成票 - 反對票

</blockquote>

        (3)投票方向y

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

        (4)帖子的受肯定程度z

        z 表示贊成票超過反對票的數量。如果贊成票少于或等于反對票,那么z就等于1。

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

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

        (一)

        這個部分表示,贊成票超過反對票的數量越多,得分越高。

        需要注意的是,這里用的是以 10 為底的對數,意味著z=10可以得到 1 分,z=100可以得到 2 分。也就是說,前 10 個投票人與后 90 個投票人(乃至再后面 900 個投票人)的權重是一樣的,即如果一個帖子特別受到歡迎,那么越到后面投贊成票,對得分越不會產生影響。

        當反對票超過或等于贊成票,z=1,因此這個部分等于0,也就是不產生得分。

        (二)

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

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

        y 的作用是用來產生正分和負分。當贊成票超過反對票時,得分為正;當贊成票少于反對票時,得分為負;當兩者相等,得分為0。這就保證了得到大量凈贊成票的文章,會排在前列;得到大量凈反對票的文章,會排在最后。

        (三)

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

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

        [參考資料]

        * How Reddit ranking algorithms work

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!