考慮時間的評分和排名分析

Hacker News

Hacker News 是一個可以發(fā)布帖子的網(wǎng)絡社區(qū),每個帖子前面有一個向上的三角形,如果用戶覺得這個內(nèi)容好,點擊一下即可投票。根據(jù)得票數(shù),系統(tǒng)自動統(tǒng)計出熱門文章排行榜。

Hacker News 使用分數(shù)計算公式如下:

Score = \frac{P - 1}{(T + 2) ^G}

其中, P 表示帖子的得票數(shù),減去 1 表示忽略發(fā)帖人的投票;T 表示當前距離發(fā)帖的時間(單位為小時),加上 2 是為了防止最新的帖子分母過??;G 為重力因子,即將帖子排名被往下拉的力量,默認值為 1.8
在其他條件不變的情況下,更多的票數(shù)可以獲得更高的分數(shù),如果不希望“高票數(shù)”帖子和“低票數(shù)”帖子之間差距過大,可以上面公式的分子中添加小于 1 的指數(shù),例如:(P - 1) ^{0.8} 。
在其他條件不變的情況下,隨著時間不斷流逝,帖子的分數(shù)會不斷降低,經(jīng)過 24 小時后,幾乎所有帖子的分數(shù)都將小于 1 。重力因子對于分數(shù)的影響如下圖所示:

G 值越大,曲線越陡峭,排名下降的速度越快,意味著排行榜的更新速度越快。


Reddit

不同于 Hacker News , Reddit 根據(jù)投票結(jié)果,計算出最新的熱點文章排行榜。



Reddit 網(wǎng)站的計算分數(shù)統(tǒng)計代碼可以總結(jié)如下

from datetime import datetime, timedelta
from math import log

epoch = datetime(1970, 1, 1)

def epoch_seconds(date):
    td = date - epoch
    return td.days * 86400 + td.seconds + (float(td.microseconds) / 1000000)

def score(ups, downs):
    return ups - downs

def hot(ups, downs, date):
    s = score(ups, downs)
    order = log(max(abs(s), 1), 10)
    sign = 1 if s > 0 else -1 if s < 0 else 0
    seconds = epoch_seconds(date) - 1134028003
    return round(order + sign * seconds / 45000, 7)

分數(shù)的計算過程大致如下:

1. 計算贊成票和反對票的差值

s = ups - downs

2. 計算中間分數(shù)

order = log_{10}max(|s| , 1)

其中,取 |s|1 的最大值是為了避免當 s = 0 時,無法計算 log_{10} |s| 。贊成票與反對票差值越大,得分越高。取以 10 為底的對數(shù),表示當 a=10 時,這部分為 1,只有 s=100 時才為 2,這樣設置是為了減緩差值增加對總分的影響程度。

3. 確定分數(shù)的方向

Sing = \begin{cases}1\quad \text {if {a > 0}} \\ 0\quad \text{if {a = 0}}\\ -1 \quad\text{if {a < 0}} \end{cases}

4. 計算發(fā)貼時間距離 2005 年 12 月 8 日 7:46:43 的秒數(shù)

seconds = timestamp(date) - 1134028003

5. 計算最終分數(shù)

score = order + sing \times \frac{sconds}{45000}

將時間除以 45000 秒(即 12.5 個小時),也就是說當前天的帖子會比昨天的帖子多約 2 分。如果昨天的帖子想要保持住之前的排名,則 s 值需要增加 100 倍才可以。

Reddit 評分排名算法決定了 Reddit 是一個符合大眾口味的社區(qū),而不是一個適合展示激進想法的地方。


Stack Overflow

Stack Overflow 是世界排名第一的程序員問答社區(qū) , 創(chuàng)始人之一的 Jeff Atwood 的評分排名的計算公式如下:

\frac{4 \times log_{10}Quiews+\frac{Qanswers \times Qscore}{5} + \sum(A_{scores})}{((Q_{age} + 1) - ( \frac{Q_{age} - Q_{updated}}{2}))^{1.5}}
其中:

  1. 4 \times log_{10}Quiews 表示問題的瀏覽次數(shù)越多,得分越高,同時利用 log_{10} 減緩了隨著瀏覽量增大導致得分變高的程度。
  2. \frac{Qanswers \times Qscore}{5} 表示問題的得分(贊成票和反對票之差)越高,回答的數(shù)量越多,分數(shù)越高。采用乘積的形式意味著即使問題本身的分數(shù)再高,沒有人回答的問題也算不上熱門問題。
  3. \sum(A_{scores}) 表示問題回答的總分數(shù)?;卮鹂偡植捎昧撕唵蔚募雍停珜嶋H上一個正確的回答要勝過多個無用的回答,簡答的加和無法很好的區(qū)分這兩種不同的情況。
  4. ((Q_{age} + 1) - ( \frac{Q_{age} - Q_{updated}}{2}))^{1.5} 可以改寫為 (\frac{Q_{age}}{2} + \frac{Q_{updated}}{2} + 1) ^{1.5} , Q_{age}Q_{updated} 分別表示問題和最近一次回答的時間(單位為小時),也就是說問題時間越久遠,最近一次回答時間約久遠,分母就會越大,從而得分就會越小。
    Stack Overflow 的評分排名算法考慮了參與程度(問題瀏覽次數(shù)和回答次數(shù))、質(zhì)量(問題分數(shù)和回答分數(shù))、時間(問題時間和最近一次回答時間)等多個維度。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 本文為學習阮一峰《基于用戶投票的排名算法》的學習筆記。 一、Hacker News(只有贊成票) ① P 表示帖子...
    偽開發(fā)閱讀 3,309評論 1 5
  • 影評類網(wǎng)站(豆瓣,IMDB),資訊網(wǎng)站(hacker news),問題回答網(wǎng)站(知乎,stackoverflow)...
    Howyi閱讀 12,299評論 0 3
  • 最近開始在簡書上混,今日在首頁上不經(jīng)意間看到一篇《從豆瓣電影評分算法說起》,感覺有點眼熟,就點了進去。 其實阿北的...
    數(shù)據(jù)蟲巢閱讀 33,740評論 6 172
  • 一、<Delicious> 算法:按照單位時間內(nèi)用戶的投票數(shù)進行排名。得票最多的項目,自然就排在第一位。 eg:"...
    Rainysong閱讀 2,898評論 0 1
  • 熱門內(nèi)容對任何網(wǎng)站都很重要,對社交網(wǎng)站更為重要。如何讓用戶第一眼就看到感興趣的內(nèi)容而留下來,正是各種排名算法的任務...
    兔子David閱讀 1,639評論 0 6

友情鏈接更多精彩內(nèi)容