IMDB.COM排名算法(贝叶斯公式)和Reddit评论排行算法

博客迁移:时空蚂蚁http://cui.zhbor.com/

因为最近做万维品牌口碑的项目,需要对口碑进行一个对比,现在库中也有一部分的数据了,有很多的品牌评分居然是一样的,这是库中的真实的数据,如果我简单的按平均分进行评比,也行不太公平,因为有很多评论人数很多,但有的很少。

所以我就研究了一些算法。

刚开始引用了IMDB.COM排名算法,他主要是对top250进行排名,对评分的人数有一定的限制,而我们品牌库中总不能不让相应的品牌露出。所以针对品牌库中排行使用贝叶斯公式的算法是不合适的,没有意义,因为他针对的是超过某些评论后的数据的排行,对于那些评论数没有超过最低的有效评分人数时是没有露出机会的,贝叶斯还有一个缺点:主要问题是它假设用户的投票是正态分布。比如,电影A有 10 个观众评分,5个为五星,5个为一星;电影B也有 10 个观众评分,都给了三星。这两部电影的平均得分(无论是算术平均,还是贝叶斯平均)都是三星,但是电影A可能比电影B更值得看。 

这里跟大家分享一下IMDB.COM排名算法公式:

WR = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C

具体意思:

R =  单部电影的平均得分
v = 单部电影的有效评分人数(for this top 250, only votes from regular voters are considered.)防止粉丝拉票

m =  入选top250榜单所需最低的有效评分人数
C = 所有影片的平均分

-------------------------------

IMDB.COM排名算法不可用,于是我转战reddit评论排名算法:他这里设计到一个威尔逊置信区间,可以根据置信区间的宽窄计算出更加人性化的排行榜。具体计算方法是:

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

我自己感觉有些复杂,用PHP写出来如下:

1 function willson($ups=10, $downs=1){
2         $n = $ups + $downs; //评论总数
3         if($n==0) return 0;
4         $z = 1.0;
5         $phat = (float)$ups/$n;
6         return ($phat+$z*$z/(2*$n)-$z*sqrt(($phat*(1-$phat)+$z*$z/(4*$n))/$n))/(1+$z*$z/$n);
7     }

其中:

$ups 好评数

$downs 差评数 

$z 表示对应某个置信水平的z统计量,这是一个常数,可以通过查表得到。一般情况下,在 95% 的置信水平下,z统计量的值为1.96

用这个公式也会有问题,因为品牌评分是按照五个等级评分,而这个公式只有好坏评分,所以我利用置信区间的不同来进行等级排名。最后的结果是非常满意,排名很人性化,能达到自己想要的效果。如果自己用平均值计算排名自己感觉都有点不好意思了。

参考:http://www.biaodianfu.com/imdb-rank.html

参考:http://www.biaodianfu.com/reddit-comment-sorting-algorithms.html

原文地址:https://www.cnblogs.com/hongbo819/p/3956824.html