利用Apache Mahout部署个性化图书推荐服务
刘丹
华东师范大学图书馆 上海 200240
通讯作者:刘丹, ORCID: 0000-0001-7085-1925, E-mail:dliu@library.ecnu.edu.cn
摘要

【目的】通过提供个性化图书推荐, 丰富图书资源发现途径, 增进读者对馆藏资源的了解, 促进馆藏借阅, 应对图书外借量下滑问题。【方法】利用Apache Mahout, 通过规范化借阅历史数据, 采用布尔型基于用户的协同过滤推荐算法, 使用对数最大似然相似度计算用户相似性, 生成个性化图书推荐, 并嵌入OPAC读者借阅账户页面。【结果】在OPAC中嵌入个性化图书推荐列表, 基于shell脚本每10天自动更新。对于没有生成推荐的用户呈现上月10本热门图书。【局限】缺乏图书评分, 存在数据稀疏性问题, 未能使用基于评分预测的推荐算法。【结论】系统投入运行后受到读者的关注与好评, 促发了读者借阅行为, 有7.5%的读者点击查看了推荐, 约3.1%的读者借阅了推荐图书。

关键词: 推荐系统; Apache Mahout; 图书推荐
中图分类号:G250.76
Personalized Book Recommender Service Deployment Using Apache Mahout
Liu Dan
East China Normal University Library, Shanghai 200240, China
Abstract

[Objective] Through providing personalized book recommender service, enrich resource discovering methods and promote user awareness, book circulation under the situation of circulation decrease.[Methods] Using Apache Mahout, by normalizing circulation log data, using boolean user-based collaborative filtering recommendation with logarithm similarity algorithm, personalized book recommendations are generated and embedded in OPAC.[Results] Personalized book recommendations are embedded in OPAC, with automatic update every 10 days, and top 10 books are rendered to readers without recommendations.[Limitations] Lack of preference data, available recommenders are limited to boolean user-based recommenders.[Conclusions] The personalized book recommendation service receives attention and good fame. 7.5% readers click and read the recommendations, and about 3.1% borrow the recommended book.

Keyword: Recommender system; Apache Mahout; Book recommendation
1 引 言

华东师范大学图书馆2013年度《馆藏文献利用调查与分析》指出, 自2009年借出量逐年走低, 借出与续借合计在2012年也呈下降趋势, 2013年已低于 2007年[1]。随着数字化阅读技术不断变革与普及, 在强调图书馆作为阅读环境提供者等新理念的冲击下, 传统纸本图书外借量下降已是行业内的普遍情况。如何保持并提升纸本图书借阅量, 并能促进电子资源的利用是亟待探索研究的问题。目前业界较为认同使用推荐手段提升资源利用率, 因此各类在线图书排行、现场主题书展应运而生, 并越来越受到图书馆青睐。伴随着大数据技术的不断升温, 数据挖掘方法与工具逐渐普及, 推荐系统这样具有较高技术壁垒、在商业领域使用频繁的技术易于被图书馆所掌握和利用。

目前对个性化图书推荐已有大量的研究和实践, 主要集中在基于关联规则的推荐和协同过滤推荐。高凤荣等[2]对典型的推荐系统进行介绍, 并阐述其关键技术。王燕等[3]阐述和分析了数据挖掘中的关联规则算法, 提出基于Apriori算法的推荐系统模型。徐嘉莉等[4]提出利用矩阵向量技术和压缩技术对Apriori算法进行改进, 以提高数据资源的挖掘效率。王代琳等[5]提出基于平均差异度的个性化推荐算法, 以解决协同过滤算法中数据稀疏性问题。赵麟[6]设计基于最大频繁模式挖掘算法的书目推荐系统。董坤[7]通过引入读者特征模型, 采用优化的协同过滤算法产生个性化图书推荐。汪英姿[8]提出基于语义手段结合协同过滤技术的混合推荐。张闪闪等[9]提出通过建立自动化评分规则结合图书归类以解决协同过滤算法数据稀疏性问题。王晓耘等[10]将粗糙集引入基于用户聚类的协同过滤中, 以提高推荐质量。罗琳等[11]提出在协同过滤的基础上利用分众分类法构建用户、资源和标签的三元组关系实现图书推荐系统。

