java使用mahout做协同过滤推荐算法

最近尝试了一下推荐算法,具体业务场景是给用户推荐一些比较热门的资讯:

本次实例采用了userCf算法。(springboot 2.0.4.RELEASE)

1、添加依赖


    0.9



	org.apache.mahout
		mahout-core
		${mahout.version}
	

    org.apache.mahout
	mahout-integration
	${mahout.version}
		
			
				org.mortbay.jetty
				jetty
			
			
				org.apache.cassandra
				cassandra-all
			
		    
				me.prettyprint
				hector-core
			
		

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 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即可

你可能感兴趣的:(java项目级组件)