短视频推荐服务端的设计与实现(Python)

1功能实现
本小节介绍各个功能的具体的实现。在开发过程中,前台的请求以Ajax的方式请求,后台以Json的格式返回数据。Json的格式信息规范如表1.1:

表1.1 返回数据类型规范
code info data
四位数字代码 注册成功 User
{“code”:“0000”,“info”:“注册成功”,“data”:user}

1.1 用户模块的实现
1.11. 用户注册

图1.1 用户注册界面

想要给用户带来更好的推荐体验,推荐符合用户的视频,需要让系统知道你是谁,如果是老用户已经有账号,直接登录。如果没有账号就是新用户,新用户需要先注册才能登录,注册页面如图1.1。需要填写用户名、密码、电子邮件和选择你喜欢的视频类型。图1.2是新用户注册功能的处理流程。

图1.2 用户注册流程图

在系统的首页有登录->注册的按钮,点击进去之后填写相应的信息。填写完提交之后前后台都会做相应的校验工作,然后判断用户名是否已注册,未注册则给用户生成ID(此ID使用Oracle的Sequence),把对应的其他信息插入到数据库,则注册成功,用户可以去登录页面登录。
1.1.2. 用户登录

图1.3 用户登录界面

用户登录的界面如图1.3,有密码和用户名两个输入框需要用户填写。用户登录的具体流程为:当用户提交登录信息后,前台用JS对用户填写的数据做校验,用户名和密码都不能为空,密码不能低于六位。在前台校验成功后,然后封装参数以ajax的方式请求到后台,这样可以减少服务器的压力。后台获取登录的信息后,也必须校验。在某些情况下,用户可以不通过前台页面直接请求到后台,因此后台的校验也是必须的。校验通过后再从数据库查找,判断该用户是否存在以及用户名密码是否正确。若存在并且正确,则把用户信息放入Session当中,供前台页面显示。否则返回错误消息到前台页面,然后展示给用户。登录流程如图1.4。

图1.4 用户登录流程图

用户登录成功后的主页面如图1.5。左半小部分会列出推荐给当前登录用户的十条记录,展示缩略图和视频的部分信息以及推荐理由,中间为播放视频,下边用户可以对视频进行评分。右边显示当前视频的具体信息。

图1.5 用户主界面

用户有登录操作相对应的就有退出操作,用户退出主要是销毁Session中用户的信息,界面显示把用户名称更换为登录的按钮。前台点击退出按钮后发送ajax请求到后台,后台返回成功后前台重新加载页面,此时Session中已经没有用户的信息,因此在界面中显示登录的按钮。
1.1.3. 用户其他操作
界面菜单如图1.6。用户在界面可以进行查找,在搜索框输入关键词后,点击查找按钮之后,系统会根据输入的关键词按视频的名称进行模糊匹配。然后将查到的视频返回给用户。

图1.6 界面菜单

界面中还对视频进行分类,在导航栏中有推荐菜单和视频的分类。用户点击某一个分类后后台根据类型会为用户查找出相应的视频,为了解决个性化视频推荐系统中新视频的冷启动,如果查出来的视频中含新视频,我们会把新视频顶置,以便用户可以看到新视频。此处都是用户查找操作,因此我们把按分类和用户的搜索抽象成一段公用的逻辑,符合软件设计的规范。
1.2 推荐模块的实现
推荐模块是我们个性化视频推荐系统的重要模块。根据我们第三章的设计,推荐算法的实现交给我们的定时任务模块调用的存储过程来实现。因此推荐模块相对简单。如果用户没有登录,我们的推荐结果如图1.6,推荐新视频以及评分比较高的视频,新视频会顶置并且视频名称标注为红色,如果用户登录了,并且为新用户没有观看记录,则推荐与用户兴趣爱好相同的视频,如果用户有观看记录,则按照我们的推荐算法来推荐,如图1.7,每个视频给出了推荐系数,这样能给让用户更加信任推荐的结果。

图1.6 无登录推荐结果 图1.7 登录推荐结果

1.3 日志模块的实现
日志模块主要记录用户看过视频的评分信息,此系统的推荐主要也依赖评分信息。如果用户是第一次给某电影评分,则插入一条记录,此种情况会发生在分类的视频或者查找的视频或者推荐的视频,推荐的视频都是用户未评分的。如果插入的记录已经存在,我们会更新原来的评分。此种情况发生在分类视频和查找的视频当中,因为其中可能有用户看过的视频。因此推荐的类型就掌握在用户的手中,你可以修改评分从而改变推荐结果。
1.4 管理模块的实现
管理模块主要对视频和用户管理以及算法优化,管理的界面如图1.8。后台管理的页面分为左右两个部分,左边是菜单,右边是我们数据的展示。左边的菜单有视频管理,用户管理和算法优化。我们先看视频管理,在右边会列出所有的视频,我们会把新视频顶置,一行代表一个视频,在每行的最右边有一个操作的栏目,可以对此视频进行删除操作和修改操作。在最上面有一个添加的按钮,可以添加新的视频。

