电影推荐

创建基于内容的电影推荐

我们这个模型将使用基于内容的过滤方法,将推荐的电影提供给用户,并根据他们各自的偏好向他们介绍相似的电影。

制作推荐引擎时,我们会选择一种过滤技术来对数据进行分类以进行预测。 推荐引擎主要使用两种主要的过滤技术:

1、协同过滤:假设有两个相似的用户U1和U2。 U1购买了I手机,然后他/她也购买了耳机,现在U2购买了I手机,因此也推荐使用与U2相同的耳机。 综上所述, 协同过滤 是一种可以根据相似用户的'反馈'过滤出用户可能喜欢的项目 的技术。

2、基于内容的过滤:假设有两个用户U1和U2,并且用户U1看过电影M1(动作),M2(冒险)和M3(动作),并将其分别评为5星,4星和3星。 现在,让我们假设U2看过电影M4(动作),M2(冒险),我们将推荐U2电影M1,这是一部收视率最高的动作电影。 总结一下: 基于内容的过滤是一种 系统,旨在预测用户对某项商品的“评价”或“偏好”。

导入库和数据集
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import sigmoid_kernel
credits = pd.read_csv(r'D:\credits.csv')
movies = pd.read_csv(r'D:\tmdb_5000_movies.csv')

合并数据集:

credits.head()
movies.head()

如果同时查看这两个数据集,我们可以清楚地看到,信用数据集上的“ Movies_id”列与“电影”数据集上的“ id”列相同,并且具有相同的值,如图所示:


因此我们可以将“ Movie_id”列重命名为“ id”积分数据集并合并“ id”列上的两个数据集:

credits_column_renamed = credits.rename(index=str, columns={"movie_id": "id"})
movies_merged = movies.merge(credits_column_renamed, on="id")
movies_merged.head()

数据清理:

删除数据集中所有对预测无用的列,其中几乎包括除“概述”,“ orignal_title”,“ Id”,“流派”和“ orignal_language”之外的所有列:

movies_cleaned = movies_merged.drop(columns=['title_x', 'title_y', 'production_countries', 'homepage'])
movies_cleaned.head()

创建矩阵向量:

现在,我们将使用overview列(情节摘要)来挑选关键字,以推荐用户使用类似情节的电影。 概述列将包含我们将提取的内容以提出建议。 创建推荐引擎时,必须为每个电影创建矩阵向量。 在这种情况下,我们将使用tfidfvectorizer进行操作:

tfv = TfidfVectorizer(min_df=3, max_features= None, 
                     strip_accents = 'unicode', analyzer='word', token_pattern=r'\w{1,}',
                     ngram_range=(1,3),
                     stop_words = 'english' )

补充:
Tfidfvectorizer 是NLP概念,用于将文本转换为矢量。 我们将从sklearn.feature_extraction.text导入它。 它将创建此列的文档矩阵。 此功能具有3个主要功能,它们是:
1、ngram_range:此功能将帮助模型将总览列的1-3个相似词分组。
2、stop_words =“ english”:此功能将删除所有重复的单词,例如代词,文章等。
3、strip_accents,token_pattern,分析器:这些功能将帮助摆脱标点符号和该列中的所有连词。

由于上述步骤,总览列中将出现许多nan值,我们将使用.fillna('')将其替换为空白值:

movies_cleaned['overview']= movies_cleaned['overview'].fillna('')

将其转换为稀疏矩阵:

现在,我们将使用fit_transform函数将此列转换为稀疏矩阵。 稀疏矩阵是具有许多零值和一些非零值的矩阵。 由于tfidfvectorizer,将使用等式给出该矩阵中的非零值。 所有非零项的值将在0到1之间———这步是为了之后能应用到函数Sigmoid。

tfv_matrix= tfv.fit_transform(movies_cleaned['overview'])

在看到矩阵的形状时,我们发现使用ngram_range创建的单词组合超过4500条记录和10000列以上。


查找不同电影之间的相似性:

我们在开始时从sklearn.metrics.pairwise导入一个名为sigmoid_kernel的库。 该库基本上将输入值转换为S型函数。 S形函数是其值在0到1之间的函数。它是通过下图给出的简单公式转换的:


应用Sigmoid可以查看一部电影的overview相对于另一部电影的overview的相似性,将其通过S形时,我们将看到一个介于0和1之间的相似值,该值越高相似之处更多。 因此,在应用S形内核的代码中,我们将必须提供相同的矩阵 ,以便获得不同电影之间的相似性。( 相似度将基于向量值进行计算)

sig = sigmoid_kernel(tfv_matrix, tfv_matrix)

此处通过sig [0]举例,如图所示:

这里的sig [0]表示overview 1相对于所有其他电影的概述的相似性。

创建索引:

我们将为数据集中的所有电影创建索引,并删除所有重复的标题,这将为数据集中的每个电影标题提供唯一的索引值。

indices = pd.Series(movies_cleaned.index, index=movies_cleaned['original_title']).drop_duplicates()

结果如下:


获得建议:

我们这里定义了一个函数,其功能是可以预测所有相似的电影,现在我们知道它的工作原理。 该函数将获取电影标题,模型将从该电影标题中找到其索引值(使用索引)。 然后,它将通过一个Sigmoid对象传递该对象,该对象将提供一定范围的值,该模型将使用list(enumerate(sig []))属性将这些值转换为列表。 然后,将使用sorted()属性以降序排列列表。 然后,我们将获取前10个相似度得分,并使用movie_indices来获取电影的原始标题。

print("根据以下电影进行推荐")
a_str = input("moviename:")

def give_reccomendation(title, sig=sig):
    # index to corresponding title
    idx = indices[title]
    # similarity score
    sig_scores = list(enumerate(sig[idx]))
    # sortingmovies
    sig_scores = sorted(sig_scores, key=lambda x: x[1], reverse=True)
    # score of 10 most similar movies
    sig_scores = sig_scores[1:11]
    # movie indices
    movie_indices = [i[0] for i in sig_scores]
    # tope recommended movies
    return movies_cleaned['original_title'].iloc[movie_indices]

print(give_reccomendation(a_str))

运行结果 :

根据我们的模型,将显示相似度最高的前10部电影。


注:可以通过修改 sig_scores = sig_scores[1:11]的参数来改变推荐相似度前几的数目。

代码和数据集:

代码和数据集详见码云:https://gitee.com/chiantisun/sunchuanyi/tree/master/Movie%20Recommendation
或者可以直接从kaggle https://www.kaggle.com/tmdb/tmdb-movie-metadata导入数据集;一共有两个数据集: 分别是Credits 、Movies。

参考: https://medium.com/swlh/movie-recommendation-system-dc00430af6ec

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容