推荐应用不仅涉及推荐模型与算法, 而且需要支持大规模数据运算的编程。在有良好的大数据技术、工具支持之前, 此类研究以理论介绍、推荐模型、算法探讨居多, 面向实际服务部署的案例相对较少。上述文献中, 采用协同过滤算法进行推荐的研究基本上都是在小规模实验数据集上进行测试[5, 7, 8, 9, 11]。这是当前图书馆推荐系统研究的普遍状况, 不利于解决推荐评估中的数据拟合问题。算法性能是在大规模真实数据上测试的主要阻碍之一。Apache Mahout的出现为推荐系统的应用与研究提供支持, 是一款非常实用的图书馆个性化推荐系统框架。它高性能的存储设计与算法实现使得在真实数据集上的测试变得容易, 使得图书馆能化解大规模数据环境下面临的个性化图书推荐应用开发挑战, 有利于更多的图书馆部署实际的个性化图书推荐服务。目前图书馆相关研究人员对其关注还不够, 仅奉国和等[12]介绍了Apache Mahout在大规模数据环境下对个性化推荐的支持作用。本文旨在探讨如何利用Apache Mahout提供的高性能存储工具、算法组件, 在大规模数据集(①本馆一年期读者借阅数据, 近似25000× 150000规模的读者-书目矩阵。)上实现高效、稳定的个性化图书推荐服务(②生成整个推荐所用时间平均约为10分钟, 每次生成推荐约23万条。)以及该工具在图书馆普遍面临数据稀疏性环境下的应用。

2 需求及技术思路

利用推荐系统提升销量已被商业领域广泛应用。鉴于纸本图书借阅量下滑的现状, 华东师范大学图书馆已经尝试修订借阅规则、增加可借阅量、延长借阅期限以及推出季度图书排行、现场主题图书会等手段。为了进一步促进纸本借阅, 以及探索促进电子资源利用率的有效手段, 华东师范大学图书馆决定尝试采用推荐系统进行图书推荐的个性化服务。

目前主要的推荐方法有协同过滤推荐、基于内容的推荐、基于知识的推荐以及混合推荐4种类型[13]。其中, Goldberg等[14]于1992年在Tapestry中提出的协同过滤推荐是推荐系统中最成熟、使用最广泛的推荐技术。协同过滤分为基于用户的协同过滤和基于物品的协同过滤。基于用户的协同过滤的基本思想认为, 找到与用户兴趣相似的人, 他们喜欢而用户却没有尝试的物品就值得推荐给用户。基于物品的协同过滤的基本思想认为, 用户未来的喜好蕴藏在其过去的偏好之中, 找到与其过去偏好相似的物品就值得推荐给用户。一般认为高校图书馆环境下更适合采用基于用户的协同过滤算法[15], 这样可以发现馆藏中的长尾。

协同过滤推荐将用户与物品间关系表示为一个二维的用户-物品评分矩阵, 如图1所示。通过计算矩阵中用户间的相似性找出需要推荐用户的N个最近邻, 对N个最近邻评过分而推荐用户未评分的物品进行评分预测, 最终将评分靠前的N个物品推荐给用户, 也称为Top N推荐。

图1 用户评分矩阵

协同过滤推荐的核心是预测用户对待推荐物品的评分, 其公式[16]如下:

(1)

其中, ru, i代表用户u对物品i的评分, 代表用户u对物品的平均评分, U为用户u的最近邻集, 代表U中的一个近邻, 是用户u与近邻 的相似性度量, 为另一近邻 对物品i的评分。

由于华东师范大学图书馆存在数据稀疏性问题, 系统使用无偏好值的协同过滤推荐是最佳策略。针对无偏好值的推荐, 最好的相似性度量是对数似然相似性度量[16]。与欧式距离、余弦相似度相比, 它是一个概率论领域的方法, 较为复杂, 但已经在推荐领域成功地得到应用。

为了实现所选择的推荐算法, 系统需要使用Apache Mahout[17]提供的推荐系统工具库。它是Apache软件基金会旗下的一个独立子项目, 使用Java语言编写, 具有开源许可。作为一个软件库, Apache Mahout主要面向开发人员, 而非终端用户。它以API调用的方式提供服务, 着眼于为机器学习相关的开发提供基础组件支持。Apache Mahout主要组件包括推荐引擎、聚类(Clustering)、分类(Classification)等算法及辅助工具的实现。Apache Mahout能够为开发个性化推荐应用提供基础的、高效的代码库支持, 降低应用开发的难度与风险。

