java使用mahout做协同过滤推荐算法
最近尝试了一下推荐算法,具体业务场景是给用户推荐一些比较热门的资讯:
本次实例采用了userCf算法。(springboot 2.0.4.RELEASE)
1、添加依赖
<properties>
<mahout.version>0.9</mahout.version>
</properties>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-core</artifactId>
<version>${mahout.version}</version>
</dependency>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-integration</artifactId>
<version>${mahout.version}</version>
<exclusions>
<exclusion>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.cassandra</groupId>
<artifactId>cassandra-all</artifactId>
</exclusion>
<exclusion>
<groupId>me.prettyprint</groupId>
<artifactId>hector-core</artifactId>
</exclusion>
</exclusions>
</dependency>
2、基于基础数据较大,作推荐算法的时候可能执行时间过长,所以在做推荐的时候使用了定时器,并且将结果放进redis缓存
@Scheduled(cron = "0 0 */6 * * ?")
public void getRecommend() {
try {
String server = url.substring(url.indexOf("//") + 2, url.lastIndexOf(":"));
String database = url.substring(url.lastIndexOf("/") + 1, url.lastIndexOf("?"));
//权重计算使用数据库中的值,也可以使用文件形式
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setServerName(server);
dataSource.setUser(user);
dataSource.setPassword(pass);
dataSource.setDatabaseName(database);
DataModel model = new MySQLJDBCDataModel(dataSource, "t_itemcf", "user_id", "question_id", "score", "time");
// 指定用户相似度计算方法,这里采用皮尔森相关度
UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
// 指定用户邻居数量,这里为10
UserNeighborhood neighborhood = new NearestNUserNeighborhood(NEIGHBOORHOODNUM, similarity, model);
// 构建基于用户的推荐系统
Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);
// 得到指定用户的推荐结果,这里是得到用户1的两个推荐
LongPrimitiveIterator iterator=model.getUserIDs();
while(iterator.hasNext()) {
long uid=iterator.nextLong();
List<RecommendedItem> list=recommender.recommend(uid, RECOMMENDNUM);
for(RecommendedItem item:list) {
//删除
jedisCluster.zremrangeByRank("recommend:" + uid, Integer.MIN_VALUE, Integer.MAX_VALUE);
//加入
jedisCluster.zincrby("recommend:" + uid, item.getValue(), item.getItemID()+"");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
3、直接查询redis即可
还没有评论,来说两句吧...