第一章 绪论
1.1 研究背景与意义
1.1.1 研究背景
电影推荐服务最早依靠人工编辑的静态榜单或者简单的分类列表。工作人员用观看电影、阅读影评、手工筛选、归类电影的方式来产生推荐内容。该模式更新速度慢,往往落后于影片上映的进度,不能及时反应用户的即时偏好。用户面对海量的电影库,选择过程耗时且效率低下,易导致信息过载。人工筛选不可避免地受到编辑者的主观影响,推荐范围狭窄,不能涵盖各种各样的观影兴趣。随着电影产量的爆发式增长,传统的方法已经不能满足用户对于精准化、个性化内容的需求了。计算机技术的飞速发展,特别是数据处理能力的提高,给改变这一局面带来了可能。互联网普及之后,用户观影行为的数字化记录就成为现实,这些海量数据里包含着丰富的偏好信息。行业规范化发展需要更科学的决策支持,市场竞争压力促使平台寻找提高用户粘性的方法,观众对于发现符合个人口味的电影的期望越来越高,这些因素共同构成了对新型推荐系统迫切的需求1。传统的通用榜单没有考虑到用户作为独立个体的不同,推荐结果常常和用户的真正兴趣存在偏差,从而影响用户的平台使用体验和满意度。数据整合和信息共享在传统模式下几乎不可能实现,各个环节的数据是相互割裂的,不能形成对用户兴趣的连续认识2。技术飞速发展造成传统手工操作效率低下,没有依靠数据驱动进行精细化运营的机会,在用户流失、市场反应迟钝等各方面出现管理问题3。
1.1.2 研究意义
基于用户分析的电影推荐系统直接提高了电影分发的效率。系统用算法对用户的过去行为和内容特征进行分析,把符合用户潜在兴趣的电影推送到前端。取代繁重的人工筛选工作,释放出人力资源。用户获取推荐内容的速度得到质的飞跃,由原来的被动浏览转为主动接收个性化的列表。操作流程的改进降低了人为判断的随意性,推荐结果是以可量化的数据关联为基础的。系统可以不断学习用户的最新偏好,动态调整推荐策略,这是静态榜单所不具备的自适应能力。资源配置因此更加合理,热门内容和长尾内容都能找到对应的观众群体,提高了电影库的整体利用率。对电影行业而言,该系统实现了观影决策的科学化。制片方和发行方可以从系统的群体偏好分析中了解市场走向,从而决定以后的创作和宣传方向。平台服务质量提高之后,用户忠诚度得到提升,稳定的用户群体给行业带来持续增长的消费动力。标准化的推荐流程提高了行业内信息处理水平,数据驱动的决策模式逐渐成为行业共识。系统的示范效应明显,其核心的以用户行为为基础的分析框架可以迁移到音乐、图书、新闻资讯等各个内容消费领域。这些领域也存在着信息过载以及个性化分发的问题,电影推荐系统成功实践为它们提供了一个可参照的解决办法。系统未来可以加入更多的上下文信息,例如时间、地点、社交关系等,从而产生更大的社会效益,进一步模糊内容发现与用户意图之间的边界,创造出更加自然流畅的数字内容消费体验。
1.2 国内外研究现状
1.2.1 国内现状
国内电影推荐系统研究与实践随着互联网视频平台的兴起而迅速发展。早期的豆瓣电影社区依靠用户自发的评分与评论,积累了大量的观影数据,其推荐逻辑是基于群体评分的排序,形成了以"豆瓣电影Top250"为代表的榜单文化,这种依靠显式反馈的推荐模式,对国内用户的选择习惯产生了深远的影响4。伴随着流媒体平台用户数量的增加,平台所面对的内容分发效率问题也变得越来越突出5。爱奇艺在创建推荐系统的时候,加入了个性化推荐模块,系统不但会保存用户的播放行为,还会去探究用户对于某些类型影片的停留时长、完播率等隐式反馈信号6。腾讯视频更看重把社交关系链数据加入到推荐模型当中,好友的观看记录、跨平台分享行为成了预测用户兴趣的辅助因素。平台实践使得用户行为序列建模研究热度提升,注意力机制、深度兴趣网络等模型结构被用来捕捉用户兴趣动态变化7。阿里巴巴旗下的优酷平台凭借电商场景所积累的用户画像数据,试图把购物兴趣同观影偏好展开跨领域关联分析,从而给冷启动用户推荐内容赋予了一种数据解决办法。Bilibili作为以用户生成内容为特点的平台,其电影推荐机制中包含弹幕互动、UP主创作等社区特征,推荐结果会考虑电影本身,也会考虑围绕电影产生的二次创作内容的热度8。从学术研究上来说,国内高校和研究机构同企业开展密切合作,就数据稀疏性、推荐结果多样性平衡等实际问题提出改进算法。国内行业的现实状况表明,推荐系统已经成为视频平台基础设施的重要部分,它的效果直接影响到用户留存率以及平台商业收益。
1.2.2 国外现状
国外电影推荐系统研究起步较早,以Netflix为代表形成成熟的产业实践。2006年Netflix推出的百万美元公开竞赛大大推动了协同过滤算法的发展,参赛的团队提出的矩阵分解、受限玻尔兹曼机等模型成为之后研究的基础9。Netflix自身系统之后演变为一个复杂的集成体系,融合了基于内容的过滤、协同过滤、情境感知推荐等多种技术,其推荐页面中"Trending Now"、"Because you watched..."等模块背后是几十种算法模型的实时计算结果10。亚马逊作为电商巨头,其Prime Video服务的推荐系统得益于公司多年积累的商品推荐技术,尤其是基于物品的协同过滤算法被有效迁移到了电影推荐场景中,形成了经典的"Customers who watched this also watched"的推荐范式11。YouTube的电影推荐机制建立在庞大的视频内容生态之上,系统使用深度神经网络对用户的观看历史序列进行预测,预测下一个可能观看的视频,端到端的学习方式减少了人工特征工程的依赖12。研究领域,ACM举办的RecSys是国际学者交流前沿进展的主要平台,近几年来关于图神经网络、强化学习在推荐系统中的应用研究很多,这些研究试图提高推荐的长期用户满意度,解决反馈环路中的偏差问题。Meta并不是传统的影视平台,但是其在社交推荐方面的研究影响了电影的口碑传播和发现路径,朋友点赞、分享的电影信息流成了用户发现新内容的重要渠道13。好莱坞电影公司也开始使用数据分析来预测影片的市场表现,但是系统建设更多地集中在前期制作和营销环节的决策支持上,而不是面向终端用户的实时推荐。
第二章 相关技术介绍
2.1 Python语言
Python属于高级编程语言,在数据分析以及Web应用开发方面起着重要的作用。其语法设计追求简洁明了,用强制缩进规范代码结构,这样初学者入门门槛低,大型项目维护直观。语言本身就有丰富的标准库,可以用来实现网络通信、文件处理、系统交互等各个方面的功能。内置功能的广泛性使得开发者可以不用重复编写底层代码,可以把主要精力放在业务逻辑的构建上。电影推荐系统包含数据爬取、清洗、分析和服务提供等许多环节,Python在这里有着很好的适用性14。NumPy和Pandas库给结构化数据的处理提供高效工具,可以方便地对数据进行筛选、转换和聚合操作,为后面推荐算法准备干净的数据集。Scikit-learn库包含了诸多经典的机器学习算法,虽然本系统主要使用基于规则的推荐,但是该库的存在为将来加入复杂的预测模型留下技术上的空间。
语言的动态类型特性以及解释执行机制使得开发迭代速度变快,可以对代码进行运行时修改并立即看到效果,该特性在系统原型设计以及功能调试阶段具有显著作用。Python拥有庞大的第三方开源生态,几乎所有的具体需求都能找到对应的成熟模块,这样就大大缩短了项目开发周期。社区活跃度保证了语言特性、库函数的持续更新,新的编程范式和性能优化可以及时加入到开发实践当中。Python解释器可以运行在Windows以及各种Linux发行版上,保证系统部署阶段平台兼容性。Python在执行效率方面不如C++等编译型语言,但是其可以与C扩展模块集成的特点,给计算密集型任务提供了性能优化的途径。从整体上看,Python凭借全能性、易用性,成为本系统后端逻辑、数据处理流程的合理技术选择。
2.2 Flask框架
Flask是一个轻量级的Web应用框架,使用Werkzeug工具箱和Jinja2模板引擎作为主要的组成部分15。其设计思想是简洁和可扩展的,框架本身并不强制要求预定义的项目结构或者数据库抽象层,它把组织代码的自由度完全交给了开发者。微内核架构使得Flask适合用来创建中小规模的Web服务,例如提供电影推荐API的后端应用。开发者可以根据系统需求自由选择并集成数据库驱动、用户认证、表单验证等特定功能库,避免了框架强加的多余组件造成的性能开销和学习成本。本系统中用户对电影数据的搜索请求、个性化推荐列表的生成、管理端对影片信息的增删改查操作,都是通过Flask定义的路由来接收和响应的。
框架的路由装饰器语法简单直观,可以很容易地把URL模式映射到具体的Python处理函数上。请求上下文和应用上下文机制给视图函数处理单个请求时所需要的全局信息提供了一个安全隔离的访问方式。Jinja2模板引擎实现了业务逻辑与表现层的分离,虽然本系统前后端分离的架构主要使用Vue渲染界面,但是Jinja2在快速生成管理端简单页面或者邮件内容时仍然具有一定的实用性。Flask内置的开发服务器支持代码热重载,方便开发阶段调试。对于生产环境,Flask应用可以很方便地和Gunicorn、uWSGI等高性能服务器对接,满足多用户并发访问电影推荐服务的需求。框架的扩展生态成熟,Flask-SQLAlchemy为对象关系映射提供了便利,Flask-RESTful有助于构建结构更清晰的RESTful API。Flask轻便的特点使其成为搭建和迭代本系统后端服务接口的利器。
2.3 MySQL数据库
MySQL是一种关系型数据库管理系统,由于其开源、稳定、社区支持好等特点而被广泛使用。采用客户端/服务器结构,用SQL语言进行数据定义、操作、管理。数据库的核心就是存储引擎,InnoDB是默认的存储引擎,可以对事务处理、外键约束、行级锁等提供支持。事务的ACID特性保证了用户评分提交或者管理员批量更新影片信息的时候,数据的完整性、一致性不会因为系统意外中断而被破坏。数据库依靠创建索引来加快数据检索,B+树索引结构特别适合范围查询和排序操作,从而加快了用户按照电影名称、分类搜索或者按评分、热度排序列表展示的响应速度16。
数据库表结构设计符合范式理论,用合理拆分数据实体、定义关系的方法减少冗余。本系统中用户信息、电影基本信息、用户行为记录等数据分别存放在不同的表中,表之间通过主键和外键来建立关联。该种设计使数据的维护更加清楚,查询也可以通过表连接操作灵活地组合所需信息。MySQL的配置参数很多,可以针对硬件资源和具体的负载进行性能调优,比如改变缓冲池大小来提高频繁访问数据的读取速度。其主从复制功能为读写分离、提高系统吞吐量打下了基础,备份和恢复工具保证了数据的安全性。虽然面对海量非结构化数据时存在局限,但是对于本系统所管理的结构化程度较高的电影元数据、用户偏好标签、交互记录等,MySQL提供了一个成熟可靠、易于管理的持久化存储解决方案。
2.4 Vue框架
Vue是一个用于构建用户界面的渐进式JavaScript框架。核心库只关注视图层,用声明式渲染和组件化系统作为基本的设计思想。声明式渲染是将数据与DOM绑定,底层数据状态发生变化时视图会自动更新。数据驱动视图模式把开发者从繁杂的手动DOM操作中解放出来,使开发者更多地关注数据逻辑本身。组件化是Vue的又一特性,将用户界面拆分为独立可复用的代码单元,每个组件封装自身的模板、样式和逻辑。电影推荐系统前端的电影卡片、搜索栏、导航菜单等都可以被设计成独立组件,从而提高了代码的可维护性以及复用性。
Vue生态系统里有处理各种需求的官方库。Vue Router为单页面应用的路由管理提供支持,可以实现不同功能视图之间的无缝切换,从电影列表页跳转到详情页。Vuex是一个状态管理库,它把多个组件共享的应用状态集中起来,例如当前登录用户的身份证号或者全局的电影分类列表,从而避免了复杂组件树中状态传递的混乱。Vue CLI给项目的创建、开发、构建提供了一套标准化的工具链,集成了现代前端开发所需要的配置17。框架的学习曲线比较平缓,文档详细、社区活跃,利于开发团队快速上手解决实践中的问题。Vue轻量、灵活,适合本系统动态、交互式前端用户界面的构建,可以很好地表现电影推荐结果以及复杂的可视化图表。
2.5 Echarts可视化
ECharts是由百度团队开发、维护的一个基于JavaScript的开源可视化图表库。它提供了丰富的图表类型,包括折线图、柱状图、饼图、关系图、地图、雷达图等,几乎可以满足所有的数据可视化需求。库的最明显的优势就是它强大的交互功能以及高度的可定制性,图表可以实现数据筛选、区域缩放、图例切换、数据点提示等各方面的交互操作,用户可以借助鼠标来主动去探索数据背后的信息。电影推荐系统可视化大屏中电影类型分布情况、用户偏好比例构成等数据需要用直观的图形来表现,ECharts的多种图表类型给匹配不同的数据特性以及展示目的提供可能。
ECharts的配置项系统使用声明式的选项对象,开发者只需要通过一个包含系列、坐标轴、图例、提示框等组件的配置对象来描述出完整的图表。这种配置方式结构清楚,易于理解和修改。图表库底层使用Canvas进行渲染,Canvas在处理大量图形元素以及动态数据更新的时候,比SVG有着更好的性能表现,这对于需要定时刷新数据的实时监控大屏来说十分重要。ECharts支持数据的动态加载与更新,只需要调用提供的API方法更新数据选项,图表就会以平滑的动画过渡到新的状态,使电影推荐大屏上的数据面板可以实时反映最新的统计分析结果。库文档详细,社区中积累了大量的示例和主题方案,大大降低了实现复杂可视化效果的技术门槛18。ECharts因为具备全面的功能、良好的性能和活跃的生态,成为本系统后台管理数据看板和前端数据可视化展示的主要技术支撑。
第三章 系统分析
3.1 可行性分析
3.1.1 技术可行性
本系统使用成熟的Python Web开发技术栈。使用Flask框架以及MySQL数据库的组合来验证系统的数据存储和业务逻辑的需求。前端使用Vue和ECharts实现数据可视化,技术架构层次分明。系统核心的基于用户标签的协同过滤推荐算法逻辑清楚,可以很好地运行在选定的技术环境中,整体上具有充分的技术可行性。
3.1.2 操作可行性
系统界面设计清楚,功能模块划分清楚。普通用户可以浏览、搜索、评价、收藏电影,个性化推荐结果一目了然。管理员可以很方便地管理电影数据和内容。用户交互流程一般人的认知,学习成本低。系统的操作逻辑简单直接,可以满足各个角色用户日常使用的需求,具有良好的操作可行性。
3.1.3 经济可行性
系统开发和部署成本可控。开发过程主要使用开源软件框架,不需要支付高昂的授权费用。硬件上系统可以在中等配置的服务器上稳定运行,初期投入小。平台上线之后,其自动化推荐功能可以大大降低人工运营成本,通过提升用户体验间接创造价值,整体投入产出比具有合理性。
3.2 功能需求分析
UML用例图是一种用来描述系统功能需求的图形化工具,用以表现系统与外部参与者之间的交互关系,从而明确系统的功能。用例图用用例来表示系统可以执行的特定功能,参与者代表与系统交互的各种用户或者外部系统。用例图可以用来分析和设计阶段,使开发者和客户达成一致意见,保证系统的完整性、准确性。UML用例图用直观的图示来表示系统功能和角色之间的关系。本文将对系统按照角色模块进行需求分析。
3.2.1 用户功能
用户在首页可以浏览电影,也可以接受协同过滤算法产生的个性化推荐。该角色可以分别访问热门电影、新上映电影、高分电影页面,在这些页面中可以浏览电影列表,使用电影名称搜索、电影分类搜索、排序功能对列表进行筛选和整理。点击进入电影详情页之后,普通用户可以查看电影详细信息、点赞、收藏、评分、发表评论等操作。用户用例图如图3-1所示。
图3-1用户用例图
3.2.2 管理员功能
管理员对系统后台的各项数据管理工作进行管理。主要功能是对热门电影、新上映电影和高分电影三个模块进行管理,每个模块都包含对应电影列表的查看以及新电影条目的添加。管理员添加或者编辑电影信息时要填写电影名称、分类、上映日期、导演、演员、封面、简介等内容。管理员还对基础电影数据进行管理,即查看电影数据列表、添加新数据、删除列表中的条目、启动数据爬取和查看详情等操作。管理员用例图如图3-2所示。
图3-2管理员用例图
第四章 系统设计
4.1 系统架构设计
电影推荐系统采用分层的模块化设计,使用前后端分离的开发模式,目的是创建出一个职责分明、易于维护的应用。从前端用户交互界面到后端数据处理再到持久化存储,各个层次互相配合。用户在前端浏览器上通过Vue框架开发的页面浏览电影、搜索电影、评分等,这些交互动作是由Axios库封装成HTTP请求,发送到基于Flask搭建的后端服务。Flask应用的路由层接收请求,解析参数,把任务分发给对应的业务服务模块。核心推荐逻辑就是根据用户标签的协同过滤计算,在Service层中实现。数据库访问使用统一的模型层来实现,所有的电影数据、用户信息以及行为记录都被存储在MySQL数据库中,保证数据的持久化以及事务一致性。为了提高用户体验,系统使用浏览器本地存储对一些静态资源以及用户会话状态做缓存,减少网络和后端的重复请求。这样一种架构设计使系统具有清晰的逻辑性,各个模块之间耦合度低,为系统的功能迭代和扩展打下了良好的基础。整个系统架构如图4-1所示。
图4-1系统架构图
4.2 系统功能结构设计
根据用户分析设计了两种主要角色以及对应的功能模块。普通用户是系统的主要服务对象,可以访问系统首页获取个性化的推荐,浏览由热门电影、新上映电影和高分电影构成的各种电影列表,在这些列表页面上可以进行电影搜索和分类筛选。用户可以进入电影详情页,进行点赞、收藏、评分、发表评论等操作。管理员角色负责系统的后台内容管理,主要职能是进行电影数据的管理,包括热门电影、新上映电影、高分电影和基础电影的数据列表查看、添加、编辑等。功能结构图如图4-2所示。
图4-2系统功能结构图
4.3 系统流程设计
4.3.1 总体业务流程图设计
系统总体业务流程是按照用户角色驱动的双层结构来设计的。普通用户进入系统首页,系统根据用户的以往行为给出个性化的推荐列表。用户随后可以浏览各类电影列表,按照不同的条件进行筛选,在电影详情页完成一系列的交互。这些交互行为产生的数据反馈给后台,不断更新用户的兴趣模型。管理员在独立的后台界面进行内容管理任务,即维护各种电影列表信息的完整、管理基础电影数据生命周期等,直接影响前台用户能访问到的内容质量。系统依靠前后台数据互通,把内容的维护和个性化的推荐全部包含在内。系统总体业务流程图如图4-3所示。

