Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >大数据工程师:如何改进豆瓣电影Top250的算法思路

大数据工程师:如何改进豆瓣电影Top250的算法思路

作者头像
机器学习AI算法工程
发布于 2018-03-12 09:55:22
发布于 2018-03-12 09:55:22
1.6K0
举报

作者:飞林沙 算法工程师

影迷们经常关注的电影排行榜里,一部由100人评出9.0分的电影,和一部由10000人评出8.0分的电影,谁应该排在前面呢?

这是我们算法工程师时常会面对的问题。

一些深度影迷可能会想到 imdb.com (互联网电影数据库) 所采用的贝叶斯公式[见附注],这个公式的思路就是通过每部影片的[评分人数]作为调节排序的杠杆:如果这部影片的评分人数低于一个预设值,则影片的最终得分会向全部影片的平均分拉低。

由此可见,平衡评分人数和得分,避免小众高分影片排前,是这个计算方法的出发点。可问题在于:调节整个榜单的排序主要依赖于这个[评分人数预设值]。如果它设置的很低,那么最终的排序结果,就是每部影片自身评分从高到低在排序;如果它被设置得过高,那么只适用高曝光率的影片。据说 imdb.com 的这个预设值从500一路调整到了25000,遗憾的是这个算法仍然无法很好的解决他们的问题。

我们看看国内电影市场的现状。2013年上映的《疯狂原始人》两个月内在豆瓣电影得到了13万人次的评分,而1974年上映的《教父2》,到目前为止的评分总人数还不到10万人。近几年观影方式的多样化以及影院观影的持续火爆,使得新近上映的影片很轻松地就能获得大量的评分,相较之下,老片子的曝光机会少了很多。显然,继续调节 [评分人数的预设值] 已无法满足当前国内电影排行榜的实际需求。

如何解决这个问题呢?对算法工程师而言,我们通常会先用最基本的算法模型来应对,然后针对该算法带来的问题再修改并衍生出新的算法。比如针对这里的[评分人数预设值],我们可以分出老片和新片两个排行分别对待,也可以把时间因素考虑在内,如此等等。

不过这次我们决定换个做法。

在重新审视过 [豆瓣电影TOP250] 这一产品之后,我们提炼出两个关键指标:

1 它应该具备人群的广泛适应性。

例如一些动漫作品,因为拥有大量的粉丝,容易得到高分。如果采用 imdb.com 的榜单公式计算,这些影片的排名就会很靠前,但它们显然不适合被推荐给非动漫迷。

我们的解决办法,是将电影划分为若干分类,每一分类对应着喜欢此类有显著代表性的人群。如此一来,排序问题就变成了推荐问题,即把某部影片分别向所有类人群做推荐,能被推荐给越多人群的电影也就越具备广泛性。

实际上,实验的结果也证明了《肖申克的救赎》这类电影的人群广泛度远远超越了《EVA》这样的动漫作品。

2 它还需要具备持续关注度,不能昙花一现。

1957年的《十二怒汉》时至今日仍然被人津津乐道,而一些票房大片上映时非常红,过后就乏人问津。如何解决他们的排序关系?

我们取得每部影片在不同时间周期内的收藏人数和评分,将其汇成一条收藏曲线,再分析不同的曲线及其间关系,计算相应的分数。

