构建电影推荐系统

在这个项目中,将构建一个基于机器学习的电影推荐系统,并将其作为一个在线电影推荐网站进行部署。这个项目适合初学者,如果对机器学习感兴趣,并且想要完成一个端到端的机器学习项目,那么请跟随一起完成这个项目。

将从本文中学到什么?

第一部分:从零开始构建电影推荐系统。在第一部分中,将理解推荐系统的基本概念以及它的工作原理,并从零开始构建一个基于内容的电影推荐系统。

第二部分:创建网站并部署模型。在第二部分中,将使用Streamlit和其他服务创建一个网站,包括API来获取实时电影横幅,并将机器学习模型部署到网站上。

第三部分:免费将电影推荐网站部署到互联网上。在这一部分中,将讨论使用免费服务在互联网上部署的各种方法,并进行演示。

推荐系统的介绍

推荐系统本质上是一个系统,它以用户的喜好为输入,并预测相关的电影、新闻、书籍等。可能在浏览YouTube、Netflix等平台时已经见过推荐系统的实际应用。主要有两种类型的推荐系统,第三种可能是这两种类型的混合。

协同过滤:协同过滤基本上尝试将一个用户与另一个具有相同过去行为(即用户购买或搜索的项目)或由其他用户做出的类似决策的用户关联起来。一旦用户被关联起来,这个模型就根据其他类似用户的兴趣来预测项目(或项目的评分)。

基于内容的过滤:这种过滤系统根据实际喜欢的内容来推荐。想象一下,如果喜欢观看喜剧电影,那么基于内容的推荐系统将为推荐其他相关的喜剧电影,这些电影属于类别。

在现实世界中,推荐系统使用基于内容和基于协同的混合过滤。这提高了推荐的准确性。

步骤涉及

步骤1:获取数据集。将使用tmdb-5000电影数据集来构建电影推荐系统。它包含了5000部电影以及它们的类型、演员、制片人、制作人、荣誉等信息。数据集包含两个CSV文件,一个包含电影详情,第二个包含电影的荣誉(元数据),如演员、制片人、导演等。

步骤2:数据清洗和处理。将选择对推荐重要的特征(列),并处理数据集中的空值。

步骤3:训练推荐系统。将使用NLP技术对标签进行处理,并使用余弦相似度来计算标签之间的相似性。

步骤4:测试和验证。将创建一个函数,输入电影标题并返回最相似的前5部电影。

步骤5:保存训练好的模型以供部署。将使用pickle保存模型和相似性矩阵。

获取数据集以创建电影推荐系统

import numpy as np import pandas as pd movies = pd.read_csv('../input/tmdb-movie-metadata/tmdb_5000_movies.csv') credits = pd.read_csv('../input/tmdb-movie-metadata/tmdb_5000_credits.csv') movies = movies.merge(credits, on='title')

在数据预处理阶段,将选择重要的特征列,并删除包含空值的记录。还将处理'genres'和'keywords'列,将它们从字典列表转换为字符串列表。

def convert(obj): import ast L = [] for i in ast.literal_eval(obj): L.append(i['name']) return L movies_df['genres'] = movies_df.genres.apply(convert) movies_df['keywords'] = movies_df.keywords.apply(convert)

还将处理'cast'列,只取前4位演员,并从'crew'列中提取导演的名字。

def convert_top4(obj): counter = 0 import ast L = [] for i in ast.literal_eval(obj): if counter != 4: L.append(i['name']) counter += 1 else: break return L movies_df['cast'] = movies_df.cast.apply(convert_top4) def fetch_director(obj): import ast L = [] for i in ast.literal_eval(obj): if i['job'] == 'Director': L.append(i['name']) return L movies_df['crew'] = movies_df.crew.apply(fetch_director)

将概述列分割成单词,并创建标签,将所有数据汇总到'tags'列中。然后,将应用词干提取技术,将文本数据转换为数值数据,以便输入机器学习算法。

import nltk from nltk.stem.porter import PorterStemmer ps = PorterStemmer() def stem(text): v = ' '.join([ps.stem(i) for i in text.split()]) return v new_df = movies_df[['id','title','tags']] new_df['tags'] = new_df.tags.apply(lambda x:x.lower()) new_df['title'] = new_df.title.apply(lambda x:x.lower()) new_df['tags'].apply(stem) from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import cosine_similarity cvect = CountVectorizer(max_features=5000, stop_words='english') vectors = cvect.fit_transform(new_df['tags']).toarray() similarity = cosine_similarity(vectors) def recommend(movie): movie = movie.lower() movie_index = new_df[new_df.title == movie].index[0] distances = similarity[movie_index] movies_list = sorted(list(enumerate(distances)), reverse=True, key=lambda x:x[1])[1:6] for i in movies_list: print(new_df.iloc[i[0]].title) import pickle pickle.dump(new_df, open('movies_df.pkl','wb')) pickle.dump(similarity, open('similarity.pkl','wb'))
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485