首页 > 其他分享 >基于协同过滤的电影推荐系统

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

时间:2024-09-03 20:52:25浏览次数:11  
标签:协同 title movie self 电影 过滤 user dct id

推荐系统已经成为当今互联网平台不可或缺的一部分,尤其是在电影、音乐和电子商务等领域。本文将带您深入探讨如何利用协同过滤算法,构建一个功能齐全的电影推荐系统。我们将结合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] = rating
            
        for 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 = None

    def 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.score
        return 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 = Movie
    template_name = 'movie/index.html'
    paginate_by = 15
    context_object_name = 'movies'
    ordering = 'imdb_id'
    page_kwarg = 'p'

    def get_queryset(self):
        return Movie.objects.filter(imdb_id__lte=1000)

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

6. 项目优化与总结

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

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

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

标签:协同,title,movie,self,电影,过滤,user,dct,id
From: https://blog.csdn.net/qq_36224726/article/details/141868458

相关文章

  • wireshark 过滤source和destination wireshark常用过滤 转载
    Wireshark常用过滤使用方法tcp.port==80&&(ip.dst==122.114.5.11||ip.src==122.114.5.11) 过滤源ip、目的ip。在wireshark的过滤规则框Filter中输入过滤条件。如查找目的地址为192.168.101.8的包,ip.dst==192.168.101.8;查找源地址为ip.src==1.1.1.1 端口过滤。如过滤80......
  • 过滤策略算法
    过滤策略算法过滤策略算法是指根据特定的规则或条件,从一组数据中筛选出符合要求的数据集合的方法。在信息检索和搜索引擎领域,过滤策略算法常用于对搜索结果或推荐结果进行过滤,以提供更符合用户需求的结果集合。比如针对过滤用户拉黑的内容和不感兴趣的内容,可以采用基于用户行......
  • ssm基于web的电影购票系统+vue
    文章目录目录文章目录论文目录项目介绍开发环境系统实现论文参考论文目录摘 要Abstract第1章 绪论1.1 课题背景1.2课题意义1.3研究内容第2章 开发环境与技术2.1Java语言2.2 MYSQL数据库2.3IDEA开发工具2.4SSM框架第3章 系统分析......
  • Java学习案例:控制台实现电影院管理系统
    文章目录@[TOC](文章目录)前言一、实现效果1、登录界面以及注册功能演示2、普通用户登录(1)热映影片(2)即将上映(3)个人信息(4)票夹3、管理员登录(1)电影管理(2)用户管理(3)个人信息二、功能源码1、接收用户的合法输入2、控制台格式化输出3、创建工具类4、多个类之间数据传递三......
  • 【Windows】windows server如何实现 ps aux | grep xxx 方式过滤出要看到的进程信息
    在WindowsServer中,可以使用PowerShell或命令提示符(cmd.exe)来实现类似Linux中psaux|grepxxx的功能。具体来说,可以使用PowerShell的Get-Process命令来获取进程信息,并使用管道(|)和筛选命令来过滤出特定的进程信息。使用PowerShellPowerShell提供了非常强大的命令行工具,......
  • 文心快码前端工程师观点分享:人机协同新模式的探索之路(一)
    ......
  • 文心快码前端工程师观点分享:人机协同新模式的探索之路(一)
    进入文心快码BaiduComate官网,体验智能编码之旅,还有超多福利!本系列视频来自百度工程效能部的前端研发经理杨经纬,她在由开源中国主办的“AI编程革新研发效能”OSC源创会·杭州站·105期线下沙龙活动上,从一款文心快码(BaiduComate)前端工程师的角度,分享了关于智能研发工具本身的研发......
  • 智能自动化:影刀RPA与腾讯在线文档的协同力量
    影刀RPA与腾讯在线文档的配合使用,为企业带来了前所未有的自动化办公体验。影刀RPA作为一款强大的自动化软件,它不仅能够实现桌面软件和Web程序的自动化,如ERP、浏览器、CRM、微信、钉钉等,还能够控制手机App的自动化操作,包括真机和模拟器上的输入、点击、手势滑动和提取数据等......
  • 电影票小程序API接口对接方式注册和申请接入流程
    电影票API接口对接方式注册和申请接入:注册成为合作伙伴或开发者:在API提供商处注册账号,并按照其指引填写相关信息,申请API密钥和相关文档 。了解使用条款和限制:明确API提供商的使用条款,包括请求频率限制、数据使用权限、隐私政策、版权信息、计费规则等,确保在使用过......
  • 042.CI4框架CodeIgniter,控制器过滤器Filter配合Services的使用
    01、Config中的Services.php代码如下:<?phpnamespaceConfig;useApp\Libraries\Tx_Auth;useCodeIgniter\Config\BaseService;classServicesextendsBaseService{//用户权限类publicstaticfunctionuser_auth($getShared=true){echo......