图1.8 视频管理后台界面

视频删除:点击删除的时候会给出如图1.9的确认框, 确实是否删除此视频,如果确认则向后台传视频的ID进行删除,取消则不删除。

图1.9 删除操作确认框

视频修改:点击修改的图标回显此视频的信息如图1.10。此时可以选择关闭或者更改信息后点击修改按钮。前台把页面的数据传给后台进行修改。后台获取参数,进行校验,校验合法然后修改。

图1.10 修改视频界面

视频增加:点击添加按钮之后会有一个弹出框如图1.11来填写视频的信息。填写完成后点击保存即可增加新视频:后台也是获取参数与校验操作,与更新不同的是,这里先查找到视频库最大的视频的ID,然后给此ID+1作为新视频的ID。

图1.11 增加视频界面
图1.12是用户管理的界面。用户管理比较简单,主要对非法的用户进行禁用,在用户列表的最右边的操作中有禁用的按钮,点击此按钮就可禁用此用户,禁用后用户不可以登录到此系统。

图1.1.2 用户管理界面

1.5 定时任务模块的实现
1.5.1. 算法实现
在实现推荐算法的过程中考虑到每次都要从数据库获取到数据,再计算,最后存储到数据库,这样访问数据库有大量的系统资源和时间的消耗,为了解决此问题,我们不运用Python语言来做推荐系统算法的开发,而是采用Oracle的存储过程。这样大大的提升了计算速度。
相似矩阵的计算(计算流程如图1.13):首先删除数据库中要计算的用户原来的相似矩阵,其次遍历所有用户计算每个用户与其他用户的相似值。

图1.13 相似用户计算流程图

1.5.2. 定时任务实现
基于Python语言的定时调度框架有APScheduler和Celery。我们推荐系统定时任务的实现采用APScheduler框架,它提供了多种不同的调度器和存储器,Quartz里的提供的每个功能在APScheduler里都有。对开发人员提供了便捷的操作。
我们的定时任务不断的判断是否有更新的推荐数据,当用户对某个视频的评分改变之后,这条记录在数据库表示为需要更新,定时任务查询到后调用存储过程来更新该用户的推荐列表。最后更新该条记录为不再需要更新的状态。
定时任务还需要实现另一个功能,当新视频上架之后,什么情况下不是新视频。这个功能我们也用定时任务来完成,例如规定当超过50个用户观看之后取消新视频的标志。
1.3 小结
本章从系统的实现方面进行了介绍,系统每个模块的开发都采用MTV的结构进行开发,对复杂的逻辑给出了流程图,每个实现还有文字描述,对开发出的界面都有截图展示。至此,本系统开发阶段完成。

import time
from django.db import connection
import datetime
from user.models import Ratings
from user.models import Movies
from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job
from VideoRecommendSystem.wsgi import scheduler


# @register_job(scheduler, "interval", seconds=5, id="test_job")
# def test_job():
#     print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))+"  I'm a test job!")

@register_job(scheduler, "interval", seconds=10, id="update_recommend_data")
def update_recommend_data():
    print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + "  update_recommend_data")
    ratings = Ratings.objects.filter(isupdate=1).only('user_id').distinct()
    if len(ratings)>0:
        for r in ratings:
            update_xsjz_and_recommendlist(r.user_id)
            Ratings.objects.filter(user_id=r.user_id).update(isupdate=0)
            print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))+"  更新用户"+str(r.user_id)+"推荐列表")


@register_job(scheduler, "interval", seconds=10, id="update_new_video")
def update_new_video(num=10):
    '''
    新电影被num个人观看之后,取消新电影的标记符号
    :return:
    '''
    print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))+" update_new_video")
    movies = Movies.objects.filter(isnew=1)
    if len(movies)>0:
        for movie in movies:
            ratings = Ratings.objects.filter(movie_id=movie.movie_id)
            if len(ratings)>num:
                Movies.objects.filter(movie_id=movie.movie_id).update(isnew=0)
                print("视频"+str(movie.movie_id)+"取消新视频的标记")
#######################################################################################################################
def update_xsjz_and_recommendlist(userID):
    print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))+"   更新推荐数据开始")
    with connection.cursor() as cursor:
        cursor.callproc('update_xsjz_and_recommendlist', (userID,))  # 注意参数应该是一个元组
        connection.connection.commit()  # 调用存储过程后,确定要进行commit执行
    print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))+"   更新推荐数据结束")



在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 28
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

shejizuopin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值