4.1需求分析
4.1.1功能性需求
1、帮助天翼高清用户从庞大的电影库中找出最适合自己的5部电影,避免让用户陷入信息过多的困扰。
2、可以动态增加或者删除推荐算法引擎,更改各推荐算法引擎的权重,从而提高混合推荐算法的效果。
4.1.2非功能性需求
1、数据仓库是整个系统稳定性和整体性能的关键所在,由于该项目需要存储大量的用户、电影、用户对电影评分的数据,因此一个稳定而高效的数据仓库是必须的。
2、由于本项目是基于分布式Spark平台,故选取算法应该能够较为容易在Spark平台上并行优化,能够充分发挥Spark平台的集群优势,增加其运行效率。
3、选取的算法必须至少包括一个冷启动算法,以满足推荐系统处理冷启动问题的需求。
4.2系统架构
如图4.1所示,一个完整的个性化推荐系统的架构应包含以下七个模块:数据采集模块、数据仓库模块、推荐引擎模块、引擎管理模块、结果处理模块、用户反馈模块、评估模块。其中推荐引擎模块是整个系统的核心,每种推荐算法都会有自己推荐策略,而结果处理模块是将各个推荐算法的推荐结果按权重输出,并进行过滤、排名、业务解释等,最终将推荐结果展示给用户。数据仓库模块存储大量的用户、电影、用户对电影评分的数据。评估模块是对各个推荐算法的结果根据运行速度、准确率、覆盖率等指标进行评估。引擎管理模块可以根据推荐结果,应用场景,动态增加或者删除推荐算法引擎,更改各推荐算法引擎的权重,从而提高混合推荐算法的效果。由于本项目采用现成的MovieLens数据集,里面包含了三部分数据:用户、电影、用户对电影评分,因此本项目并没有实现数据采集模块,用户反馈模块。但是这并不表示这两个模块并不重要,恰恰相反,数据收集模块的好坏影响到采集数据的质量,从而进一步影响到推荐的结果。而是用户反馈模块是用户对推荐结果的反馈,通过反馈,调整推荐引擎的数目,权重等,从而达到更好的推荐效果。
4.3数据仓库设计
正如前面所述,一个稳定而高效的数据仓库在这个项目中是必须的。本项目中将所需要的三类数据:用户、电影、用户对电影评分的数据以Parquet文件的形式,存储到HDFS中,查询的时候使用SparkSQL查询数据,SparkSQL在进行查询的时候,可以像查询数据库的表一样使用SQL查询,那正是因为Parquet文件具有自带Schema的特性。又因为整个平台是基于Spark的,Parquet文件是列式设计的,因此这样的数据仓库具有很高的效率和稳定性,甚至比目前通用的Hive快很多。
如图所示,整个数据仓库一共分为三层:ODS层(ODS层指的是将OLTP数据通过ETL同步到数据仓库来作为数据仓库最基础的数据来源。在这个过程中,数据经过了一定的清洗,比如字段的统一,脏数据的去除等,但是数据的粒度是不会变化的。ODS层的数据可以只保留一定的时间),中间层,结果层
-
ODS层:该层是将现成的数据文件解析后以Parquet文件形式存储于HDFS中,同事抽象成数据仓库表,上层的各推荐引擎,通过SparkSQL方式调用数据。
-
中间层:由于整个推荐系统数据量十分巨大,涉及的计算量也不小,如果我们不一开始先离线算好一些和推荐对象无关的指标,例如用户的相异度,电影的相似度等,那么我们整个推荐系统的速率将会无法忍受,因此一些和推荐对象无关的计算我们可以事先离线算好,并且以Parquet文件形式存储于HDFS中,供上层的推荐引擎使用。
-
结果层:基于中间层的数据,通过推荐引擎计算得到的结果,都会存在这一层,结果层的数据往往不大,可以存储在内存中,然后进行过滤,排名,直接将结果展示给用户。
4.4推荐算法引擎
本项目实现了三个推荐引擎:基于SVD的推荐、协同过滤算法的推荐以及基于人口统计学的推荐,可以根据实际场景,输出结果等线性增加或者删除推荐引擎,并通过结果动态调整各个推荐系统的权重,从而进一步提高混合推荐引擎的质量。之所以会加入基于人口统计学的推荐引擎,因为我们的推荐系统会存在“冷启动”的问题,而基于人口统计学的推荐引擎针对新用户可以避免此类问题,当用户的行为逐渐多了的时候,可以使用基于SVD的推荐、协同过滤算法的推荐,从而提高推荐质量。如图所示,每一种推荐算法都分成离线和在线两部分,离线部分就是上述数据仓库的中间层,通过对ODS层数据进行处理,计算和推荐对象没有直接关系的指标,如电影相似度等,这些计算往往非常大,耗时十分长,利用Spark事先算好。模型的训练也同样可以事先训练好,存在中间层。在线部分则是与具体的推荐目标有关的,需要在离线基础上,将推荐结果最快的展示给用户,因此需要将在线部分计算加载到内存中,提高推荐速度。
4.5结果处理模块
如图所示,结果处理模块一共有三个阶段,将推荐算法引擎模块中各推荐算法的结果按照一定权重线性组合输出,经过过滤、排名阶段最终输出推荐结果,其中过滤的过程是将推荐结果中,用户曾经看过的电影,或者普遍评分都不高的电影剔除,排名是根据多个推荐算法的结果线性组合的分数排名。