从豆瓣电影评分算法说起

在PingWest看到一篇《豆瓣电影打分规则竟如此简单粗暴…》,作者写这篇文章是因为豆瓣创始人阿北最近写了一篇博文《豆瓣电影评分八问》,阿北博文是为了回应一些外界对豆瓣电影评分的质疑,然后作者看到这篇博文后,觉得豆瓣电影的评分算法有点low,就写了这样一篇吐槽文章。

那么这个很low的算法究竟是什么样子的呢?此处引用阿北原文。

豆瓣的注册用户看完一部电影,心情好的话会来打个一到五星的分(有时候心情不好也会来)。比方说一部电影有42万用户打分。我们的程序把这42万个一到五星换算成零到十分,加起来除以42万,就得到了豆瓣评分。这个评分会自动出现在豆瓣各处,中间没有审核,平时也没有编辑盯着看。每过若干分钟,程序会自动重跑一遍,把最新打分的人的意见包括进来。

简单说就是计算每部电影评论的算数平均值,并按此值来排名。

对这个算法持怀疑态度,因为如果按照这个算法的话,假设一部小众文艺片有10个用户给了全五星,和一部经典老片比如《十二怒汉》相比,小众文艺片排名比《十二怒汉》还要高,不过这在豆瓣电影TOP250里面不太可能。阿北可能只是为了文章写作方便或是保密起见,把算法故意说简单了,因为假如豆瓣公布了详细的算法,那电影发行方的水军们十分有可能针对这个算法制定出有效的刷分策略的。可怜小编还真信了。

下面是阿北当年在知乎上的回答

《从豆瓣电影评分算法说起》

顺着PingWest这篇文章给的链接,我又去阮一峰博客看了他在2012年写的《基于用户投票的排名算法》系列文章,以及这些文章里的参考文章,发现排名算法很好玩很有趣,非常有收获,推荐阅读。

看完这些文章,我就想知道知乎的评论排名算法是怎么样的,于是去知乎找到他们产品经理@黄涛的回答,知乎在2014年底更新的算法使用的正是Reddit在2009年引入的评论排名算法,也就是阮一峰老师在系列文章第5篇中介绍的「威尔逊区间」算法。在用这个算法之前,知乎用的是直接利用好评减去差评的结果来给评论排序,这种算法的缺点我就不介绍了,可以查看参考资料[1]。

「威尔逊区间」算法的数学基础是数学家Edwin B. Wilson在1927年提出的威尔逊区间修正公式,后来芝加哥工程师Evan Miller在2009年写了一篇博客,认为该修正公式可以用来做排名。

这个算法的核心思想是这样的:

  1. 计算每个评论的好评率
  1. 计算每个好评率的置信区间(以 95% 的概率)。
  2. 根据置信区间的下限值,进行排名。这个值越大,排名就越高。

所谓「置信区间」就是说在某个概率下(通常是95%),好评率p会落在的那个区间。比如,某个产品的好评率是 80%,但是这个值不一定可信。根据统计学,我们只能说,有 95% 的把握可以断定,好评率在 75% 到 85% 之间,即置信区间是[75%, 85%]。

置信区间的实质,就是进行可信度的修正,弥补样本量过小的影响。如果样本多,就说明比较可信,不需要很大的修正,所以置信区间会比较窄,下限值会比较大;如果样本少,就说明不一定可信,必须进行较大的修正,所以置信区间会比较宽,下限值会比较小。

因为常见的置信区间计算公式「正态区间」不能很好的照顾小样本数量的准确性,而威尔逊提出的修正公式能很好地修正小样本数量的准确性问题,所以大家采用「威尔逊区间」算法较多,像Reddit、Yelp、Digg,还有知乎。

不过这种算法也有缺点,缺点就是对于那些得票少的新评论很难获得出头之日,因为得票少,置信区间就会宽,排名位置就会低,得到的关注也就会更少。

前面阿北的回答里面提到了IMDB,IMDB是亚马逊旗下的一个类似豆瓣的电影排名网站,他们在处理TOP250电影排名问题时采用了「贝叶斯平均」算法来解决,这个算法的核心思想是既然新兴产品的评分数量很少,那我就为你人工补偿一定的投票。关于这种算法在阮一峰老师系列文章第6篇中有介绍。

更多参考资料:

  1. How Not To Sort By Average Rating
  2. How Reddit ranking algorithms work
  3. 基于用户评价的评分模型
  4. 基于用户投票的打分算法
  5. Reddit评论排名算法
  6. Reddit的排名算法
  7. 数学之美:IMDB.COM排名算法
  8. Hacker News的热门排名算法
    原文作者:gentleming
    原文地址: https://www.jianshu.com/p/77ac83db802d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