首页 > 其他分享 >实现基于内容的电影推荐系统—代码实现

实现基于内容的电影推荐系统—代码实现

时间:2024-01-18 11:33:06浏览次数:27  
标签:similarity 实现 代码 电影 movies 相似 data

引言

昨日在读论文的过程中讲到,要实现一种基于内容的推荐算法,那么今天他来了。

今天的算法实现基于Python的pandas数据处理第三方包和机器学习第三方包sklearn,关于sklearn的详细信息可以点击这里查看,关于pandas的详细信息可以点击这里查看

代码实现

import pandas as pd  # 导入数据处理包,pandas
from sklearn.feature_extraction.text import TfidfVectorizer  # TfidfVectorizer转换文本为特征向量
from sklearn.metrics.pairwise import cosine_similarity  # cosine_similarity计算余弦相似度

# 1. 数据预处理
data = pd.read_csv("movies.csv")  # 读取名为"movies.csv"的CSV文件,并将其存储在名为data的Pandas DataFrame中。

# 2. 特征工程
# 这段代码选择了一些特征("NAME"、"ACTORS"、"DIRECTORS"、"GENRES"),
# 并将它们组合成一个新的特征列"FEATURES"。使用apply函数和lambda表达式,
# 将每一行的这些特征值转换为字符串,并使用空格将它们连接起来。
selected_features = ["NAME", "ACTORS", "DIRECTORS", "GENRES"]
data["FEATURES"] = data[selected_features].apply(lambda x: ' '.join(x.astype(str)), axis=1)

# 3. 构建推荐模型
# 这段代码创建了一个TfidfVectorizer对象,并使用它对特征列"FEATURES"进行拟合转换。
# fit_transform方法将文本数据转换为TF-IDF特征矩阵,并将结果存储在features_matrix变量中。
tfidf = TfidfVectorizer()
features_matrix = tfidf.fit_transform(data["FEATURES"])

# 4. 用户输入特征
# 这行代码定义了用户的特征值。在这个示例中,用户特征值是一个字符串,包含了用户的偏好或兴趣。
# user_feature = "流浪地球 吴京/刘德华/李雪健/沙溢 郭帆 科幻/冒险/灾难"

# 5. 计算相似度
# 这行代码将用户特征值转换为特征矩阵。使用transform方法,根据之前拟合的TF-IDF向量化器,将用户特征值转换为与训练数据相同的特征表示。
user_feature_matrix = tfidf.transform([user_feature])
# 这行代码计算用户特征与每个电影特征之间的余弦相似度。使用cosine_similarity函数,
# 将用户特征矩阵和电影特征矩阵作为输入,计算它们之间的相似度。flatten方法将结果展平为一维数组。
similarity_scores = cosine_similarity(user_feature_matrix, features_matrix).flatten()

# 6. 获取相似电影推荐
# 这行代码根据相似度分数对电影进行排序,并返回排序后的索引。
# argsort函数返回按相似度分数升序排列的索引,然后使用切片操作[::-1]将其反转,得到按相似度分数降序排列的索引。
similar_movies_indices = similarity_scores.argsort()[::-1]  # 按相似度降序排列的索引

# 这行代码根据排序后的索引选择前5个电影作为推荐电影。使用iloc函数,根据索引选择对应的电影数据,并将结果存储在recommended_movies变量中。
recommended_movies = data.iloc[similar_movies_indices[:5]]  # 推荐前5个相似电影

# 7. 打印推荐结果
print("推荐电影:")
# 这段代码打印推荐电影的名称和相似度分数。使用iterrows函数遍历recommended_movies中的每一行,然后打印电影名称和对应的相似度分数。
for idx, movie in recommended_movies.iterrows():
     print(movie["NAME"], "- 相似度:", similarity_scores[idx])

其他信息

此外,有的小伙伴可能问我数据集从哪下载,这里给出下载地址,本程序所使用的数据集为大数据集,里面包含十万多条数据,如果训练时间太慢或者内存不够用,可以选取其中小的数据集。