这样,更新后的算法便初步形成了。算法更新后,榜单产生了一些变化,具体哪些变化?这就去看看吧!( http://movie.douban.com/top250 )

再说两句题外话,其实依靠简单的维度去做排序的榜单,我们平时也见的很多。这也许能解决一时的问题。对比简单排序甚至人工编辑的方式,一个算法模型在结果展示上可能没有优势,但面对环境因素的应变和扩展性上,算法有能力自我学习和进化,相信这也是产品生命力的一种体现吧。

附录: imdb.com 的top榜单公开公式(http://www.imdb.com/chart/top)

The formula for calculating the Top Rated 250 Titles gives a true Bayesian estimate:

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

where:

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 25000) -入选top250榜单所需最低的有效评分人数 C = the mean vote across the whole report (currently 7.0) -所有影片的平均分

一直以来,我都很想借助一个例子来说明一个算法的诞生过程,或者说是思考的迭代过程,但是或者算法过于复杂,不利于初学者看懂,或者涉及到一些公司本身的机密,不便公开。正好这次有着这么一个不但容易而且比较典型的例子上线,就借机来说一下这个产品的诞生过程吧。 1. IMDB的TOP250 自IMDB以来,Top250就几乎成了各大网站的标配,而IMDB更是开放了自己Top250的算法: The formula for calculating the Top Rated 250 Titles gives a true Bayesian estimate: weighted rating (WR) = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C where: 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 25000) C = the mean vote across the whole report (currently 7.0) for the Top 250, only votes from regular voters are considered. 方法其实很简单,就是一个基础的贝叶斯平均,随着互联网访问人数的日益增长,IMDB将自己最初的平均值m从500一路调整到了25000,而且据我所知,大部分公司的Top榜也是依据这样的方式来进行计算,甚至原封不动地去沿用了IMDB的参数设置,那么我们不妨来思考下传统的贝叶斯平均所带来的弊病,以及Top250产生本身的意义。 2. 分析贝叶斯平均带来的问题 我们首先思考一下贝叶斯平均中m和c的意义,从算法本身出发,贝叶斯平均希望把不足评分人数的电影评分向平均值(也就是7.0)去拉近。 首先说m和c本身,这个m和c是否具有通用性?很明显并不是,而是一个经统计得出的值。那么这个值到底应该是一个平均值还是分位数,我觉得依然需要我们依照实际的数据分布来评估界定。 另外说这个公式本身,大部分网站使用的都是所有电影的均值或者是中位数,比如说IMDB的25000,那么这个值是否真的可以起到贝叶斯平均的意义?如果大家感兴趣,也许可以尝试着根据豆瓣电影的评分以及收藏人数数据设置对应的v1,v2,r1,r2来做一次简单的不等式推导,我们会发现,所得出的排序几乎就是按照分数从高到低的排序。 究其原因,其实还是因为互联网上本身长尾现象的存在,这就需要我们更恰当地来选择m和c本身的统计值。接下来的问题就属于细节问题,每个人有每个人的解决办法,也许并不通用。 3. 重新思考Top250的产品意义 解决一个问题,或者为一个产品定制算法,整体我更愿意把他分成两步来走: A. 用最最基本的算法实现(对于这个例子来说就是贝叶斯平均) B. 思考该算法所带来的问题,然后改善原有算法或者产生新算法,接下来重新开始B的迭代过程。

回归正文,我们思考Top250本身的产品意义是什么,在我眼里Top250的意义如下: A. 非个性化推荐。也就是说对于一个电影的新用户,或者一个不知道该看什么的电影老用户,为其推荐Top250总是没有错,而且是最保险的。简而言之,就是具备人群的广泛适应性。 B. Top250的电影应该是经过时间考验的,而不是上映之初评分红极一时然后迅速跌落的。 那么接下来我们就分别来解决以上的两个问题。 4. 如何保证人群的广泛性 我们对人群广泛性举一个简单的例子,例如EVA是一部深受动漫迷喜爱的日本动漫作品,所以评分也都会达到9分以上,但是对于非动漫迷来说,为其推荐EVA明显并不是一个合适的做法。

我一直很努力地在强调数据中心和工具中心的概念,在软件世界中,重用是亘古不变的一个话题,那么在我看来,数据和工具这两个位于软件世界最底层的东西是可被最广泛重用的东西。

在之前的一段时间中,我们花费很大精力建设了一个豆瓣所有类型条目的聚类的一个数据中心,那么接下来我们便可以依据这个已有的数据来解决这个问题。

假设说我们已经对电影划分成了100个类,而这100个类分别又对应着其具有显著代表性的100类人群(例如A类喜欢看爱情动作片),也就是说相当于把Rank问题转换成了推荐问题,即我把某电影分别像向100类人群做推荐,可以被推荐给越多人群的电影说明就是一个越具有广泛性的电影。 在最终的结果评测时,我们也可以发现如肖申克的救赎一类电影的人群广泛程度远远超过了足球小将,EVA这样的受众比较局限的动漫。 5. 如何达到持续关注的目的 关于持续关注,我们也举一个简单的例子,1957年的十二怒汉距今已经过去半个世纪了,但是至今人们依旧对其津津乐道,而太多的爆米花大片可能在上映之初红极一时,然后随着偶像的跌落神坛,或者走出电影院的3D效果,也许就很快变得无人问津了。

在这里,我的方法是得到每一部电影在不同的时间间隔内对应的收藏人数和评分,这样其实类似与对每一部电影都得到了一条收藏和评分的曲线。那么接下来只分析不同的曲线以及之间的关系便可得出结论。 例如如果某部电影的曲线下降的很迅速,那么我们便可以说该电影只在上映之初得到了好评和关注。这样我们便可以评估每条曲线的质量并计算相应的分数,对之前的Rank做一次Rerank。 6. 效率没问题之前,效率都不是问题 除非极少数极为复杂的算法之外,在算法初步完成之前,我并不愿意去过多地考虑效率相关的问题。因为我总是固执地认为效率问题往往都可以在后期通过很多办法来解决掉,或者并行化计算,或者用C/C++来改进,或者增加预处理,或者干脆去做一些近似计算。 7. 总结 其实这个例子本身很简单,我想讲述的不过是如何诞生新产品的思维方式: 先框架,再细节。 先整体,再局部。 先简单,再迭代。 先阐述问题,再解决问题。 先广度优先,再深度优先。 最后说一句,某人(还是很懂算法的某人)在某天跟我吐槽首页豆瓣猜不需要算法,我说为什么呢?他说不就是热点和友邻广播么?我说OK,那你说热点怎么做呢?他说就依靠喜欢数来做order by。 我说那阿北写了一篇日记有100喜欢,我写了一篇日记有99喜欢,到底哪一个算是热点呢?如果你想评估每个人在过往日记的表现,那么修女每次的日记都有几百的喜欢,那么没有超过他的均值他就永远都上不了热点了么?如果你希望用户之间的比较,又要怎么样比较才能达到性能和质量的折中?

