数据挖掘实战-基于内容协同过滤算法的电影推荐系统

 

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


目录

1.项目背景

2.数据集介绍

3.技术工具

4.实验过程

4.1导入数据

4.2词云图可视化

4.3基于内容的协同过滤

4.4基于投票的过滤:人口统计学过滤

5.总结

6.源代码


1.项目背景

        随着信息技术的迅猛发展和数字化媒体的普及,人们每天面临着海量的信息选择。特别是在线电影平台,如腾讯视频、爱奇艺、优酷等,拥有数以万计的电影资源。用户在如此庞大的电影库中寻找感兴趣的内容变得愈发困难,因此,一个高效、精准的推荐系统显得尤为重要。

        传统的电影推荐方法,如基于流行度或者最新发布进行推荐,往往不能满足用户个性化的需求。为了提供更加个性化的电影推荐,推荐系统需要能够理解和预测用户的喜好。基于内容的推荐系统和协同过滤推荐系统是两种主流的方法。基于内容的推荐主要是通过分析用户过去的行为和电影的内容(如类型、导演、演员等)来推荐类似的电影。而协同过滤则是通过分析用户的行为和其他相似用户的行为来进行推荐。

        然而,单一的推荐方法往往有其局限性。基于内容的推荐可能过于依赖电影的特征描述,而忽略了用户的个性化需求;而协同过滤则可能受限于数据的稀疏性和冷启动问题。为了克服这些问题,可以考虑将基于内容的推荐和协同过滤结合起来,形成一种混合推荐方法,即基于内容协同过滤的推荐系统。

        本研究旨在构建一个基于内容协同过滤算法的电影推荐系统,通过结合电影的内容特征和用户的行为数据,为用户提供更加精准和个性化的电影推荐。通过这种方法,我们期望能够提高用户对推荐电影的满意度,并进一步提升在线电影平台的用户体验。

        在上述背景下,本研究将深入探索内容协同过滤算法在电影推荐系统中的应用,以期为用户提供更加精准、个性化的电影推荐服务。

2.数据集介绍

本数据集来源于Kaggle,原始数据集共有2个文件,一个是movies.csv,一个是credits.csv。

movies.csv如下:

credits.csv如下:

3.技术工具

Python版本:3.9

代码编辑器:jupyter notebook

4.实验过程

4.1导入数据

导入第三方库并加载数据集

查看数据前五行

合并数据集

查看数据基本信息

4.2词云图可视化

自定义一个画词云图的函数

画出标题列的词云图 

填充overview变量中的缺失值并可视化

4.3基于内容的协同过滤

        这种类型的过滤器不涉及其他用户,如果不是我们自己。根据我们的喜好,算法会简单地挑选内容相似的商品推荐给我们。在这种情况下,推荐的多样性将会减少,但无论用户评分与否,这都是有效的。如果我们将其与上面的例子进行比较,也许用户B可能喜欢黑色喜剧,但他/她永远不会知道,除非他/她决定自主尝试,因为这个过滤器只会继续推荐反乌托邦电影或类似的电影。当然,我们可以计算许多类别的相似性:在电影的情况下,我们可以决定仅基于类型构建我们自己的推荐系统,或者我们想要包括导演,主要演员等。

向量化

我们将使用sklearn的linear_kernel()而不是cosine_similarity(),因为它更快。 

自定义一个推荐函数 

如果你搜索“Spectre”,下面的电影名称将被推荐 

如果你搜索“John Carter”,下面的电影名称将被推荐 

 将字符串化后的特征解析为对应的python对象

提取类型和关键词列表 

结合类型和关键词

 向量化

余弦相似度

余弦相似度度量了内积空间中两个向量之间的相似度。它是由两个向量之间夹角的余弦来测量的,并确定两个向量是否大致指向相同的方向。在文本分析中,它常用于度量文档的相似度。文档可以由数千个属性表示,每个属性记录文档中特定单词(如关键字)或短语的频率。因此,每个文档都是由术语频率向量表示的对象。

我们都熟悉向量:它们可以是2D, 3D或任何d。让我们用2D来思考一下,因为它更容易在我们的脑海中描绘出来,让我们先复习一下点积的概念。两个向量的点积等于其中一个向量在另一个向量上的投影。因此,两个相同向量(即具有相同分量)之间的点积等于它们的平方模,而如果两个向量垂直(即它们不共享任何方向),则点积为零。通常,对于n维向量,点积的计算方法如下所示。

