@ 2014.04.03 , 13:31

Reddit的评论排序新算法

# Voldemort投递:这篇翻译自Redditblog,除了投稿之外我更希望煎蛋能够采用这个算法。解决长久以来文章置顶评论基本上被前十楼占领的问题。Reddit置顶评论的质量可以说是我见过的网站中最高的,原因就在于Reddit的帖子和评论的排序算法一直以来都是业界领先。这个算法是xkcd的作者Randall神牛推荐给Reddit的,我的观察是效果相当出众。

其实算法极其简单,就是把原来排序的公式(JavaScript为例)

score = oo - xx;

改成一个稍微复杂点的公式

n = oo + xx;
if (n==0) {
score = 0;
}
else {
z = 1.96;
phat = oo / n;
score = (phat + z*z/(2*n) - z * Math.sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n);
}


嗨!我是xkcd的作者Randall,今天来为大家解释下Reddit的新的评论排序系统。这个系统是我当时极力推荐的。

一般呢,我会给我的博客文章配些手绘图,但是今天这篇文章内容没什么图可配,所以可能会混进些乱七八糟的东西,你们凑合看吧~

[-]

Reddit现在采用了一个新的算法:“Best”排序(之前有Top/Hot/New/Controversial/Old)。注意这个算法仅仅用在评论排序中,没有用在文章排序中。Davean(xkcd系统管理员)之前写过一个补丁,试用了这个新算法大概一周。今天早上,它正式成为了我们评论区的默认排序方法。

本人认为这个算法相当给力。其实大多数人都不会注意到有什么变化,它并不影响评论层级等其它东西,但是会极大改善置顶(最高oo)评论的质量。

[-]

算法的具体细节可以猛击这篇来自Evan Miller的文章。作者认为常见的根据投票来排序的体系都存在各自的问题,他解释了算法的具体细节并给出了例子。如果你想看看新系统在Reddit中运用的实战效果可以直达本文最后附上的截图。但是广大geek们可能更想知道新算法究竟为什么能改善Reddit评论质量。

Reddit评论排序一个最严重的问题是极其偏袒比较早发表的评论。如果有人在文章发布一小时内回复一个很一般的吐槽,只要这个吐槽有那么一点点好笑,这条评论将一定会被顶为最佳评论。顺便说下之所以我很了解这个现象,是因为我有一堆Reddit马甲,我用它们发过无数不是很好笑的吐槽。这是因为一旦一个评论在文章刚刚发表的时候得到一些oo,它会被顶到最上面。而评论排名越前,它被后来的网友读到的概率就越大,所以会形成一个良性循环从而锁定了这评论置顶的位置。而文章发表一小时后的优秀评论,就算读过它们的网友中给oo的比例远远高出置顶评论,也很难撼动置顶评论的地位。

每隔一段时间总有些帖子的话题是类似于“你最喜欢的笑话/最有用的建议/最尴尬的秘密/最古怪的癖好”等等。几周前,我找了一个这样的帖子。当时这个帖子刚发表8个多小时。我数了数排在最上面的10条评论,不是“发表于7小时前”就是“发表于8小时前”,也就是说它们都发表于的帖子诞生后的两个小时内。所谓“置顶”评论实际上已经成了一个“一小时速回笑话排行榜”。在之后的六个小时之中没有一个评论能挤进排行榜。要知道这个时间段才是评论发表的高峰期。

这些后发表的评论完全没有竞争的机会。随着帖子慢慢被刷出首页,之后评论的票数就不怎么增长了。或许后来的网友中有人会碰巧看到,给个oo,但是这并不会帮助它们追上置顶评论。一个典型的例子,就是有时候你会看到有人特意回复置顶评论“抱歉挤进您的评论,但是我要链接一个重要确凿的事实来驳斥楼主的观点”。因为他们知道,无论他们提供的信息有多宝贵,也成为不了置顶评论。

[-]

管理员们试图通过一种拙劣的hack来解决这个问题:“hot”排序(给评论加上时间限制,一段时间后原有置顶评论会被撤销置顶)。但是这个排序会不分青红皂白地把真正优秀的评论也踢下去。而且文章发表一两天后,评论区的排序会完全一片混乱。

有一个解决方案,这就是新的“Best”排序。大概思路是这样的,当有少量的人给一条评论投票后,我们对这条评论的质量会有一个大概的印象。评论的人越多,我们就越能精确地评价这条评论最终的正确排名。通过这个算法,我们把这种“精确程度”进行量化,从有限的投票中尽可能的推测出评论的真实质量。

对某一条评论来说,如果每个人都能看到它,并且给它投票,它最终会得到一定比例的oo和xx。新算法把已经投出的oo和xx看作是所有可能投出的oo/xx的统计抽样,并计算得到95%置信区间。我们第一步对这些区间进行排名,这个暂时排名比较的是这些评论最终排名100在一百次统计中95次可能落在的区间。

[-]

如果一条评论得到了1个oo和0个xx,那它的优评比就会是100%。但是我们的抽样数据太少了,系统还是会把它排在最低。但是如果它已经得到了10个oo但只有1个xx,我们应当有足够的自信把它排在一条40oo/20xx的评论前面,因为我们可以设想当这条评论有机会得到40oo的时候,它的xx数几乎可以肯定少于20,精确地说是95%以上的概率少于20。

不仅如此,最妙的地方在于就算我们错了(5%概率),这条评论会迅速得到大量新的抽样数据,从而将它快速纠正到正确的位置。也就是说在这个这个新算法下,真正优秀的评论会迅速置顶并停留在最高位置,而欠佳的评论则只能漂浮在排行榜的最底部。细心的网友可能会注意到有些评论就是会得到更多的投票(不是指更多oo或更多xx,而是读了这些评论的人会更倾向于投上一票),这个现象我们的新算法并没有明确考虑到,然而这个现象产生的偏袒比起发表时间产生的偏袒要微小得多。而且总票数少的评论本来就更难估计质量。

在实际运行中,这个新的排序系统效果可谓拔群。下面是一个我今天看到的帖子(就在我写这篇文章的时候)。一个Redditor想人肉搜索一个酒吧中曾经给他拍照的妹子:
[-]

拍照的妹子相当长一段时间后才发现了这个帖子,回复并提供了照片。在那之前,网友们各种吐槽,几个小时后才有人回答他的问题,找到了那张照片。虽然妹子本人的回复被网友怒顶,但是在老的排序系统下,她的回复根本顶不到置顶区去。
[-]

就算你折叠置顶评论,下面一条还是无关评论。在被看到的网友怒顶了8小时后,这个妹子的回复仍然只能排在第三。

好的,咱们看下面新算法的排序结果,我想不用我多说了。
[-]

[-]
# 任务完成,这是里面那张 imgur 相片

采用新算法的Reddit会更聪明,更好用。我很期待再次看到“你最喜欢的笑话”类型的帖子,看到大家在新的评论排序系统下能够浏览到更优秀的置顶评论。

[-]

[Voldemort via Redditblog]

支付宝打赏 [x]
您的大名: 打赏金额:
赞一个 (11)