私信我获取源码和万字论文,制作不易,感谢点赞支持。
目 录
[++++1 团队建设++++](#1 团队建设)
[++++1.1 团队的任务和目标++++](#1.1 团队的任务和目标)
[++++1.2 团队制度++++](#1.2 团队制度)
[++++1.3 团队任务分配++++](#1.3 团队任务分配)
[++++1.4 项目进度安排++++](#1.4 项目进度安排)
[++++2 需求分析++++](#2 需求分析)
[++++2.1 国内外研究现状++++](#2.1 国内外研究现状)
[++++2.2 研究背景与意义++++](#2.2 研究背景与意义)
[++++2.3 功能分析和性能分析++++](#2.3 功能分析和性能分析)
[++++2.4 用例图++++](#2.4 用例图)
[++++2.5 类图++++](#2.5 类图)
[++++2.6 系统E-R图++++](#2.6 系统E-R图)
[++++3 推荐算法++++](#3 推荐算法)
[++++3.1 基于用户的协同过滤算法++++](#3.1 基于用户的协同过滤算法)
[++++3.2 基于物品的协同过滤算法++++](#3.2 基于物品的协同过滤算法)
[++++3.3 相似度计算++++](#3.3 相似度计算)
[++++4 总体设计++++](#4 总体设计)
[++++4.1 设计原则++++](#4.1 设计原则)
[++++4.2 系统架构++++](#4.2 系统架构)
[++++4.3 功能模块++++](#4.3 功能模块)
[++++4.4 系统表结构++++](#4.4 系统表结构)
[++++4.5 数据字典++++](#4.5 数据字典)
[++++5 使用手册++++](#5 使用手册)
[++++5.1 使用环境配置++++](#5.1 使用环境配置)
[++++5.2 数据爬取及存储++++](#5.2 数据爬取及存储)
[++++5.3 结果展示++++](#5.3 结果展示)
[++++6 代码清单++++](#6 代码清单)
[++++6.1 数据爬虫代码++++](#6.1 数据爬虫代码)
[++++6.2 动态爬虫抓取链接代码++++](#6.2 动态爬虫抓取链接代码)
[++++6.3 抓取电影详细信息代码++++](#6.3 抓取电影详细信息代码)
[++++6.4 连接数据库代码++++](#6.4 连接数据库代码)
[++++6.5 将数据写入数据库++++](#6.5 将数据写入数据库)
[++++6.6 推荐算法代码++++](#6.6 推荐算法代码)
[++++6.7 电影图文展示代码++++](#6.7 电影图文展示代码)
[++++6.8 前端代码++++](#6.8 前端代码)
[++++总 结++++](#总 结)
1 团队建设
1.1 团队的任务和目标
总体任务:完成对豆瓣电影推荐网页的爬虫,并在此基础上完成推荐电影的系统。
子任务:
(1)对爬取数据进行预处理使用;
(2)使用对数据进行分析;
(3)使用Django完成对系统的设计;
(4)完成文档编写。
目标:
(1)最大程度的完成预期任务,尽全力完善细节,完美实现既定的功能,满足用户需求;
(2)不仅要巩固基础知识,还要学习较难知识,为完成项目做好充分的准备,也为自身求职就业增加竞争力。
1. 2 团队制度
(1)实训课准时到教室上课,无特殊情况不可请假;
(2)按时完成老师、组长布置的任务,不拖延;
(3)遇到问题时,相互交流,团结合作。
1. 3 团队任务分配
(1) :
团队工作协作,代码督办;
部分代码编写及团队建设、需求分析和总文档的编写。
(2) 、 、 :
后期项目编写及代码测试。
(3) :
部分团队文档编写及全程测试。
1. 4 项目进度安排
小组进度安排表
|-------------------------|---------------------|
| 时间 | 进度安排 |
| 2022/11/22---2022/11/28 | 完成团队建设文档编写 |
| 2022/11/29---2022/12/05 | 完成需求分析文档的编写 |
| 2022/11/06---2022/12/12 | 完成对豆瓣电影数据的爬取、预处理及分析 |
| 2022/12/13---2022/12/19 | 完成对系统设计的代码编写 |
| 2022/12/20---2022/12/26 | 完成对项目系统的总体测试并加以改进 |
| 2022/12/27---2022/12/19 | 完成对前期文档的汇总及总报告的编写 |
2 需求分析
现在电影资源[1]是网络资源的重要组成部分,随着网络上电影资源的数量越来越庞大,设计电影个性化推荐系统迫在眉睫。所以本系统旨在为每一个用户推荐与其兴趣爱好契合度较高的电影。本系统包含电影前端展示界面、电影评分、电影收藏、推荐算法的实现。其中实现推荐算法是整个电影推荐系统的核心。
2 . 1 国内外研究现状
推荐系统被提出并受到大众的关注已有二十多年了。在国外,Goldbery [2]等人员于 1992 年在 Tapestry 垃圾邮件过滤系统中运用了协同过滤思想。2006 年 Netflix[3]举办了改进推进系统大赛,然而这场比赛也催生出了许多其他优质的推荐算法,例如比较有名的当属隐语义模型和矩阵分解。它们为后续的推荐系统发展奠定了重要的理论依据。
在国内,文献对目前比较流行的框架进行分析,Netflix Prize 竞赛提出了基于矩阵分解的二项矩阵分解模型。文献[4]提出了在相似度计算中融入项目类别喜爱度和类别关注度,再对用户进行聚类,最后做出推荐,不仅时间复杂度变低,而且也使得推荐精度进一步升高。
综合来看,推荐系统主要是从优化推荐算法以及推荐算法与实际工程应用相结合等两个方面进行研究,目前常用的有:
(1)基于协同过滤算法的推荐。它是以用户的历史行为信息以及最近邻居为基础进行推荐,也是较早被广泛关注和发展的算法。在某一特定用户或物品的集合内,求出它们的相似度,并获取各自的邻居集合。然后把用户没有使用过的物品推荐给他,同时也去除用户曾经使用过的物品,以避免重复推荐,从而完成整个推荐过程。一些商业系统中,在用户物品信息量比较大的情形下,用户间直接有共同行为的物品数据非常少,会造成共同行为数据比较稀疏的问题。同时,在新用户或者新物品进入业务系统后,由于没有历史行为也会造成冷启动的问题,对此提出了协同聚类算法。协同过滤发展的历史最悠久,到现在依然普遍适用,充分的体现出它的健壮性,而且还得到了普遍的应用,亚马逊、淘宝、京东、爱奇艺等流行的网站中都包含了基于该思想的推荐算法。
(2)基于内容的推荐。从信息检索领域发展出基于内容的推荐方法。主要是通过预先提取物品自身的属性特征,然后根据它们的属性差异来作为数据源进行推荐的。首先为每个用户建立符合自身的特征向量,然后通过这些特征向量计算出他们各自的相似性,再通过相似性筛选出用户各自的邻居集合。因此,这种推荐方式不需要考虑其他用户行为的信息,也即不存在考虑用户对物品评价的因素。正因如此,它的这一优点克服了在推荐过程中会常常遇到的冷启动问题,而且对于数据稀疏方面上也能得到一定程度的缓和,从而实现推荐系统的个性化。
(3)基于关联规则的推荐。关联规则有个"啤酒和尿布"的小故事案例,但是也特别的经典,常常被拿来用作分析关联规则算法的分析,其思想是从数据集中找到项与项的关系,简而言之的理解就是用户购买某个物品的时候,同时也去购买另一个物品的概率。它是对于最大频繁项的求解,通常有Apriori和FP-Growth使用较多。
(4)基于聚类的推荐算法。基于聚类的算法有K最近邻算法,它可以按照用户或物品划分,对于专门来缓解数据稀疏有非常很好的作用。
2 . 2 研究背景与意义
从信息匮乏到信息过载,人们的生产生活遇到了巨大的挑战。社会各行业均以数据作为研究对象,与此同时也累积了大量具有潜在价值的数据,现今已步入大数据时代。我们进入各种搜索引擎网站亦或是APP[5],在输入关键信息后检索想要得的信息。尽管我们可以通过搜索引擎来获取我们想要的信息,但是对于很多人来说,却并不明确自己需要什么具体的信息。例如当人们进入超市或商店进行购物时,并不太明确自己一定就做好了买什么的准备,而是去了货架、储物柜才知道。通过分析自身的喜好和需求,最终决定买什么。我们身处于一个信息爆炸的时代,让用户在有限的时间和无限的海量信息中去找所需要的信息,就像是大海捞针,这就是大家经常所称的信息过载现象。推荐系统能够为客户提供推荐服务,现在越来越多的科研工作者投入到此领域当中。如何能让这些海量信息自己主动"找上门",从以前的主动寻找所需物品,变为被动的去接受。因此,这样也就形成了推荐系统的雏形。
现如今大数据越来越火,在生活中的应用涉及到方方面面,相应的分布式存储系统的技术发展也让存储的运行成本控制的很低。分布式计算是将存储在不同服务节点中的海量数据进行运算,达到降低系统对硬件的要求,使得低廉的机器也能满足这种规模方式的计算量,进而发掘出巨大的潜在价值。数据挖掘[6-7]是跨越多门学科的计算机技术,从海量信息中通过预先定义好的方式去寻找所需要的有价值的信息,再通过一定的转换方式格式化为可以理解的信息。机器学习是通过分析大量的用户历史行为数据从中寻找出其背后所隐藏的规律。大数据处理框架比较早的非 Hadoop莫属,其核心技术 HDFS、MapReduce等更是经典。它能将分布于不同机器上的进程协同进行工作,从而形成一个庞大的分布式应用系统,也被许多的软件厂商青睐。为了在海量数据中寻找用户所需的信息,使用传统的寻找方式需要付出巨大的成本,正是在这样的大背景下推荐系统便出现了。它可以让信息更加精准的流向所需要的用户,用户也无需绞尽脑汁在庞大的数据量中毫无头绪的搜集信息。
从刚开始单一化的发展,到现在的多元化发展与应用,在许多行业领域推荐系统都有它的身影,在像淘宝,京东,拼多多等电商网站中显得尤为凸出,为他们的销售业绩作出了巨大的贡献。同样在电影、新闻媒体等领域中,传统的租碟片、看报纸的方式显得越来越难以为继,效率非常低下。比如,在视频领域中国内比较热门的有优酷、爱奇艺等网站都是大家所熟知的。当用户打开网站或者 APP 首页,可以看到各种板块的推荐影片信息,会让用户感到一种很熟悉的感觉,似乎这些 APP 非常智能懂得用户喜好。虽然推荐系统经历了长时间的发展,但其性能仍有一定的提升空间,如何给用户提供高质量的信息推荐,也是目前推荐领域行业大家所一直研究的重难点。在多元化的大信息量的前提下,设计一个满足所有用户需要的高效推荐系统,从而达到具有差异性的个性化,这正是本文所需要研究的。
2 . 3 功能分析和性能分析
随着电影市场的迅速发展,每天都有大量电影上映.人们都希望可以高效的 在海量电影库中找到自己可能会喜欢的电影,以节省寻找电影的时间。电影推荐系统能给用户带来便利.本系统要实现的是一个面向用户的个性化电影推荐系统。根据豆瓣 Top250 的电影数据集,通过计算用户相似性、电影相似性,实现为用户推荐符合其兴趣的电影。本系统实现的个性化电影推荐系统有以下几点基本需求:
(1)数据集:每个用户所评电影数量要多,尽量广泛涉及大量电影;
(2)推荐算法:推荐效果要良好;
(3)良好的用户交互体验:包括用户注册登录在内的整个 Web 系统,用户可查看电影,收藏电影;
(4)系统要易于扩展和维护。
2 . 3 .1 功能分析
由于国内外电影行业的不断发展,每天都有新加入的观影用户和新上架的影片。如何让用户在规模如此巨大的影片中找到自己喜欢的电影,就必须让系统从被动接收用户请求转化为主动感知用户的信息需求,从而节约用户的时间、增加系统的粘性。本文所设计的电影推荐系统就是以此为目的,让系统主动为用户寻找喜欢的电影。
用户可以分为有目标性的和无目标性的,对于有目标性的用户,他们知道自己想看某部电影,可直接根据用户提供的电影名字进行查询或者模糊匹配寻找电影;对于无目标性的用户,可根据用户静态数据与用户历史行为数据进行数据分析挖掘用户可能喜欢的电影,让系统自动给用户进行推荐预测。
本文设计的电影推荐系统是面向用户的,具有前台业务系统和后台推荐系统。由于推荐系统是依据用户的个性化数据去做推荐,所以用户必须先注册账号,登录成功后才会根据用户的个性化数据自动展示实时推荐、离线推荐、热门推荐以及详情页推荐模块的推荐结果。当用户发生点击事件时,系统还会对该数据进行记录,以此为下次推荐做准备,让系统形成一个闭环。
根据系统的特点,可将功能分为基本功能、个性化推荐功能和数据存储功能三个部分。其中基本功能为用户的基本行为功能,包括用户注册、用户登录、电影搜索、电影评分、历史评分和退出登录功能。个性化推荐功能主要由推荐引擎提供支持,包含离线推荐、实时推荐、热门推荐和详情页推荐四个模块。数据储存[8]功能主要为用户历史行为数据存储和推荐引擎的计算提供支持,使用数据库完成。
(1)基本功能
1)用户注册:本系统只对会员开放,用户登录成功后,方能访问。并且系统
根据用户唯一标示进行电影推荐,所以对新用户提供注册功能。用户进行账号注册时系统会在网页中显示填写账号、登录密码和确认密码的输入框,之后系统会验证用户提交的信息是有效,并返回是否注册成功,注册成功则返回登录页面。
2)用户登录:用户在登录页的相应输入框填写用户名和密码,后台系统接收到用户填写的信息后会进行校验。校验通过,则自动跳转到推荐首页,否则将会提不登录失败。
3)电影搜索:用户在页面顶部的搜索框内输入想要查询电影的关键词信息,系统则会根据用户提供的信息在电影信息里进行查找,将匹配到的电影呈现给用户。
4)电影评分:用户进入电影详情页后,可根据自己的喜好对该电影进行评分。评分值的范围为0-5分,0分为最低分,5分为最高分,以0.5分为一个评分值间隔。
5)历史评分:用户可对自己有过评分记录的电影进行查看,页面会展示相关电影与评分值。
6)退出登录:当用户点击"退出登录"后,则会退出系统,跳转到登录页面。若还想进入系统,就得再次登录。
(2)推荐功能
本电影推荐系统的推荐场景有四种,既有个性化推荐功能,也有非个性化推荐功能。个性化推荐会根据每个用户的不同偏好,为其提供符合各种喜好的影片。非个性化推荐根据所有用户对电影的历史行为,提供评分次数高、评分值高等的相同推荐结果。为了提高用户的交互体验,还提供了实时推荐功能,该推荐模块可在秒级时间内响应推荐需求。
1)离线推荐:离线推荐位于推荐首页,根据用户、电影和上下文等相关信息进行电影推荐,每天只需提供一次推荐结果,推荐的结果具有个性化特点。其推荐的准确率、召回率和覆盖率应有良好的得分值,其是用户对系统粘性的重要保障。
2)实时推荐:实时推荐位于推荐首页,它会根据用户对不同电影的评分,实时的更新此推荐模块的结果。这部分注重推荐效果的实时性,是对当前评分电影的同类型电影进行推荐,必须让系统快速响应用户。
3)热门推荐:热门推荐位于推荐首页,是非个性化的推荐,其对每个用户的推荐结果都一样。这部分的推荐是根据所有用户对电影的历史评分行为进行统计后获得,统计的方式有所有电影中评分次数最多的电影、所有电影中平均得分值最高的电影等。
4)详情页推荐:详情页推荐位于电影详情页,为了避免推荐同类型电影导致用户审美疲劳,此推荐部分不根据电影相似度进行推荐,而是采用基于模型的协同过滤方式进行推荐。
(3)数据存储功能
电影推荐系统应具备电影相关数据、用户相关数据和计算中间结果存储的能力。对于非实时性需求的数据,应采用可扩展、稳定性高的存储平台功能进行保存,例如对于用户历史行为的备份数据。对于实时性需求高的数据,则采用基于内存的软件,以保证其处理速度,例如实时推荐需要的评分数据、供展示层调用的推荐结果。
2 . 3 .2 性能分析
(1)准确性
准确性是推荐系统的重要性能度量指标,拥有较高的准确性从某种程度上预示着模型能很好地预测用户的兴趣。因此,系统如果有较高的准确性,那么就能更加准确的给用户推荐其真正喜欢的电影,提升用户对推荐功能的体验,增强用户对系统的粘性。
(2)实时性
当用户对一电影进行评分后,会触发推荐引擎的实时推荐计算,系统需马上计算出实时推荐结果集,实时推荐耗时越短越能给用户更加的体验。本课题的实时推荐模块在接收到用户对电影的评分数据后,到计算出实时推荐结果集的时间需要低至秒级。
由于定位的用户群体规模较大,所以本系统对性能以及兼容性要求比较严格,
(1)满足大量用户同时登录系统并能成功地运行;
(2)简单人性化的操作页面,易于用户操作,也便于后期维护;
(3)因为系统对数据库依赖性较强,所以数据库需要具备相当高的稳定性和高效性。
2 . 4 用例图
用例的核心概念中首先它是一个业务过程,经过逻辑整理抽象出来的一个业务过程,这是用例的实质。业务过程是指在待开发软件所处的业务领域内完成特定业务任务的一系列活动。
我们小组所设计的推荐系统主要服务于用户和管理员。
2 . 4 .1 游客和普通用户用例图
从用户角度来看,分为游客和普通用户:游客只能浏览电影信息,而且需要用户登录才可以对电影进行评分,评论等操作,所以游客无法获得个性化定制的推荐电影列表。
对于普通用户,首先需要新用户在系统当中注册user_id,便于系统能够准确识别用户信息,并根据该用户的观影兴趣为其提供独特的推荐列表。
用例图可视化[9]地表达了系统的需求,具有直观、规范等优点,克服了纯文字性说明的不足。借助于用例图,系统用户、系统分析人员、系统设计人员、领域专家能够以可视化的方式对问题进行探讨,减少了大量交流上的障碍,便于对问题达成共识。现通过用例图展现用户与系统之间的交互,游客和普通用户的用例图如下:
图2.1 游客用例图
图2.2 普通用户用例图
2 . 4 .2 管理员用例图
从管理员的角度来看,管理员在系统中具有最高权限,其主要是对用户信息以及电影信息进行维护与管理操作。管理员可以随时添加新电影,以及对电影信息进行删除,更新修改以及检索等,管理员还可以添加、删除、查找用户信息,还可以对用户行为进行管理。
图2.3 管理员用例图
2 . 5 类图
所设计的电影推荐系统中的类可以大致分为以下几种:Person,User,Administrator, Movies, Rating, Interest, Recommendation。
Person是Administrator和User的父类;Administrator负责管理用户和电影信息;User可以设置自己的观影兴趣并且给电影评分;Movies主要是进行电影信息的管理和更新电影操作;Recommendation系统则是根据用户的兴趣和它对电影的评分,为用户生成个性化的推荐。总体类图如下:
图2.4 总体类图
2. 6 系统E-R图
按照数据组织模型[10-11]来组织显示信息的过程需要花费大量的资源,另外设计的工作也是很烦乱,这样造成了工作效率的低下。而E-R方法就很容易来解决这种问题,实体-关系方法简称为E-R方法,此方法所使用的工具为E-R图,实体、实体属性以及实体间关系就组成了E-R图。
本系统E-R图如图2.5所示。共有4个实体,分别是会员、管理员、电影以及电影分类。一个会员可以查询多个电影和电影分类,一个管理员管理多个电影和电影分类。
图2.5 系统E-R图
其中每个实体的属性图如下所示。
管理员实体属性图如图2.6所示。管理员具有编号、账号、密码属性。
图 2.6 管理员实体属性图
电影实体属性图如图2.7所示。电影具有标题、图片、时间、内容属性。
图 2.7 电影实体属性图
电影分类实体属性图如图4.6所示。电影分类具有编号和分类名属性。
图 2.8 电影分类实体属性图
3 推荐算法
3. 1 基于用户的协同过滤算法
该算法主要用相似统计的方法得到具有相似爱好或者兴趣的相邻用户。基于用户(User-Based)的协同过滤算法[12-13]首先要根据用户历史行为信息,寻找与新用户相似的其他用户;同时,根据这些相似用户对其他项的评价信息预测当前新用户可能喜欢的项。给定用户评分数据矩阵 R,基于用户的协同过滤算法需要定义相似度函数 s:U×U→R,以计算用户之间的相似度[14],然后根据评分数据和相似矩阵计算推荐结果。
具体步骤如下:第一步,收集用户信息。收集可以代表用户兴趣的信息。一般的网站系统使用评分的方式或是给予评价,这种方式被称为"主动评分"。另外一种是"被动评分",是根据用户的行为模式由系统代替用户完成评价,不需要用户直接打分或输入评价数据。电子商务网站在被动评分的数据获取上有其优势,用户购买的商品记录是相当有用的数据。第二步,最近邻搜索(Nearest neighbor search, NNS)。以用户为基础(User-based)的协同过滤的出发点是与用户兴趣爱好相同的另一组用户,就是计算两个用户的相似度。例如:查找 n 个和 A 有相似兴趣用户,把他们对 M 的评分作为 A 对 M 的评分预测。一般会根据数据的不同选择不同的算法, 目前较多使用的相似度算法有 Pearson Correlation Coefficient(皮尔逊相关系数)、Cosine-based Similarity(余弦相似度)、Adjusted Cosine Similarity(调整后的余弦相似度)。
3.2 基于物品的协同过滤算法
该以物品为基础的协同过滤方法有一个基本的假设"能够引起用户兴趣的项目,必定与其之前评分高的项目相似",通过计算物品之间的相似性来代替用户之间的相似性[15-18]。
具体步骤如下:第一步,收集用户信息。同以用户为基础(User-based)的协同过滤。第二步,针对项目的最近邻搜索。先计算已评价项目和待预测项目的相似度,并以相似度作为权重,加权各已评价项目的分数,得到待预测项目的预测值。例如:要对项目 A 和项目 B 进行相似性计算,要先找出同时对 A 和 B 打过分的组合,对这些组合进行相似度计算。第三步,产生推荐结果。以物品为基础的协同过滤不用考虑用户间的差别,所以精度比较差。但是却不需要用户的历史数据,或是进行用户识别。对于项目来讲,它们之间的相似性要稳定很多,因此可以离线完成工作量最大的相似性计算步骤,从而降低了在线计算量,提高推荐效率,尤其是在用户多于项目的情形下尤为显著。
3.3 相似度计算
在协同过滤算法中,相似度的计算至关重要。只有计算了用户或者物品之间的相似度才能得出推荐列表.常用的相似度计算方法有以下几种:
1.余弦相似度
在 n 维空间中,任意两个向量之间的夹角的余弦值大小即代表这两个向量的相似程度。余弦值的取值范围为[-1,1].假设 n 维空间中存在向量 i 和向量 j,式(3-1)为计算其余弦相似度的公式。
(3-1)
2.欧氏距离
欧式距离也称为欧几里得度量,是指在 n 维向量空间中,任意两个向量之间的自然长度。同样的,假设存在向量 M 和 N,则欧式距离表达公式如式(3-2)所示。
(3-2)
3.皮尔逊(Pearson)相关系数
如果一个推荐算法使用的是皮尔森相关系数来计算相似度[19],那么该算法将会比使用余弦相似度公式计算相似度的算法的精确度更高。然而这是要建立在两个用户拥有较多共同评分项目的基础上,如果两个用户之间共同评分项目很少,使用皮尔森相关系数进行计算无法反映出真实的相似度.假设存在两个向量J 与K,这两个向量间的皮尔森相关系数计算公式如式(3-3)所示,
(3-3)
4.曼哈顿距离
在平面上,坐标(1x,1y)与坐标(1y,2y)的曼哈顿距离为:
(3-4)
4 总体设计
4.1 设计原则
(1)实用性原则
任何项目的开发都应该是按照实际实用性来执行的,既要考虑到开发的成本,也要保证项目最后的成果。过多的开发成本,虽然完成了项目需求,但是浪费了大量人力物力以及其他资源。所以按照具体的业务水平、管理能力、以及数据的处理方面来保证项目的实用性是十分重要的。
(2)可扩展性与可维护性原则
一个系统开发出来之后,并不是一层不变的,系统需要随着时间而不断地需要扩展和维护来满足增长的需求。所以在设计软件的时候要最大程度上模块化设计,灵活运用组件,这样在未来需要扩展系统的时候不至于将系统全盘翻新,而是一个模块地进行扩展,这样既节约了资源也更容易调整。
(3)安全可靠性原则
系统的开发都需要涉及到安全性问题,系统对不正当访问的限制以及系统开发过程中对数据库数据的及时备份都是十分重要的。
(4)用户界面设计原则
主要还是考虑到用户的使用体验,系统的界面应该简洁、易于操作,这样既能让用户乐于使用系统,也节省了开发人员在界面设计上花费的资源。
(5)数据库设计原则
数据库设计体现需要体现以下四个原则:设计的一致性、数据库的完整性、数据库的安全保障性、数据库的可伸缩性和设计的规范化。
4.2 系统架构
4 . 2 .1 Bootstrap3 CSS框架
前端界面采用 Bootstrap3 css 框架。Bootstrap 是基于 HTML、CSS、JavaScript 的,它简洁灵活,使得 Web 开发更加快捷。Bootstrap 提供了一个带有网格系统、链接样式、背景的基本结构。自带以下特性:全局的 CSS 设置、定义基本的 HTML 元素样式、可扩展的 class,以及一个先进的网格系统。
Bootstrap 还包含了十几个可重用的组件,用于创建图像、下拉菜单、导航、警告框、弹出框等等。其中包含了十几个自定义的 JQuery 插件,便于使用者直接包含所有的插件,也可以逐个包含这些插件。还支持定制 Bootstrap 的组件、Less 变量和 JQuery 插件来得到自己的版本。
4 . 2 . 2 MVC框架
(1)MVC模式
MVC英文全称是Model View Control,是模式---视图---控制器的缩写,是一种框架模式,数据、逻辑、界面的代码在MVC模式中获得了很好的分离,三个部分之间有条不紊的协调工作。MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
MVC指MVC模式的某种框架[20],它强制性地使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。最典型的MVC就是JSP + Servlet + JavaBean的模式。
MVC框架的核心思想是解耦,让不同的代码块之间降低耦合,增强代码的可扩展性和可移植性,实现向后兼容。
(2)MVC架构优点
1)耦合性低
视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。
2)重用性高
MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,因为多个视图能共享一个模型,它包括任何WEB(Http)浏览器或者无线浏览器(Wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。
3)部署快,生命周期成本低
MVC使开发和维护用户接口的技术含量降低。使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。
4)可维护性高
分离视图层和业务逻辑层也使得Web应用更易于维护和修改。
(3)MVC架构缺点:
1)完全理解MVC比较复杂。
由于MVC模式提出的时间不长,加上同学们的实践经验不足,所以完全理解并掌握MVC不是一个很容易的过程。
2)调试困难。
因为模型和视图要严格的分离,这样也给调试应用程序带来了一定的困难,每个构件在使用之前都需要经过彻底的测试。
3)不适合小型,中等规模的应用程序
在一个中小型的应用程序中,强制性的使用MVC进行开发,往往会花费大量时间,并且不能体现MVC的优势,同时会使开发变得繁琐。
4)增加系统结构和实现的复杂性
对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
5)视图与控制器间的过于紧密的连接并且降低了视图对模型数据的访问
视图与控制器是相互分离,但却是联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
(4)MVC三部分关系
首先等待用户输入,待用户输入后通过控制器进行人机交互,从而将用户数据及指令传递给模型。接着通过模型分别进行业务逻辑判断及数据库存取和根据业务逻辑选择不同视图。接着通过视图与用户人机交互,将结果返回给用户。最后用户获得反馈并进行下一步同样操作。以此反复。
程序的输入操作、程序的输出操作和处理操作被MVC很好的分开来。MVC三部分关系如图4.1所示。
图4.1 MVC关系图
4 . 2 . 2 Django框架
本系统后端使用 Django 框架结合 Sqlite3 数据库设计[21]。Django 是一个基于Python 的 Web 框架,可以用来开发交互式网站。Django采用的是 MTV 框架模式, 即模型(Model),模板(Template)和视图(Views)。它们各自的职责所示。Django框架(内部的URLconf)作为控制器的角色,负责了接收用户请求和转发请求的工作。由于 Django 是免费的,且公布了其源码,又拥有丰富的文档,所以使用的人员很多。其优点如下:
(1)通用性:
Django 可以和任何客户端框架一起工作,并且可以提供几乎任何格式的内容。
(2)安全性:
Django 提供一种安全的方式管理用户的账户和密码,其 cookies 只包括一个秘钥,而实际数据存储在数据库中,并且 Django 可以防范许多漏洞,大大提高了网站的安全性。
(3)灵活性:
由于 Django 是用 Python 语言所编写的,所以它不受服务器平台的限制。比如在 Linux 系统、Windows 系统或者 Mac 系统上都能运行程序。
4.3 功能模块
本系统用户分为两种,分别是后台管理员和前台用户。前台用户需要注册账号并成功登陆进入该电影推荐系统,可以通过搜索电影类别查询各类电影,并查看电影详细信息。最重要的是可以通过个人喜好和收藏等习惯推荐其可能喜欢的电影。管理员需要登陆后台,进行电影及分类、上新等,管理用户信息以及点击量管理等。本系统主要功能模块如图4.2所示。
图4.2 系统功能模块图
4.4 系统表结构
本系统的运行十分依赖于与数据库的交互,所以数据库的建立必须是整洁有条理而且规范的。而系统所运用到的协同过滤也是以相当规模的数据集为基础,包括后期的推荐结果测试也同样是需要反复与数据库进行交互[22]。
系统后台管理员表如表4-1所示。
表4-1管理员信息表
|---------------------------|---------------------|----------------|------------|------------------|
| 列名 | 数据类型 | 默认 | 是否允许为空 | 说明 |
| Id(PRI) Username Password | Int Varchar Varchar | Null Null Null | No Yes Yes | 管理员编号为主键 管理员名 密码 |
电影类型表如表4-2所示。
该表用于记录电影类型,而用户注册时会相应地添加自己喜欢的类型,用于后期给用户推荐其他相同类型的电影。
表4-2电影类型表
|---------------|-------------|-----------|--------|----------------|
| 列名 | 数据类型 | 默认 | 是否允许为空 | 说明 |
| Id(PRI) Types | Int Varchar | Null Null | No Yes | 电影类型的编号为主键 类型名 |
电影信息表如表4-3所示。
该表主要用于记录电影的基本信息,并将信息提交给前端显示。
用户信息表如表4-4所示。
用于记录用户基本信息,用于登录与注册。
用户喜好表如表4-5所示
该表记录用户注册系统时添加的所喜好电影的类型,从而作为后期给用户推荐相同类型电影以及跟用户有相同喜好的其他用户喜爱的电影的依据。
表4-3电影信息表
|---------------------------------------------------------------------|-----------------------------------------------------------------|----------------------------------------------|------------------------------------|------------------------------------|
| 列名 | 数据类型 | 默认 | 是否允许为空 | 说明 |
| Id(PRI) Moviename Actor Director Types Area Years Abstract Clicknum | Int Varchar Varchar Varchar Varchar Varchar Varchar Varchar Int | Null Null Null Null Null Null Null Null Null | No Yes Yes Yes Yes Yes Yes Yes Yes | 管理员编号为主键 电影名 主演 导演 类型 地区 年代 简介 点击数 |
表4-4用户信息表
|------------------|---------|------|--------|-------|
| 列名 | 数据类型 | 默认 | 是否允许为空 | 说明 |
| Id(PRI) Username | Int | Null | No | 编号为主键 |
| Id(PRI) Username | Varchar | Null | Yes | 用户昵称 |
| Password | Varchar | Null | Yes | 密码 |
| Mobile | Varchar | Null | Yes | 手机 |
| Name | Varchar | Null | Yes | 用户姓名 |
表4-5用户喜好表
|----------|---------|------|--------|--------|
| 列名 | 数据类型 | 默认 | 是否允许为空 | 说明 |
| Id(PRI) | Int | Null | No | 编号为主键 |
| Typename | Varchar | Null | Yes | 类型名 |
| cid | Int | Null | Yes | 点击量表id |
电影点击量表如图4-6所示
电影点击量表会记录下每一部电影的点击次数,以及点击者的id,从而作为后期推荐给该点击者其他可能感兴趣的电影的依据。
表4-6电影点击量表
|------------|----------|------|--------|-------|
| 列名 | 数据类型 | 默认 | 是否允许为空 | 说明 |
| Id(PRI) | Int | Null | No | 编号为主键 |
| Fid | Int | Null | Yes | 电影编号 |
| Cid | Int | Null | Yes | 点击量编号 |
| insertdate | Datetime | Null | Yes | 点击时间 |
4.5 数据字典
数据库中各表字段以及关联信息如下:
表4-7 auth_group_permissions
|---------------|------|----|----|
| 列名 | 数据类型 | 长度 | 注释 |
| id | int | | 主键 |
| group_id | int | | 外键 |
| permission_id | int | | 外键 |
表4-8 auth_permission
|-----------------|---------|-----|----|
| 列名 | 数据类型 | 长度 | 注释 |
| id | int | | 主键 |
| name | varchar | 255 | |
| content_type_id | int | | 外键 |
| codename | varchar | 100 | 外键 |
表4-9 auth_user_user_permissions
|------------|------|-----|----|
| 列名 | 数据类型 | 长度 | 注释 |
| id | int | | 主键 |
| user_id | int | 100 | 外键 |
| permission | Int | 100 | 外键 |
表4-10 django_content_type
|-----------|---------|----|----|
| 列名 | 数据类型 | 长度 | 注释 |
| id | int | | 主键 |
| app_label | varchar | | 外键 |
| model | varchar | | 外键 |
表4-11 auth_group
|------|---------|----|----|
| 列名 | 数据类型 | 长度 | 注释 |
| id | int | | 主键 |
| name | varchar | | 外键 |
表4-12 auth_user_groups
|----------|------|----|----|
| 列名 | 数据类型 | 长度 | 注释 |
| id | int | | 主键 |
| user_id | int | | 外键 |
| group_id | int | | 外键 |
表4-13 auth_user
|--------------|----------|-----|----|
| 列名 | 数据类型 | 长度 | 注释 |
| id | int | | 主键 |
| password | varchar | 128 | |
| last_login | datetime | 6 | |
| is_superuser | tinyint | 1 | |
| username | varchar | 150 | 外键 |
| first_name | varchar | 30 | |
| last_name | varchar | 150 | |
| email | varchar | 254 | |
| is_staff | tinyint | 1 | |
| is_active | tinyint | 1 | |
| date_joined | datetime | 6 | |
表4-14 django_admin_log
|-----------------|------------------|-----|----|
| 列名 | 数据类型 | 长度 | 注释 |
| id | int | | 主键 |
| action_time | datetime | 6 | |
| object_id | longtext | | |
| object_repr | varchar | 200 | |
| action_flag | smalint UNSIGNED | | |
| change_message | longtext | | |
| content_type_id | int | | 外键 |
| user_id | int | | 外键 |
表4-15 movies_3
|----------------------|---------|-----|----|
| 列名 | 数据类型 | 长度 | 注释 |
| id | varchar | 255 | |
| title | varchar | 255 | |
| image_link | varchar | 255 | |
| country | varchar | 255 | |
| years | varchar | 255 | |
| director_description | varchar | 255 | |
| leader | varchar | 255 | |
| star | varchar | 255 | |
| description | varchar | 255 | |
| tags | varchar | 255 | |
| imdb | varchar | 255 | |
| language | varchar | 255 | |
| time_length | varchar | 255 | |
表4-16 django_migrations
|---------|----------|-----|----|
| 列名 | 数据类型 | 长度 | 注释 |
| id | int | | 主键 |
| app | varchar | 255 | |
| name | varchar | 255 | |
| applied | datetime | 6 | |
表4-17 movie_likecomment
|------------|------|----|----|
| 列名 | 数据类型 | 长度 | 注释 |
| id | int | | 主键 |
| comment_id | int | | 外键 |
| user_id | int | | 外键 |
表4-18 movie_usertagprefer
|---------|--------|----|----|
| 列名 | 数据类型 | 长度 | 注释 |
| id | int | | 主键 |
| score | double | | |
| tag_id | int | | 外键 |
| user_id | int | | 外键 |
表4-19 movie_user
|--------------|----------|-----|----|
| 列名 | 数据类型 | 长度 | 注释 |
| id | int | | 主键 |
| username | varchar | 255 | 外键 |
| password | varchar | 255 | |
| email | varchar | 254 | |
| created_time | datetime | 6 | |
表4-20 movie_comment
|-------------|----------|-----|----|
| 列名 | 数据类型 | 长度 | 注释 |
| id | int | | 主键 |
| content | int | 255 | |
| create_time | datetime | 6 | |
| movie_id | int | | 外键 |
| user_id | int | | 外键 |
表4-21 movie_movie_collect
|----------|------|----|----|
| 列名 | 数据类型 | 长度 | 注释 |
| id | int | | 主键 |
| movie_id | int | | 外键 |
| user_id | int | | 外键 |
表4-22 movie_rate
|---------------------|---------------------|----|----|
| 列名 | 数据类型 | 长度 | 注释 |
| id mark create_time | int double datetime | | 主键 |
| movie_id | int | | 外键 |
| user_id | int | | 外键 |
表4-23 movie_movie
|-------------------|----------|------|----|
| 列名 | 数据类型 | 长度 | 注释 |
| id | int | | 主键 |
| name | varchar | 255 | 外键 |
| director | varchar | 255 | |
| country | varchar | 255 | |
| years | date | | |
| leader | varchar | 1024 | |
| d_rate_nums | int | | |
| d_rate | varchar | 255 | |
| intro | longtext | | |
| num | int | | |
| origin_image_link | varchar | 255 | |
| image_link | varchar | 255 | |
| imdb_link | varchar | 255 | |
表4-24 movie_tages
|------|---------|-----|----|
| 列名 | 数据类型 | 长度 | 注释 |
| id | int | | 主键 |
| name | varchar | 255 | 外键 |
表4-25 movie_movie_tags
|----------|------|----|----|
| 列名 | 数据类型 | 长度 | 注释 |
| id | int | | 主键 |
| movie_id | int | | 外键 |
| tags_id | int | | 外键 |
表4-26 django_session
|--------------|----------|----|----|
| 列名 | 数据类型 | 长度 | 注释 |
| session_key | varchar | 40 | 主键 |
| session_data | longtext | | |
| expire_date | datetime | 6 | 外键 |
5 使用手册
5. 1 使用环境配置
(1)在Pycharm编译器中打开名为"2021movie"文件夹为项目文件夹。
图5.1 打开项目文件夹
(2)打开配置Python解释器,选择Settings
图5.2 选择Settings查看环境配置
(3)进入文件夹依次打开Project:2021movie->Project Interpreter,此时项目文件夹未设置解释器,点击显示'<No interpreter>'的下拉菜单选择现有的Python解释器,点击ok按钮使用选中的解释器。
图5.3 所拥有的环境
(4)若缺失需要的库,可选择使用图形化界面点击安装或命令行代码安装。
图形化界面安装:
在上图界面点击环境表右侧"+"号进入搜索界面,搜索到需要的依赖库之后,会弹出如下界面,需要从中选择合适的库的版本(例如图,本程序需要安装Django 2.2.10及以上版本),点击左下方install Package进行安装。
图5.4 图形化界面安装环境
命令行安装:
进入主界面,点击左下方terminal进入终端界面。使用pip指令安装,输入pip install <依赖包名>==<特定版本>;;
运行该指令即可安装(已安装会显示依赖包已满足需要)。
图5.5 命令行安装
5.2 数据爬取及存储
(1)打开Pycharm,新建movie2 project
图5.6 新建Project
(2)Crawler用于存豆瓣爬虫文件,新建selecuim_douban_crawler.py,用于抓取动态爬虫链接。
图5.7 新建selecuim_douban_crawler.py
(3)在新建的py文件中输入如下爬取代码;在Crawler中新建get_details.py,用于电影详细信息。
图5.8 新建get_details.py
(4)调用包
图5.9 所调用的包
(5)最后爬取的电影及相关信息如下
图5.10 爬取的电影的信息
5.3 结果展示
(1)注册登录模块
描述:主要实现用户登陆注册功能。
对于新用户可以在推荐系统中注册自己的账号,并登录;对于老用户,可以直接登录系统进行电影搜索及查看。
界面:
图5.11 用户注册
图5.12 用户登录
(2)用户浏览电影
描述:浏览页面首页,其他页面引用此界面样式再进行其他信息展示。get_user_recommend() 方 法 用 于 调 用 后 端 基 于 用 户 推 荐 电 影 数 据 , get_latest_movie()方法用于调用最新的电影数据。另外可根据热度/收藏/评分/时间,浏览不同排序的电影,在标签页,可根据标签浏览不同标签下的电影。
界面:
图5.13 按流量排序
图5.14 按家庭标签查询
图5.15 按奇幻标签查询
(3)基于用户的电影推荐功能
描述:基于用户对电影的打分数据推荐,用户每次打分后,页面用户推荐数据将清除缓存,重新计算数据,并重新生成推荐数据,展示在页面新的基于用户推荐数据。算法主要通过计算该用户与 10 位用户的距离,找到距离最近的用户,即喜好最相似的用户,根据此用户的数据向目前用户用户推荐电影。
界面:
图5.16 猜你喜欢
(4)基于物品的电影推荐功能以及用户评分
描述:主要通过找到被共同用户评分的两个电影,余弦计算两电影相似度,找出与当前电影相似的电影,生成用户电影推荐列表并展示出来。
界面:
图5.17 为你推荐和添加评分
(5)用户收藏电影
描述:用户可在电影详情界面收藏或取消收藏电影,并可在我的信息中我的收藏查看收藏的电影。
界面:
图5.18 收藏电影
(6)用户修改个人信息
描述:用户可在个人信息界面对个人信息进行修改。可以修改账号、密码及邮箱或重置,还包括可以查看我的收藏、我的评论以及我的评分。
界面:
图5.19 用户修改信息功能展示
(7)用户观影界面
描述:用户可进行影片搜索并查看搜索结果,点击前往观看按钮,即可链接到第三方网站,从而观看该电影。
界面:
图5.20 用户观影界面
(8)后台管理模块
描述:后台管理为 Djiango 框架中所集成的可视化管理模块,能方便管理数据库中用户信息,电影信息等各项信息。但需要通过 python manage.py createsuperuser 命令建立超级用户进入后台管理。
界面:
图5.21 后台管理登录展示
图5.22 后台管理页面展示
总 结
本电影推荐系统的设计与实现是由各个阶段逐步进行的,主要有团队建设、需求分析、系统设计与实现,其中需求分析主要进行了功能分析和性能分析,并使用各种图表进行更为直观的进一步表示,是系统设计与实现过程中基础的重要的一步。系统设计阶段主要通过推荐算法的选择、设计原则、系统架构、功能模块等方面进行对该电影推荐系统的设计,采用主流的推荐算法以及大数据平台进行后续的开发及实现,并提出相应的改进策略。详细设计通过系统界面展示的形式进行说明,包括功能描述、界面视图展示及核心代码。本文采用的大数据处理平台是Python,再结合本文提出的算法,为后续离线、在线以及热门进行推荐。
本系统结合现有的较热门的MVC框架,采用两种不同推荐算法实现对用户的个性化电影推荐,编写视图代码进行电影推荐结果的 UI 前端展示。利用CSS3语言对网页进行排版、美化,使系统看上去更加简洁和美观,增加用户的体验。不过,采用的算法效率不够高。当前使用的两种算法依旧是上个世纪提出的算法,所以系统运行效率不高,速度很慢,后期可以考虑尝试其他推荐算法,采用更新、效率更高的推荐算法。另外,数据集为固定的数据集,可考虑加入爬虫技术以实时更新数据集,使用户能获取最新的电影观看。
总体来说,本电影个性化推荐系统采用了两种协同过滤算法:基于用户的协同过滤和基于项目的协同过滤,使用户能从两种不同角度获得推荐,提高用户的可选择性。设计的系统包含用户信息功能模块、电影展示功能模块、用户操作功能模块、推荐结果模块及管理员后台管理模块,简明清晰,易操作。
参考文献
[1] 蔡骐,李玲.信息过载时代的新媒介素养[J].现代传播(中国传媒大学学 报),2013,35(09):120-124.
[2] Ghemawat S, Gobioff H, Leung S T. The Google file system[C]//ACMSIGOPS Operating Systems Review. ACM, 2003, 37(5): 29-43.
[3] Dean J,Ghemawat S.MapReduce:simplified data processing on large clusters[J].Communications of the ACM, 2008, 51(1): 107-113.
[4] 孙辉,马跃,杨海波,张红松.一种相似度改进的用户聚类协同过滤推荐算法[J].小型微型计算机系统,2014,35(09):1967-1970.
[5] 印鉴,陈忆群,张钢.搜索引擎技术研究与发展[J].计算机工程,2005(14):54-56+104.
[6] 许明杰,蔚承建,沈航.Spark 并行化基于物品协同过滤算法[J].计算机工程与设计,2017,38(07):1817-1822.
[7] 周志华,杨强.机器学习及其应用[M].北京:清华大学出版社,2011.
[8] JiaWei Han,Micheline Kamber.数据挖掘概念与技术[M].范明,译.机械工业出版社,2001.
[9] Y.Carbonne and C. Jacob. Genetic Algorithm as Machine Learning for profiles recognition[J].2015 7th International Joint Conference on Computational Intelligence (IJCCI), Lisbon, Portugal,2015:157-166.
[10] 唐振坤.基于 Spark 的机器学习平台设计与实现[D].厦门大学,2014.
[11] K. Dwivedi and S. K. Dubey. Analytical review on Hadoop Distributed file system[J].Confluence The Next Generation Information Technology Summit (Confluence), 2014 5th International Conference -, Noida, 2014:175-181.
[12] Shvachko K, Kuang H, Radia S,et al. The hadoop distributed file system[C]//Mass Storage Systems and Technologies (MSST),2010 IEEE 26th Symposium on. IEEE, 2010: 1-10.
[13] 王升升,赵海燕,陈庆奎,曹健.个性化推荐中的隐语义模型[J].小型微型计算机系统,2016,37(05):881-889.
[14] 杨阳,向阳,熊磊.基于矩阵分解与用户近邻模型的协同过滤推荐算法[J].计算机应用,2012,32(2):395-398.
[15] F. Ullah, G. Sarwar, S.C. Lee, Y.K. Park, K.D. Moon, J.T. Kim, Hybrid recommender system with temporal information, Proceedings of IEEE International Conference on Information Networking (2012) 421-425.
[16] 吴金龙.Netflix Prize中的协同过滤算法[D].北京:北京大学,2010.
[17] 胡俊,胡贤德,程家兴.基于Spark的大数据混合计算模型[J].计算机系统应用,2015,24(4)215-218.
[18] 李改,李磊.基于矩阵分解的协同过滤算法[J].计算机工程与应用,2011,47(30): 5-7.
[19] Guo G,Wang H,Bell D,Bi Y,Greer K. KNN model-based approach in classification[M]. On The Move to Meaningful Internet Systems 2003:986-996.
[20] George T, Merugu S. A scalable collaborative filtering framework based on co-clustering[C].//IEEE International Conference on Data Mining.IEEE, 2005: 625-628.
[21] 杨志伟.基于 Spark 平台推荐系统研究[D].中国科学技术大学,2015.
[22] 冯琳.集群计算引擎 Spark 中的内存优化研究与实现[D].清华大学,2013.