IMDB评分排名算法

    IMDB网站是目前互联网上最为权威、系统、全面的电影资料网站,里面包括了几乎所有的电影,以及1982 年以后的电视剧集。IMDB的资料中包括了影片的众多信息,演员,片长,内容介绍,分级 ,评论等,就个人买碟而言,很大程度上也是参考IMDB的得分。 它所特有的电影评分系统深受影迷的欢迎,注册的用户可以给任何一部影片打分并加以评述,而网站又会根据影片所得平均分、选票的数目等计算得出影片的加权平均分并以此进行TOP250(最佳250部影片)和Bottom100(最差100部影片)的排行。


    由于影片资料的更新和所得评分的不断变化,TOP250和Bottom100必定是份动态的名单,但大部分出色(或者说是受大众欢迎的)影片的位置会相对不变,于是这份TOP榜单也就有了窥视大众电影口味的意义。评选最佳250部电影时只考虑正式的投票者的投票结果。分值系统采用10分制,最低为awful(令人厌恶)的1分,最高为excellent(出类拔萃)的10分。值得注意的是,虽然很多影片在资料系统中得分很高,但由于未能达到TOP所要求的最低1250张的投票数而无法参加排行。因此,很多曲高和寡(至少在美国)的优秀影片未能列入其中。尽管如此,这份名单对选看影片仍具有重要的参考价值。


    这里就有一个问题:热门电影与冷门电影的平均得分,是否真的可比?举例来说,一部好莱坞大片有10000个观众投票,一部小成本的文艺片只有100个观众投票。这两者的投票结果,怎么比较?如何才能公平地反映出一部电影真正的质量?


    一个合理的思路是,如果要比较两部电影的好坏,至少应该请同样多的观众观看和评分。既然文艺片的观众人数偏少,那么应该设法为它增加一些观众。在排名页面的底部,IMDB给出了它的计算方法。


    根据IMDB网站上公布的TOP250评分标准:


    imdb top 250用的是贝叶斯统计的算法得出的加权分(Weighted Rank-WR),公式如下:


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


    其中:


    R = average for the movie (mean) = (Rating) (是用普通的方法计算出的平均分)


    v = number of votes for the movie = (votes) (投票人数,需要注意的是,只有经常投票者才会被计算在内,这个下面详细解释)


    m = minimum votes required to be listed in the top 250 (currently 1250) (进入imdb top 250需要的最小票数,只有三两个人投票的电影就算得满分也没用的)


    C = the mean vote across the whole report (currently 6。9) (目前所有电影的平均得分)


    仔细研究这个公式,你会发现,IMDB为每部电影增加了1250张选票,并且这些选票的评分都为6。9。这样做的原因是,假设所有电影都至少有1250张选票,那么就都具备了进入前250名的评选条件;然后假设这1250张选票的评分是所有电影的平均得分(即假设这部电影具有平均水准);最后,用现有的观众投票进行修正,长期来看,v/(v+m)这部分的权重将越来越大,得分将慢慢接近真实情况。


    这样做拉近了不同电影之间投票人数的差异,使得投票人数较少的电影也有可能排名前列。


    IMDB上的评分完全来自于网民的评价,凭的是参与评价的网民的自身喜好,参与评分的网民越多,IMDB的评分越有可靠性。


    看到这个公式,我们就能明白为什么IMDB的排名最有权威性,虽然它是一个以英美观众为主的网站,但依然受到全世界影迷的推崇,这和它以科学为主导的客观公正性是分不开的。别的各种所谓排行榜都可以伪造,可以花钱买,或者是一种商业游戏,但是IMDB不是,所以这就是它的价值。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
利用IMDb电影数据文件,可以使用MapReduce算法实现一些任务,例如计算电影评分的平均值、查找特定类型的电影等。下面是一个简单的MapReduce任务示例,用于计算IMDb电影数据文件中所有电影的评分平均值: 1. Map阶段:对每个电影记录,将电影评分作为键,将1作为值,发射键值对。 2. Reduce阶段:将相同评分的键值对按键聚合,并计算每个评分的总和和计数。最终,计算出每个评分的平均值。 以下是示例代码: Mapper: ``` public class MovieRatingMapper extends Mapper<Object, Text, FloatWritable, FloatWritable> { private final static FloatWritable one = new FloatWritable(1); private FloatWritable rating = new FloatWritable(); public void map(Object key, Text value, Context context) throws IOException, InterruptedException { String[] fields = value.toString().split(","); rating.set(Float.parseFloat(fields[2])); context.write(rating, one); } } ``` Reducer: ``` public class MovieRatingReducer extends Reducer<FloatWritable, FloatWritable, FloatWritable, FloatWritable> { private FloatWritable result = new FloatWritable(); public void reduce(FloatWritable key, Iterable<FloatWritable> values, Context context) throws IOException, InterruptedException { float sum = 0; int count = 0; for (FloatWritable value : values) { sum += value.get(); count++; } result.set(sum / count); context.write(key, result); } } ``` 在以上示例中,Mapper将每个电影的评分作为键,将1作为值,发射键值对。在Reducer阶段,相同评分的键值对按键进行聚合,并计算每个评分的总和和计数,最终计算出每个评分的平均值。 当然,以上示例只是一个简单的 MapReduce 任务,实际上可以根据需要进行更复杂的计算和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值