更新:相关代码放gitee了,sql与测试类在如下位置https://gitee.com/hwp_ing/mahout.git
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
然后生成一些数据,这里使用navicat生成了50条记录(因为只是测试一下算法的准确性因此只生成了3个用户,10篇文章)
使用case when 简单统计一下数据,推测一下用户相关度
不同操作对应不同分数0点赞(3分)1收藏(3分)2评论(5)分,分组求和
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
执行语句如下
可以看出
1号用户最喜欢6,9号文章,
2号用户最喜欢4,5,6号文章
3号用户最喜欢4,5,6号文章
发现1,2,3号用户都喜欢6号文章,3个用户具有一定相似性。
(别问为啥这么规律,问就是我为了好测试修改了下数据,如果你感觉哪里不对劲的话,那你说的都对)(反正应付一下老师够了,这里只是提供一个小demo,读者需注意哈🚗🚗🚗🚗)
因此如果要给1号用户推荐文章的话,应该先推荐5号,再推荐4号文章。
输入推荐5个,但是这里只推荐了四个,应该是样本数据量太小的原因,对比了一下之前运行case then语句时做的的简单预测,5号最推荐,然后是4号,控制台打印的结果还是比较符合的。
(反正应付一下老师够了,这里只是提供一个小demo,读者需注意哈🚗🚗🚗🚗)
读者自己建个表,然后简单写个对应实体类,然后添加下面的核心代码就行。如下面的UserArticleOperation就是我建立的实体类,基本改几个参数就行,套模板的。
public Listrecommend( 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); }