Mahout构建图书推荐系统

本文介绍了如何使用Mahout构建图书推荐系统,基于Amazon数据,涵盖了项目背景、需求分析、数据说明、算法模型(如基于物品的协同过滤)以及程序开发流程。通过算法评估,选择了表现较好的itemEuclideanNoPref算法,并展示了推荐结果的分析过程。

Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa,新增加的项目包括,YARN, Hcatalog, Oozie, Cassandra, Hama, Whirr, Flume, Bigtop, Crunch, Hue等。

从2011年开始,中国进入大数据风起云涌的时代,以Hadoop为代表的家族软件,占据了大数据处理的广阔地盘。开源界及厂商,所有数据软件,无一不向Hadoop靠拢。Hadoop也从小众的高富帅领域,变成了大数据开发的标准。在Hadoop原有技术基础之上,出现了Hadoop家族产品,通过“大数据”概念不断创新,推出科技进步。

作为IT界的开发人员,我们也要跟上节奏,抓住机遇,跟着Hadoop一起雄起!

关于作者:

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/hadoop-mahout-recommend-book/

mahout-recommendation-book

前言

本文是Mahout实现推荐系统的又一案例,用Mahout构建图书推荐系统。与之前的两篇文章,思路上面类似,侧重点在于图书的属性如何利用。本文的数据在自于Amazon网站,由爬虫抓取获得。

目录

  1. 项目背景
  2. 需求分析
  3. 数据说明
  4. 算法模型
  5. 程序开发

1. 项目背景

Amazon是最早的电子商务网站之一,以网上图书起家,最后发展成为音像,电子消费品,游戏,生活用品等的综合性电子商务平台。Amazon的推荐系统,是互联网上最早的商品推荐系统,它为Amazon带来了至少30%的流量,和可观的销售利润。

如今推荐系统已经成为电子商务网站的标配,如果还没有推荐系统都不好意思,说自己是做电商的。

2. 需求分析

推荐系统如此重要,我们应该如果理解?

打开Amazon的Mahout In Action图书页面:
http://www.amazon.com/Mahout-Action-Sean-Owen/dp/1935182684/ref=pd_sim_b_1?ie=UTF8&refRID=0H4H2NSSR8F34R76E2TP

网页上的元素:

  • 广告位:广告商投放广告的位置,网站可以靠网络广告赚钱,一般是网页最好的位置。
  • 平均分:用户对图书的打分
  • 关联规则:通过关联规则,推荐位
  • 协同过滤:通过基于物品的协同过滤算法的,推荐位
  • 图书属性:包括页数,出版社,ISBN,语言等
  • 作者介绍:有关作者的介绍,和作者的其他著作
  • 用户评分:用户评分行为
  • 用户评论:用户评论的内容

amazon-book

在网页上,其他的推荐位:

amazon-book-2

结合上面2张截图,我们不难发现,推荐对于Amazon的重要性。除了最明显的广告位给了能直接带来利润的广告商,网页中有4处推荐位,分别从不同的维度,用不同的推荐算法,猜用户喜欢的商品。

3. 数据说明

2个数据文件:

  • rating.csv :用户评分行为数据
  • users.csv :用户属性数据

1). book-ratings.csv

  • 3列数据:用户ID,图书ID, 用户对图书的评分
  • 记录数: 4000次的图书评分
  • 用户数: 200个
  • 图书数: 1000个
  • 评分:1-10

数据示例


1,565,3
1,807,2
1,201,1
1,557,9
1,987,10
1,59,5
1,305,6
1,153,3
1,139,7
1,875,5
1,722,10
2,977,4
2,806,3
2,654,8
2,21,8
2,662,5
2,437,6
2,576,3
2,141,8
2,311,4
2,101,3
2,540,9
2,87,3
2,65,8
2,501,6
2,710,5
2,331,9
2,542,4
2,757,9
2,590,7

2). users.csv

  • 3列数据:用户ID,用户性别,用户年龄
  • 用户数: 200个
  • 用户性别: M为男性,F为女性
  • 用户年龄: 11-80岁之间

数据示例


1,M,40
2,M,27
3,M,41
4,F,43
5,F,16
6,M,36
7,F,36
8,F,46
9,M,50
10,M,21
11,F,11
12,M,42
13,F,40
14,F,28
15,M,25
16,M,68
17,M,53
18,F,69
19,F,48
20,F,56
21,F,36

4. 算法模型

本文主要介绍Mahout的基于物品的协同过滤模型,其他的算法模型将不再这里解释。

针对上面的数据,我将用7种算法组合进行测试:有关Mahout算法组合的详细解释,请参考文章:从源代码剖析Mahout推荐引擎

