张 淼,吴昌雨,刘东旭
(滁州职业技术学院,安徽 滁州 239000)
网络信息技术的高速发展使得书籍摆脱了传统的纸媒方式,电子图书也越来越受到人们的认可。2016年全国共出版图书、期刊、报纸、音像制品和电子出版物512.53亿册[1]。对于大部分用来来说,如何在浩瀚的图书资源中找到自己感兴趣的图书,对自身的检索能力是一个很大的挑战。因此,帮助用户更快地找到感兴趣的图书是当前首要解决的问题。
本文主要完成了基于Mahout的图书推荐系统的设计与实现,通过Mahout框架为用户提供书籍推荐服务,使得传统的“人找书”变为“书推荐给人”。协同过滤算法的使用让用户更快速地找到自己需要的书籍,节省了大量的时间。
协同过滤推荐算法是一种主流的、目前广泛应用在工业界的推荐算法。一般分为基于用户的协同过滤(user-based)和基于项目(item-based)的协同过滤[2]。
基于用户的协同过滤算法,主要考虑的是用户和用户之间的相似度,首先找出与目标用户相似度高的其他用户,也就是邻居。把邻居喜欢的物品推荐给用户。而基于项目的协同过滤是通过寻找物品和物品之间的相似度,向目标用户推荐与他自己喜欢的物品相似度高的其他物品。
Mahout是Apache Software Foundation(ASF)旗下的一个开源项目,提供了一些经典的机器学习算法,帮助研发工作者更方便地进行研发[3]。其中Mahout中的Taste提供了一系列组件让开发者根据自身的需求构建推荐系统。
Taste主要有5个组件构成[4]:Data Model,User Smiliarity和Item Similarity,User Neighborhood和Recommender。
(1)Data Model:用于读取用户的偏好数据。Taste目前提供了3种读取数据源的方式,分别是从数据库、从文件、从内存对用户的偏好信息进行读取。
(2)User Similarity和Item Similarity:相似度是推荐系统的核心部分, 它主要分为用户相似度(User Similarity)和项目相似度(Item Similarity)。User Smilarity用于定义两个用户之间的相似度,Item Similarity用于计算两个项目的相似度。
(3)User Neighbourhood:和(2)中提到的User Smilarity一起使用,定义寻找邻居的方法。
(4)Recommender:Recommender是推荐系统的核心,决定了系统采用何种推荐算法。Recommender是一个接口,它的主要实现类有Generic User Based Recommender和Generic Item Based Recommender。
本系统主要基于Mahout框架为用户提供推荐服务,在开发中采用C/S框架,前端负责用户界面交互,后端负责核心推荐算法。系统架构采用分层设计,以下分别对表示层、推荐算法层以及存储层进行介绍。
(1)表示层:负责与用户进行交互,在本系统中主要负责把用户的请求传递给推荐算法层,经过后台计算后返回推荐结果,最后展示在界面。
(2)推荐算法层:是整个系统的核心,用于处理用户请求并返回计算结果。本系统中使用基于项目的协同过滤推荐,所以当该层收到用户请求时,会首先找到与当前用户喜欢的图书相似度较高的其他图书,把这些图书返回给表示层。
(3)存储层:存储系统中的数据,主要包括用户基本信息数据(性别、年龄),图书数据以及其他数据等。
在1.2节中提到过Taste组件主要由5部分组成,依次对应着推荐结果产生的几个过程。下面介绍实现整个系统中最重要的3步。
推荐系统进行推荐的前提是了解用户过去,根据用户的过去行为预测他的偏好。因此首先要对用户行为进行建模。以图书推荐系统为例,用户的行为主要为浏览、搜索、收藏、借阅,针对不同的行为设置分值,从而得到用户—物品评分矩阵。
对于偏好数据的处理可以有多种方式。Taste提供了Preference接口来封装用户的偏好信息,常用的实现类为Generic Preference,数据格式为<userid,itemid,value >。在1.2节中提到Data Model用于读取用户偏好,其中Generic Data Model支持从内存中读取用户偏好信息,和Generic Preference搭配使用。
本系统采用File Data Model,直接从文件中读取用户偏好信息,文件每行是简单的三元组样式:userID,itemID,preference,分别表示用户ID,图书ID,偏好值,中间用逗号分隔。
相似度计算是用于计算对象之间的相似程度,是涉及推荐系统中重要的一环。相似度计算的越准确,推荐结果的质量也越好。
目前Taste中提供的相似度计算方法,大多为基于向量的计算,即把一个用户对所有商品的喜好或者把所有用户对一个商品的喜好处理为一个向量。通过计算两个向量之间的距离,来推测用户或者商品之间的相似度,距离越近相似度越大。
Taste中相似度算法按照计算对象不同,分为User Similarity和Item Similarity两种。本文使用基于项目的协同过滤推荐,因此采用Item Similairty下的实现类Pearson Correlation Similarity通过皮尔逊相关系数计算图书和图书之间的相似度。
Recommender是推荐引擎最核心的模块,决定采用何种推荐算法进行推荐。没有完美的推荐算法,只有适合的推荐算法。因此,首先要了解每个推荐算法的优缺点和不同的使用场景。基于用户的协同过滤推荐和基于项目的协同过滤推荐的主要区别如下[5]。
(1)基于用户的协同过滤:首先找到和当前用户有相同兴趣爱好的用户,即邻居。把邻居喜欢的商品推荐给当前用户。因此,该算法在计算用户相似度这一环节会有大量计算,适合于用户较少的、实时性要求不高的场景。
(2)基于项目的协同过滤:推荐和用户之前喜欢的物品类似的物品,比如用户之前产生过借阅历史书A的行为,系统就会给用户推荐历史书B。所以该种推荐算法在计算物品相似度这一环节会有大量计算,适合于物品数量明显小于用户数的场合,比如音乐、图书、电子商务的网站。
通过以上分析,我们知道对于图书推荐来说,应该选择基于项目的推荐算法。
通过以上几个环节,我们即构建出一个推荐系统。本系统中使用File Data Model存储用户偏好评分,调用Pearson Correlation Similarity计算书本之间的相似度,使用基于项目的推荐算法Generic Item Based Recommende产生推荐结果,最后把结果传递给表现层。
本文设计实现了一个基于Mahout的图书推荐系统系统,系统通过基于项目的协同过滤的推荐算法进行推荐。系统采用分层设计,易于开发和维护,稳定性强,有利于对用户兴趣度的后续数据挖掘研究。关于推荐系统中的冷启动问题以及时间因素对于推荐结果的影响是本文还没有完成的,冷启动和时间因素是下一步主要解决的问题。