美文网首页算法
考虑时间的评分和排名分析

考虑时间的评分和排名分析

作者: ___n | 来源:发表于2023-02-20 17:33 被阅读0次

Hacker News

Hacker News 是一个可以发布帖子的网络社区,每个帖子前面有一个向上的三角形,如果用户觉得这个内容好,点击一下即可投票。根据得票数,系统自动统计出热门文章排行榜。

Hacker News 使用分数计算公式如下:

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

其中, P 表示帖子的得票数,减去 1 表示忽略发帖人的投票;T 表示当前距离发帖的时间(单位为小时),加上 2 是为了防止最新的帖子分母过小;G 为重力因子,即将帖子排名被往下拉的力量,默认值为 1.8
在其他条件不变的情况下,更多的票数可以获得更高的分数,如果不希望“高票数”帖子和“低票数”帖子之间差距过大,可以上面公式的分子中添加小于 1 的指数,例如:(P - 1) ^{0.8}
在其他条件不变的情况下,随着时间不断流逝,帖子的分数会不断降低,经过 24 小时后,几乎所有帖子的分数都将小于 1 。重力因子对于分数的影响如下图所示:

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


Reddit

不同于 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. 计算赞成票和反对票的差值

s = ups - downs

2. 计算中间分数

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

其中,取 |s|1 的最大值是为了避免当 s = 0 时,无法计算 log_{10} |s| 。赞成票与反对票差值越大,得分越高。取以 10 为底的对数,表示当 a=10 时,这部分为 1,只有 s=100 时才为 2,这样设置是为了减缓差值增加对总分的影响程度。

3. 确定分数的方向

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

4. 计算发贴时间距离 2005 年 12 月 8 日 7:46:43 的秒数

seconds = timestamp(date) - 1134028003

5. 计算最终分数

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

将时间除以 45000 秒(即 12.5 个小时),也就是说当前天的帖子会比昨天的帖子多约 2 分。如果昨天的帖子想要保持住之前的排名,则 s 值需要增加 100 倍才可以。

Reddit 评分排名算法决定了 Reddit 是一个符合大众口味的社区,而不是一个适合展示激进想法的地方。


Stack Overflow

Stack Overflow 是世界排名第一的程序员问答社区 , 创始人之一的 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 表示问题的浏览次数越多,得分越高,同时利用 log_{10} 减缓了随着浏览量增大导致得分变高的程度。
  2. \frac{Qanswers \times Qscore}{5} 表示问题的得分(赞成票和反对票之差)越高,回答的数量越多,分数越高。采用乘积的形式意味着即使问题本身的分数再高,没有人回答的问题也算不上热门问题。
  3. \sum(A_{scores}) 表示问题回答的总分数。回答总分采用了简单的加和,但实际上一个正确的回答要胜过多个无用的回答,简答的加和无法很好的区分这两种不同的情况。
  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 的评分排名算法考虑了参与程度(问题浏览次数和回答次数)、质量(问题分数和回答分数)、时间(问题时间和最近一次回答时间)等多个维度。

相关文章

网友评论

    本文标题:考虑时间的评分和排名分析

    本文链接:https://www.haomeiwen.com/subject/xyjgkdtx.html