电影推荐系统实现原理及Ptyhon源代码下载
在这个教程中,我们将实现一个基于电影内容本身相似性的推荐系统。我们将利用自然语言处理/ NLP技术来提取每个电影的特征,然后建立不同电影之间的余弦相似性矩阵,最后利用相似矩阵来推荐指定电影的10个最相似电影。
快速掌握Python开发技能,推荐汇智网的Python在线课程。
当我们评价互联网上的产品和服务时,我们表达并分享出来的倾向性,被推荐系统用来生成个性化推荐。最常见的例子就是亚马逊的商品推荐、谷歌的搜索结果推荐和Netflix上的视频推荐。
有两种类型的推荐系统:
- 协同过滤 - 基于用户的评价和消费行为来分组相似的用户,然后向用户推荐可能感兴趣的产品或服务
- 基于内容的过滤 - 基于产品/服务本身的相似性向用户推荐
在这个教程中,我们将利用电影的特征,例如风格、剧情、导演和主要演员等,来计算不同电影之间的余弦相似度。我们使用从data.world下载的IMDB前250部英文电影作为我们的数据集。
1、导入Python库和数据集
确保已经安装了RAKE库,或者参考以下命令安装:
pip install rake_nltk
然后使用以下代码读入数据集:
from rake_nltk import Rake import pandas as pd import numpy as np from sklearn.metrics.pairwise import cosine_similarity from sklearn.feature_extraction.text import CountVectorizerdf = pd.read_csv('IMDB_Top250Engmovies2_OMDB_Detailed.csv') df.head()
数据集中有250部电影(行),每部电影包含38个属性(列)。不过我们只需要
用到其中的5个属性: ‘Title’, ’Director’, ’Actors’, ’Plot’, and ’Genre’。
下面的代码显示10个流行的导演的作品数量直方图:
df['Director'].value_counts()[0:10].plot('barh', figsize=[8,5], fontsize=15, color='navy').invert_yaxis()
2、数据预处理
首先使用NLP对数据进行预处理,将属性合并为一列,然后进行矢量化,每个单词对应一个得分,最后计算余弦相似性得分。
我们使用Rake函数来提取剧情列中整句话的最相关单词,并将提取结果放入一个新的‘Key_words’:
df['Key_words'] = '' r = Rake()for index, row in df.iterrows(): r.extract_keywords_from_text(row['Plot']) key_words_dict_scores = r.get_word_degrees() row['Key_words'] = list(key_words_dict_scores.keys())
演员和导演的名字被小写并转换为唯一标识值。我们将姓、名合并,这样Chris Evans和Chris Hemsworth就不会有相似性,否则的话,这两个名字就会有50%的相似性,因为都包含了Chris:
df['Genre'] = df['Genre'].map(lambda x: x.split(',')) df['Actors'] = df['Actors'].map(lambda x: x.split(',')[:3]) df['Director'] = df['Director'].map(lambda x: x.split(','))for index, row in df.iterrows(): row['Genre'] = [x.lower().replace(' ','') for x in row['Genre']] row['Actors'] = [x.lower().replace(' ','') for x in row['Actors']] row['Director'] = [x.lower().replace(' ','') for x in row['Director']]
3、创建单词的表示
在数据预处理之后,这四个列‘Genre’, ‘Director’, ‘Actors’ 和 ‘Key_words’ 合并为一个新
的列‘Bag_of_words’,这样最终的数据帧只有2列:
df['Bag_of_words'] = '' columns = ['Genre', 'Director', 'Actors', 'Key_words']for index, row in df.iterrows(): words = '' for col in columns: words += ' '.join(row[col]) + ' ' row['Bag_of_words'] = words df = df[['Title','Bag_of_words']]
4、创建相似性矩阵
推荐模型只能读取并比较向量,因此我们需要将Bag_of_words
列使用CountVectorizer
转换为向量表示,这是一个简单的频率计数器。一旦我们得到了所有单词的计数矩阵,就可以利用cosine_similarity
函数来比较电影的相似性。
count = CountVectorizer() count_matrix = count.fit_transform(df['Bag_of_words'])cosine_sim = cosine_similarity(count_matrix, count_matrix) print(cosine_sim)
接下来是创建电影标题序列,序列的索引对应相似矩阵的行和列。
indices = pd.Series(df['Title'])
5、运行测试推荐模型
最后一步是创建一个函数,以电影标题为输入,返回其最相似的10个电影。这个函数将输入电影标题与相似矩阵进行比较,以降序提取相似的电影:
def recommend(title, cosine_sim = cosine_sim): recommended_movies = [] idx = indices[indices == title].index[0] score_series = pd.Series(cosine_sim[idx]).sort_values(ascending = False) top_10_indices = list(score_series.iloc[1:11].index) for i in top_10_indices: recommended_movies.append(list(df['Title'])[i]) return recommended_movies
现在我们可以测试模型了。输入“The Avengers” 看看推荐结果:
recommend('The Avengers')
6、源代码
你可以在这里下载源代码。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
8种经常被忽视的SQL错误用法,你有没有踩过坑?
1、LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般 DBA 想到的办法是在 type, name, create_time 字段上加组合索引。这样条件排序都能有效的利用到索引,性能迅速提升。 SELECT * FROM operation WHERE type = 'SQLStats' AND name = 'SlowLog' ORDER BY create_time LIMIT 1000, 10; 好吧,可能90%以上的 DBA 解决该问题就到此为止。但当 LIMIT 子句变成 “LIMIT 1000000,10” 时,程序员仍然会抱怨:我只取10条记录为什么还是慢?要知道数据库也并不知道第1000000条记录从什么地方开始,即使有索引也需要从头计算一次。出现这种性能问题,多数情形下是程序员偷懒了。在前端数据浏览翻页,或者大数据分批导出等场景下,是可以将上一页的最大值当成参数作为查询条件的。SQL 重新设计如下: SELECT * FROM operation WHERE type = 'SQLStats' AND name...
- 下一篇
JavaScript到底是什么?特点有哪些?
JavaScript到底是什么?特点有哪些?这也是成为web前端工程师必学的内容。今天为大家分享了这篇关于JavaScript的文章,我们一起来看看。 一、JavaScript是什么? 1、JavaScript是在网站浏览器上运行的编程语言。 主要是向使用HTML和CSS构建的网站添加,并起到实现各种页面动态效果的作用。例如,在网页上展示的轮播图样式和在咨询平台上输入的内容错误后显示的提示信息等这样的效果。另外针对商城网站里面购买商品时,使用购物车和费用估算也需要用到JavaScript。所以即使它不怎么明显,但依然是编码人员经常会用到的一种语言。 2、JavaScript是一种多功能的开发语言。 除了向网页添加动作的用处之外,JavaScript还可以用来实现很多其他的功能。比如它能够开发出各种网站应用程序,如“聊天工具”和“货币图表”等,可以实时进行修改,这也是JavaScript的主要魅力之一。 二、JavaScript的特点有哪些? 1、脚本语言。JavaScript是一种解释型的脚本语言,C、C++等语言先编译后执行,而JavaScript是在程序的运行过程中逐行进行解释。 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Mario游戏-低调大师作品
- 2048小游戏-低调大师作品
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作