图4-3系统总体业务流程图
4.3.2 用户电影浏览与推荐流程设计
该流程给出了用户从进入首页到得到个性化推荐的主要路径。用户访问首页时,系统后端会先去获取用户的标识。标识有效就调用推荐算法服务,该服务查询用户的历史偏好标签,与电影数据库进行匹配计算,生成初步推荐结果。系统获取全局热门电影数据,给推荐结果提供补充。经过整合的电影数据被包装之后返回给前端界面渲染展示。用户身份无法识别时,系统就不再做个性化计算,而是使用预设的热门电影列表作为首页内容返回。用户电影浏览与推荐流程图如图4-4所示。

图4-4用户电影浏览与推荐流程图
4.3.3 用户电影搜索与筛选流程设计
用户在电影列表页面上发起搜索或者筛选请求,这是寻找某个内容的操作。前端界面接收用户输入的关键词或者选择的分类条件,把参数传送到后端处理接口。后端服务接收到参数之后,就构建包含查询条件的数据库检索语句。执行查询之后,根据结果集的数量来判断。结果数量符合预期就对数据进行排序封装,返回给前端进行列表渲染。当查询结果为空时,系统会发出不同的处理逻辑,向用户发出没有找到匹配项的提示信息。用户电影搜索和筛选流程图如图4-5所示。
图4-5用户电影搜索与筛选流程图
4.3.4 电影详情页用户交互流程设计
用户点击电影条目进入详情页,加载电影基本信息和社区互动数据。用户执行点赞或者收藏操作之后,系统就会对这些隐性的反馈进行记录。评分、发表评论属于显式反馈,提交前要进行内容合法性校验。所有合法的交互行为被持久化存储到数据库中,新增的数据会更新该电影的热度统计指标,也会被加入到用户兴趣模型的训练数据池中。用户退出详情页面之后,本次交互产生的影响会一直作用于之后的推荐计算。电影详情页用户交互流程图如图4-6所示。

