本文来源于我个人博客www.chenbiaolong.com
概要
本文主要根据mahout in action第六章分析维基百科链接数据的例子编写。大部分内容是直接翻译的mahout in action,不过不是逐字翻译,加入了一些个人理解。关于本文的前提背景可以参考其他博主翻译的文章:
Mahout in action 中文版-6.分布式推荐计算-6.1
Mahout in action 中文版-6.分布式推荐计算-6.2
6.3.2 使用MapReduce:生成用户向量
在这个例子中,我们主要目的是利用item-base
的推荐算法实现维基百科网页的推荐。基础理论就是:如果网页A和网页B同时被多个网页同时引用,那么我们就可以推测网页A和网页B的内容相近。当一个用户看了网页A时,我们可以考虑将网页B推荐给它。计算的输入文件是维基百科的链接数据文件,这个文件的每一行数据并不是按照userId
,itemId
,preference
格式排列的,而是按照userID:itemID1 itemID2 itemID3 ...
格式排列。这个格式代表的意义是ID为userID
的网页有指向ID为itemID1
,itemID2...
网页的超链接。可以在这里获得所需要的维基百科链接数据文件。将这个文件传送到HDFS文件系统,以便Hadoop集群使用该文件。
为了实现网页推荐功能,我们需要2次的MapReduce操作。
第一次的MapReduce操作将生成用户向量:
- 在MapReduce框架中,输入的文件将会被看成(Long,String)的键值对,Key是Long类型,它表示值在文件中的位置。String是该行具体的数据内容。比如
239/98955:590 22 9059
,239
表示数据行位于的文件位置,95955:590 22
是该行的内容 - 每一行将会被一个map函数解析为一个
user ID
和若干个item ID
。这个map函数将会生成新的key/value对:一个user ID
关联一个item ID
,比如98955/590
- 框架收集所有的被
user ID
关联的item ID
- reduce函数输出
user ID
和与该用户对各个item的喜好向量。用户喜好向量只能为0或者1(因为链接只有有和没有2种情况)。比如95955/[590:1.0,22:1.0,9059:1.0]
表示网页95955
有链接到590
,22
,9059
的超链接。需要注意的是这里userID