具体算法也许不便透露,我只是想说,永远不要认为一个外表看上去简单的产品在内部也是一样简单的,因为每个算法的背后都隐藏着无数你所忽略或者不去在意的种种细节。

再说两句题外话,其实依靠简单的维度去做排序的榜单,我们平时也见的很多。这也许能解决一时的问题。对比简单排序甚至人工编辑的方式,一个算法模型在结果展示上可能没有优势,但面对环境因素的应变和扩展性上,算法有能力自我学习和进化,相信这也是产品生命力的一种体现吧。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-10-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据挖掘DT数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
R语言IMDb TOP250电影特征数据挖掘可视化分析受众偏好、排名、投票、评分
本文首先介绍了IMDb(互联网电影资料库) TOP250及其排名算法、评分机制利弊,帮助客户通过分析《黑暗骑士》、《肖申克的救赎》和《教父》三部影片在2008年7月至9月评分数据,分析排名变动的原因。其次,通过抓取曾经入选电影的生产国家、导演和演员、制作年份、风格流派以及当前入选的制作年份和各自的计数、平均打分,总结IMDb TOP250电影特征,最终得出互联网资料库Top250多为欧美国家制作于上世纪末本世纪初剧情片的分析结果。
拓端
2023/06/28
3920
豆瓣电影top250爬虫及可视化分析
  人类社会已经进入大数据时代,大数据深刻改变着我们的工作和生活。随着互联网、移动互联网、社交网络等的迅猛发展,各种数量庞大、种类繁多、随时随地产生和更新的大数据,蕴含着前所未有的社会价值和商业价值!!!
