import pandas as pd
import numpy as np
def build_movie_infos_en(ratings_data_path, movies_data_path, save_path):
# 载入数据
ratings_data = pd.read_csv(ratings_data_path)
movies_data = pd.read_csv(movies_data_path)
# 计算电影的评分次数和电影的平均得分
ratings_data['rating'] = ratings_data['rating'].astype(int)
ratings_data = ratings_data[['userId', 'movieId', 'rating']]
ratings_count_df = ratings_data.value_counts(subset=['movieId']).sort_index().to_frame().reset_index()
ratings_count_df.columns = ['movieId', 'rating_count']
ratings_mean_df = ratings_data.groupby(by='movieId')['rating'].mean()
ratings_mean_df = ratings_mean_df.to_frame().reset_index()
count_rating_df = pd.merge(left=ratings_count_df, right=ratings_mean_df, on=['movieId'])
# 数据处理,处理电影名称和年份, 返回电影名称
import re
def split_name(df):
name = re.search(r'^(.+)\([\d]{4}\)$', df['title'].strip())
if name:
return name.group(1).strip()
else:
return None
# 从电影名中提取年份, 并转换为整数
def split_year(df):
year = re.search(r'\(([\d]{4})\)$', df['title'].strip())
if year:
return int(year.group(1))
else:
return None
items_data = pd.DataFrame()
items_data['movieId'] = movies_data['movieId']
items_data['name'] = movies_data.apply(split_name, axis=1)
items_data['year'] = movies_data.apply(split_year, axis=1)
items_data = items_data.dropna()
items_data['year'] = items_data['year'].astype(int)
items_data.reset_index(drop=True, inplace=True)
# 流程类型,提取所有流派
genres_set = set()
for row in movies_data.itertuples():
genres = row.genres.split("|")
genres_set = set(genres_set) | set(genres)
genres_metrix = np.zeros((len(items_data), len(genres_set)), dtype=int)
genres_df = pd.DataFrame(genres_metrix, columns=list(genres_set))
genres_df = pd.concat([items_data, genres_df], axis=1)
items_df = pd.merge(left=count_rating_df, right=genres_df, on=['movieId'])
# 设置每部电影的类型
for row in movies_data.itertuples():
genres = row.genres.split("|")
items_df.loc[items_data['movieId'] == row.movieId, genres] = 1
items_df.to_csv(save_path, index=None)
return items_df
def build_movie_infos_ch(ratings_data_path, movies_data_path, save_path):
# 载入数据
ratings_data = pd.read_csv(ratings_data_path)
movies_data = pd.read_csv(movies_data_path)
movies_data = movies_data[['movieId', 'name', 'year', 'genres']]
movies_data.dropna(how='any', axis=0, inplace=True)
# 计算电影的评分次数和电影的平均得分
ratings_data['rating'] = ratings_data['rating'].astype(int)
ratings_data = ratings_data[['userId', 'movieId', 'rating']]
ratings_count_df = ratings_data.value_counts(subset=['movieId']).sort_index().to_frame().reset_index()
ratings_count_df.columns = ['movieId', 'rating_count']
ratings_mean_df = ratings_data.groupby(by='movieId')['rating'].mean()
ratings_mean_df = ratings_mean_df.to_frame().reset_index()
count_rating_df = pd.merge(left=ratings_count_df, right=ratings_mean_df, on=['movieId'])
items_data = pd.DataFrame()
items_data['movieId'] = movies_data['movieId']
items_data['name'] = movies_data['name']
items_data['year'] = movies_data['year']
items_data = items_data.dropna()
items_data['year'] = items_data['year'].astype(int)
items_data.reset_index(drop=True, inplace=True)
# 流程类型,提取所有流派
genres_set = set()
for row in movies_data.itertuples():
genres = row.genres.split("/")
genres_set = set(genres_set) | set(genres)
genres_metrix = np.zeros((len(items_data), len(genres_set)), dtype=int)
genres_df = pd.DataFrame(genres_metrix, columns=list(genres_set))
genres_df = pd.concat([items_data, genres_df], axis=1)
items_df = pd.merge(left=count_rating_df, right=genres_df, on=['movieId'])
# 设置每部电影的类型
for row in movies_data.itertuples():
genres = row.genres.split("/")
items_df.loc[items_df['movieId'] == row.movieId, genres] = 1
items_df.to_csv(save_path, index=None)
return items_df
def load_movie_infos(movie_info_path, ratings_data_path, movies_data_path):
try:
return pd.read_csv(movie_info_path)
except:
print("电影信息未找到,正在生成电影信息,请稍后...")
# 生成电影信息, 这里可以选择中文或者英文
movie_infos = build_movie_infos_ch(ratings_data_path, movies_data_path, movie_info_path)
print("电影信息建立完成")
return movie_infos
def load_data(data_path):
# 设置字段类型和所需列
# dtype = {"userId": np.int32, "movieId": np.int32, "rating": np.float32}
# cols = ['userId', 'movieId', 'rating']
# 加载数据集
# ratings_df = pd.read_csv(data_path, dtype=dtype)
ratings_df = pd.read_csv(data_path)
ratings_df = ratings_df[['userId', 'movieId', 'rating']]
ratings_df['userId'] = ratings_df['userId'].astype(np.int32)
ratings_df['movieId'] = ratings_df['movieId'].astype(np.int32)
ratings_df['rating'] = ratings_df['rating'].astype(np.float32)
return ratings_df
def load_user_list(data_path):
df = load_data(data_path)
# 基于userId删除重复行,通过索引选取userId列,并将其转换为列表
user_list = df.drop_duplicates(subset=['userId'])['userId'].to_list()
user_list = [str(i) for i in user_list]
return user_list
def build_train_data(train_df):
from surprise import Reader
from surprise import Dataset
ratings_reader = Reader(rating_scale=(1, 5))
# 根据提供的reader对象将数据转换为适用于推荐系统的格式
train_data = Dataset.load_from_df(train_df, reader=ratings_reader)
return train_data
def build_model(train_data):
from surprise import SVD
from surprise.model_selection import GridSearchCV
# 迭代次数(n_epochs)、学习率(lr_all)和正则化参数(reg_all)
# param_grid = {'n_epochs': [45, 50, 55], 'lr_all': [0.02, 0.05], 'reg_all': [0.15, 0.2]}
param_grid = {'n_epochs': [30, 45, 50], 'lr_all': [0.02, 0.05], 'reg_all': [0.15, 0.2]}
# 创建了一个GridSearchCV对象gs,传入SVD模型、参数网格字典、评价指标(均方根误差RMSE和平均绝对误差MAE)以及交叉验证折数(cv=3)。这样就可以通过网格搜索在给定参数范围内找到最佳的模型参数
gs = GridSearchCV(SVD, param_grid, measures=['rmse', 'mae'], cv=3)
# 寻找最佳训练模型
gs.fit(train_data)
# 获取通过网格搜索得到的最佳模型,通过索引'rmse'获取对应的SVD模型
svd_model = gs.best_estimator['rmse']
# 使用build_full_trainset方法从训练数据集中构建一个适用于SVD模型的完整训练集
fit_data = train_data.build_full_trainset()
# 使用构建的完整训练集对SVD模型进行训练,即拟合模型
svd_model.fit(trainset=fit_data)
return svd_model
def save_model(model, save_path):
from surprise.dump import dump
try:
# 使用dump函数将模型对象model保存到指定的文件路径save_path中。algo=model表示要保存的算法对象是model
dump(save_path, algo=model)
except Exception as e:
print("保存失败,请再试一次吧")
def load_model(model_path):
from surprise.dump import load
try:
model = load(model_path)
except:
return None
else:
return model
# train_data表示训练数据集,model表示已训练好的推荐系统模型
# 对所有用户进行评分预测
def predict_all(train_data, model):
# 从训练数据集中构建一个适用于模型的完整训练集
fit_data = train_data.
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
python毕业设计——基于Django和协同过滤算法的电影推荐系统(源码+数据库+说明文档).zip 建立电影数据库: 创建一个电影数据库,其中包含电影的各种信息,如名称、类型、演员、导演等。 实现用户评分功能: 允许注册用户对他们看过的电影进行评分。这些评分将用作协同过滤算法的输入。 实现协同过滤算法: 选择适当的协同过滤算法,例如基于用户的协同过滤或基于物品的协同过滤。根据用户的评分历史和电影之间的相似性,为每个用户生成推荐列表。 设计用户界面: 创建一个用户友好的界面,使用户可以浏览电影、查看个人推荐列表,并进行评分和评论。 优化和测试: 优化算法以提高推荐的准确性和用户体验。进行系统测试,确保功能正常运行并且界面响应良好。 部署: 将你的应用程序部署到服务器上,让用户可以通过互联网访问。 在这个项目中,你可能需要一些额外的资源,如电影数据库的数据集和一些Python库来实现协同过滤算法。同时,不要忘记考虑用户隐私和数据安全等方面的问题。祝你顺利完成这个有趣的项目!建立电影数据库: 创建一个电影数据库,其中包含电影的各种信息,如名称、类型、演员、导演等。 实现用户
资源推荐
资源详情
资源评论
收起资源包目录
movie-recommender-system-master.zip (34个子文件)
movie-recommender-system-master
controller.py 3KB
Application.py 3KB
ml-latest-small
ch_ratings_small.csv 67KB
en_movies_small.csv 39KB
ch_ratings.csv 15.87MB
ch_movies_small.csv 43KB
ch_movies.csv 59.52MB
en_ratings_small.csv 20KB
extraction.ipynb 3KB
new_user_recommender.py 1KB
extraction.py 2KB
recomender_core.py 10KB
new_user_page.py 10KB
svd_recomander.py 2KB
.gitignore 12B
show_page.py 963B
login_page.py 2KB
__pycache__
svd_recomander.cpython-310.pyc 1KB
Application.cpython-36.pyc 2KB
show_page.cpython-36.pyc 1KB
views.cpython-310.pyc 5KB
new_user_recommender.cpython-310.pyc 1KB
views.cpython-36.pyc 5KB
new_user_recommender.cpython-36.pyc 1KB
recomender_core.cpython-36.pyc 6KB
controller.cpython-310.pyc 2KB
new_user_page.cpython-36.pyc 6KB
Application.cpython-310.pyc 3KB
svd_recomander.cpython-36.pyc 1KB
new_user_page.cpython-310.pyc 6KB
recomender_core.cpython-310.pyc 7KB
controller.cpython-36.pyc 2KB
show_page.cpython-310.pyc 1KB
views.py 7KB
共 34 条
- 1
资源评论
荒野大飞
- 粉丝: 1w+
- 资源: 2575
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 打包和分发Rust工具.pdf
- SQL中的CREATE LOGFILE GROUP 语句.pdf
- C语言-leetcode题解之第172题阶乘后的零.zip
- C语言-leetcode题解之第171题Excel列表序号.zip
- C语言-leetcode题解之第169题多数元素.zip
- ocr-图像识别资源ocr-图像识别资源
- 图像识别:基于Resnet50 + VGG16模型融合的人体细胞癌症分类模型实现-图像识别资源
- C语言-leetcode题解之第168题Excel列表名称.zip
- C语言-leetcode题解之第167题两数之和II-输入有序数组.zip
- C语言-leetcode题解之第166题分数到小数.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功