博客迁移:时空蚂蚁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评论排名算法:他这里设计到一个威尔逊置信区间,可以根据置信区间的宽窄计算出更加人性化的排行榜。具体计算方法是:
- 计算每个评论的”好评率”
- 计算每个”好评率”的置信区间(以 95% 的概率)。
- 根据置信区间的下限值,进行排名。这个值越大,排名就越高。
我自己感觉有些复杂,用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