3 系统设计与实现
3.1 系统设计

本图书推荐系统基于华东师范大学图书馆ILS(图书馆集成系统)中的图书外借日志, 利用Apache Mahout库编程进行推荐生成, 通过Z39.50协议匹配图书ISBN号, 通过Web编程将推荐书目嵌入到OPAC读者个人借阅账户页面中, 其流程如图2所示:

图2 应用流程图

(1) 准备偏好数据阶段。在确定合适的Apache Mahout数据模型后, 导出MySQL数据库中原始的外借日志, 利用sed、awk、shell脚本等工具将其转换为数据模型所支持的偏好数据格式。

(2) 推荐生成阶段。利用上一阶段中得到的规范化偏好数据, 选择合适的推荐算法组件, 通过编程生成图书推荐记录。

(3) 推荐记录的图书ISBN匹配阶段。为了不影响推荐呈现的速度, 系统结合书目数据库, 将推荐所需的ISBN等信息一同存入推荐记录。之所以与推荐生成分离, 是为了模块化开发, 便于查错, 同时利用已有的Z39.50 PHP脚本。

(4) 推荐结果呈现阶段。在读者登录OPAC个人借阅账户后, 浏览器中运行的jQuery代码以读者ID为参数发送异步请求, 接收到请求的服务器端程序查询推荐记录数据库, 并以JSON格式返回推荐记录, jQuery代码以图片链接的形式动态呈现推荐图书。

系统实现所使用的数据库平台、编程语言、实用工具依赖于具体开发资源的可获得性和限制。其中, 准备偏好数据、推荐生成以及推荐结果呈现是图书推荐所需的三个一般过程。

3.2 准备偏好数据

偏好数据(Preference Data)是以协同过滤算法为基础的图书推荐系统的基本数据表示形式。由用户ID、物品ID、偏好值组成, 表达了用户与物品之间关系的存在性与喜好程度。偏好数据的存储机制直接影响推荐系统性能。在Apache Mahout中, Preference对象是对偏好数据的基本抽象, DataModel对象实现对输入数据集的封装, 用于算法对象对数据的高效访问, 提供用户计数、偏好值访问等接口。

由于图书馆的ILS中启用读者评分机制较晚, 读者参与度也比较低, 导致< 读者-图书-偏好值> 三元组中, 偏好值匮乏, 存在数据稀疏性问题, 数据模型、推荐算法的可选择范围有限。因而, 系统采用无偏好值的数据表示, 在Apache Mahout中, 此类数据称为布尔型偏好(Boolean Preference), 使用GenericBoolean PrefDataModel表示。

Apache Mahout提供GenericDataModel、FileData Model、JDBCDataModel三种数据模型以支持内存的、文件的、数据库的数据源。华东师范大学图书馆ILS中保留的外借历史记录最早为2006年, 到目前为止, 合计约270万条, 保留在MySQL数据库中。考虑到最大程度保证ILS系统的稳定性和快速响应, 系统也没有实时推荐的需求, 不需要使用JDBCDataModel直接在线计算。显然, FileDataModel是比较自然的选择。通过MySQL客户端脚本将ILS上图书外借日志导出, 编写shell脚本配合sed、awk语言进行基本的数据转换处理, 脚本输出最终的CSV(Comma Seperated Values)文件, 包含读者ID、图书ID(书目级)。shell脚本配合sed、awk的日志(时间跨度为一年)导出主要代码如下:

#保留可利用的上一次抓取日志, 以当前脚本调度时间为准, 求出一年前的今天, 存入变量year_ago, 保留上一次抓取日志中大于该日期的记录, 减轻对ILS的数据读取压力。

/usr/xpg4/bin/awk -F, -v year_ago=$year_ago '{ if ($4 > year_ago) { print $0 } }' data/circ_his.csv > data/circ_his.tmp

#抓取ILS上MySQL中所需时间段的日志, 以脚本调度时间往回计一年, 起始时间为上次抓取日志中可用数据的最后时间。

checkouts=/usr/sfw/bin/mysql -h host -P port -u user -N db< <
QUERY 2> > data/log

SELECT patronNum, bibNum, itemNum, unix_timestamp
(checkOut), checkOut FROM circhistory

WHERE checkOut > '$start_date' AND checkOut < '$today'

ORDER BY checkOut ASC;

