zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    表达式与运算符
    Python3 从零单排22_异常处理
    Python3 从零单排21_元类
    Python3 从零单排20_方法(绑定&内置)&反射
    Python3 从零单排19_组合&多态
    Python3 从零单排18_封装
    Python3 从零单排17_类的继承
    Python3 从零单排16_面向对象基础
    Python3 从零单排15_urllib和requests模块
    Python3 从零单排14_flask模块&mysql操作封装
  • 原文地址:https://www.cnblogs.com/hongbo819/p/3956824.html
Copyright © 2011-2022 走看看