1. 引言
在这篇文章中,我们将展示如何使用 Spring Boot 框架与 协同过滤算法 相结合来构建一个简单的推荐系统。推荐系统广泛应用于电商、电影推荐、社交平台等领域。协同过滤算法通过分析用户行为,找出相似的用户或者物品,从而实现个性化推荐。
2. 环境搭建
在开始编码之前,我们需要先搭建开发环境。
2.1 Spring Boot 环境配置
使用 Spring Initializr 创建一个 Spring Boot 项目。
选择必要的依赖:
Spring Web
,Spring Data JPA
,H2 Database
(用于测试)等。下载并解压项目,然后导入到 IDE 中(如 IntelliJ IDEA 或 Eclipse)。
2.2 安装协同过滤算法的 Java 实现
协同过滤算法可以通过多种方式实现,如基于用户的协同过滤和基于物品的协同过滤。我们可以使用第三方库,如 Apache Mahout 或自己实现一个简单的版本。
3. 协同过滤算法基础
协同过滤可以分为两大类:
基于用户的协同过滤:通过寻找与目标用户兴趣相似的其他用户来推荐物品。
基于物品的协同过滤:通过分析物品之间的相似性来为用户推荐相似的物品。
在我们的例子中,我们将使用 基于用户的协同过滤 算法。
4. 项目结构设计
为了实现推荐系统,我们首先设计数据库模型和项目结构。
4.1 数据库模型设计
我们需要设计以下几个实体类:
User:用户实体,存储用户信息。
Item:物品实体,存储商品或物品信息。
Rating:评分实体,存储用户对物品的评分。
@Entity
public class User {@Idprivate Long id;private String name;// Getters and Setters
}@Entity
public class Item {@Idprivate Long id;private String name;// Getters and Setters
}@Entity
public class Rating {@Idprivate Long id;private Long userId;private Long itemId;private Double rating;// Getters and Setters
}
4.2 Repository 层
我们使用 Spring Data JPA 来操作数据库:
public interface UserRepository extends JpaRepository<User, Long> {
}public interface ItemRepository extends JpaRepository<Item, Long> {
}public interface RatingRepository extends JpaRepository<Rating, Long> {List<Rating> findByUserId(Long userId);List<Rating> findByItemId(Long itemId);
}
5. 实现协同过滤算法
接下来,我们实现协同过滤算法。为了简化,我们仅使用 基于用户的协同过滤。
5.1 相似度计算
我们使用 余弦相似度 来计算用户之间的相似度。
public class CosineSimilarity {public static double calculate(List<Rating> userRatings, List<Rating> otherUserRatings) {Map<Long, Double> userRatingMap = userRatings.stream().collect(Collectors.toMap(Rating::getItemId, Rating::getRating));Map<Long, Double> otherUserRatingMap = otherUserRatings.stream().collect(Collectors.toMap(Rating::getItemId, Rating::getRating));double dotProduct = 0.0;double userMagnitude = 0.0;double otherUserMagnitude = 0.0;for (Long itemId : userRatingMap.keySet()) {if (otherUserRatingMap.containsKey(itemId)) {dotProduct += userRatingMap.get(itemId) * otherUserRatingMap.get(itemId);userMagnitude += Math.pow(userRatingMap.get(itemId), 2);otherUserMagnitude += Math.pow(otherUserRatingMap.get(itemId), 2);}}return dotProduct / (Math.sqrt(userMagnitude) * Math.sqrt(otherUserMagnitude));}
}
5.2 推荐算法实现
基于余弦相似度,我们可以为一个用户推荐与他最相似的用户喜欢的物品。
@Service
public class RecommendationService {@Autowiredprivate RatingRepository ratingRepository;@Autowiredprivate UserRepository userRepository;public List<Item> recommendItems(Long userId) {List<Rating> userRatings = ratingRepository.findByUserId(userId);List<User> allUsers = userRepository.findAll();List<Double> similarities = new ArrayList<>();Map<Long, List<Rating>> userRatingsMap = new HashMap<>();// 计算所有用户与目标用户的相似度for (User user : allUsers) {if (user.getId().equals(userId)) continue;List<Rating> otherUserRatings = ratingRepository.findByUserId(user.getId());double similarity = CosineSimilarity.calculate(userRatings, otherUserRatings);similarities.add(similarity);userRatingsMap.put(user.getId(), otherUserRatings);}// 找到相似度最高的用户Long mostSimilarUserId = similarities.indexOf(Collections.max(similarities));List<Rating> mostSimilarUserRatings = userRatingsMap.get(mostSimilarUserId);// 推荐该用户没有评分的物品Set<Long> recommendedItems = new HashSet<>();for (Rating rating : mostSimilarUserRatings) {if (userRatings.stream().noneMatch(r -> r.getItemId().equals(rating.getItemId()))) {recommendedItems.add(rating.getItemId());}}// 从数据库获取推荐物品List<Item> items = recommendedItems.stream().map(itemId -> itemRepository.findById(itemId).orElse(null)).collect(Collectors.toList());return items;}
}
6. 前端展示
前端部分我们使用 Spring Boot 提供的 RESTful API 来展示推荐的物品。
6.1 Controller 层
@RestController
@RequestMapping("/api/recommendations")
public class RecommendationController {@Autowiredprivate RecommendationService recommendationService;@GetMapping("/{userId}")public List<Item> getRecommendations(@PathVariable Long userId) {return recommendationService.recommendItems(userId);}
}
6.2 前端展示
前端部分可以使用 Thymeleaf 或 React 等技术,通过 API 获取推荐物品数据并展示。
7. 测试与优化
在推荐系统构建完成后,我们需要进行性能优化和测试。
8. 总结
在本文中,我们展示了如何使用 Spring Boot 和 协同过滤算法 构建一个简单的推荐系统。通过使用基于用户的协同过滤和余弦相似度,我们能够为用户推荐个性化的物品。尽管该系统非常简单,但它为开发更复杂的推荐系统提供了一个基础。
你可以进一步优化算法,使用更多的数据源,或者引入更先进的推荐算法,如 矩阵分解 或 深度
推荐全新学习项目
全新基于springboot+vue+vant的前后端分离的微商城项目,包括手机端微商城项目和后台管理系统,整个电商购物流程已经能流畅支持,涵盖商品浏览、搜索、商品评论、商品规格选择、加入购物车、立即购买、下单、订单支付、后台发货、退货等。功能强大,主流技术栈,非常值得学习。
项目包含2个版本:
线上演示:https://www.markerhub.com/vueshop
从文档到视频、接口调试、学习看板等方面,让项目学习更加容易,内容更加沉淀。全套视频教程约44小时,共260期,讲解非常详细细腻。下面详细为大家介绍:
架构与业务
使用主流的技术架构,真正手把手教你从0到1如何搭建项目手脚架、项目架构分析、建表逻辑、业务分析、实现等。
单体版本:springboot 2.7、mybatis plus、rabbitmq、elasticsearch、redis
微服务版本:spring cloud alibaba 2021.0.5.0,nacos、seata、openFeign、sentinel
前端:vue 3.2、element plus、vant ui
更多详情请查看:
手把手教学,从0开发前后端微商城项目,主流Java技术一网打尽!