Python和Django的基于协同过滤算法的电影推荐系统源码及使用手册

目录

软件及版本

电影推荐系统算法的实现过程

系统功能模块

项目文件结构

核心功能代码

系统源码及运行手册

1、创建虚拟环境

2、进入虚拟环境

3、安装必须依赖包

4、运行程序

4.1 直接运行程序(连接sqllite数据库)

4.2、连接MySQL

源码下载链接:


以下正文:

本文利用Python的Django框架最终实现一个简单的基于协同过滤算法的在线电影推荐系统。

功能齐全可作为练习或毕设参考项目

电影推荐算法基于用户的历史评分数据和电影之间的相似度。

软件及版本

开发相关的技术和软件版本如下:

服务端:Python 3.9

Web框架:Django 4

数据库:Sqlite / Mysql

开发工具IDE:Pycharm

电影推荐系统算法的实现过程

实现的电影推荐算法基于用户的历史评分数据和电影之间的相似度。

这种类型的推荐系统通常被称为协同过滤(Collaborative Filtering),具体来说,这里使用的是基于项目的协同过滤方法。

本系统实现系统推荐算法的实现过程如下:

1 数据准备:

首先,从数据库中获取所有用户的评分数据。这些数据存储在Myrating模型中,其中包含用户ID、电影ID和评分。

使用pandas库将这些数据转换为DataFrame,以便于进行数据处理和分析。

2 构建评分矩阵:

使用用户的评分数据构建一个评分矩阵,其中行代表用户,列代表电影,矩阵中的元素表示用户对电影的评分。

对于缺失的评分(即用户未对某些电影进行评分的情况),使用0来填充。

3 计算电影相似度:

计算电影之间的相似度矩阵。这通常是通过皮尔逊相关系数(Pearson correlation coefficient)来实现的。

对于评分矩阵,计算每对电影之间的相关系数,以衡量它们之间的相似性。

4 处理新用户:

如果当前用户是新用户(即没有进行过任何评分),则推荐一个默认的电影(在这个例子中是ID为19的电影)。

为新用户创建一个初始的评分记录,评分值为0。

5 生成推荐列表:

对于当前用户已经评分的电影,计算其他用户的评分与当前用户的评分之间的相似度。

使用这些相似度来加权其他用户的评分,从而预测当前用户可能对未观看电影的评分。

通过将加权评分相加并排序,得到一个推荐列表,推荐列表中的电影是用户可能感兴趣的,但用户尚未观看的。

6 选择推荐电影:

从推荐列表中选择前10部电影作为推荐结果。

这些电影是根据用户的评分历史和相似度矩阵计算出来的,理论上应该与用户的喜好相匹配。

7 渲染推荐结果:

将推荐的电影列表传递给模板,并渲染成HTML页面展示给用户。

系统功能模块

主页电影列表

电影详情

电影评分

电影收藏

电影推荐

注册

登录

项目文件结构

核心功能代码

显示电影详情评分及收藏功能视图

# 显示电影详情
def detail(request, movie_id):
    # 如果用户未登录,则重定向到登录页面
    if not request.user.is_authenticated:
        return redirect("login")
    # 如果用户未激活,则抛出404错误
    if not request.user.is_active:
        raise Http404
    # 获取电影对象,如果不存在则抛出404错误
    movies = get_object_or_404(Movie, id=movie_id)
    movie = Movie.objects.get(id=movie_id)

    # 获取当前用户对该电影的观看状态
    temp = list(MyList.objects.all().values().filter(movie_id=movie_id, user=request.user))
    if temp:
        update = temp[0]['watch']
    else:
        update = False
    if request.method == "POST":

        # 对于我的列表
        if 'watch' in request.POST:
            watch_flag = request.POST['watch']
            # 更新观看状态
            if watch_flag == 'on':
                update = True
            else:
                update = False
            # 更新用户的观看列表
            if MyList.objects.all().values().filter(movie_id=movie_id, user=request.user):
                MyList.objects.all().values().filter(movie_id=movie_id, user=request.user).update(watch=update)
            else:
                q = MyList(user=request.user, movie=movie, watch=update)
                q.save()
            # 显示消息
            if update:
                messages.success(request, "电影已收藏!")
            else:
                messages.success(request, "电影已取消收藏!")

        # 对于评分
        else:
            rate = request.POST['rating']
            # 更新用户的评分
            if Myrating.objects.all().values().filter(movie_id=movie_id, user=request.user):
                Myrating.objects.all().values().filter(movie_id=movie_id, user=request.user).update(rating=rate)
            else:
                q = Myrating(user=request.user, movie=movie, rating=rate)
                q.save()
            # 显示消息
            messages.success(request, "评分已提交!")

        return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
    out = list(Myrating.objects.filter(user=request.user.id).values())

    # 在电影详情页面显示评分
    movie_rating = 0
    rate_flag = False
    for each in out:
        if each['movie_id'] == movie_id:
            movie_rating = each['rating']
            rate_flag = True
            break

    context = {'movies': movies, 'movie_rating': movie_rating, 'rate_flag': rate_flag, 'update': update}
    return render(request, 'recommend/detail.html', context)