QUERY`

#格式化日志, 生成Mahout所需的CSV数据文件, 格式为:
读者ID、图书ID、日期。

echo "$checkouts" | sed -e 's/ /, /g' | sed -e '/^$/d' > >
data/circ_his.csv

生成的偏好数据以CSV格式存储, 如图3所示。由于是布尔型偏好数据, 数据仅包含读者ID、书目ID, 而没有评分。

图3 偏好数据CSV文件

3.3 推荐生成

在获取偏好数据后, 推荐生成主要涉及选择合适的推荐算法, 以获得最为满意的推荐结果。虽然出于数据稀疏性限制, 系统已经确定使用基于无偏好数据的推荐策略。但为了考查基于偏好值的推荐算法, 以读者借阅时间代替读者评分, 系统进行过基于皮尔逊相关系数相似度(Pearson Correlation Similarity)的协同过滤、基于欧氏距离相似度(Euclidean Distance Similarity)的协同过滤以及Slop-One、SVD(奇异值分解)等算法的测试。

以时间代替读者评分是一种在数据稀疏性条件下进行推荐的折中策略。它基于大学生读者阅读受课程学习影响较大的假设, 将读者评分按时间远近进行简单的设定, 如近一学期借阅图书给予5分, 往后递减。此种策略已有研究者进行过尝试[9, 15]。实际测试发现, 并不能提升华东师范大学图书馆推荐系统的查准率。

在使用Apache Mahout内置的推荐评估组件对选择算法进行测试无效后, 为了切实了解Apache Mahout在华东师范大学图书馆书目数据上采用无偏好值协同过滤推荐的效果, 数据集被拆分为两部分, 近一年数据作为测试集, 一年前的所有数据用作推荐生成, 类似于训练集。在此基础上编写程序计算近一年读者所借图书在推荐(依据一年前借阅历史所形成的推荐)中所占的比率, 得出查准率约为3%。相较而言, 所选算法在MovieLens[18]等测试数据上查准率达到20%, 二者相去甚远。但考虑到现有评估方法也可能存在局限[13], 不宜简单根据现有评估断定推荐效果。鉴于测试结果较低, 缺乏指标的区分度, 邻域参数范围设为20, 最终推荐的核心代码如下:

/* * 在数据抓取阶段生成的图书外借历史记录文件circ_his.csv为数据源形成推荐计算的基础数据模型。* /

DataModel model =

new GenericBooleanPrefDataModel(

GenericBooleanPrefDataModel.toDataMap(

new FileDataModel(

new File("data/circ_his.csv"))));

/* * 使用对数似然相似性类LogLikeLihoodSimilarity, 以数据模型对象为参数, 生成读者间相似性度量对象。* /

UserSimilarity similarity = new LogLikelihoodSimilarity(model);

/* * 以数据模型对象、相似性度量对象为基础求出20个最近邻。* /

NearestNUserNeighborhood neighbor =

new NearestNUserNeighborhood(20, similarity, model);

/* * 以数据模型对象、相似性度量对象、20个最近邻对象为参数生成基于用户的布尔偏好型协同过滤推荐器。* /

Recommender recommender =

new GenericBooleanPrefUserBasedRecommender(

model, neighbor, similarity);

/* * 通过迭代数据模型中的读者, 使用推荐器的Recommend方法为读者推荐10本图书。* /

LongPrimitiveIterator iter = model.getUserIDs();

List< RecommendedItem> books = null;

while (iter.hasNext()) {

patron = iter.nextLong();

books = recommender.recommend(patron, 10);

}

3.4 推荐呈现

推荐呈现由一个服务器端脚本与一个客户端脚本构成。服务器端的PHP脚本接受读者ID为参数, 查询SQLite推荐数据库, 将匹配的推荐以JSON格式返回给发起请求的客户端。客户端的JavaScript脚本动态生成HTML图片及链接节点, 动态嵌入到当前的读者账户页面中。最终的推荐呈现效果如图4所示:

图4 推荐呈现效果

4 应用效果

该推荐系统最终部署在华东师范大学图书馆的ILS服务器上, 运行环境为Solaris 10, Java 6, PHP 5, Apache 2, 以OPAC嵌入的方式提供服务。由shell脚本进行调度的整个过程运行平稳, 推荐生成时间一般在10分钟左右。每10天进行一次推荐生成, 能够看到个性化推荐有部分变化, 说明推荐时间的选择对于推荐更新是有效的。

从前期近两个月的运行来看, 推荐系统的上线受到了读者的关注。有读者评论到“ 今天发现有图书推荐。很人性化。点个赞” 。评论表达了读者对图书馆个性化推荐服务的期待。根据约两个月的数据统计, 推荐系统的使用情况如表1所示:

表1 推荐效果统计

在所有的登录读者中, 约7.5%的读者查看了推荐, 约3.1%的读者借阅了推荐的图书。对推荐图书产生了查看行为的读者, 平均查看推荐数为3-4本, 产生了借阅行为的读者借阅量为1-2本。但也有读者借阅了10本图书。

从现有的研究中, 难以找到实际的统计数字进行对比, 因为大多数研究的测试结果都是建立在样本数据集上, 不仅数量少, 也存在数据拟合的问题。但邱均平等[15]研究给出的客观数据也印证了当前在数据稀疏性条件下推荐效率的客观情况: 推送的1 000份调查问卷, 只回收了36份有效问卷, 回收率3.6%。从服务的角度, 推荐系统为读者提供一种新的资源发现途径, 而读者对推荐也产生了兴趣, 并产生借阅行为, 读者的互动也表明推荐系统受到了读者的肯定。至于服务效果的不足, 不仅受由数据稀疏性问题引起的推荐算法适应性不良的影响, 也需要考虑新服务方式的用户接受度因素。只有通过实际的推荐实践才能在系统运行过程中发现和改善这些不足。

5 结 语

利用Apache Mahout, 华东师范大学图书馆在简单的排行推荐基础上提供了个性化图书推荐服务。新的推荐系统上线, 能丰富图书资源发现途径, 增进读者对馆藏的了解、促进馆藏借阅。在推荐服务的开发过程中, 以借阅时间代替评分的策略被用于解决偏好数据缺乏评分的数据稀疏性问题。但遗憾的是, 此种策略未能收到良好的效果。通过测试, 推荐服务采用最近一年的借阅历史为偏好数据, 以满足推荐的新颖性要求。此次实践证明, 利用Apache Mahout, 图书馆可以获得大量现成的算法组件, 在投入较小的情况下对大量既有的推荐算法进行评估测试, 可以快速构建系统原型, 加速图书馆个性化推荐服务部署。同时, 作为一个世界级的、先进而成熟的开源机器学习工具库, Apache Mahout可以解决推荐系统普遍面临的性能瓶颈, 为部署高效实用的个性化推荐服务提供支持。

参考文献
[1] 华东师范大学图书馆. 华东师范大学图书馆馆藏文献利用调查与分析[R/OL]. [2014-12-28]. http: //www. lib. ecnu. edu. cn/about/lib_annual/.
(East China Normal University Library. Investigation and Analysis on Utilization of the Holdings of East China Normal University Library [R/OL]. [2014-12-28]. http://www.lib.ecnu.edu.cn/about/lib_annual/ [本文引用:1]
[2] 高凤荣, 马文峰, 王珊. 数字图书馆个性化信息推荐系统研究[J]. 情报理论与实践, 2003, 26(4): 359-362.
(Gao Fengrong, Ma Wenfeng, Wang Shan. Research on Individual Information Recommendation System in Digital Library[J]. Information Studies: Theory & Application, 2003, 26(4): 359-362. ) [本文引用:1]
[3] 王燕, 温有奎. 基于关联规则的推荐系统在数字图书馆中的应用[J]. 情报科学, 2007, 25(6): 877-880.
(Wang Yan, Wen Youkui. The Applications of Recommendation System Based on Association Rules in the Digital Library[J]. Information Science, 2007, 25(6): 877-880. ) [本文引用:1]
[4] 徐嘉莉, 陈佳. 一种快速的个性化书目推荐方法[J]. 现代图书情报技术, 2010(2): 79-84.
(Xu Jiali, Chen Jia. A Fast Personalized Bibliographic Recommendation Method[J]. New Technology of Library and Information Service, 2010(2): 79-84. ) [本文引用:1]
[5] 王代琳, 刘亚秋, 王真谛. 基于平均差异度的数字图书馆个性化推荐算法研究[J]. 图书情报工作, 2009, 53(11): 119-122.
(Wang Dailin, Liu Yaqiu, Wang Zhendi. Personalized Recommendation Algorithm for Digital Library Based on Average Difference Degree[J]. Library and Information Service, 2009, 53(11): 119-122. ) [本文引用:2]
[6] 赵麟. 基于最大频繁模式挖掘算法进行书目推荐系统的设计与实现[J]. 现代图书情报技术, 2010(5): 23-28.
(Zhao Lin. The Design and Implementation of the Bibliographic Recommendation System Based on Maximal Frequent Patterns Mining Algorithm[J]. New Technology of Library and Information Service, 2010(5): 23-28. ) [本文引用:1]
[7] 董坤. 基于协同过滤算法的高校图书馆图书推荐系统研究[J]. 现代图书情报技术, 2011(11): 44-47.
(Dong Kun. Research of Personalized Book Recommender System of University Library Based on Collaborative Filter[J]. New Technology of Library and Information Service, 2011(11): 44-47. ) [本文引用:2]
[8] 汪英姿. 基于本体的个性化图书推荐方法研究[J]. 现代图书情报技术, 2012(12): 72-78.
(Wang Yingzi. Research on Ontology-based Personalized Recommendation Method for Library Resources[J]. New Technology of Library and Information Service, 2012(12): 72-78. ) [本文引用:2]
[9] 张闪闪, 黄鹏. 高校图书馆图书推荐系统中的稀疏性问题实证探析[J]. 大学图书馆学报, 2014(6): 47-53.
(Zhang Shanshan, Huang Peng. Empirical Study on Sparsity of University Libraries[J]. Journal of Academic Libraries, 2014(6): 47-53. ) [本文引用:3]
[10] 王晓耘, 钱璐, 黄时友. 基于粗糙用户聚类的协同过滤推荐模型[J]. 现代图书情报技术, 2015(1): 45-51.
(Wang Xiaoyun, Qian Lu, Huang Shiyou. Collaborative Filtering Recommendation Model Based on Rough User Clustering[J]. New Technology of Library and Information Service, 2015(1): 45-51. ) [本文引用:1]
[11] 罗琳, 梁桂生, 蔡军. 基于分众分类法的图书馆书目推荐系统[J]. 现代图书情报技术, 2014(4): 14-19.
(Luo Lin, Liang Guisheng, Cai Jun. Book Recommendation System Based on Folksonomy in Library[J]. New Technology of Library and Information Service, 2014(4): 14-19. ) [本文引用:2]
[12] 奉国和, 黄家兴. 基于Hadoop与Mahout的协同过滤图书推荐研究[J]. 图书情报工作, 2013, 57(18): 116-121.
(Feng Guohe, Huang Jiaxing. Research on Collaborative Filtering Book Recommendation Based on Hadoop and Mahout[J]. Library and Information Service, 2013, 57(18): 116-121. ) [本文引用:1]
[13] Jannach D, Zanker M, Felfering A, . 推荐系统[M]. 蒋凡译. 北京: 人民邮电出版社, 2013: 2, 123.
(Jannach D, Zanker M, Felfering A, et al. Recommender Systems [M]. Translated by Jiang Fan. Beijing: The People’s Posts and Telecommunications Press, 2013: 2, 123. ) [本文引用:2]
[14] Goldberg D, Nichols D, Oki B M, et al. Using Collaborative Filtering to Weave an Information Tapestry[J]. Communications of the ACM, 1992, 35(12): 61-70. [本文引用:1]
[15] 邱均平, 张聪. 高校图书馆馆藏资源协同推荐系统研究[J]. 图书情报工作, 2013, 57(22): 132-137.
(Qiu Junping, Zhang Cong. Research on the Collaborative Recommendation System of University Library Resources[J]. Library and Information Service, 2013, 57(22): 132-137. ) [本文引用:3]
[16] Owen S, Anil R, Dunning T, . Mahout实战[M]. 王斌, 韩冀中, 万吉译. 北京: 人民邮电出版社, 2014: 47.
(Owen S, Anil R, Dunning T, et al. Mahout in Action[M]. Translated by Wang Bin, Han Jizhong, Wan Ji. Beijing: The People’s Posts and Telecommunications Press, 2014: 47. ) [本文引用:2]
[17] What is Apache Mahout? [EB/OL]. [2015-06-30]. http://mahout.apache.org/. [本文引用:1]
[18] MovieLens [DB/OL]. [2015-06-30]. http://grouplens.org/datasets/movielens/. [本文引用:1]