摘要

摘要:随着社会逐渐进入信息过载时代,人们对电影个性化推荐服务的要求与日俱增。本文以协同过滤算法为基础进而发掘用户与用户之间的隐含关联,不同电影之间的隐性信息,采集并分析用户对电影的操作记录对用户进行个性化的模型构建,并利用Flume与Kafka建立数据管道,通过Spark系统进行快速计算,从而完成对用户的实时个性化电影推荐。
关键词:个性化推荐;协同过滤;实时推荐;电影推荐;Spark;

0 引言

  随着当代互联网技术的飞速发展,日益普及的个人电脑,移动终端等设备,极大的丰富了人们的生活,如多种多样的网站门户、APP等提供数以万计的电影视频,但用户面对海量的数据 [ 1 ] ^{[1]} [1],难以从中提取有效信息,有时并不能在庞杂的电影种类中挑选到自己喜欢的电影,导致用户体验很差。那么个性化的电影推荐系统作为一种信息过滤系统,对电影评分、类别、热度等进行数学统计,利用用户对电影的标签评价,进行个性化离线推荐服务;通过挖掘用户潜在的兴趣爱好,分析电影之间的隐藏关联性,进行协同过滤推荐;基于电影相似度矩阵,利用用户对电影的历史评分记录,通过Flume的实时采集,利用Spark平台高速计算的特点 [ 3 ] ^{[3]} [3],按权重推荐优先级实现实时电影推荐 [ 2 ] ^{[2]} [2]。这样一种基于协同过滤的个性化实时电影推荐系统,实现多方共赢,通过准确的预测用户的行为,对用户进行合理化的实时推荐,省去了用户在挑选影片上所花费的时间,并拓宽用户视野,将“冷门”但喜爱的影片进行推荐,提高用户惊喜度,提升用户体验。利用个性化电影推荐系统,提高了影片利用率,增加用户对网站的粘度 [ 5 ] ^{[5]} [5],提高网站收入。

1 协同过滤算法

  协同过滤算法核心思想是通过用户历史行为数据发掘用户潜在的偏好,并将与用户兴趣爱好相似的其他用户划分群组进行个性化预测与推荐,进而实现将用户感兴趣的电影进行推荐。协同过滤算法分为两类:一类是基于用户的协同过滤算法,另一类是基于物品的协同过滤。
  基于用户 ( U s e r − b a s e d ) (User-based) Userbased的协同过滤通过用户的历史浏览记录以及打分评价记录,对数据进行清洗分类和数学统计。并根据不同的用户对相同的电影的偏好程度计算不同用户之间的潜在关系,对相似群组的用户进行划分,此时处于同一群组的用户可以根据邻居对电影评分以及评价的加权平均值来预测目标用户的可能评分,进而生成目标用户的个性化推荐电影。
  基于物品 ( I t e m − b a s e d ) (Item-based) Itembased的协同过滤依赖于不同电影之间的分类标签以及不同用户对其评价的关联度,计算不同用户对不同电影的平均偏好值差异,得到电影相似度矩阵。对已打标签或已评分电影进行对相似电影的推荐预测,依据不同电影间的相似程度,基于电影间的关系对用户进行相似电影的预测推荐,最终根据以上信息对目标用户形成推荐。
  通过采集用户对电影的历史行为记录,处理数据,生成每个用户的行为向量,如用户 X X X n n n维行为向量 X ⃗ = { x 1 , x 2 , x 3 , . . . x n } \vec {X}=\{x_1,x_2,x_3,...x_n\} X ={x1,x2,x3,...xn}和用户 Y Y Y n n n维行为向量 Y ⃗ = { y 1 , y 2 , y 3 , . . . y n } \vec {Y}=\{y_1,y_2,y_3,...y_n\} Y ={y1,y2,y3,...yn},利用余弦相似度计算不同用户之间和不同电影之间的相似度。可写成如下形式: c o s θ = ∑ i = 1 n ( x i ∗ y i ) ∑ i = 1 n x i 2 ∗ ∑ i = 1 n y i 2 = X ∗ Y ∥ X ∥ ∗ ∥ Y ∥ cos\theta=\frac{\sum_{i=1}^n(x_i*y_i)}{\sqrt{\sum_{i=1}^nx_i^2}*\sqrt{\sum_{i=1}^ny_i^2}}=\frac{X*Y}{\left\|X\right\|*\left\|Y\right\|} cosθ=i=1nxi2 i=1nyi2 i=1n(xiyi)=XYXY
  所以最终我们利用用户行为向量的夹角的余弦值衡量两个电影者用户之间的差异大小,向量夹角余弦值接近于1说明夹角越接近于0,则表示这两个电影或用户越相似,反之说明差异越大 [ 6 ] ^{[6]} [6]
  本文采用基于用户的协同过滤算法实现不同用户对不同电影之间的预测评分得到最终的推荐矩阵,并利用基于物品的协同过滤算法计算不同电影之间的关联程度,实现对用户的个性化推荐。此外通过大数据技术进行用户评分的实时采集,实现毫秒级别的实时个性化电影推荐,提升用户体验。

