当前位置: 首页> 教育> 幼教 > 基于协同过滤的电影推荐系统

基于协同过滤的电影推荐系统

时间:2025/7/27 19:12:34来源:https://blog.csdn.net/qq_36224726/article/details/141868458 浏览次数:0次

推荐系统已经成为当今互联网平台不可或缺的一部分,尤其是在电影、音乐和电子商务等领域。本文将带您深入探讨如何利用协同过滤算法,构建一个功能齐全的电影推荐系统。我们将结合Python、Django框架以及协同过滤算法,逐步实现这一目标。

完整项目:基于协同过滤的电影推荐系统

目录

  1. 项目背景
  2. 环境配置与依赖
  3. 数据导入与处理
  4. 协同过滤算法实现
  5. 前端页面展示
  6. 项目优化与总结

1. 项目背景

在当今的互联网环境中,推荐系统能够有效提高用户体验,帮助用户发现自己感兴趣的内容。本项目的主要目标是通过协同过滤技术,为用户推荐他们可能感兴趣的电影。我们将通过以下几个步骤完成该系统的搭建:

  • 从CSV文件中导入电影和用户数据
  • 构建用户和电影的关系模型
  • 通过协同过滤算法实现电影推荐
  • 在前端页面展示推荐结果

2. 环境配置与依赖

在开始之前,我们需要确保开发环境配置正确,并安装必要的依赖项。我们使用的是Django框架,因此需要在项目目录下配置settings.py文件,并安装以下依赖:

pip install django
pip install pandas

 

3. 数据导入与处理

3.1 导入电影类型数据

我们首先从一个预定义的文本文件中导入电影类型数据。代码如下所示:

def get_genre():'''导入所有电影类型'''path = os.path.join(BASE, 'static/movie/info/genre.txt')with open(path) as fb:for line in fb:Genre.objects.create(name=line.strip())

该函数从指定路径读取电影类型,并将其存储到数据库的Genre表中。

3.2 导入电影信息

接下来,我们从CSV文件中导入电影的详细信息,并关联它们的类型。这部分代码的实现如下:

def get_movie_info():'''导入所有电影信息,并设置它们的类型'''path = os.path.join(BASE, 'static/movie/info/info.csv')with open(path) as fb:reader = csv.reader(fb)title = next(reader)title_dct = dict(zip(title, range(len(title))))for i, line in enumerate(reader):movie = Movie.objects.create(name=line[title_dct['name']],imdb_id=line[title_dct['id']],time=line[title_dct['time']],release_time=line[title_dct['release_time']],intro=line[title_dct['intro']],director=line[title_dct['directors']],writers=line[title_dct['writers']],actors=line[title_dct['starts']])movie.save()for genre in line[title_dct['genre']].split('|'):genre_obj = Genre.objects.filter(name=genre).first()movie.genre.add(genre_obj)if i % 1000 == 0:print(i)

此函数读取电影信息并逐条保存到数据库中。它还处理了电影和类型之间的多对多关系。

3.3 导入用户评分数据

为了实现推荐系统,我们还需要导入用户的评分数据。以下是对应的实现:

def get_user_and_rating():'''获取用户信息并设置对电影的评分'''path = os.path.join(BASE, 'static/movie/info/ratings.csv')with open(path) as fb:reader = csv.reader(fb)title = next(reader)title_dct = dict(zip(title, range(len(title))))user_id_dct = {}for line in reader:user_id = line[title_dct['userId']]imdb_id = line[title_dct['movieId']]rating = line[title_dct['rating']]user_id_dct.setdefault(user_id, {})user_id_dct[user_id][imdb_id] = ratingfor user_id, ratings in user_id_dct.items():user = User.objects.create(name=user_id, password=user_id, email=f'{user_id}@1.com')user.save()for imdb_id, rating in ratings.items():movie = Movie.objects.get(imdb_id=imdb_id)relation = Movie_rating(user=user, movie=movie, score=rating, comment='')relation.save()print(f'{user_id} process success')

该函数从CSV文件中读取用户评分,并保存到Movie_rating表中,形成用户和电影的关联。

4. 协同过滤算法实现

在处理完数据导入之后,我们开始实现协同过滤算法,以生成电影推荐。以下是算法的核心部分:

class RecommendMovieView(ListView):def __init__(self):super().__init__()self.K = 20  # 最相似的20个用户self.N = 10  # 推荐10部电影self.cur_user_movie_qs = Nonedef get_user_sim(self):'''计算用户相似度'''user_sim_dct = {}cur_user_id = self.request.session['user_id']cur_user = User.objects.get(pk=cur_user_id)other_users = User.objects.exclude(pk=cur_user_id)self.cur_user_movie_qs = Movie.objects.filter(user=cur_user)for user in other_users:user_sim_dct[user.id] = len(Movie.objects.filter(user=user) & self.cur_user_movie_qs)return sorted(user_sim_dct.items(), key=lambda x: -x[1])[:self.K]def get_recommend_movie(self, user_lst):'''获取推荐的电影列表'''movie_val_dct = {}for user, _ in user_lst:movie_set = Movie.objects.filter(user=user).exclude(id__in=self.cur_user_movie_qs).annotate(score=Max('movie_rating__score'))for movie in movie_set:movie_val_dct.setdefault(movie, 0)movie_val_dct[movie] += movie.scorereturn sorted(movie_val_dct.items(), key=lambda x: -x[1])[:self.N]def get_queryset(self):user_lst = self.get_user_sim()movie_lst = self.get_recommend_movie(user_lst)return [movie for movie, _ in movie_lst]

这个类实现了基于用户相似度的电影推荐。它通过计算当前用户与其他用户的相似度,生成一个推荐电影的列表。

5. 前端页面展示

有了推荐算法之后,我们需要在前端展示推荐结果。我们使用Django的ListView类来展示电影列表。以下是一个简单的例子:

class IndexView(ListView):model = Movietemplate_name = 'movie/index.html'paginate_by = 15context_object_name = 'movies'ordering = 'imdb_id'page_kwarg = 'p'def get_queryset(self):return Movie.objects.filter(imdb_id__lte=1000)

通过这个视图类,我们可以在主页上展示前1000部电影,并支持分页功能。

6. 项目优化与总结

在完成上述步骤后,我们的电影推荐系统已经基本成型。但为了提升性能和用户体验,我们还可以做一些优化,例如:

  • 缓存用户相似度和推荐结果,减少计算开销
  • 使用异步任务队列(如Celery)来处理耗时的推荐计算
  • 提供更加个性化的推荐,结合用户行为数据

本项目展示了如何利用协同过滤技术构建一个基本的电影推荐系统。通过不断的迭代和优化,我们可以逐步提升系统的推荐准确性和用户体验。如果你对推荐系统感兴趣,欢迎继续探索更为复杂的算法和实现。

关键字:基于协同过滤的电影推荐系统

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: