使用 Python 创建自己的电影推荐引擎

2025年3月17日 | 阅读 14 分钟

您是否想过 Netflix 是如何推荐那些如此符合您偏好的电影的?或者,也许您也想构建一个能为客户提供这类建议的系统?

如果您的回答是肯定的,那么您来对地方了,因为本文将向您展示如何使用 Python 构建一个电影推荐系统。

然而,在我们讨论“如何做”之前,我们应该先了解“是什么”。

如果您参与这个项目,它将有助于:

  • 增强您的信心 - 当您使用真实的工具和技术时,您会对自己的优势充满信心,同时也能认识到自己的薄弱环节。
  • 探索 - 在处理 Python 项目时,您需要熟悉新的工具和技术。您尝试的 Python 项目想法越多,您获得的知识就越多。您对最先进的开发工具、环境和库了解得越多,您的项目实验范围就越广。
  • 了解 SDLC 的细节 - 当您从头开始开发一个项目时,您将对软件开发生命周期的运作方式有更深入的理解。随着时间的推移,您将学会如何在编写代码前进行规划、执行代码、处理测试过程、修复错误、部署代码以及定期更新您的软件产品。
  • 掌握编程概念 - 构建真实项目的最大优势之一是,通过不断的实践,您将掌握不同语言的编程概念和模式。

电影推荐系统:它是什么?

推荐系统已经成为我们日常生活中不可或缺的一部分。从亚马逊和 Flipkart 等在线零售商到 YouTube 和 Facebook 等社交媒体平台,每个主要的数字公司都在使用推荐系统为客户提供个性化的体验。

您日常生活中推荐系统的一些例子包括:

  • 您在亚马逊上购买产品时收到的建议是推荐系统的结果。
  • YouTube 使用推荐系统来推荐适合您口味的视频。
  • Netflix 有一个著名的推荐系统,可以根据您的偏好推荐节目和电影。

推荐系统是利用数据向用户推荐产品的系统。这些数据可能关乎用户的兴趣、历史记录等。如果您正在学习机器学习和人工智能,那么研究推荐系统是必不可少的,因为它们正变得越来越流行和先进。

推荐系统是一种简单的算法,其目的是通过在数据集中寻找模式,为用户提供最相关的信息。该算法对项目进行评分,并向用户展示他们会给予高评价的项目。推荐系统的一个实际例子是,当您访问亚马逊时,会发现一些商品被推荐给您;或者当 Netflix 向您推荐某些电影时。Spotify 和 Deezer 等音乐流媒体应用也使用推荐系统来推荐您可能喜欢的音乐。

以下是关于推荐系统在电子商务网站中如何工作的简单图示。

Using Python Create Own Movies Recommendation Engine

两位顾客从一个电子商务商店购买了相同的商品 A 和 B。当这种情况发生时,系统会计算这两位顾客的相似度指数。根据这个分数,系统可以向另一位顾客推荐商品 C,因为它识别出这两位顾客在购买商品方面是相似的。

不同类型的推荐系统

最常见的推荐系统是基于内容的和协同过滤的推荐系统。在协同过滤中,利用一组用户的行为向其他用户进行推荐。推荐是基于其他用户的偏好。一个简单的例子是根据朋友对某部电影的喜爱程度向用户推荐该电影。协同模型有两种类型:基于内存的方法和基于模型的方法。基于内存的方法的优点是它们易于实现,并且生成的推荐通常很容易解释。它们分为两种:

  • 基于用户的协同过滤: 在此模型中,根据与该用户相似的用户对产品的喜好来向其推荐产品。例如,如果 Derrick 和 Dennis 喜欢相同的电影,并且 Derrick 喜欢一部新电影,我们可以将那部电影推荐给 Dennis,因为 Derrick 和 Dennis 似乎喜欢相同的电影。
  • 协同推荐系统
    • 协同推荐系统根据相似用户对某项物品的喜爱程度来推荐物品。它将兴趣和品味相似的用户分组,并相应地向他们推荐产品。
    • 例如,假设您和另一位用户都喜欢《Sholay》。现在,在观看并喜欢《Sholay》之后,那位用户又喜欢了《Golmaal》。由于您和那位用户有相似的兴趣,推荐系统会根据这些数据建议您观看《Golmaal》。这就是协同过滤。
  • 基于物品的协同过滤: 这些系统根据用户过去的评分来识别相似的物品。例如,如果用户 A、B 和 C 都给书籍 X 和 Y 打了 5 星评价,那么当用户 D 购买书籍 Y 时,他也会收到购买书籍 X 的推荐,因为系统根据用户 A、B 和 C 的评分将书籍 X 和 Y 识别为相似物品。
  • 基于模型的方法:基于模型的方法基于矩阵分解,并且在处理稀疏数据方面表现更好。它们是使用数据挖掘和机器学习算法来预测用户对未评分物品的评分而开发的。这种方法使用诸如降维之类的技术来进一步提高准确性。这种基于模型的方法的例子包括决策树、基于规则的模型、贝叶斯模型和潜在因子模型。
  • 基于内容的系统基于这样的理念:如果你喜欢某个特定的东西,你很可能也会喜欢类似的东西。基于内容的系统使用元数据,例如类型、制作人、演员和艺术家,来推荐电影或音乐等物品。这样的推荐系统会推荐一部由范·迪塞尔主演的《无限战争》,因为有人看过并喜欢《速度与激情》。同样,你可能会收到某些艺术家的音乐推荐,因为你喜欢他们的音乐。基于内容的推荐系统根据从用户那里获得的数据来推荐物品。它可以基于明确的数据(“喜欢”、“分享”等)或隐含的数据(观看历史)。推荐系统会使用这些数据来创建一个特定的用户画像,并根据该画像推荐物品。

