基于Spark和微服务架构的电影推荐系统设计与实现
2021-04-13史爱武李险贵
史爱武 李险贵
摘要:推荐系统广泛应用于人们生活的多个领域,日常生活中常见的有电商、电影、音乐和新闻推荐等。推荐系统根据用户的历史偏好主动推送相关的信息,节约了用户的时间,极大地提升了用户的体验。随着大数据技术的发展成熟,数据处理的速度变得更快。该文选取MovieLens电影数据集,并基于大数据分布式处理框架Spark和交替最小二乘法ALS等算法搭建数据处理平台,然后再结合Spring Boot和Spring Cloud等搭建电影后台服务,实现一个基于微服务架构的电影推荐系统。
关键词:推荐系统;Spark;ALS;微服务架构
Abstract: Recommendation system is widely used in many fields of people's life, such as e-commerce, movies, music and news recommendation and so on. Recommendation system actively pushes relevant information according to the user's historical preference, which saves the user's time and greatly improves the user's experience. With the development and maturity of big data technology, the speed of data processing becomes faster. This paper selects movielens movie data set, builds a data processing platform based on big data distributed processing framework Spark and alternating least squares algorithm ALS, and then builds movie background service combined with Spring Boot and Spring Cloud to realize a movie recommendation system based on microservice architecture.
Key words: recommendation system; Spark; ALS; microservice architecture
1 背景
大數据时代用户面临信息过载的问题,为了从海量数据中找到用户可能感兴趣的信息,由此产生了推荐系统。日常生活中常见的有电商、电影、音乐和新闻推荐等[1]。随着大数据技术如Spark、Flink等的发展成熟,其计算速度更快,可以更好地为广大群众服务。本文将基于Spark和微服务架构设计并实现一个简易的电影推荐系统。
2 相关技术
2.1 推荐策略
推荐系统的实质是对用户或者物品的本身属性即基本信息,或者是对用户的行为数据进行分析,通过特定的算法模型从海量数据中找到相关性,从而产生推荐的结果。常见的推荐策略有基于内容的推荐、协同过滤推荐和混合推荐等[2]。
基于内容的推荐,即根据物品自身的属性特征计算物品间的相关性或相似性,再基于用户的历史偏好记录为用户推荐相似的物品。基于协同过滤的推荐,即根据用户评分矩阵,用户和物品协同作战。协同过滤推荐可分为基于内存的协同过滤Memory-based CF和基于模型的协同过滤Model-based CF。Memory-based 可分为基于用户的协同过滤User-based CF和基于物品的协同过滤Item-based CF[3]。混合推荐,即多种算法按照不同的策略进行混合后再推荐,常见的混合推荐有加权、切换、分区、分层、瀑布式混合、特征组合和特征增强等[4]。
2.2 Spark介绍
Spark作为大数据并行计算框架,由于支持内存计算,减少了IO开销,带来了更高的迭代计算效率,同时Spark也支持批处理和实时流数据处理等。Spark包含的组件主要有Spark Core、Spark SQL、Spark Streaming、Structured Streaming、MLlib和GraphX等[5]。
2.3 微服务架构
微服务架构将单一应用细分为多个微服务,可以独立开发和部署每个微服务,便于开发和维护。多个微服务之间互相协调、互相配合。常见的微服务架构有Spring Cloud和Dubbo等等。微服务架构体系包含服务注册与发现、服务调用、服务降级、服务网关、服务配置和服务总线等[6],对应的组件如表1所示。
3 系统设计
3.1 架构设计
本系统采用微服务架构,并基于前后端分离设计理念。系统架构设计如下图1,首先选取MovieLens电影数据集ml-1m,并基于Spark进行数据处理,将结果存入到MongoDB中;然后基于Spring Boot搭建电影后台微服务,同时将服务注册到Nacos中;前端基于Vue等进行开发,通过服务网关Gateway访问不同的服务,并由Feign调用具体的微服务[7]。
3.2 功能模块
本系统主要分为数据处理部分和电影后台微服务部分。如图2其中数据处理主要包括离线统计模块和离线推荐模块,离线统计模块包含最新电影推荐和热门电影推荐功能;离线推荐模块包含基于交替最小二乘法ALS的协同过滤推荐、基于物品的协同过滤推荐和基于内容的推荐;电影后台服务包含电影模块和用户模块等。
4 系统实现
4.1 开发工具和开发环境
实现一个简易的基于微服务架构的电影推荐系统,选取IntelliJ IDEA和Visual Studio Code为开发工具,开发环境如下表2。
4.2 热门电影推荐实现
热门电影推荐考虑最近每周内每部电影的评分次数,评分次数越多说明该电影的热度越高。具体流程如下。
1)加载数据集。
2)统计最近每周电影的评分次数并进行降序排序。
3)将结果存入到MongoDB中。
4.3 基于ALS的协同过滤推荐实现
交替最小二乘法ALS其实是将一个稀疏的用户评分矩阵通过降维得到用户隐特征矩阵和电影隐特征矩阵的过程[8],推荐流程如下。
1)加载数据集并随机切分为训练集和测试集。
2)多次调整ALS的参数如迭代次数iteration、隐特征个数k和正则化系数lambda等对模型进行训练。
3)计算每种参数组合下测试集预测评分与实际评分之间的均方根误差RMSE。
4)选取RMSE最小时的参数组合作为ALS的最优参数组合。
5)通过训练ALS模型得到电影隐特征矩阵。
6)计算两两电影隐特征向量的余弦相似度并按照相似度进行降序排序。
7)将结果存入到MongoDB中。
4.4 基于物品的协同过滤推荐实现
基于物品的协同过滤是根据用户的行为数据如评分、点击、收藏等计算出两物品间的相似度,即两物品间有相同的受众,表示两物品间有相关性。以用户评分记录为例,具体流程如下。
1)加载数据集。
2)统计每部电影的评分个数,并根据电影ID进行组合。
3)统计两两电影被同一用户评過分的次数。
4)计算两两电影间的同现相似度并按相似度降序排序。
5)将结果存入到MongoDB中。
4.5 电影后台服务实现
电影后台服务基于Spring Boot和Spring Cloud等实现,主要功能是读取MongoDB中的数据,并对外提供用户模块和电影模块的访问接口。为了让每种算法推荐的效果更加明显,基于Vue搭建前端项目,最终前端页面的推荐效果如图3,其中上半部分展示电影的详细信息,中间部分展示各种推荐算法推荐的电影ID列表和是否有交集及交集个数,下半部分展示不同算法推荐的电影列表及相似度。
5 结束语
通过设计并实现一个简易的电影推荐系统,对Spark进行数据处理和微服务架构等有更深入的了解,同时也了解了不同推荐算法的具体流程,本系统暂时包含最新电影推荐、热门电影推荐、基于ALS的协同过滤推荐、基于物品的协同过滤推荐、基于内容的推荐、用户注册登录和电影展示等功能。未来的研究工作将结合kmeans和深度学习等模型进行推荐,提高推荐的多样性和准确率,同时也可考虑进行实时推荐。
参考文献:
[1] 项亮.推荐系统实践[M].北京:人民邮电出版社,2012.
[2] Zhang S,Yao L N,Sun A X,et al.Deep learning based recommender system:a survey and new perspectives[EB/OL].[2020-03-02].https://arxiv.org/abs/1707.07435.
[3] Zhang Y F,Chen X.Explainable recommendation:a survey and new perspectives[J].Foundations and Trends? in Information Retrieval,2020,14(1):1-101.
[4] 张志威.个性化推荐算法研究综述[J].信息与电脑(理论版),2018(17):27-29.
[5] 林子雨.大数据技术原理与应用:概念、存储、处理、分析与应用[M].2版.北京:人民邮电出版社,2017.
[6] 冯志勇,徐砚伟,薛霄,等.微服务技术发展的现状与展望[J].计算机研究与发展,2020,57(5):1103-1122.
[7] 熊其昌.基于微服务架构的学习系统设计与实现[D].武汉:华中师范大学,2020.
[8] 侯敬儒,吴晟,李英娜.基于Spark的并行ALS协同过滤算法研究[J].计算机与数字工程,2017,45(11):2197-2201.
【通联编辑:谢媛媛】