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

news2024/9/22 23:22:25

推荐系统已经成为当今互联网平台不可或缺的一部分,尤其是在电影、音乐和电子商务等领域。本文将带您深入探讨如何利用协同过滤算法,构建一个功能齐全的电影推荐系统。我们将结合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)来处理耗时的推荐计算
  • 提供更加个性化的推荐,结合用户行为数据

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2101480.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go父类调用子类方法(虚函数调用)

前言 在Go语言中,支持组合而不是继承。网上都说可以通过接口和结构体内嵌来模拟面向对象编程中的子类和父类关系。但给的例子或写法感觉都不是很好,难以达到我的目的(比如通过模板模式实现代码的重用等)。因此调查了一下实现方式…

内裤洗衣机需要一人一台吗?快来围观2024年五大好货集合

随着市面上的内衣抑菌产品越来越多,内衣洗衣机的质量也是参差不齐,一些网红跨界品牌内衣洗衣机的用料和做工品质较差,使用过程中出现清洗不干净和稳定性不足等问题。那么选购内衣洗衣机需要注意什么呢?我作为一名小家电测评博主&a…

pikachu文件包含漏洞靶场(本地文件包含+远程文件包含关卡)

本地文件包含 1.来到关卡随便点击一个提交 可以发现这里可以读取文件 这是1.txt内容 能读取到上一级文件那么也就可以读取本地文件 上传一个jpg文件 拿去连就ok了 远程包含 包含写木马的文件 该文件内容如下,其作用是在fi_remote.php文件的同级目录下新建一个文…

Java 基于微信小程序的小区服务管理系统,附源码

博主介绍:✌stormjun、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…

【赵渝强老师】MongoDB的WiredTiger存储引擎

WiredTiger提供文档级别(Document-Level)的并发控制,检查点(CheckPoint),数据压缩和本地数据加密( Native Encryption)等功能。从MongoDB 3.2 版本开始,WiredTiger成为Mo…

大带宽服务器推流延迟怎么回事

大带宽服务器推流延迟的原因可能涉及多个方面,包括编码解码的延迟、网络传输延迟、CDN分发延迟以及播放端的缓冲处理等。下面将详细解释各个影响因素,并提出相应的优化建议: 1. 编码解码的延迟 视频编码格式的影响:不同的编码格式…

net、udp、tcp

Makefile的main.c文件中的全局变量SONG song,要在fun.c文件里面写成extern SONG song 编译方法 第一次编写 或 网络编程 物理层的网线规定有八根,颜色不一样,功能不一样,光猫把光信号转换成电信号,光纤10Gb WiFi叫无线局域网,一般也就50米左右,手机流量叫蜂窝网络,…

无限延展(倒推法)

本题不妨逆推。 对于长度为的字符串 ,若要求第位的延展,考虑 在最后一次延展前的位置。 若延展结束后的长度为,每次考虑以下内容: 若 ​,说明本次伸展无效, ,

CTFHub技能树-备份文件下载-bak文件

当开发人员在线上环境中对源代码进行了备份操作,并且将备份文件放在了 web 目录下,就会引起网站源码泄露。 使用dirsearch扫描出index.php.bak 有些时候网站管理员可能为了方便,会在修改某个文件的时候先复制一份,将其命名为xxx.b…

没关系,会一手Git版本控制就行(全)

Git版本控制 文章目录 Git版本控制1. 版本控制1.1 概述1.2 版本控制优点1.3 本地版本控制系统(离线版)1.4 集中化的版本控制系统(联网版)1.5 分布式版本控制系统(离线联网版) 2. Git概述2.1 Git基本工作流程…

BUUCTF PWN wp--ciscn_2019_n_8

第一步 checksec一下,本题为32位。 分析一下保护机制: 一、RELRO: Partial RELRO Partial RELRO 提供了一定程度的保护。在这种情况下,部分重定位表在程序启动时被设置为只读。这可以防止一些针对重定位表的攻击,比如通过篡改重…

Elasticsearch 介绍

1、课程介绍 1.1 ES 8.x 演化进程 版本号发布日期多少个次要版本迭代历时8.02022年2月11日?至今7.02019年4月11日17个次要版本34个月6.02017年11月15日8个次要版本17个月5.02016年10月27日6个次要版本13个月 2、Elasticsearch 是什么 2.1 概念 2.1.1 标准定义 …

QLineEdit中文本显示不全,部分字符显示空白问题

环境 QT5.14.2 Windows 7 现象 触发某个条件后,使用QLineEdit的setText方法设置文本后,文本部分字符缺失,现象如下(小数点后都是4位): 解决办法 设置根据显示器的像素密度进行自动缩放;再主…

VMware启动报错-Intel VT-x处于禁用状态,进入BIOS更改CPU设置

问题描述 VMware启动虚拟机失败,报错显示Intel VT-x处于禁用状态。 原因分析 打开主机的任务管理器,找到CPU,发现虚拟化处于禁用状态,查阅资料之后发现,进入BIOS模式将CPU虚拟化禁用开启即可解决。 解决步骤 1、…

KAN 学习 Day1 —— 模型框架解析及 HelloKAN

说明 最近了解到了一个新东西——KAN,我的毕设导师给推荐的船新框架。我看过很多剖析其原理的文章,发现大家对其持有的观点都各不相同,有的说可以颠覆传统MLP,有的说可以和Transformer同等地位,但是也有人说它训练速度…

15chatGLM3半精度微调

1 模型准备 数据依然使用之前的数据,但是模型部分我们使用chatglb-3,该模型大小6B,如果微调的话需要24*4 96GB,硬件要求很高,那么我们使用半精度微调策略进行调试,半精度微调有很多坑啊,注意别踩到…

只会SQL语句,可以做什么工作?

1、SQL是什么 首先简单介绍一下SQL(Structured Query Language),是一种可以进行数据提取、聚合、分析,并对数据库进行构建和修改的编程语言。 相对来说,SQL上手非常容易,因为语法结构比较固定&#xff0c…

第一性原理计算从定义到场景到硬件配置详细讲解

第一性原理计算,又称为从头计算(The Ab initio Calculation),是一种基于量子力学原理,通过计算机模拟来预测材料、分子、固体等体系性质的方法。这种方法的核心思想是不依赖于实验数据或经验参数,而是直接从…

如何纯手动的创建SpringBoot工程?

1、打开项目结构 2、new 一个新模块 3、所需全部选配好 4、 创建好之后,目录如下 5、在pom文件中,做第一件事情(让当前的工程继承一个父工程) (这是一个固定的写法:spring-boot-starter-parent)…

JavaWeb - Maven

Maven apache旗下的一个来源项目,一款用于管理和构建java项目的工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建。 作用 安装 解压官网下载的压缩包 配置本地仓库,修改conf/se…