构建一个简单的电影推荐系统

既然我们已经掌握了推荐系统的基础知识,那么让我们开始构建一个电影推荐系统吧。

这个数据集包含超过 2600 万次评分和 75 万个标签应用,覆盖超过 75,000 部电影,但我们只使用了那个庞大数据中的一些样本。这个数据集中包含了标签基因组数据,拥有超过 1200 万个相关性分数。

我们正在使用完整的数据集来创建一个基础的电影推荐系统。然而,您可以自由地为这个项目使用一个更小的数据集。首先,我们需要导入所有必需的库。

一个基于 Python 的基础电影推荐系统会根据电影的受欢迎程度和类型来推荐电影。这个系统的工作原理是基于这样一个概念:广受好评的热门电影很可能会受到广大观众的喜爱。请记住,这样的电影推荐系统不提供个性化推荐。

Using Python Create Own Movies Recommendation Engine

为了实现它,我们将根据电影的受欢迎程度和评分对它们进行排序,并传入一个类型参数来获取该类型的顶级电影。

表 1:电影ID、标题和类型

电影IDtitle类型
1电影名称:玩具总动员 (1996)动作 | 动画 | 儿童 | 喜剧 | 奇幻
2电影名称:勇敢者的游戏 (1996)动作 | 儿童 | 奇幻
3电影名称:脾气更坏的老男人 (1996)喜剧 | 爱情
7电影名称:待到梦醒时分 (1996)喜剧 | 剧情 | 爱情
5电影名称:新岳父大人续集 (1996)喜剧
6电影名称:盗火线 (1996)动作 | 犯罪 | 喜剧
7电影名称:情归巴黎 (1996)喜剧 | 爱情
8电影名称:汤姆和哈克 (1996)动作 | 儿童
9电影名称:突然死亡 (1996)操作
10电影名称:黄金眼 (1996)动作 | 动作 | 喜剧
11电影名称:白宫奇缘 (1996)喜剧 | 剧情 | 爱情
12电影名称:吸血鬼也疯狂 (1996)喜剧 | 恐怖
13电影名称动作 | 动画 | 儿童
17电影名称:尼克松 (1996)剧情
15电影名称:割喉岛 (1996)动作 | 动作 | 爱情
16电影名称:赌城风云 (1996)犯罪 | 剧情
17电影名称:理智与情感 (1996)剧情 | 爱情
18电影名称:四个房间 (1996)喜剧
19电影名称:神探飞机头2:大自然的呼唤 (1996)喜剧
20电影名称:金钱列车 (1996)动作 | 喜剧 | 犯罪 | 剧情 | 喜剧
21电影名称:矮子当道 (1996)喜剧 | 犯罪 | 喜剧
22电影名称:拷贝猫 (1996)犯罪 | 剧情 | 恐怖 | 悬疑 | 喜剧
23电影名称动作 | 犯罪 | 喜剧
27电影名称:白电王 (1996)剧情 | 科幻
25电影名称:离开拉斯维加斯 (1996)剧情 | 爱情
26电影名称:奥赛罗 (1996)剧情
27电影名称:那时那地 (1996)儿童 | 剧情
28电影名称:劝导剧情 | 爱情
29电影名称:失落的孩子城 (1996)动作 | 剧情 | 奇幻 | 悬疑 | 科幻
30摇啊摇,摇到外婆桥 (1996)犯罪 | 剧情