根据用户评分获取相似电影

# 根据用户评分获取相似电影
def get_similar(movie_name,rating,corrMatrix):
    similar_ratings = corrMatrix[movie_name]*(rating-2.5)
    similar_ratings = similar_ratings.sort_values(ascending=False)
    return similar_ratings

推荐电影视图函数

# 推荐电影视图函数
def recommend(request):
    # 检查用户是否已认证
    if not request.user.is_authenticated:
        return redirect("login")
    if not request.user.is_active:
        raise Http404

    # 从数据库中获取所有用户的评分数据,并转换为DataFrame
    movie_rating = pd.DataFrame(list(Myrating.objects.all().values()))

    # 获取当前用户的唯一用户数量和当前用户的ID
    new_user = movie_rating.user_id.unique().shape[0]
    current_user_id = request.user.id

    # 如果当前用户是新用户(没有对任何电影进行评分),则给用户一个默认推荐
    if current_user_id >= new_user:
        movie = Movie.objects.get(id=19)  # 默认推荐的电影ID
        q = Myrating(user=request.user, movie=movie, rating=0)
        q.save()

    # 构建用户-电影评分矩阵
    userRatings = movie_rating.pivot_table(index=['user_id'], columns=['movie_id'], values='rating')
    userRatings = userRatings.fillna(0, axis=1)  # 填充缺失值为0

    # 从数据库中获取当前用户的评分数据
    corrMatrix = userRatings.corr(method='pearson')  # 计算电影之间的相似度矩阵

    # 获取当前用户已经评分的电影ID列表
    user = pd.DataFrame(list(Myrating.objects.filter(user=request.user).values())).drop(['user_id', 'id'], axis=1)
    user_filtered = [tuple(x) for x in user.values]
    movie_id_watched = [each[0] for each in user_filtered]

    # 初始化一个空的DataFrame用于存储推荐结果
    similar_movies = pd.DataFrame()

    # 对于当前用户已经评分的每部电影,计算相似电影的加权评分
    for movie, rating in user_filtered:
        similar_movies = similar_movies._append(get_similar(movie, rating, corrMatrix), ignore_index=True)

    # 获取推荐列表中的电影ID,并排除用户已经观看过的电影
    movies_id = list(similar_movies.sum().sort_values(ascending=False).index)
    movies_id_recommend = [each for each in movies_id if each not in movie_id_watched]

    # 使用Case语句和When语句来为推荐的电影列表创建一个排序字段
    preserved = Case(*[When(pk=pk, then=pos) for pos, pk in enumerate(movies_id_recommend)])

    # 从数据库中获取推荐的电影列表,并限制为前10部电影
    movie_list = list(Movie.objects.filter(id__in=movies_id_recommend).order_by(preserved)[:10])

    # 将推荐的电影列表传递给模板
    context = {'movie_list': movie_list}
    return render(request, 'recommend/recommend.html', context)

系统源码及运行手册

下载并解压源文件后。

使用Pycharm打开文件夹movie_recommender

接着在Pycharm中参考如下步骤运行系统:

1、创建虚拟环境

在Pycharm的Teminal 终端输入如下命令:python -m venv venv

2、进入虚拟环境

在Pycharm的Teminal 终端输入如下命令:venv\Scripts\activate.bat

以下界面说明已进入虚拟环境

3、安装必须依赖包

终端输入如下命令:pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple( -i 是为了指定安装源,可以加速依赖下载安装速度)

4、运行程序

4.1 直接运行程序(连接sqllite数据库)

本系统默认已自带并连接上了sqllite数据库。

输⼊命令: python manage.py runserver 运⾏服务器,浏览器输⼊地址:http://127.0.0.1:8000/

4.2、连接MySQL

如果想要连接MySQL参考如下步骤:

  1. 本地新建⼀个MySQL数据库: movie_recommed(名字可以自定义,如果修改,配置文件对应的NAME也要修改)
  2. 安装MySQL连接器:在终端输入命令:pip install mysqlclient
  3. 修改配置⽂件 movie_recommender/settings.py 的DATABASES相关的配置项连接到本地MySQL数据库。

修改USER和PASSWORD为⾃⼰的。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',    # 数据库引擎
        'NAME': 'movie_recommed', # 数据库名称
        'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
        'PORT': 3306, # 端口
        'USER': 'root',  # 数据库用户名
        'PASSWORD': '123456', # 数据库密码
    }
}
  1. 先后输⼊命令 python manage.py makemigrations迁移

数据, python manage.py migrate 创建数据库表。

  1. 输⼊命令: python manage.py runserver 运⾏服务器。

浏览器输⼊地址:http://127.0.0.1:8000/

源码下载

公众号回复:电影推荐系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李威威wiwi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值