在定义相似度时,点积很重要,因为它与相似度直接相关。两个向量u和v之间相似度的定义,实际上是它们的点积和它们的大小之积的比值。

通过应用相似性的定义,如果这两个向量相同,它等于1,如果这两个向量正交,它等于0。换句话说,相似度是一个介于0到1之间的数字它告诉我们两个向量有多相似。

使用余弦相似度

如果你搜索“John Carter”,下面的电影名称将被推荐 

 

如果你搜索“Soldier”,下面的电影名称将被推荐

4.4基于投票的过滤:人口统计学过滤

计算avarage评级

筛选符合条件的电影

根据上面计算的分数对电影进行排序 

热门电影 

5.总结

        本研究通过构建并优化基于内容协同过滤算法的电影推荐系统,成功实现了对用户个性化电影推荐需求的精准满足。实验结果表明,该系统能够结合电影内容特征和用户行为数据,为用户提供更加符合其兴趣和偏好的电影推荐。相较于单一的推荐方法,该系统展现出了更高的推荐准确性和用户满意度,从而验证了内容协同过滤算法在电影推荐系统中的有效性和优越性。因此,该算法对于提升在线电影平台的用户体验和服务质量具有重要的应用价值。

6.源代码

import numpy as np 
import pandas as pd 
pd.set_option('display.max_columns', 25)
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')movie = pd.read_csv('tmdb_5000_movies.csv')
credit = pd.read_csv('tmdb_5000_credits.csv')
movie.head()
credit.head()
# 合并两个数据集
credit.columns = ['id','cast', 'title', 'crew']
movie= movie.merge(credit, on='id')
movie.head()
movie.info()
# 词云图
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import matplotlib.pyplot as plt
# 自定义一个画词云图的函数
def cloud(col):    wcloud = " ".join(f for f in movie[col])wc_ = WordCloud(width = 2000, height = 1000, random_state=1, background_color='black', colormap='Set2', collocations=False, stopwords = STOPWORDS)wc_.generate(wcloud)plt.subplots(figsize=(10,6))plt.imshow(wc_, interpolation="bilinear")plt.axis("off")
# 画出标题列的词云图
cloud("original_title")
# 填充overview变量中的缺失值
movie["overview"] = movie["overview"].fillna("")
cloud("overview")
# Tfidf向量化
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(stop_words="english")
tfidf_matrix = tfidf.fit_transform(movie["overview"])
tfidf_matrix
# 我们将使用sklearn的linear_kernel()而不是cosine_similarity(),因为它更快。
from sklearn.metrics.pairwise import linear_kernel
cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)
# 索引和电影original_title的反向映射
indices = pd.Series(movie.index, index=movie['original_title']).drop_duplicates()
# 自定义一个推荐函数
def get_recommendation(title, cosine_sim):idx = indices[title]sim_scores = list(enumerate(cosine_sim[idx]))sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)sim_scores = sim_scores[1:11]movies = [i[0] for i in sim_scores]movies = movie["original_title"].iloc[movies]return movies
# 如果你搜索“Spectre”,下面的电影名称将被推荐
get_recommendation('Spectre', cosine_sim)
# 如果你搜索“John Carter”,下面的电影名称将被推荐
get_recommendation("John Carter", cosine_sim)
# 将字符串化后的特征解析为对应的python对象
from ast import literal_evalfeatures = ['keywords', 'genres']
for feature in features:movie[feature] = movie[feature].apply(literal_eval)movie[['original_title', 'keywords', 'genres']].head(3)
# 提取类型列表
def list_genres(x):l = [d['name'] for d in x]return(l)
movie['genres'] = movie['genres'].apply(list_genres)# 提取关键字列表
def list_keyword(y):i = [a['name'] for a in y]return(i)
movie['keywords'] = movie['keywords'].apply(list_keyword)
# 结合类型和关键词
def genre(x):return ''.join(' '.join(x['genres']) + ' ' + ' '.join(x['keywords']))movie['mix'] = movie.apply(genre, axis=1)
movie["mix"]
# 向量化
from sklearn.feature_extraction.text import CountVectorizer
countvect = CountVectorizer(stop_words="english")
countvect_mat = tfidf.fit_transform(movie["mix"])
countvect_mat
from sklearn.metrics.pairwise import cosine_similarity
cos_sim = cosine_similarity(countvect_mat, countvect_mat)
# 索引和电影original_title的反向映射
movie = movie.reset_index()
indices = pd.Series(movie.index, index=movie['original_title'])
# 如果你搜索“John Carter”,下面的电影名称将被推荐
get_recommendation("John Carter", cos_sim)
# 如果你搜索“Soldier”,下面的电影名称将被推荐
get_recommendation("Soldier", cos_sim)
基于投票的过滤:人口统计学过滤
# avarage评级
avg = movie["vote_average"].mean()
#  我们将使用第90个百分位数作为截止点。换句话说,一部电影要想进入榜单,它必须比榜单上至少90%的电影获得更多的选票。
q = movie["vote_count"].quantile(0.9)
print(avg)
print(q)
# 符合条件的电影
movies = movie[movie["vote_count"] >= q]
# weighted_rating函数
def weighted_rating(x, q=q, avg=avg):v = x['vote_count']R = x['vote_average']# 根据IMDB公式计算return (v/(v+q) * R) + (q/(q+v) * avg)# 符合条件的影片
movies["score"] = movies.apply(weighted_rating, axis=1)
# 根据上面计算的分数对电影进行排序
movies = movies.sort_values('score', ascending=False)
# 打印前10部电影
listed = movies[['original_title', 'vote_count', 'vote_average', 'score', "popularity"]].head(10)
# 可视化
import seaborn as sns
plt.subplots(figsize=(10,6))
sns.barplot(listed["score"], listed["original_title"], palette="Set2")
plt.title("Movie Vs Score")
plt.show()
# 热门电影
popular= movies.sort_values('popularity', ascending=False)
plt.figure(figsize=(12,4))plt.barh(popular['original_title'].head(10),popular['popularity'].head(10), align='center',color="#313131")
plt.gca().invert_yaxis()
plt.xlabel("Popularity")
plt.title("Popular Movies")
plt.show()