2 实时推荐服务

  利用协同过滤算法得到的电影相似度矩阵,并记录最近一段时间用户的偏好,当用户 u u u对电影 m m m进行了一次评价,那么实时更新用户 u u u对与电影 m m m相似的其他电影的关联程度,更新数据进而达到实时推荐的效果,但由于要在时间性能上满足实时推荐,那么用户更关心的是对于推荐结果的动态变化能力,意味着最终推荐的结果合理即可,要满足用户所要求的实时推荐或准实时推荐。
  首先,获取用户 u t ( 1 ≤ t ≤ n ) u_t(1\leq t\leq n) ut(1tn)按时间序列最近的 S S S个评分,记为 R S RS RS;根据电影相似度矩阵得到与电影 m i ( 1 ≤ i ≤ n ) m_i(1\leq i\leq n) mi(1in)最相似的 N N N个电影集合,记为 M M M。对于每个电影 q ∈ M q\in{M} qM,根据以下公式计算其动态推荐级别: R e c r a n k = ∑ r ∈ R S c o s ( q , m j ) ∗ R m j c o s _ s u m + l g m a x { u p c o u n t , 1 } − l g m a x { d o w n c o u n t , 1 } Rec_{rank}=\frac{\sum_{r\in{RS}}cos(q,mj)*R_{mj}}{cos\_sum}+lgmax\{upcount,1\}-lgmax\{downcount,1\} Recrank=cos_sumrRScos(q,mj)Rmj+lgmax{upcount,1}lgmax{downcount,1}
  将用户 u t u_t ut对电影 m i m_i mi的评分记为 R m j R_{mj} Rmj,通过余弦相似度 c o s θ cos\theta cosθ计算电影 m i m_i mi与电影 m j m_j mj的相似度,设定最小相似度为0.7,当两个电影的相似度低于0.7的阈值,则视为两者不相关并过滤忽略。以 c o s _ s u m cos\_sum cos_sum表示电影 m i m_i mi与存储的用户电影评分 R S RS RS的相似度大于最小阈值的个数。计算平均值作为用户 u t u_t ut m i m_i mi的评分预测。
  为了提升系统推荐准确性,减少其他因素干扰,我们将用户 u t u_t ut最近的 S S S个评分中与电影 m i m_i mi相似且自身评分较高 ( r a n k ≥ 3 ) (rank\geq 3) (rank3)的电影个数记为 u p c o u n t upcount upcount,计算 l g m a x { u p c o u n t , 1 } lgmax\{upcount,1\} lgmax{upcount,1}作为电影 m i m_i mi的“增强因子”,说明与用户最近评分的电影相似的高评分电影越多,越应该被优先推荐。而将用户 u t u_t ut最近的 S S S个评分中与电影 m i m_i mi相似且自身评分较低 ( r a n k < 3 ) (rank< 3) (rank<3)的电影个数记为 d o w n c o u n t downcount downcount,计算 l g m a x { d o w n c o u n t , 1 } lgmax\{downcount,1\} lgmax{downcount,1}作为电影 m i m_i mi的“减弱因子”,因其评分较低,所以尽量不对用户进行推荐。最终得到新的电影推荐优先级列表,i表示更新前的推荐与更新后的推荐的电影集合中的每个电影, t o p K topK topK表示取出推荐效果最好的前 K K K个电影,而 c m p cmp cmp表示将电影按推荐优先级输出:
N e w R e c = t o p K ( i ∈ ⋃ m ∈ R e c { m j , R e c u m } ∪ ⋃ q ∈ S { u i , R e c r a n k } , c m p = R e c m a x ) NewRec = topK(i\in{\bigcup_{m\in{Rec}}\{m_j,Rec_{um}\}}\cup \bigcup_{q\in S}\{u_i,Rec_{rank}\},cmp=Rec_{max}) NewRec=topK(imRec{mj,Recum}qS{ui,Recrank},cmp=Recmax)
  经过用户对系统的电影评分触发后,得到最新的实时电影推荐结果,更新数据库与网站前端界面,实时更新个性化电影推荐信息。

3 电影推荐系统设计部署

3.1 架构设计

  主要实现JavaEE层面整体的业务逻辑,通过Spring框架进行构建,对接业务需求。部署在Tomcat上,项目整体架构如图所示。
在这里插入图片描述
  项目前端UI界面使用Html+Css+JavaScript搭建,后台服务通过Spring框架进行创建,主要负责后台数据和前端业务的交互。项目主要分为接口服务层、业务服务层、业务模型以及工具组件组成。系统有效的组织中间层对象,保证了整体系统高内聚、低耦合的效果,系统稳定性好。
在这里插入图片描述

