Mapreduce之基于内容的电影推荐(一)
背景
你是不是很想知道腾讯或爱奇艺是如何为用户创建推荐电影?或者淘宝京东如何为用户推荐图书?肯定有某种魔法算法生成的这些推荐系统,那么有那些推荐系统呢?
这里介绍基于内容的推荐系统,基于内容的推荐系统会检查项目(如电影)的属性来为用户作出推荐,例如一个用户如果看了很多动作片,那么系统就会为他推荐这一类电影
原理
在基于内容的推荐系统中,我们得到的内容信息(如邻域和元数据)越多,算法就会变得越复杂,不过推荐也会变得更准确,更合理,如,要实现电影推荐,系统应当有一些元数据,如演员,导演和制片人,在这个例子中,算法仅限于对电影评分。接下来使用关联度算法,对Mapreduce处理好的数据来找出每个电影之间的关联,进而进行推荐。
MapReduce解决方案如下:
- 阶段1:找出各个电影的评分总人数
- 阶段2:对每个电影对A和B,找出同时对A和B评分的人
- 阶段3:找出每两个相关的电影之间的关联,在这个阶段使用三个不同的关联度算法(Pearson,Cosine和Jaccard)一般的,要根据具体数据需求来选择关联度算法,不过这个阶段可以使用任何想要的算法作实验
样例输入
输入数据包括用户ID,电影ID,评分。
即< UserID > < MovieID > < rating >
样例生成程序如下:
package com.deng.MovieRecommend;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class create {
public static void main(String[] args) throws IOException, IOException {
String path="input/movieRecommend.txt";
File file=new File(path);
if(!file.exists()){
file.getParentFile().mkdirs();
}
file.createNewFile();
FileWriter fw=new FileWriter(file,true);
BufferedWriter bw=new BufferedWriter(fw);
for(int i=0;i<5000;i++){
int id=(int)(Math.random()*100)+1;
int movieId=(int)(Math.random()*300);
while(id==movieId) movieId=(int)(Math.random()*300);
bw.write("UserId=User"+id+" Movie=Movie"+movieId+" rating="+(int)(Math.random()*5)+"\n");
}
bw.flush();
bw.close();
fw.close();
}
}
程序创建5000行用户对电影评分的信息