7种算法组合

  • userCF1: EuclideanSimilarity+ NearestNUserNeighborhood+ GenericUserBasedRecommender
  • userCF2: LogLikelihoodSimilarity+ NearestNUserNeighborhood+ GenericUserBasedRecommender
  • userCF3: EuclideanSimilarity+ NearestNUserNeighborhood+ GenericBooleanPrefUserBasedRecommender
  • itemCF1: EuclideanSimilarity + GenericItemBasedRecommender
  • itemCF2: LogLikelihoodSimilarity + GenericItemBasedRecommender
  • itemCF3: EuclideanSimilarity + GenericBooleanPrefItemBasedRecommende
### 系统设计 #### 功能模块设计 - **用户模块**:涵盖用户的注册、登录功能,用户能够查看并修改个人信息,比如昵称、头像、联系方式等。 - **图书信息模块**:负责存储和展示图书的详细信息,像书名、作者、出版社、出版日期、简介等,同时支持图书分类管理。 - **推荐模块**:这是核心模块,借助 Mahout 提供的推荐算法,依据用户的历史行为(如借阅记录、评分记录等)生成个性化的图书推荐列表。 - **后台管理模块**:管理员可在此进行用户账号的管理(新增、删除、修改),图书信息的维护(添加、删除、修改),以及系统的配置管理。 #### 系统架构设计 - **表现层**:采用 Spring Boot 构建 Web 服务,负责接收用户的请求并返回相应的页面或数据。可以使用 Thymeleaf 等模板引擎来渲染页面。 - **业务逻辑层**:处理业务逻辑,调用 Mahout 的推荐算法进行图书推荐,同时数据访问层进行交互。 - **数据访问层**:负责数据库进行交互,实现数据的增删改查操作。可以使用 Spring Data JPA 来简化数据库操作。 - **数据存储层**:使用关系型数据库(如 MySQL)存储用户信息、图书信息、借阅记录等数据。 ### 系统实现 #### 环境搭建 首先,创建一个 Spring Boot 项目,可以使用 Spring Initializr 来快速生成项目骨架。在 `pom.xml` 中添加 Mahout 相关的依赖: ```xml <dependency> <groupId>org.apache.mahout</groupId> <artifactId>mahout-core</artifactId> <version>0.13.0</version> </dependency> <dependency> <groupId>org.apache.mahout</groupId> <artifactId>mahout-integration</artifactId> <version>0.13.0</version> </dependency> ``` #### 数据准备 创建用户信息表、图书信息表、借阅记录表等数据库表,并插入测试数据。例如,借阅记录表可以包含用户 ID、图书 ID、借阅时间等字段。 #### 推荐算法实现 以下是一个简单的基于 Mahout 的协同过滤推荐算法示例: ```java import org.apache.mahout.cf.taste.common.TasteException; import org.apache.mahout.cf.taste.impl.model.file.FileDataModel; import org.apache.mahout.cf.taste.impl.neighborhood.ThresholdUserNeighborhood; import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender; import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity; import org.apache.mahout.cf.taste.model.DataModel; import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood; import org.apache.mahout.cf.taste.recommender.RecommendedItem; import org.apache.mahout.cf.taste.recommender.Recommender; import org.apache.mahout.cf.taste.similarity.UserSimilarity; import java.io.File; import java.io.IOException; import java.util.List; public class BookRecommender { public static void main(String[] args) throws IOException, TasteException { // 加载数据模型 DataModel model = new FileDataModel(new File("data.csv")); // 计算用户相似度 UserSimilarity similarity = new PearsonCorrelationSimilarity(model); // 定义用户邻居 UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.1, similarity, model); // 创建推荐器 Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity); // 为用户 1 推荐 5 本图书 List<RecommendedItem> recommendations = recommender.recommend(1, 5); for (RecommendedItem recommendation : recommendations) { System.out.println(recommendation); } } } ``` #### Spring Boot 集成 将上述推荐算法封装成一个服务类,在 Spring Boot 项目中调用该服务类来实现图书推荐功能。例如: ```java import org.springframework.stereotype.Service; import java.io.IOException; import java.util.List; @Service public class BookRecommendationService { public List<RecommendedItem> recommendBooks(long userId, int numRecommendations) throws IOException, TasteException { // 实现推荐逻辑 // ... return null; } } ``` ### 系统开发 #### 前端开发 可以使用 HTML、CSS、JavaScript 等技术开发前端页面, Spring Boot 后端进行数据交互。例如,使用 jQuery 或 Vue.js 来实现页面的动态效果。 #### 测试部署 对系统进行单元测试和集成测试,确保系统的稳定性和正确性。可以使用 JUnit 和 Mockito 等测试框架进行测试。部署时,可以将系统部署到服务器上,如 Tomcat 或 Jetty。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值