3.2 系统功能设计

(1)用户功能
    项目前端采用AngularJS2自动化构建工具搭建,在实现用户的登陆注册等功能的前提下,使得前端各组件解耦合。当用户注册时,根据用户输入的年龄、性别、兴趣、爱好等进行离线统计推荐。当用户第一次登陆时,可以让用户选择自己感兴趣的影片,有效的解决冷启动问题,同时使用ElasticSearch作为模糊检索服务器,利用其强大的匹配查询能力实现基于内容的推荐服务。同时将用户的评分以及观看记录实时存储在MongoDB服务器中,在用户通过UI给出评分动作后,将数据传输到Redis集群中,综合以上功能,对用户行为记录进行分析,进行合理的个性化推荐。

(2)离线推荐
    离线批处理统计性业务主要采用Spark Core+Spark SQL实现,并利用Spark MLlib的ALS算法进行电影相似度矩阵的计算。因为离线推荐较实时推荐准确性高,所以需要利用Azkaban的调度服务设置运行时间,对离线推荐服务进行触发。在离线推荐部分主要还包括对电影信息的存储与挖掘,因为实时推荐算法依赖于离线推荐部分,如获取最热门的电影、评分最高的电影、电影的加权平均值等。

(3)实时推荐
   实时推荐部分因为要求较高的实时性,所以采用Flume从系统的运行日志中记录的锚点读取日志更新,将更新的日志实时推送到Kafka集群中。Kafka通过KafkaStream程序对获取的信息进行过滤处理,得到用户评分流。利用Spark Streaming监听Kafka队列,实时获取Kafka过滤之后的数据流,并融合存储在Redis集群中的用户最近评分,提交给实时推荐算法,完成对用户触发实时推荐的计算,将结果实时更新,保存且合并数据库,同时刷新前端界面,得到实时推荐结果。

3.3 数据库设计

    项目数据以推荐系统领域知名的MovieLens数据集为依托,其中包括Movie(电影数据表),Rating(电影评分表),Tag(电影标签表),User(用户表),基本信息表中保存用户和电影的基本信息以及用户评分记录和电影的标签点信息等。经离线统计计算得到AverageMoviesScore(电影平均平均分表),MovieRecs(电影相似度矩阵),GenresTopMovies(电影类别Top10),经离线统计推荐为实时推荐部分提供数据保障。经实时推荐服务得到UserRecs(用户电影推荐矩阵),RateMoreMoviesRecently(最近电影评分个数统计表),StreamRecs(用户实时电影推荐矩阵),最终得到用户的个性化电影推荐。
在这里插入图片描述

4 系统运行效果

  使用三台服务器搭建Spark集群,利用Spark Streaming强大的实时流数据处理,通过用户与前端界面进行交互,设置锚点,收集用户信息,经过后台数据分析以及推荐算法计算,获取不同用户之间的隐形关联度,以及不同电影之间的潜在联系。在实现推荐电影的功能的前提下,根据用户兴趣、评分记录、观看浏览记录等获取用户画像,得到更细粒度的推荐效果。系统在Linux集群下进行部署,经过数小时不间断的访问,使用Http_Load进行压力测试,系统运行稳定,实时响应,网站负载能力良好。

5 结语

  本文意在解决如今信息过载时代下,人们面对庞大的电影种类信息无法得到满意的结果问题。该方法首先是基于用户的,根据用户对应电影的操作记录发掘用户潜在的影片爱好种类,建立数学模型,依据电影相似度矩阵对用户进行个性化推荐。并实时更新预测对用户推荐的电影。经过部署上线,表明该系统具有优秀的稳定性,并与传统推荐系统进行对比,发现本文系统时效性更强,对用户的操作可以实时回馈,从而达到准实时的推荐,后续可利用改进的协同过滤算法 [ 7 ] ^{[7]} [7]优化推荐准确性,以达到更细粒度的推荐效果。实验表明本系统对提升用户体验以及商业用途皆有参考借鉴意义。

参考文献

[1] 练红波. 基于粒子群聚类的协同过滤推荐算法研究[D].中央民族大学,2015.
[2] 张恒玮. 基于协同过滤技术的电子商务推荐系统的研究与实现[D].华北电力大学,2012.
[3] 李光明,房靖力.Spark平台下电影推荐系统的设计[J].计算机应用与软件,2020,37(11):28-34.
[4] 侯林坤.电影个性化推荐系统的构建[J].电脑知识与技术,2020,16(27):41-42.
[5] 张玉叶.基于协同过滤的电影推荐系统的设计与实现[J].电脑知识与技术,2019,15(06):70-73.
[6] 郑梅. 基于常数复杂度距离函数的推荐算法研究[D].西南石油大学,2017.
[7] 王骏,虞歌.基于改进神经协同过滤模型的电影推荐系统[J].计算机工程与设计,2020,41(07):2069-2075.

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