相关推荐recommended
springboot集成mahout实现简单基于协同过滤算法的文章推荐算法
作者:mmseoamin日期:2024-03-20

文章目录

  • 参考文章
  • 前言
  • 1.建表并且生成一些数据
    • 首先,建立一个用户文章操作表(user_article_operation)
    • 使用case when语句简单统计数据
    • 2. 代码与测试
        • 只需要根据表生成相应实体类(注意要加一个value属性来存储分数)
        • 主要代码如下,其实就两个方法
        • userArticleOperationMapper.getAllUserPreference()方法收集数据mapper文件如下
        • 测试算法
        • 3.核心代码(基于用户分析)

          更新:相关代码放gitee了,sql与测试类在如下位置https://gitee.com/hwp_ing/mahout.git

          springboot集成mahout实现简单基于协同过滤算法的文章推荐算法,在这里插入图片描述,第1张

          参考文章

          1.spring boot项目基于mahout推荐算法实现商品推荐

          2.相关内容在章节5-9

          前言

          这边只是跑了个文章推荐的demo,不过什么电影,商品啥的都一样,没啥区别就是把表当中的文章id改成商品id,操作类型自己修改一下

          mahout基础知识扫盲,大概看一下就行,简单的推荐算法直接套下面核心代码的模板,改改参数就行。

          推荐系统 Mahout入门之简单使用

          推荐系统之推荐算法实战:mahout推荐算法框架

          温馨提醒

          这个mahout包有毒。。。。很多依赖冲突。。。。

          这是我的pom文件,仅仅供参考。。

             
                  
                      com.baomidou
                      mybatis-plus-boot-starter
                      3.5.3
                  
                  
                      com.baomidou
                      mybatis-plus-generator
                      3.5.3
                  
                  
                      org.freemarker
                      freemarker
                      2.3.30
                      test
                  
                  
                      com.alibaba
                      druid
                      1.1.21
                  
                  
              
                  
                      org.apache.mahout
                      mahout-mr
                      0.12.2
                      
                          
                              javax.servlet
                              servlet-api
                          
                          
                              org.slf4j
                              slf4j-api
                          
                          
                              org.slf4j
                              slf4j-jcl
                          
                          
                              org.apache.lucene
                              lucene-core
                          
                          
                              org.apache.lucene
                              lucene-analyzers-common
                          
                          
                              log4j
                              log4j
                          
                          
                              org.slf4j
                              slf4j-log4j12
                          
                          
                              jersey-client
                              com.sun.jersey
                          
                          
                              jersey-core
                              com.sun.jersey
                          
                          
                              jersey-apache-client4
                              com.sun.jersey.contribs
                          
                      
                  
          
          
                  
                      org.springframework.boot
                      spring-boot-starter-web
                  
                  
                      mysql
                      mysql-connector-java
                      8.0.21
                  
                  
                      org.projectlombok
                      lombok
                      true
                  
                  
                      org.springframework.boot
                      spring-boot-starter-test
                      test
                  
              
          

          1.建表并且生成一些数据

          首先,建立一个用户文章操作表(user_article_operation)

          springboot集成mahout实现简单基于协同过滤算法的文章推荐算法,在这里插入图片描述,第2张

          然后生成一些数据,这里使用navicat生成了50条记录(因为只是测试一下算法的准确性因此只生成了3个用户,10篇文章)

          springboot集成mahout实现简单基于协同过滤算法的文章推荐算法,在这里插入图片描述,第3张

          使用case when语句简单统计数据

          使用case when 简单统计一下数据,推测一下用户相关度

          不同操作对应不同分数0点赞(3分)1收藏(3分)2评论(5)分,分组求和

          springboot集成mahout实现简单基于协同过滤算法的文章推荐算法,在这里插入图片描述,第4张

                  SELECT
                      user_id,
                      article_id,
                      SUM(
                              CASE operation_type
                                  WHEN 0 THEN 3
                                  WHEN 1 THEN 3
                                  WHEN 2 THEN 5
                                  else 0 END
                          ) AS "value"
                  FROM
                      user_article_operation
                  GROUP BY user_id,article_id
          				ORDER BY user_id
          

          执行语句如下

          springboot集成mahout实现简单基于协同过滤算法的文章推荐算法,在这里插入图片描述,第5张

          可以看出

          1号用户最喜欢6,9号文章,

          2号用户最喜欢4,5,6号文章

          3号用户最喜欢4,5,6号文章

          发现1,2,3号用户都喜欢6号文章,3个用户具有一定相似性。

          (别问为啥这么规律,问就是我为了好测试修改了下数据,如果你感觉哪里不对劲的话,那你说的都对)(反正应付一下老师够了,这里只是提供一个小demo,读者需注意哈🚗🚗🚗🚗)

          因此如果要给1号用户推荐文章的话,应该先推荐5号,再推荐4号文章。

          2. 代码与测试

          只需要根据表生成相应实体类(注意要加一个value属性来存储分数)

          springboot集成mahout实现简单基于协同过滤算法的文章推荐算法,在这里插入图片描述,第6张

          主要代码如下,其实就两个方法

          springboot集成mahout实现简单基于协同过滤算法的文章推荐算法,![在这里插入图片描述](https://img-blog.csdnimg.cn/e70aea3c224f4c13b17de84f476016e6.png,第7张

          userArticleOperationMapper.getAllUserPreference()方法收集数据mapper文件如下

          springboot集成mahout实现简单基于协同过滤算法的文章推荐算法,在这里插入图片描述,第8张

          测试算法

          输入推荐5个,但是这里只推荐了四个,应该是样本数据量太小的原因,对比了一下之前运行case then语句时做的的简单预测,5号最推荐,然后是4号,控制台打印的结果还是比较符合的。

          (反正应付一下老师够了,这里只是提供一个小demo,读者需注意哈🚗🚗🚗🚗)

          springboot集成mahout实现简单基于协同过滤算法的文章推荐算法,在这里插入图片描述,第9张

          springboot集成mahout实现简单基于协同过滤算法的文章推荐算法,在这里插入图片描述,第10张

          springboot集成mahout实现简单基于协同过滤算法的文章推荐算法,在这里插入图片描述,第11张

          3.核心代码(基于用户分析)

          读者自己建个表,然后简单写个对应实体类,然后添加下面的核心代码就行。如下面的UserArticleOperation就是我建立的实体类,基本改几个参数就行,套模板的。

          public List recommend( Integer userId) throws TasteException {
                  List userList = userArticleOperationMapper.getAllUserPreference();
                  //创建数据模型
                  DataModel dataModel = this.createDataModel(userList);
                  //获取用户相似程度
                  UserSimilarity similarity = new UncenteredCosineSimilarity(dataModel);
                  //获取用户邻居
                  UserNeighborhood userNeighborhood = new NearestNUserNeighborhood(2, similarity, dataModel);
                  //构建推荐器
                  Recommender recommender = new GenericUserBasedRecommender(dataModel, userNeighborhood, similarity);
                  //推荐2个
                  List recommendedItems = recommender.recommend(userId, 5);
                  List itemIds = recommendedItems.stream().map(RecommendedItem::getItemID).collect(Collectors.toList());
                  return itemIds;
              }
              private DataModel createDataModel(List userArticleOperations) {
                  FastByIDMap fastByIdMap = new FastByIDMap<>();
                  Map> map = userArticleOperations.stream().collect(Collectors.groupingBy(UserArticleOperation::getUserId));
                  Collection> list = map.values();
                  for(List userPreferences : list){
                      GenericPreference[] array = new GenericPreference[userPreferences.size()];
                      for(int i = 0; i < userPreferences.size(); i++){
                          UserArticleOperation userPreference = userPreferences.get(i);
                          GenericPreference item = new GenericPreference(userPreference.getUserId(), userPreference.getArticleId(), userPreference.getValue());
                          array[i] = item;
                      }
                      fastByIdMap.put(array[0].getUserID(), new GenericUserPreferenceArray(Arrays.asList(array)));
                  }
                  return new GenericDataModel(fastByIdMap);
              }