我所使用到的数据集已经上传到云盘,需要的可以下载.链接:https://pan.baidu.com/s/10k5_LSL0H6HtCtODFMZIvg?pwd=2024 提取码:2024 --来自百度网盘超级会员V1的分享)

结尾

好了,今天的分享就到这了,下次再见喽。

标签:similarity,实现,代码,电影,movies,相似,data
From: https://www.cnblogs.com/wephiles/p/17971748

相关文章

  • 用ArcGIS模型构建器生成、导出Python转换空间坐标系的代码
      本文介绍在ArcMap软件中,通过创建模型构建器(ModelBuilder),导出地理坐标系与投影坐标系之间相互转换的Python代码的方法。  在GIS领域中,矢量、栅格图层的投影转换是一个经常遇见的问题;而由于地理坐标系与投影坐标系各自都分别具有很多不同的种类,且二者之间相互转换涉及到很多......
  • Maven使用${revision}实现多模块版本统一管理
    父pom: <?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://mave......
  • 某知名电车品牌:规范内外部文件交换行为 实现网间数据安全交换
    一、客户介绍某知名合资电车品牌,成立于2020年,是由两大全球知名汽车厂商出资成立的合资公司。该公司致力于推动、普及电动车更环保、安全、舒适、智能的高品质技术,开发和制造受中国消费者喜爱的性能优异的纯电动车,创造消费者为中心的未来出行、人与自然和谐共享的社会。二、建设......
  • 利用JVS低代码引擎实现列表页和表单按钮的显隐控制
    在开发中,控制页面的元素(如按钮)的可见性是很常见的需求。特别是在需要根据特定字段的值来隐藏或显示某些元素时,例如在列表页和表单中。这样的需求在许多应用程序中都有出现,无论是电子商务平台、管理系统还是其他类型的软件。本文将深入探讨JVS低代码列表引擎中如何根据字段的值来控......
  • 实现微服务
    1、vue前端如何创建WebSocketconstsocketUrl=`ws://127.0.0.1:3000/websocket/${store.state.user.token}/`;onMounted(()=>{socket=newWebSocket(socketUrl);//WebSocket是js自带的socket.onopen=()=>{console.log("connected!");}socke......
  • MySQL中create_time 和 update_time实现自动更新时间
    也是最近在捣鼓前后端分离项目,在写后端接口的时候便设计到数据库表建设,这里规范显得很重要.通常的建表规范,必备三字段:id,create_time,update_time.id必为主键,类型为bigintunsigned、单表时自增、步长为1create_time类型为datetime,数据新增时自动创建update......
  • Python Matplotlib 实现基础绘图
    ​ 1、Matplotlib的三层结构Matplotlib是一个用于在Python中创建二维图表的库。为了更好地理解和使用Matplotlib,重要的是要了解其三层结构:容器层(ContainerLayer)、辅助显示层(HelperLayer)和图像层(ArtistLayer)。这些层级构成了Matplotlib的绘图体系结构。1)容器层(Conta......
  • 国产最强的 AI 代码生成插件:CodeGeeX
    国产最强的AI代码生成插件:CodeGeeX学习改变命运,技术铸就辉煌。大家好,我是銘,AI已经火了一年多了,国内很多公司也都开始开发了很多AI工具。今天我们就来聊一聊国产的AI代码生成工具CodeGeex。官方介绍首先,我们来看一下官方对它的介绍CodeGeeX是一款基于大模型的智......
  • 代码随想录 day22 二叉搜索树的最近公共祖先 二叉搜索树中的插入操作 删除二叉搜索树
    二叉搜索树的最近公共祖先这题跟之前的不一样可以利用二叉搜索树有序的特点有序就说明可以根据节点的值与pq的关系判断应该往左边搜索还是右边搜索这题显然是不需要遍历整棵树的所以是写的遍历边的写法遍历树需要用变量接受二叉搜索树中的插入操作一开始还以为要遍历......
  • 两种实现TCP并发的方式
    【一】socketserver模块实现TCP并发服务服务端importsocketserverclassRequesterHandle(socketserver.BaseRequestHandler):defhandle(self)->None:print(self.request)print(self.client_address)#self.request相当于TCP协议的conn......