Hacker News
Hacker News 是一个可以发布帖子的网络社区,每个帖子前面有一个向上的三角形,如果用户觉得这个内容好,点击一下即可投票。根据得票数,系统自动统计出热门文章排行榜。
Hacker News 使用分数计算公式如下:
其中, 表示帖子的得票数,减去 表示忽略发帖人的投票; 表示当前距离发帖的时间(单位为小时),加上 是为了防止最新的帖子分母过小; 为重力因子,即将帖子排名被往下拉的力量,默认值为 。
在其他条件不变的情况下,更多的票数可以获得更高的分数,如果不希望“高票数”帖子和“低票数”帖子之间差距过大,可以上面公式的分子中添加小于 的指数,例如: 。
在其他条件不变的情况下,随着时间不断流逝,帖子的分数会不断降低,经过 24 小时后,几乎所有帖子的分数都将小于 。重力因子对于分数的影响如下图所示:
值越大,曲线越陡峭,排名下降的速度越快,意味着排行榜的更新速度越快。
不同于 Hacker News , Reddit 根据投票结果,计算出最新的热点文章排行榜。
Reddit 网站的计算分数统计代码可以总结如下
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)
分数的计算过程大致如下:
1. 计算赞成票和反对票的差值
2. 计算中间分数
其中,取 和 的最大值是为了避免当 时,无法计算 。赞成票与反对票差值越大,得分越高。取以 为底的对数,表示当 时,这部分为 ,只有 时才为 ,这样设置是为了减缓差值增加对总分的影响程度。
3. 确定分数的方向
4. 计算发贴时间距离 2005 年 12 月 8 日 7:46:43 的秒数
5. 计算最终分数
将时间除以 45000 秒(即 12.5 个小时),也就是说当前天的帖子会比昨天的帖子多约 2 分。如果昨天的帖子想要保持住之前的排名,则 值需要增加 100 倍才可以。
Reddit 评分排名算法决定了 Reddit 是一个符合大众口味的社区,而不是一个适合展示激进想法的地方。
Stack Overflow
Stack Overflow 是世界排名第一的程序员问答社区 , 创始人之一的 Jeff Atwood 的评分排名的计算公式如下:
其中:
- 表示问题的浏览次数越多,得分越高,同时利用 减缓了随着浏览量增大导致得分变高的程度。
- 表示问题的得分(赞成票和反对票之差)越高,回答的数量越多,分数越高。采用乘积的形式意味着即使问题本身的分数再高,没有人回答的问题也算不上热门问题。
- 表示问题回答的总分数。回答总分采用了简单的加和,但实际上一个正确的回答要胜过多个无用的回答,简答的加和无法很好的区分这两种不同的情况。
-
可以改写为 , 和 分别表示问题和最近一次回答的时间(单位为小时),也就是说问题时间越久远,最近一次回答时间约久远,分母就会越大,从而得分就会越小。
Stack Overflow 的评分排名算法考虑了参与程度(问题浏览次数和回答次数)、质量(问题分数和回答分数)、时间(问题时间和最近一次回答时间)等多个维度。