资料获取,更多粉丝福利,关注下方公众号获取

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/14371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony集成OCR三方库实现文字提取

1. 简介 Tesseract(Apache 2.0 License)是一个可以进行图像OCR识别的C库,可以跨平台运行 。本样例基于Tesseract库进行适配,使其可以运行在OpenAtom OpenHarmony(以下简称“OpenHarmony”)上,并新增N-API接口供上层应…

Ubuntu服务器运行Subspace节点和Farm

提供Subspace 节点部署&性能优化&机房托管&运维监控等服务。myto88 磁盘格式化 将插入的磁盘格式化。 sudo mkfs.ext4 -m 0 -T largefile4 /dev/sd*磁盘挂载 此处为语雀内容卡片,点击链接查看:https://www.yuque.com/u25096009/lvoxa…

企商在线荣登甲子光年“2024中国AI算力层创新企业”榜单

5月15日,「AI创生时代——2024甲子引力X科技产业新风向」大会在北京顺利举办,大会发布2024【星辰100】创新企业榜。企商在线凭借全栈式一体化AI算力能力,与超聚变、寒武纪等企业共同入选“2024中国AI算力层创新企业”榜单。 本次大会由中国科…

AJAX(JQuery版本)

目录 前言 一.load方法 1.1load()简介 1.2load()方法示例 1.3load()方法回调函数的参数 二.$.get()方法 2.1$.get()方法介绍 2.2详细说明 2.3一些例子 2.3.1请求test.php网页并传送两个参数 2.3.2显示test返回值 三.$.post()方法 3.1$.post()方法介绍 3.2详细说明 …

什么是云计算安全?如何保障云计算安全

云计算彻底改变了数据存储的世界,它使企业可以远程存储数据并随时随地从任何位置访问数据。存和取变得简单,也使得云上数据极易造成泄露或者被篡改,所以云计算安全就显得非常重要了。那么什么是云计算安全? 其实,云计…

WPS PPT学习笔记 1 排版4原则等基本技巧整理

排版原则 PPT的排版需要满足4原则:密性、对齐、重复和对比4个基本原则。 亲密性 彼此相关的元素应该靠近,成为一个视觉单位,减少混乱,形成清晰的结构。 两端对齐,1.5倍行距 在本例中,19年放左边&#x…

是谁的项目还在烂大街?一个基于 SpringBoot 的高性能短链系统

