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

 3f6a7ab0347a4af1a75e6ebadee63fc1.gif

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

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

4d9751f701854a5c81d0778bcefddd4a.png

credits.csv如下:

5858334f8e2a415db7dac34b087b3572.png

3.技术工具

Python版本:3.9

代码编辑器:jupyter notebook

4.实验过程

4.1导入数据

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

6166b5a61d7d475a8ffefa84b2f97259.png

查看数据前五行

faff183b68e546d98295213d5d0c186b.png

a166d18e10e84f528a5dce49bdcd3f8d.png

合并数据集

b1b84ab87f0b41979618c77be94391d1.png

查看数据基本信息

5e6dae994a084c96a106570d8da193dd.png

4.2词云图可视化

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

c5fdb411a0024947ac78bba801e2622a.png

画出标题列的词云图 

fb390e53870146dbaacb3e27dff1e29c.png

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

8537822f0a0848c7aa71a8d777741a76.png

4.3基于内容的协同过滤

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

向量化

bedf01fa57b440d9afbf4801268c7296.png

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

43f588657356406e9e088f0d8bf47e86.png

自定义一个推荐函数 

145143adb7ee432da1d5c80ffd13bd76.png

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

eb7cfd1170c844b08a7b5cd275e6dc1f.png

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

74667ada04c5400d853df94015947128.png

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

9d68239181e2487e8d3b408ec44f58e1.png

提取类型和关键词列表 

bb3f04b2a5a246b9ac27a537d0b09c96.png

结合类型和关键词

1b50dd0930264107be93a9a0c833a82e.png

 向量化

e133dd495b8845a8a254fd0139cf81d5.png

余弦相似度

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

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

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

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

使用余弦相似度

d66b2c0bbcd14bbfa4031187804cedde.png

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

 c4c30cd15ce2408f8eb407e7489c3f6f.png

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

d90e29cb728b4ef192b54b73746c577d.png

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

计算avarage评级

5e79bd09a1c444a69a86a4899f3c3a2d.png

筛选符合条件的电影

4a9c9c01f5bb424fa5cd471d6df80e4a.png

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

dad17b1f3ab4457a83cf36432b79b53e.png

f4d304b86e2446c982ed5aca7286b9b8.png

热门电影 

2f6dce5ec1e84b1895e6078cf6e75219.png

1399d3591835444bad90a415a27b78d2.png

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()

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

a74f7d5d03234f7c8a635562034442a0.gif#pic_center

 

  • 0
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 87
    评论
### 回答1: 基于协同过滤算法的图书推荐系统Java是一种能够根据用户的偏好和行为来推荐图书的系统。协同过滤算法是一种基于用户历史行为和偏好的推荐算法,它会分析用户的借阅历史、购买历史等信息,找出和用户兴趣相近的其他用户,然后推荐这些用户喜欢的图书。 Java作为一种功能强大、跨平台的编程语言,适用于开发基于协同过滤算法的图书推荐系统。Java拥有强大的类库和框架,可以方便地实现数据分析、机器学习等功能,为图书推荐系统提供了良好的开发环境。 开发基于协同过滤算法的图书推荐系统Java需要完成以下几个步骤:首先是数据获取和预处理,包括收集用户的借阅历史、购买历史等数据,进行数据清洗和预处理,构建用户-图书的评分矩阵。接下来是算法的选择和实现,包括基于用户的协同过滤算法、基于物品的协同过滤算法等,通过对算法的优化和调整来提高系统的推荐效果。最后是系统的搭建和优化,包括系统的架构设计、界面设计、性能优化等。 基于协同过滤算法的图书推荐系统Java可以为读者提供个性化的图书推荐服务,提高读者的阅读体验和满意度。同时,它也可以为图书馆和书店等机构提供数据分析和营销服务,帮助他们更好地了解用户需求和市场趋势。 ### 回答2: 协同过滤算法是一种常见的推荐算法,基于它可以开发出适用于图书推荐的系统。在这个基于协同过滤算法的图书推荐系统,一般需要实现以下功能: 首先,需要对用户和图书信息进行收集和分析,建立相关的数据库。在这个系统,每本图书都会有其相关的信息,如书名、作者、出版社、ISBN等。同时,用户也需要有其相关信息,如姓名、年龄、性别等。 接着,需要实现协同过滤算法协同过滤算法一般分为两种,基于用户的协同过滤和基于物品的协同过滤。基于用户的协同过滤是通过挖掘用户之间的相似性,计算出用户之间的相似度以及对图书的评价,来给用户推荐其他用户感兴趣的图书。而基于物品的协同过滤是通过挖掘图书之间的相似性,计算出不同图书之间的相似度来给用户推荐其他他们可能感兴趣的图书。 最后,需要将协同过滤算法与Java程序集成起来。因为Java是一种非常流行的编程语言,因此开发基于协同过滤算法的图书推荐系统,其Java是一个很好的选择。Java程序需要实现对于数据库的读取、处理和查询,并将协同过滤算法应用于书籍推荐。由于协同过滤算法需要进行大量的计算,因此Java程序需要具有良好的性能和可扩展性。 总体而言,基于协同过滤算法的图书推荐系统Java实现是一个具有挑战性的工作,需要结合数据库、算法和Java编程的技术。这个系统可以为用户提供更好的图书推荐服务,也可以提升图书馆或网络书店的销售效益。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 87
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾派森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值