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

 

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

✍🏻作者简介: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_eval

features = ['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.mfbz.cn/a/637509.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

轻松上手ClickHouse:ClickHouse入门

引言 在数字化时代,大数据处理和分析已经成为了各行各业不可或缺的一环。而ClickHouse,作为一款高性能的列式数据库管理系统,以其卓越的查询性能和灵活的扩展性,赢得了众多企业和开发者的青睐。本文将带领大家走进ClickHouse的世…

【数组】Leetcode 452. 用最少数量的箭引爆气球【中等】

用最少数量的箭引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地…

初识java——javaSE(6)抽象类与接口【求个关注!】

文章目录 前言一 抽象类1.1 抽象类的概念1.2 抽象类的语法:1.3 抽象类与普通类的区别: 二 接口2.1 接口的概念2.2 接口的语法2.2.1 接口的各个组成2.2.2 接口之间的继承 2.3 接口的实现接口不可以实例化对象 2.4 接口实现多态 三 Object类3.1 Object类是…

HCIP【VRRP、MSTP、VLAN综合实验】

目录 一、实验拓扑图: ​编辑二、实验要求 三、实验思路 四、实验步骤 (1) eth-trunk技术配置 (2)vlan 技术配置 (3)配置SW1、SW2、AR1、ISP的IP地址 (4)在交换机…

Jetbrains插件AI Assistant,终于用上了

ai assistant激活成功后,如图 ai assistant获取:https://web.52shizhan.cn/activity/ai-assistant 主要功能如下

kubernetes(k8s) v1.30.1 helm 集群安装 Dashboard v7.4.0 可视化管理工具 图形化管理工具

本文 紧接上一篇:详细教程 Centos8.5 基于 k8s v1.30.1 部署高可用集群 kubeadm 安装 kubernetes v1.30.1 docker集群搭建 延长证书有效期-CSDN博客 1 Dashboard 从版本 7.0.0 开始,不再支持基于清单的安装。仅支持基于 Helm 的安装. #Helm 下载安装 …

PCIe协议之-Flow Control基础

✨前言: Flow Control即流量控制,这一概念起源于网络通信中。PCIe总线采用Flow Control的目的是,保证发送端的PCIe设备永远不会发送接收端的PCIe设备不能接收的TLP(事务层包)。也就是说,发送端在发送前可以…

Java设计模式(23种设计模式 重点介绍一些常用的)

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:…

限制U盘使用:企业数据安全的软件解决方案

在当今数字化办公环境中,U盘作为一种便捷的数据传输工具,其使用在企业内部非常普遍。然而,U盘的不当使用也给企业数据安全带来了巨大风险。为了防止数据泄露和病毒传播,企业需要采取有效的软件解决方案来限制U盘的使用。本文将探讨…

【qt】初识模型和视图

模型和视图 一.模型和视图的概念1.关系2.模型3.数据4.视图5.特点 二.文件系统模型1.那种数据?2.界面拖放3.创建模型4.模型设置数据5.视图设置模型6.模型索引7.模型操作数据①文件名②文件大小③文件类型④是否是目录⑤文件路径 三.字符串链表模型1.那种数据&#xf…

微信小程序开发 tabbar组件常见问题

一、 tabbar不显示问题 问题 刚开始我在app.json中配置了下面的代码,但tabbar并没有显示。代码如下: "tabBar": {"custom": true,"color": "#7A7E83","selectedColor": "#3cc51f","…

宠物空气净化器性价比大对决:小米、希喂、华为测评哪款最好用

在养宠的过程中中,我们经常会面对一些挑战,其中最为常见且令人困扰的就是宠物的掉毛问题。家中的猫猫们仿佛行走的大型蒲公英,不经意间就将毛发散落在各个角落,无论是家居摆设、舒适的沙发,还是我们心爱的衣物&#xf…

基于网络爬虫技术的网络新闻分析(四)

目录 4.2 系统异常处理 4.2.1 爬虫异常总体概况 4.2.2 爬虫访问网页被拒绝 5 软件测试 5.1 白盒测试 5.1.1 爬虫系统测试结果 5.1.2 中文分词系统测试结果 5.1.3 中文文章相似度匹配系统测试结果 5.1.4 相似新闻趋势展示系统测试结果 5.2 黑盒测试 5.2.1 爬虫系统测…

CTF实战分享 | RWZIP

前言 首先我们要了解,压缩包本身并不具备隐藏信息的功能,但由于在CTF竞赛中,经常出现压缩包与隐写术结合在一起的题目,所以我们需要掌握在CTF竞赛中有关 ZIP 压缩包题目的常见题型及分析手段。 读者福利 | CSDN大礼包&#xff1a…

Python面向对象数据库之ZODB使用详解

概要 ZODB(Zope Object Database)是一个纯Python的面向对象数据库。它允许程序员将Python对象以透明的方式存储在数据库中,无需将对象模型转换为关系模型,极大地简化了Python应用的数据持久化工作。 安装 安装ZODB非常简单,可以通过Python的包管理器pip进行安装: pip …

2024电工杯数学建模B题Python代码+结果表数据教学

2024电工杯B题保姆级分析完整思路代码数据教学 B题题目:大学生平衡膳食食谱的优化设计及评价 以下仅展示部分,完整版看文末的文章 import pandas as pd df1 pd.read_excel(附件1:1名男大学生的一日食谱.xlsx) df1# 获取所有工作表名称 e…

Android 屏保开关

设置-显示-屏保, 打开关闭 设置代码在 ./packages/apps/Settings/src/com/android/settings/dream/DreamMainSwitchPreferenceController.java , Overridepublic boolean isChecked() {return mBackend.isEnabled();}Overridepublic boolean setChecke…

K8S中Prometheus+Grafana监控

1.介绍 phometheus:当前一套非常流行的开源监控和报警系统。 运行原理:通过HTTP协议周期性抓取被监控组件的状态。输出被监控组件信息的HTTP接口称为exporter。 常用组件大部分都有exporter可以直接使用,比如haproxy,nginx,Mysql,Linux系统信…

实例展示vue单元测试及难题解惑

通过生动详实的例子带你排遍vue单元测试过程中的所有疑惑与难题。 技术栈:jest、vue-test-utils。 共四个部分:运行时、Mock、Stub、Configuring和CLI。 运行时 在跑测试用例时,大家的第一个绊脚石肯定是各种undifned报错。 解决这些报错…

网络协议测试仪设计方案:474-便携式手提万兆网络协议测试仪

便携式手提万兆网络协议测试仪 一、平台简介 便携式手提万兆网络协议测试仪,以FPGA万兆卡和X86主板为基础,构建便携式的手提设备。 FPGA万兆卡是以Kintex-7XC7K325T PCIeX4的双路万兆光纤网络卡,支持万兆网络数据的收发和网络协议…