小孙同学
2022/01/17
6.6K0
豆瓣电影top250爬虫及可视化分析
Python数据可视化:豆瓣电影TOP250
首先任意文件夹下命令行运行scrapy startproject doubanTop250,创建一个名为doubanTop250的文件夹。
小F
2020/10/09
1.8K0
Python数据可视化:豆瓣电影TOP250
你知道豆瓣电影是怎么评分的吗?
“假设,是针对我们的分析结果而言。你希望最后输出一个什么结果,或者你需要证明什么结果,都可以当做假设!”
小一不二三
2019/12/31
1.3K0
你知道豆瓣电影是怎么评分的吗?
爬取豆瓣Top250 - 2
码农GT038527
2024/11/11
1250
爬取豆瓣Top250 - 2
Python爬取豆瓣电影Top250并进行数据分析
利用Python爬取豆瓣电影TOP250并进行数据分析,爬取’排名’,‘电影名称’,‘导演’,‘上映年份’,‘制作国家’,‘类型’,‘评分’,‘评价分数’,’短评’等字段。
全栈程序员站长
2022/09/05
2.1K0
爬取豆瓣Top250 - 1
码农GT038527
2024/11/06
1110
爬取豆瓣Top250 - 1
Python爬取豆瓣电影Top250并进行数据分析
利用Python爬取豆瓣电影TOP250并进行数据分析,爬取’排名’,‘电影名称’,‘导演’,‘上映年份’,‘制作国家’,‘类型’,‘评分’,‘评价分数’,'短评’等字段。
润森
2022/08/18
4.5K0
Python爬取豆瓣电影Top250并进行数据分析
爬虫实战-手把手教你爬豆瓣电影
如果上面三小节还有问题,可以点回去再复习一下。作为基础内容并不是要求大家一定都掌握,特别是第三小节,网页解析用法特别多,一般人很难都记住。 我在写这篇的时候也会时不时的翻回去看一看之前的文章,可能有的方法并不是最简单的方法,但是只要达成目的就ok,这里你们自由发挥。
小一不二三
2019/12/31
9840
爬虫实战-手把手教你爬豆瓣电影
python数据可视化 豆瓣电影top250数据分析
文章目录 一、上映高分电影数量最多的年份Top10 import collections import pandas as pd from matplotlib import pyplot as plt # 读取数据 df = pd.read_excel("movie.xlsx") # print(type(df)) # <class 'pandas.core.frame.DataFrame'> show_time = list(df["上映时间"]) # 有上映时间数据是1961(中国大陆)这
叶庭云
2020/09/17
3.8K0
python数据可视化 豆瓣电影top250数据分析
Top250电影爬取并进行数据分析
利用Python对豆瓣电影Top250电影进行爬取,收集相关的信息,并且利用Python进行数据分析,获取'排名','电影名称','导演','上映年份','制作国家','类型','评分','评价分数','短评'等字段,探索相关的数据。
北山啦
2022/11/04
8620
豆瓣已玩烂,来爬点有逼格的 ——IMDB 电影提升你的品位
转战Python半年,接触爬虫2个月,期间读了10本相关书籍,完成此作,算是对过去学习、实践的一次回顾。也希望与更多的python,爬虫爱好者小伙伴们一起交流、成长。
龙哥
2019/04/25
9960
豆瓣已玩烂,来爬点有逼格的 ——IMDB 电影提升你的品位
Python爬虫 爬取豆瓣电影Top250信息
文章目录 一、分析网页 翻页查看url变化规律: 第一页:https://movie.douban.com/top250?start=0&filter= 第二页:https://movie.dou
叶庭云
2020/09/17
2.9K0
Python爬虫   爬取豆瓣电影Top250信息
【Python爬虫五十个小案例】爬取豆瓣电影Top250
文章链接:https://cloud.tencent.com/developer/article/2470420
小馒头学Python
2024/11/25
5970
【Python爬虫五十个小案例】爬取豆瓣电影Top250
IMDB算法(贝叶斯算法)
一些细节我觉得有必要提一下:1. TOP 250的影片都要求评价人数超过基础人数,以限制某些像民族性,小众性的电影挤进来了;2. 考虑TOP 250排名的时候,只取那些经常投票的人的票以避免刷票;3. 为什么一定要强调是TOP 250的排名。因为TOP 250的排名和IMDB的正常排名是不一样的算法。具体网站上正常排名是怎么算的对外保密了,所以不得而知。最后补充一点个人理解:贝叶斯的这套算法相对国内的网站还是科学的多的。然而个人理解还是有一些小问题的:新上映的电影短时间内评分上不去。假设电影A是老牌经典电影,100万个人给了9分,最后得分9分;电影B只是10年前的经典电影,1万个人给了9.1分,最后得分将只有8.85。这点差距放在排名上其实是非常大的。所以说,IMDB的TOP 250肯定是好电影,但不是所有的好电影都能进入TOP 250。
李玺
2021/11/22
6320
IMDB算法(贝叶斯算法)
爬取豆瓣电影排行top250
功能描述V1.0: 爬取豆瓣电影排行top250 功能分析: 使用的库 1、time 2、json 3、requests 4、BuautifulSoup 5、RequestException 上机实验室: """ 作者:李舵 日期:2019-4-27 功能:抓取豆瓣电影top250 版本:V1.0 """ import time import json import requests from bs4 import BeautifulSoup from requests.e
py3study
2020/01/16
5740
python爬虫获取豆瓣电影TOP250
在之前的博客中,小菌分享了几篇关于python爬虫的小程序,受到了许多小伙伴们的认可,小菌还是比较激动٩(๑>◡<๑)۶,毕竟小菌毕竟不是python方向的,很多的内容都是自己找资料自学的。同样本篇博客,小菌将继续分享实用的爬虫—获取豆瓣电影Top250的内容,并保存在MySQL数据库中。
大数据梦想家
2021/01/22
9690
python爬虫获取豆瓣电影TOP250
爬虫入门经典:如何爬取豆瓣电影Top250
我们打开网址,查看页面布局,可以看到有电影名称及别名、评分、引言等等,在此就以电影名称及别名、评分、引言为爬取目标。
不温卜火
2020/10/28
1.2K0
爬虫入门经典:如何爬取豆瓣电影Top250
python爬取豆瓣电影Top250的信息
python爬取豆瓣电影Top250的信息。 初学,所以代码的不够美观和精炼。 如果代码有错,请各位读者在评论区评论,以免误导其他同学。 (可能也没多少人看) import requests #从bs4中导入BeautifulSoup模块 from bs4 import BeautifulSoup #获取电影的名称(中文,外文,其他) def get_movies_name():     #定制请求的头部     headers = {         "user-agent":"Mozill
拓荒者
2019/03/16
6120
Python爬虫--爬取豆瓣 TOP250 电影排行榜
本篇讲介绍一个简单的Python爬虫案例–爬取豆瓣 TOP250 电影排行榜。 很多朋友在看一部电影前都喜欢先找一下网友们对该片的评价。
Flaneur
2020/03/25
3.2K0
推荐阅读
相关推荐
R语言IMDb TOP250电影特征数据挖掘可视化分析受众偏好、排名、投票、评分
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档