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

骑猪看日落 2022-04-17 03:20 762阅读 0赞

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

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

1、添加依赖

  1. <properties>
  2. <mahout.version>0.9</mahout.version>
  3. </properties>
  4. <dependency>
  5. <groupId>org.apache.mahout</groupId>
  6. <artifactId>mahout-core</artifactId>
  7. <version>${mahout.version}</version>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.apache.mahout</groupId>
  11. <artifactId>mahout-integration</artifactId>
  12. <version>${mahout.version}</version>
  13. <exclusions>
  14. <exclusion>
  15. <groupId>org.mortbay.jetty</groupId>
  16. <artifactId>jetty</artifactId>
  17. </exclusion>
  18. <exclusion>
  19. <groupId>org.apache.cassandra</groupId>
  20. <artifactId>cassandra-all</artifactId>
  21. </exclusion>
  22. <exclusion>
  23. <groupId>me.prettyprint</groupId>
  24. <artifactId>hector-core</artifactId>
  25. </exclusion>
  26. </exclusions>
  27. </dependency>

2、基于基础数据较大,作推荐算法的时候可能执行时间过长,所以在做推荐的时候使用了定时器,并且将结果放进redis缓存

  1. @Scheduled(cron = "0 0 */6 * * ?")
  2. public void getRecommend() {
  3. try {
  4. String server = url.substring(url.indexOf("//") + 2, url.lastIndexOf(":"));
  5. String database = url.substring(url.lastIndexOf("/") + 1, url.lastIndexOf("?"));
  6. //权重计算使用数据库中的值,也可以使用文件形式
  7. MysqlDataSource dataSource = new MysqlDataSource();
  8. dataSource.setServerName(server);
  9. dataSource.setUser(user);
  10. dataSource.setPassword(pass);
  11. dataSource.setDatabaseName(database);
  12. DataModel model = new MySQLJDBCDataModel(dataSource, "t_itemcf", "user_id", "question_id", "score", "time");
  13. // 指定用户相似度计算方法,这里采用皮尔森相关度
  14. UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
  15. // 指定用户邻居数量,这里为10
  16. UserNeighborhood neighborhood = new NearestNUserNeighborhood(NEIGHBOORHOODNUM, similarity, model);
  17. // 构建基于用户的推荐系统
  18. Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);
  19. // 得到指定用户的推荐结果,这里是得到用户1的两个推荐
  20. LongPrimitiveIterator iterator=model.getUserIDs();
  21. while(iterator.hasNext()) {
  22. long uid=iterator.nextLong();
  23. List<RecommendedItem> list=recommender.recommend(uid, RECOMMENDNUM);
  24. for(RecommendedItem item:list) {
  25. //删除
  26. jedisCluster.zremrangeByRank("recommend:" + uid, Integer.MIN_VALUE, Integer.MAX_VALUE);
  27. //加入
  28. jedisCluster.zincrby("recommend:" + uid, item.getValue(), item.getItemID()+"");
  29. }
  30. }
  31. } catch (Exception e) {
  32. e.printStackTrace();
  33. }
  34. }

3、直接查询redis即可

发表评论

表情:
评论列表 (有 0 条评论,762人围观)

还没有评论,来说两句吧...

相关阅读

    相关 协同过滤推荐算法

    1.思想简介: 协同过滤,从字面上理解,包括协同和过滤两个操作。所谓协同就是利用群体的行为来做决策(推荐)。对于推荐系统来说,通过用户的持续协同作用,最终给用户的推荐...

    相关 协同过滤推荐算法总结

    推荐算法具有非常多的应用场景和商业价值,因此对推荐算法值得好好研究。推荐算法种类很多,但是目前应用最广泛的应该是协同过滤类别的推荐算法,本文就对协同过滤类别的推荐算法做一个概括