基于用户投票的排名算法

来源:互联网 发布:社区网络数字化平台 编辑:程序博客网 时间:2024/06/02 11:35

Reddit 的程序是开源的,使用 Python 语言编写。排名算法的代码大致如下:

这段代码考虑了这样几个因素:

  (1)帖子的新旧程度t

t = 发贴时间 - 2005 年 12 月 8 日7:46:43

  t 的单位为秒,用 unix 时间戳计算。不难看出,一旦帖子发表,t就是固定值,不会随时间改变,而且帖子越新,t值越大。至于 2005 年 12 月 8 日,应该是 Reddit 成立的时间。

  (2)赞成票与反对票的差x

x = 赞成票 - 反对票

  (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 是一个符合大众口味的社区,不是一个很激进、可以展示少数派想法的地方。