图4-6电影详情页用户交互流程图
4.3.5 管理员电影数据管理流程设计
管理员登录后台系统进入电影数据管理模块查看已有的数据列表。管理员可以选择执行数据爬取任务,系统调用外部数据源接口获取最新的电影信息,清洗转换之后存入临时区域。管理员审核爬取到的数据,审核通过的就入库,审核不通过的就丢弃。对于已经入库的数据,管理员可以进行信息编辑来修正错误,也可以执行删除操作来移除无效的条目。所有的管理操作都被记录到日志里,保证数据变更有迹可循。管理员电影数据管理流程图如图4-7所示。

图4-7管理员电影数据管理流程图
4.4 数据库设计
数据库设计过程中用E-R图设计可以将概念模型转化为具体的数据库结构。该阶段要确定每一个数据表的字段类型、约束条件以及表之间的关系,给物理设计提供依据。之后将对优化数据存储方案进行分析,保证系统高效性以及可扩展性19。
4.4.1 E-R图设计
E-R图是数据建模的图形化工具,用来描述实体、属性以及实体间的关系。用图示化的方式分析和设计数据库结构,明确数据之间的相互关系,便于后面数据库的开发和管理。以下将展示系统的全局E-R图以及各个实体的属性图。
系统全局E-R图如图4-8所示。
图4-8系统E-R图
电影分类实体包括电影分类id、电影分类、创建时间、更新时间等。实体属性图如图4-9所示。
图4-9电影分类实体属性图
高分电影实体包含高分电影id、电影名称、电影分类、电影评分等。实体属性图如图4-10所示。
图4-10高分电影实体属性图
热门电影实体有热门电影id、电影名称、电影分类、电影封面等。实体属性图如图4-11所示。
图4-11热门电影实体属性图
新上映电影实体包含新上映电影id、电影名称、电影分类、上映日期等。实体属性图如图4-12所示。
图4-12新上映电影实体属性图
电影数据实体主要是电影数据id、电影标题、电影类型、电影评分等。实体属性图如图4-13所示。
图4-13电影数据实体属性图
普通用户实体主要是普通用户id、用户姓名、用户电话、偏好类型等。实体属性图如图4-14所示。
图4-14普通用户实体属性图
管理员实体主要是包含管理员id、用户名、密码、昵称等。实体属性图如图4-15所示。
图4-15管理员实体属性图
评论实体有评论id、评论人id、评论内容、创建时间等信息。实体属性图如图4-16所示。
图4-16评论实体属性图
点赞实体包含点赞id、点赞人、点赞状态、创建时间等。实体属性图如图4-17所示。
图4-17点赞实体属性图
收藏实体为收藏id、收藏人id、标题、封面。实体属性图如图4-18所示。
图4-18收藏实体属性图
4.4.2 数据库表设计
数据库表设计就是根据业务需求确定数据库表结构、字段类型以及关系。经过规范的设计来保证数据的完整性、一致性、高效性,防止出现冗余数据,为后面的数据查询、存储、维护提供清晰的框架。以下为系统的数据库表设计。
电影分类表主要用来存储电影的分类信息。主要包含电影分类id、电影分类、创建时间、更新时间等字段。电影分类表如表4-1所示。
表4-1电影分类表
| 序号 | 字段名 | 类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | 电影分类id | int | 11 | 电影分类ID |
| 2 | 电影分类 | varchar | 64 | 电影分类 |
| 3 | 创建时间 | datetime | - | 创建时间 |
| 4 | 更新时间 | timestamp | - | 更新时间 |
高分电影表主要是存储评分较高的电影信息。主要包含高分电影id、电影名称、电影分类、电影评分等字段。高分电影表如表4-2所示。
表4-2高分电影表
| 序号 | 字段名 | 类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | 高分电影id | int | 11 | 高分电影ID |
| 2 | 电影名称 | varchar | 100 | 电影名称 |
| 3 | 电影分类 | varchar | 100 | 电影分类 |
| 4 | 电影评分 | varchar | 64 | 电影评分 |
| 5 | 上映日期 | date | - | 上映日期 |
| 6 | 电影导演 | varchar | 100 | 电影导演 |
| 7 | 主要演员 | varchar | 100 | 主要演员 |
| 8 | 电影封面 | varchar | 255 | 电影封面 |
| 9 | 电影介绍 | longtext | - | 电影介绍 |
| 10 | 创建时间 | datetime | - | 创建时间 |
热门电影表主要是用来存储热门电影信息。主要包括热门电影id、电影名称、电影分类、电影封面等字段。热门电影表如表4-3所示。
表4-3热门电影表
| 序号 | 字段名 | 类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | 热门电影id | int | 11 | 热门电影ID |
| 2 | 电影名称 | varchar | 100 | 电影名称 |
| 3 | 电影分类 | varchar | 100 | 电影分类 |
| 4 | 电影封面 | varchar | 255 | 电影封面 |
| 5 | 电影导演 | varchar | 100 | 电影导演 |
| 6 | 电影简介 | longtext | - | 电影简介 |
| 7 | 主要演员 | varchar | 100 | 主要演员 |
| 8 | 上映日期 | date | - | 上映日期 |
| 9 | 创建时间 | datetime | - | 创建时间 |
| 10 | 更新时间 | timestamp | - | 更新时间 |
新上映电影表主要用来存储新上映的电影信息。主要包含新上映电影id、电影名称、电影分类、上映日期等字段。新上映电影表如表4-4所示。
表4-4新上映电影表
| 序号 | 字段名 | 类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | 新上映电影id | int | 11 | 新上映电影ID |
| 2 | 电影名称 | varchar | 100 | 电影名称 |
| 3 | 电影分类 | varchar | 100 | 电影分类 |
| 4 | 上映日期 | date | - | 上映日期 |
| 5 | 电影导演 | varchar | 100 | 电影导演 |
| 6 | 主要演员 | varchar | 100 | 主要演员 |
| 7 | 电影封面 | varchar | 255 | 电影封面 |
| 8 | 电影介绍 | longtext | - | 电影介绍 |
| 9 | 创建时间 | datetime | - | 创建时间 |
| 10 | 更新时间 | timestamp | - | 更新时间 |
电影数据表主要是用来存储从数据源爬取的原始电影数据。主要包含电影数据id、电影标题、电影类型、电影评分等字段。电影数据表如表4-5所示。
表4-5电影数据表
| 序号 | 字段名 | 类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | 电影数据id | int | 11 | 电影数据ID |
| 2 | 电影标题 | text | 65535 | 电影标题 |
| 3 | 电影类型 | text | 65535 | 电影类型 |
| 4 | 电影评分 | text | 65535 | 电影评分 |
| 5 | 上映日期 | text | 65535 | 上映日期 |
| 6 | 电影导演 | text | 65535 | 电影导演 |
| 7 | 电影主演 | text | 65535 | 电影主演 |
| 8 | 制片国家 | text | 65535 | 制片国家 |
| 9 | 图片链接 | varchar | 255 | 图片链接 |
| 10 | 唯一id | varchar | 64 | 唯一ID |
普通用户表主要是用来存储普通用户的详细信息。主要包含普通用户id、用户姓名、用户电话、偏好类型等字段。普通用户表如表4-6所示。
表4-6普通用户表
| 序号 | 字段名 | 类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | 普通用户id | int | 11 | 普通用户ID |
| 2 | 用户姓名 | varchar | 50 | 用户姓名 |
| 3 | 用户电话 | varchar | 50 | 用户电话 |
| 4 | 偏好类型 | varchar | 100 | 偏好类型 |
| 5 | 审核状态 | varchar | 16 | 审核状态 |
| 6 | 用户id | int | 11 | 用户ID |
| 7 | 创建时间 | datetime | - | 创建时间 |
管理员表主要是存储用户的登录账户信息。包含管理员id、用户名、密码、昵称等字段。管理员表如表4-7所示。
表4-7管理员表
| 序号 | 字段名 | 类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | 管理员id | int | 11 | 管理员ID |
| 2 | 用户名 | varchar | 50 | 用户名 |
| 3 | 密码 | varchar | 64 | 密码 |
| 4 | 昵称 | varchar | 50 | 昵称 |
| 5 | 手机号码 | varchar | 20 | 手机号码 |
| 6 | 邮箱 | varchar | 50 | 邮箱 |
| 7 | 头像地址 | varchar | 255 | 头像地址 |
| 8 | 用户组 | varchar | 32 | 所在用户组 |
| 9 | 账户状态 | smallint | - | 账户状态 |
| 10 | 创建时间 | timestamp | - | 创建时间 |
评论表主要用来存储用户对于电影的评论内容。主要是评论id、评论人id、内容、创建时间等字段。评论表如表4-8所示。
表4-8评论表
| 序号 | 字段名 | 类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | 评论id | int | 11 | 评论ID |
| 2 | 评论人id | int | 11 | 评论人ID |
| 3 | 内容 | longtext | - | 内容 |
| 4 | 创建时间 | timestamp | - | 创建时间 |
| 5 | 来源表 | varchar | 255 | 来源表 |
| 6 | 来源id | int | 11 | 来源ID |
点赞表主要是保存用户对电影点赞的行为信息。主要包含点赞id、点赞人、点赞状态、创建时间等字段。点赞表如表4-9所示。
表4-9点赞表
| 序号 | 字段名 | 类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | 点赞id | int | 11 | 点赞ID |
| 2 | 点赞人 | int | 11 | 点赞人 |
| 3 | 点赞状态 | tinyint | - | 点赞状态 |
| 4 | 创建时间 | timestamp | - | 创建时间 |
| 5 | 来源表 | varchar | 255 | 来源表 |
| 6 | 来源id | int | 11 | 来源ID |
收藏表主要是用来记录用户收藏电影的行为信息。主要包含收藏id、收藏人id、标题、封面等字段。收藏表如表4-10所示。
表4-10收藏表
| 序号 | 字段名 | 类型 | 长度 | 备注 |
|---|---|---|---|---|
| 1 | 收藏id | int | 11 | 收藏ID |
| 2 | 收藏人id | int | 11 | 收藏人ID |
| 3 | 标题 | varchar | 255 | 标题 |
| 4 | 封面 | varchar | 255 | 封面 |
| 5 | 创建时间 | timestamp | - | 创建时间 |
| 6 | 来源表 | varchar | 255 | 来源表 |
| 7 | 来源id | int | 11 | 来源ID |
4.5 基于标签的协同过滤推荐算法设计
推荐算法的设计是实现系统个性化服务目标的核心环节。本研究采用基于标签的协同过滤算法,旨在将电影内容特征与用户偏好标签进行关联匹配,从而为每位用户提供差异化的推荐列表。算法逻辑设计围绕"用户-标签-电影"的三元关系展开。首先,系统从ordinary_user表中读取用户预先设定的偏好类型标签,这些标签作为用户兴趣的直接表征。算法核心在于将用户的这些偏好标签集合,与hot_movies表中电影的分类标签字段进行精确比对。匹配过程通过构造SQL查询语句实现,筛选出所有分类标签与用户任一偏好标签相符的电影。为提升推荐质量,对匹配结果进行了排序优化:完全匹配用户所有偏好的电影获得最高优先级;部分匹配的电影则依据其综合热度进行次级排序,热度计算综合了点击量与用户评分数据。为了防止因用户标签过窄或数据稀疏导致的推荐列表过短,算法设计了补充机制,当匹配结果数量低于预设阈值时,系统将自动补充未匹配但热度较高的电影进入推荐列表,确保用户体验的连续性。整个算法逻辑封装在hot_movies.py文件的Get_tag_list函数中,通过前后端分离的API接口对外提供服务。基于标签的协同过滤推荐算法核心实现代码如下所示。代码如下所示:
| def Get_tag_list(self, ctx): ... if "user_id" in query: user_id = query.pop("user_id") ... # 获取用户偏好标签 user_sql = "SELECT type_of_preference FROM ordinary_user WHERE user_id = " + user_id tag_list = service.run(user_sql) if len(tag_list) > 0: tag_str = tag_list0"type_of_preference" # 根据标签匹配电影 sql = "SELECT FROM hot_movies WHERE film_class_nameification in (" + tag_sql + ")" list = service.run(sql) # 补充逻辑 if len(list) < size: other_sql = "SELECT FROM hot_movies WHERE film_class_nameification not in (" + tag_sql + ") ORDER BY hits DESC" other_list = service.run(other_sql) list.extend(other_list) return {"result": {"list": list, "count": len(list)}} return self.Get_list(ctx) |
|---|
4.6 数据采集与可视化大屏设计
系统数据层与服务层之间的协同设计,是支撑前台功能与后台管理的关键基础。数据采集模块负责为系统提供初始的、持续更新的电影内容来源,其设计核心在于从公开、稳定的数据源自动化获取结构化信息。本系统选择豆瓣电影作为数据源,利用其公开的API接口,通过模拟浏览器请求的方式爬取电影的名称、评分、类型、简介及封面图等关键元数据。采集流程考虑了网络请求的异常处理、反爬虫策略的应对以及数据格式的统一化清洗。爬取到的原始数据经过去除重复条目、处理特殊字符、转换字段名称等一系列ETL操作后,被批量写入MySQL数据库的movie_data表中,为后续的推荐计算与内容管理提供了标准化的数据基础。与此同时,面向管理员的数据操作界面设计以直观高效为原则,提供了对电影数据的列表查看、新增录入、外部爬取及删除维护等完整功能,确保了系统内容池的活力。
可视化大屏设计则聚焦于将系统运行状态与数据分析结果以图形化、动态化的方式呈现,服务于决策支持与效果监控。大屏基于Vue框架与ECharts图表库构建,采用深色主题以增强视觉沉浸感与数据突出度。设计包含三个核心板块:实时推荐电影网格展示区、电影类型分布柱状图分析区以及用户偏好构成饼图分析区。前端通过JavaScript定时器,每隔5秒自动向Flask后端发起异步请求,获取最新的推荐列表与统计图表数据。后端对应的API路由调用业务逻辑处理数据,并以JSON格式返回。前端收到数据后,利用ECharts的丰富配置项动态更新图表,电影卡片网格则通过操作DOM进行重新渲染,整个过程平滑流畅,实现了数据的实时监控与可视化分析。数据采集与可视化大屏的核心实现代码如下所示:
| # 数据采集爬虫核心函数 def spider(page, size, type, cookie): url = 'https://.../start='+str(page)+'&limit='+str(size) headers = {'user-agent': 'Mozilla/5.0 ...', 'cookie': cookie} resp = requests.get(url, headers=headers) return pd.DataFrame(json.loads(resp.text)) # 可视化大屏数据API @app.route def get_recommend(): service = service_select user_id = request.cookies.get if user_id: result = service.Get_tag_list({"user_id": user_id}) ... return jsonify({"list": service.Get_list({}, {"size": 10})}) |
|---|
第五章 系统实现
5.1 用户功能实现
5.1.1 首页功能实现
首页是用户进入系统的第一个界面,起着展示个性化内容的作用。系统根据用户之前的行为数据,用协同过滤算法计算出符合用户兴趣的电影列表,将结果集中展示在页面主体部分。用户不需要搜索就能直接找到自己喜欢的影片,大大提高了内容发现的速度和体验。首页界面如图5-1所示。
图5-1首页界面
5.1.2 热门电影功能实现
本模块给用户呈现了当下广受欢迎的电影集合。用户进入页面之后,系统默认加载的是按热度排序的电影列表。用户可以输入特定的关键词进行影片的搜索,也可以选择感兴趣的电影分类进行浏览。页面支持多种排序方式,可以按照评分或者上映时间重新组织列表内容。热门电影界面图如图5-2所示。
图5-2热门电影界面
5.1.3 电影详情页功能实现
用户在电影列表中选择某个影片之后,系统就会导航到电影详情页面。该页面集中显示了电影的详细信息,即剧情简介、演职员表、社区评分。页面上包含很多交互组件,用户可以在这里表达自己的态度,给影片打分,写文字评论,或者把影片标记为喜欢。这些交互行为就成了更新用户画像的重要数据来源。电影详情页界面如图5-3所示。
图5-3电影详情页界面
5.1.4 新上映电影功能实现
该模块主要用来展示近期上映的影视作品。其主要功能就是帮助用户快速获取最新的电影资讯。页面布局与热门电影模块一致,支持用户通过输入电影名称进行影片搜索,也可以按照电影分类筛选内容,还可以自定义排序结果列表,保证用户可以快速浏览新片信息。新上映电影界面如图5-4所示。
图5-4新上映电影界面
5.1.5 高分电影功能实现
高分电影模块就是指系统评价分数较高的一些影片。页面初始加载的时候,系统默认显示按照评分降序排列的电影列表。用户如果想要找寻某个影片,可以使用搜索功能输入电影名称。用户还可以根据自己的电影分类来缩小浏览范围,并且可以根据个人喜好改变排序标准,从而更加灵活地寻找好的电影。高分电影界面如图5-5所示。
图5-5高分电影界面
5.2 管理员功能实现
5.2.1 热门电影管理功能实现
该模块给管理员赋予了维护前台热门电影列表的权限。管理员进入页面之后就可以看到已经存在的热门电影条目列表。系统有添加新热门电影的入口,管理员需要对新增的电影填写完整属性信息,即名称、分类、上映日期、导演、演员阵容、封面图片、剧情简介。所有信息提交之后,前台用户界面就会同步更新。热门电影管理界面如图5-6所示。
图5-6热门电影管理界面
5.2.2 新上映电影管理功能实现
管理员对新上映的电影内容库进行管理时用这个模块。核心操作就是浏览当前已录入的新上映电影列表。管理员执行添加操作,弹出表单依次填写电影的各项详细信息。表单内容经过校验后提交,新的电影数据就被系统录入,保证了前台新上映电影板块内容的时效性、准确性。新上映电影管理界面如图5-7所示。
图5-7新上映电影管理界面
5.2.3 高分电影管理功能实现
本模块用来维护高分电影推荐板块的数据源。管理员在此可以查看已经入选高分电影列表的所有影片。系统支持管理员向列表中添加新的高分影片,添加时要完整录入电影的基本信息和介绍内容。该功能保证了高分电影板块的内容质量,可以给前端用户持续提供有价值的内容。高分电影管理界面如图5-8所示。
图5-8高分电影管理界面
5.2.4 电影数据管理功能实现
此模块是系统电影数据的总管理后台,对基础电影数据进行全方位的操作。管理员可以查看所有的电影数据详细信息。列表支持对单条数据进行删除操作,也可以查看某部电影的全部信息。另外系统还具有数据爬取功能,管理员可以触发该功能从外部数据源获取最新的电影信息,处理后批量导入到系统数据库中。电影数据管理界面如图5-9所示。
图5-9电影数据管理界面
第六章 系统测试
6.1 测试目的
软件测试是保证系统质量、可靠性的关键环节。测试目的主要针对验证系统功能是否严格满足前期设计的业务需求,保证系统在不同的运行环境中的稳定性、安全性。通过系统的测试过程,可以主动发现隐藏在代码中的一些缺陷和逻辑错误,这些缺陷和错误在开发阶段很难被发现。识别并修复这些缺陷直接提高系统的整体健壮性,大大降低生产环境中发生故障的概率。测试不只是对功能的正确性进行考察,还要考察系统在压力下的表现,用户的交互是否流畅,数据处理是否准确。全面的测试实践大大提高了最终交付产品的质量,为系统在实际部署之后长期稳定运行打下了良好的基础。高质量的软件产品可以改善最终用户的使用体验,降低后期维护的复杂性以及成本。
6.2 测试方法
为了全面检验基于用户分析的电影推荐系统,本次测试采用了多种策略。单元测试关注的是系统最小可测试单元,即对推荐算法中标签匹配函数、用户偏好查询逻辑等独立模块进行验证,保证其内部逻辑正确,输入输出符合预期。集成测试主要针对各个模块之间的交互进行检验,看用户请求从前端发起、经过Flask后端处理、最后从MySQL数据库返回结果的完整链条是否顺畅,数据在各个层之间传递是否准确无误20。功能测试按照用户和管理员的角色需求规格说明书,模拟用户浏览电影、搜索筛选、评分评论以及管理员对电影数据增删改查等具体操作,逐项验证系统各项功能是否实现,并符合设计。性能测试对系统在高并发访问时的响应速度、吞吐量、数据库连接池等各方面进行测试,保证系统在实际使用中满足性能要求。回归测试在每次修改功能或者修复缺陷之后执行,重新运行核心功能的测试用例,保证新的代码变更不会破坏系统原有的正确性。使用层次分明、目标明确的测试方法组合,对系统的功能完备性、运行稳定性、性能表现等各方面进行充分验证。
6.3 测试内容
首页协同过滤推荐功能测试,目的在于检验系统能否根据用户的偏好标签动态产生个性化的电影推荐列表,保证推荐结果的实时性、相关性,从而检验推荐算法的有效性。首页推荐测试表如表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热门电影管理测试用例表
| 测试内容 | 测试步骤 | 预期结果 | 实际结果 |
|---|---|---|---|
| 热门电影录入 | 在后台提交新的热门电影信息 | 电影信息添加成功并可在前端查看 | 符合预期 |
| 电影列表管理 | 查看热门电影管理列表 | 列表准确显示所有已添加的热门电影 | 符合预期 |
| 信息关联展示 | 检查前端热门电影页面内容 | 前端页面展示的数据与后台录入一致 | 符合预期 |
测试结论
对系统核心业务模块进行功能测试,所有测试用例都执行完毕。首页推荐功能可以按照用户的偏好生成个性化的推荐列表,在没有偏好时会显示默认的内容,刷新机制正常。热门电影、新上映电影、高分电影浏览功能测试通过,列表加载、名称搜索、分类筛选、排序操作均能正确响应,返回结果符合预期。电影详情页查看、评分、评论、点赞、收藏等全部功能均能正常实现,用户操作后系统反馈正确,并对相关数据进行更新。后台管理中新上映电影管理、高分电影管理、热门电影管理模块测试结果表明,电影信息添加、编辑、列表维护功能正常,数据一致性得到保证。电影数据管理模块列表查看、删除、数据爬取、详情查看操作全部完成。本次测试涉及系统的主要业务逻辑,所有的测试项实际结果都与预期结果一致,系统功能符合设计要求。