表 2:电影 ID、评分和时间戳

用户ID电影ID评分时间戳
137651.15E+07
13063.51.15E+07
130751.15E+07
166551.15E+07
17773.51.15E+07
1107751.15E+07
111753.51.15E+07
113173.51.15E+07
1133751.15E+07
1135051.15E+07
113603.51.15E+07
1165351.15E+07
130113.51.15E+07
130133.51.15E+07
130673.51.15E+07
131613.51.15E+07
133515.51.15E+07
1357351.15E+07
1363351.15E+07
1367351.15E+07
137535.51.15E+07
1355751.15E+07
1356751.15E+07
1375751.15E+07
1515551.15E+07
1530731.15E+07
1533551.15E+07
1553331.15E+07
1570351.15E+07

表 2:电影 ID、IMDb 评分 ID 和 tmdb ID

电影IDimdbIdtmdbId
1115707763
31135777755
311333715603
511577531357
511305111763
6113377757
711531711760
711330355335
71155767071
10113177710
111133567077
1311377613110
1311355331033
1511377710757
151137601507
16113651535
171153775575
171131015
171133717373
3011375511517
311131617013
331137331710
331135017671
3511516713665
35113637551
3611505716530
371150117363
3711511717015
37113673703

输入

输出

成人所属系列预算类型视频IDimdb_id概述收入title
1False30000000('id'L 10197, 'name':'玩具总动员系列')[{'id': 16, 'name':'动画'}?False862tt0117709373557033在伍迪的带领下,安迪的玩具们幸福地生活着?
2NaN65000000{{'id': 12, 'name: '动作'}?False8877tt0113797勇敢者的游戏262797279当朱迪和彼得兄妹俩?
3False('id': 119050, 'name':'脾气坏的老男人)0{{'id': 10779, 'name':'爱情'}?False15602tt0113228脾气更坏的老男人一场完美的婚礼重新点燃了古老的
4.FalseNaN16000000{{'id': 35, 'name':'喜剧'}}False31357tt0117885待到梦醒时分被欺骗、被虐待、被践踏

排行榜的公式

为了制作我们的热门电影图表,我们使用了 TMDB 的评级。我们将使用 IMDB 的加权评级公式来创建我们的图表,具体如下:

这里,v 代表一部电影获得的投票数,m 是一部电影上榜所需的最低投票数,R 代表电影的平均评分,C 是整个报告的平均票数。

构建排行榜

既然我们有了数据集和公式,我们就可以开始构建排行榜了。我们将从创建一个前 250 名的排行榜开始。我们只会将那些获得至少 95% 投票的电影添加到我们的排行榜中。

输入

输出

5.27789612706511

输入

输出

737.0

输入

输入

输出

(227, 6)

显而易见,一部电影要想进入我们的排行榜,至少需要有737票。您可能已经注意到,一部电影进入我们排行榜所需的普通评分为5.27。

输入

输入

一切就绪后,让我们来构建图表吧

热门电影总榜

输入

输出

title投票数平均投票类型wr比率(大约)受欢迎程度
158 80盗梦空间201018 08 529.1081[动作, 喜剧, 科幻, 悬疑, A?]8 .918 5888
1881黑暗骑士200812269123.168[剧情, 动作, 犯罪, 喜剧]8 .90588 18
2288 9星际穿越20181118832.2135[动作, 剧情, 科幻]8 .898 1088
288 3搏击俱乐部1999968 863.8696[剧情]8 .8818 538
8 863指环王:护戒使者2001889232.08 08[动作, 奇幻, 动作]8 .88 18 888
292低俗小说1998868 018 0.95[喜剧, 犯罪]8 .8686608
318肖申克的救赎1998835851.68 58[剧情, 犯罪]8 .868 0008
8 000指环王:王者归来2003822629.38 8[动作, 奇幻, 动作]8 .8619288
351阿甘正传1998818 88 8.308 2[喜剧, 剧情, 爱情]8 .8606568
5818指环王:双塔奇兵20028 68 129.8 235[动作, 奇幻, 动作]8 .8519288
256星球大战198 868 8 88 2.18 98[动作, 动作, 科幻]8 .838 2058
1225回到未来1985623925.8 8 85[动作, 喜剧, 科幻, 完美]8 .8208138
838教父198 260288 1.1093[剧情, 犯罪]8 .818 88 88
1158帝国反击战1980599819.8 8 1[动作, 动作, 科幻]8 .818 0998
8 6七宗罪1996591518.8 58 8[犯罪, 悬疑, 喜剧]8

最后,您已经制作了一个基于 Python 的基础电影推荐系统!

我们现在将把我们的推荐系统的建议限制在基于类型的,这样可以更精确。

按类型列出

因此,现在,我们将修改我们的电影推荐系统,使其更具类型特定性。

输入

我们现在创建了一个推荐系统,它可以对爱情类别的电影进行排序,并推荐排名靠前的影片。我们选择爱情类型是因为它在我们之前的图表中出现得不多。

热门爱情故事电影

输入

输出

title投票数平均投票wr比率(大约)受欢迎程度
10309勇夺芳心199666137.7578.5652859
351阿甘正传1997817778.30727.9713578
876迷魂记1958116218.20827.8116678
70251你的名字。2016103037.7612527.7897898
883热情如火195983511.87517.7751578
1132天堂电影院198883717.1777.7778788
19901纸人20127377.198637.7139518
37863唱街201666910.6728627.6897838
882公寓春光196079811.99737.5993178
38718小姐201675316.7277057.5661668
3189城市之光193177710.89157.5588678
27886爱,简单20172625.711277.3313638
75737心跳201717620.821787.0039598
1639泰坦尼克号1997777026.88916.9815767
19731乌云背后的幸福线2012787017.78816.9705817

现在,您有了一个可以根据所选类型推荐热门电影的电影推荐系统。

推荐系统的用例

电影推荐系统的最常见用途 几乎所有流行的流媒体服务、社交媒体平台或电子商务平台都增加了推荐系统的使用。亚马逊、Facebook、YouTube 和 Netflix 仅是其中的几个例子。推荐系统如何帮助不同行业为用户提供更个性化的体验?让我们以流行的电影推荐系统为例来看看它是如何工作的!

机器学习算法是著名流媒体平台 Netflix 提供个性化服务的核心。

Netflix

Netflix 推荐系统。由于近 80% 的 Netflix 用户会采纳其算法提供的影片推荐,因此用户们都清楚地知道找到一部理想的电影是多么简单。

此外,Netflix 对影片采用基于行的两级排名系统:行与行之间以及每行内部。

所有这些用户数据都作为输入被处理到 Netflix 的机器学习算法中。这些算法使得复杂的推荐系统成为可能,这是 Netflix 发展出最具个性化体验和最受欢迎的电影推荐系统的主要因素。

YouTube 的推荐系统

自然地,您在 YouTube 平台上首先看到的是基于您过去偏好为您生成的推荐。让我们来谈谈一个流行的流媒体服务,向您展示并非所有推荐系统的运作方式都相同。

YouTube 的推荐系统是如何运作的?该系统使用机器学习分类器将视频组织为边缘视频或权威视频。然而,这些分类需要人工评估员来检查和评估每个视频中的数据。

YouTube 推荐系统的网络结构如下:

候选生成网络,利用用户的过往活动向他们展示最相关的视频。

排名网络,通过对第一个网络输出的每个项目进行评分,并使用更广泛的视频特征集,为目标用户选择最佳视频。

一个有趣的事实: YouTube 的大部分观看量是由推荐驱动的,而不是频道订阅或搜索。因此,为全世界每个人开发一个负责任且可靠的平台,立即将推荐系统置于高度优先的位置。这里的目标和工作流程与 Netflix 的略有不同。

YouTube 用户在推荐中会收到经过筛选的信息,以减少他们遇到误导性或不当内容的可能性。此外,该平台还启动了一个新项目,旨在创建一个关怀代表性不足社区的推荐系统。这就是支撑 YouTube 推荐的公平机器学习算法。

电影推荐框架总结

正如您可能已经看到的,构建一个基于 Python 的电影推荐系统非常简单。您只需要一点数据科学知识和一些工作,就能创建一个功能齐全的推荐系统。

然而,如果您想构建一个更先进的推荐系统该怎么办?如果您想创建一个大型企业可能会考虑使用的推荐系统又该怎么办?

如果您有兴趣深入了解推荐系统和数据科学,我们建议您参加数据科学课程。通过课程,您将学到数据科学和机器学习的所有基础和高级概念。此外,您将向行业专家学习,他们将指导您完成课程,帮助您避免疑问和困惑。