看了几百份简历,真的超过 90% 的小伙伴的项目是商城、RPC、秒杀、论坛、外卖、点评等等烂大街的项目,人人都知道这些项目烂大街了,但大部分同学还是得硬着头皮做,没办法,网络上能找到的、教程比较完善的就这些项目了&a…

基于机器学习预测未来的二氧化碳排放量(随机森林和XGBoost)

基于机器学习预测未来的二氧化碳排放量(随机森林和XGBoost) 简介: CO2排放是当今全球关注的环境问题之一。本文将使用Python对OWID提供的CO2排放数据集进行分析,并尝试构建机器学习模型来预测未来的CO2排放趋势。我们将探索数据…

kafka Kerberos集群环境部署验证

背景 公司需要对kafka环境进行安全验证,目前考虑到的方案有Kerberos和SSL和SASL_SSL,最终考虑到安全和功能的丰富度,我们最终选择了SASL_SSL方案。处于知识积累的角度,记录一下kafka keberos安装部署的步骤。 机器规划 目前测试环境公搭建了三台kafka主机服务,现在将详细…

ViLT学习

多模态里程碑式的文章,总结了四种多模态方法,根据文字和图像特征特征抽取方式不通。 文章的贡献主要是速度提高了,使用了数据增强,文本的mask 学习自b站朱老师的论文讲解

电赛控制类PID算法实现

一、什么是PID PID(Proportional-Integral-Derivative)是一种经典的控制算法,广泛应用在自动化控制系统中。它是通过对被控对象的测量值和设定值进行比较,并根据误差的大小来调整输出信号,实现对被控对象的稳定控制。 …

【C++】map和set的封装

目录 前言一、红黑树的设计1.1 红黑树存储节点的设计1.2 红黑树的迭代器1.3 map的设计1.4 set的设计1.5关于map与set的const_iterator设计 前言 我们知道map和set的底层都是用红黑树实现的,但是set和map的结构不一样,set只有一个参数K,而map…

前端基础:1-2 面向对象 + Promise

面向对象 对象是什么?为什么要面向对象? 通过代码抽象,进而藐视某个种类物体的方式 特点:逻辑上迁移更加灵活、代码复用性更高、高度的模块化 对象的理解 对象是对于单个物体的简单抽象对象是容器,封装了属性 &am…

Linux_应用篇(07) 系统信息与系统资源

在应用程序当中,有时往往需要去获取到一些系统相关的信息,譬如时间、日期、以及其它一些系统相关信息,本章将向大家介绍如何通过 Linux 系统调用或 C 库函数获取系统信息, 譬如获取系统时间、日期以及设置系统时间、日期等&#x…

三能一体运营体系助力政企支撑水平提升

生产力的发展是现代社会孜孜不倦的追求,由此产生了我们熟悉的“机械化、电子化、信息化”乃至现今正在发生的“智能化”四次工业革命。这些是由技术的突破性发展带来的,但我们也注意到生产力发展的另一个助力,即生产效率的提升,19…

【MySQL数据库】mysql日志管理、备份与恢复

mysql日志管理、备份与恢复 MySQL数据库备份及日志一、数据库备份分类:如何选择逻辑备份策略 (频率)完全备份与恢复备份恢复 增量备份与恢复实现增量备份 基于时间点与位置恢复 二.MySQL日志管理 MySQL数据库备份及日志 在生产环境中,数据的安全性是至关…

在未来你将何去何从?

在数字化的浪潮中,信息技术行业无疑是推动全球经济和社会发展的重要动力。随着科技的不断迭代与进步,云计算、大数据、人工智能(AI)、物联网(IoT)、5G通信和区块链等技术已经深入到我们生活的每一个角落&am…

鸿蒙原生应用元服务开发-鸿蒙真机运行项目实战与注意事项

一、解压项目注意项目包不能为中文 二、用数据线将装好DevEco Studio的电脑与设置为开发者模式的鸿蒙手机相连接。 三、将项目包托进DevEco Studio 中 注意项目包文件不能有嵌套 四、查看设备运行 五、点击项目结构 六、勾选红色框圈部分 登录开发者账号 七、选择好公司 八、等…

我是如何使用 Next.js14 + Tailwindcss 重构个人项目的

前言 去年在学习 React 和 Nest 的时候,参考了大佬 imsyy 的项目 DailyHot,以此项目的灵感基于 React 开发,完成之后就没怎么在意。 后来发现这个项目还有点小流量,每天差不多 200-400 的 IP 访问量: 我又抽时间优…