在这个项目中,将构建一个基于机器学习的电影推荐系统,并将其作为一个在线电影推荐网站进行部署。这个项目适合初学者,如果对机器学习感兴趣,并且想要完成一个端到端的机器学习项目,那么请跟随一起完成这个项目。
第一部分:从零开始构建电影推荐系统。在第一部分中,将理解推荐系统的基本概念以及它的工作原理,并从零开始构建一个基于内容的电影推荐系统。
第二部分:创建网站并部署模型。在第二部分中,将使用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'))