*总第320期2016年第6期计算机与数字工程Computer&DigitalEngineeringVol.44No.61057基于Hadoop的图书推荐系统研究与设计南磊1,2(1.江苏省信息中心南京210013)(2.计算机软件新技术国家重点实验室(南京大学)南京210023)摘要经过近些年的发展,图书市场在种类规模和总体数量等方面有了长足的进步。但是同时也带来了图书过多,使得读者难以选择合适图书的困难。常规的明细分类使得读者可以针对每一种类型的书进行选择,但是其每个分类下依然有成千上万中书籍。论文完成的是一种基于Apriori算法创建关联规则的图书推荐在Hadoop上的实现。利用在豆瓣读书上获取的图书评论数据,使用Hadoop生成图书的K-频繁集,并计算相关的图书推荐置信度。论文实现的算法能够高效地为读者提供推荐服务。关键词MapReduce;并行计算;关联规则;图书推荐;Hadoop中图分类号TP311DOI:10.3969/j.issn.1672-9722.2016.06.016ResearchandDesignofHadoop-BasedBookRecommendationSystemNANLei1,2(1.JiangsuInformationCenter,Nanjing210013)(2.StateKeyLaboratoryforNovelSoftwareTechnology(NanjingUniversity),Nanjing210023)AbstractAfteryearsofdevelopment,thebookmarketinthetypeofscaleandtheoverallnumberofsuchareashavemadeconsiderableprogress.Butatthesametime,itbringstoomanybooks,whichmakesitdifficultforreaderstochoosetherightbooks.Thegeneralclassificationallowsthereadertochoosefromeachtypeofbook,buttherearestillthousandsofbooksundereachcategory.Inthispaper,akindofbookrecommendationbasedontheApriorialgorithmtocreatetheassoci-ationrulesisrealizedinHadoop.Usingthebookreviewdataobtainedfromthebookreview,HadoopisusedtogeneratetheK-frequentsetsofbooks,andtherelevantbooksrecommendedconfidenceiscalculated.Thealgorithmcanefficientlyprovidetherecommendationserviceforreaders.KeyWordsMapReduce,concurrentcomputation,associationrules,bookrecommendation,HadoopClassNumberTP3111引言近几年,由于多终端接入网络的便利性,越来越多的读者开始利用因特网来记录自己对各种事务的评价,这就形成了针对不同商品的庞大的评论数据集。其中图书的种类繁多,内容相对于小商品、电影、音乐等需要比较长的时间才可以被读者体会,利用其他读者对不同书籍的评价和感兴趣程度为其他读者提供阅读推荐成为推广文化和扩大书籍销售的一种重要手段。传统上要实现这样的推荐系统可以采用Apriori算法[2]。这个算法基于关联规则,挖掘出数据集中有较大联系的数据项。并以此作为依据给读者推荐其可能感兴趣的书籍。但Apriori算法存在一个问题,就是它需要不断地去扫描整个数据库,效率很低。在面对一些访问量较大的网站时,客户的数量和其留下的有用信息都是以百万的数量级来表示的,在面对这种海量数据时Apriori算法在单机上的运行比较慢,并且可能超出了普通主机、大型机的性能限制。基于以上想法,我们采用了基于MapReduce的方法[1],用并行优化后的算法来进行处理,期望以一种可以接*收稿日期:2015年12月5日,修回日期:2016年1月26日基金项目:国家自然科学基金面上项目(编号:61272418)资助。作者简介:南磊,男,博士研究生,助理研究员,研究方向:大数据、无线网络、软件工程等。1058南磊:基于Hadoop的图书推荐系统研究与设计第44卷受的成本快速地实现Apriori算法在图书推荐上的应用。2相关技术2.1网络爬虫网络爬虫是捜索引擎抓取系统的重要组成部分。爬虫的主要目的是将互联网上的网页下载到本地形成一个或联网内容的镜像备份[7]。2.1.1网络爬虫的基本结构及工作流程一个通用的网络爬虫的框架如图1所示。2.2数据挖掘相关算法2.2.1关联规则关联规则是用来描述事物之间的联系,是用来挖掘事物之间的相关性。挖掘关联规则的核心是通过统计数据项获得频繁项集,现有的算法主要有Apriori、PARTITION、FP2growth及抽样算法等。设I={i1i2,…im}是项的集合,设任务相关的数据D是数据库事务的集合,其中每个事务T是项的集合,使得A包含于I。每一个事务有一个标志符,称作TID,设A是一个项集,事务T包含A,关联规则是形如A→B的蕴涵式,并且A∩B=。图1网络爬虫基本原理图网络爬虫的基本工作流程如下:1)首先选取一部分精心挑选的种子URL;2)将这些URL放入待抓取URL队列;3)从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的IP,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL队列;4)分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环。2.1.2抓取策略在爬虫系统中,待抓取URL队列是很重要的一部分。待抓取URL队列中的URL以什么样的顺序排列也是一个很重要的问题,因为这涉及到先抓取那个页面,后抓取哪个页面。而决定这些URL排列顺序的方法,叫做抓取策略。下面是几种常见的抓取策略:1)深度优先遍历策略;2)宽度优先遍历策略;3)反向链接数策略;4)PartialPageRank策略;5)OPIC策略策略;6)大站优先策略。定义1:可信度/置信度(Confidence)。可信度即是“值得信赖性”。设A,B是项集,对于事务集D,A∈D,B∈D,A∩B=,A→B的可信度定义为:可信度(A→B)=包含A和B的元组数/包含A的元组数。定义2:支持度(Support)。支持度(A→B)=包含A和B的元组数/元组总数。支持度描述了A和B这两个项集在所有事务中同时出现的概率。定义3:强关联规则。设min_sup是最小支持度阈值;min_conf是最小置信度阈值。如果事务集合T中的关联规则A→B同时满足Support(A→B)>=min_sup,Confidence(A→B)>=min_conf,则A→B称为T中的强关联规则。而关联规则的挖掘就是在事务集合中挖掘强关联规则。2.2.2Apriori算法[1]Apriori算法是R.Agrawal和R.Srikant在1994年提出的基本关联规则挖掘算法。该算法的核心思想是基于频集理论的一种递推方法,目的是从数据库中挖掘出那些支持度和信任度都不低于给定的最小支持度阈值和最小信任度阈值的关联规则。算法通过迭代的方法反复扫描数据库来发现所有的频繁项目集。通过频繁项集的性质知道,只有那些确认是频繁项的候选集所组成的超集才可能是频繁项集。故只用频繁项集生成下一趟扫描的候选集,即Li-1生成Ci(其中:L为频繁项集的集合,C为候选项集的集合i为当前扫描数据库的次数),在每次扫描数据库时只考虑具有同数目数据项的集合。Apriori算法可以生成相对较少的候选数据项集,候选数据项集不必再反复地根据数据库中的记录产生,而是在寻找k频繁数据项集的过程中由前一次循环产生的k-1频繁数据项集一次产生。算法的描述如下所示。[5][6~8]2016年第6期计算机与数字工程1059k=0;//k表示扫描的次数L=;C1=I;//初始把所有的单个项目作为候选集Repeatk=k+1;Lk=;ForeachIi∈CkdoCi=0;//每个项目集的初始计数设为0Foreachtj∈DdoForeachIi∈CkdoIfIi∈tjthenCi=Ci+1;ForeachIi∈CkdoIfCi>=(s×|D|)then//|D|为数据库中事务项的总数Lk=Lk∪Ii;L=L∪Lk;Ck+1=Apriori-Gen(Lk);UntilCk+1=2.3并行计算相关技术2.3.1MapReduceMapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念“Map(映射)”和“Reduce(化简)”和它们的主要思想都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(化简)函数,用来保证所有映射的键值对中的每一个共享相同的键组。2.3.2HadoopHadoop是一个分布式基础架构,可以在不了解分布式底层信息的情况下,开发分布式或秉性应用程序,充分利用集群的威力高速运算和存储,它是云计算的主要架构之一。Hadoop具有以下一些特点:·扩容能力:能可靠地存储和处理PB级别数据;·成本低:可以通过普通微机组成的集群来分发以及处理数据。这些服务器群总计可达数千个节点;·高效率:通过分发数据,Hadoop可以并行地处理数据,这使得处理非常的快速;·可靠性:Hadoop能自动地维护数据的多份复制,并且在任务失败后能自动地重新部署计算任务。Hadoop是GoogleMapReduce算法的开源实现,MapReduce的执行流程主要包括Map和Re-duce两步。一个任务启动后,会在集群上按各个节点的能力配置产生相应个数的Map进程。每个Map进程处理一个具有key-value特性的数据分块,产生一组key-value对形式的结果。当一个节点上的某个Map进程执行结束后,集群的Hadoop架构会在这个节点上启动一个新的Map进程处理下一个分块。而Reduce进程对每个Map进程产生的key-value对进行合并,完成计算。3总体设计通过以下几个步骤实现图书推荐系统:1)网络源数据获取;2)对源数据进行抽取和清洗,以达到实验算法的需求;3)Apriori算法在Hadoop上的实现;4)最终界面的实现以及相关测试。其中数据来源有两个部分:1)图书列表由图书馆网站获得;2)以图书馆图书为基础,获取每一本图书在豆瓣读书(book.douban.com)上的用户评论。3.1设计思路基于MapReduce的Apriori并行策略,其候选项集的支持数统计类似于单词计数过程,因此在海量数据且支持度较低时,算法产生了大量的候选项集,从而产生了大量〈itemset,1〉的〈键,值〉对,增加了MapReduce系统的负担。比较单词计数与候选项集的支持数统计不难看出,单词计数要统计的单词是未知,因此,单词计数思想较适合找出1-频繁项集。然而,候选项集的支持数统计要统计的候选项集是已知的,它是由频繁项集通过自身的连接而生成的。因此,为提高候选项集支持数统计的效率,大量减少键/值对的产生,将Apriori数据分割的分组思想应用在候选项集的支持数统计阶段,实现候选项集支持数的分组统计,较大幅度地提高了算法的运行效率。实验拟采用的最基本的MapRe-duce并行的Apriori分组统计算法思路为:采用类似单词计数的过程并行扫描数据库