欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springboot旅游推荐系统 算法解析篇

程序员文章站 2024-01-15 21:44:10
...

介绍

最近做了一个关于旅游方面的项目,使用了比较流行的推荐算法,特地在此跟大家分享一下算法的实现过程。

项目简介

采用前后端分离架构。

RESTful API风格接口化、Json形式数据传输。

前端页面进行了升级,引用了一些基本的组件,如dataTables.js、bootstrap.js、bootbox.js。

前端没有采用主流框架如Vue、React等,使用基本的HTML+CSS+JQ也减轻了上手难度。

引入皮尔逊线性相似度推荐算法的Java实现,应用于项目的“景点推荐”栏目。

项目架构

采用前后端分离,Jquery + SpringBoot2.0

后端语言Java

ORM使用SpringDataJPA

数据库使用MySql5.7+Mongodb3

缓存Redis

部署Nginx+Jar

算法解析

皮尔逊相关系数的相似度算法(Pearson)

该算法在本系统中实现了基于景点分数近似度的推荐功能,以下给出数据获取方法代码,具体算法实现请查看CFUtils.cosineSimilarity()方法。

public List<Spots> findRecommendList(String id) {
        //系统中我将景点抽象成了产品,这样便于扩展,如酒店、旅行团均可看作产品评分,统一记录在系统的分数表中
        //如果是查询景点推荐列表,则根据入参景点id查询景点
        List<Score> productScoreList = scoreDao.findByProductId(id);
        //因为相似度比对需要两份数据,首先得到自己查询的景点的分数集合
        double[] ownProductScoreList = new double[productScoreList.size()];
        for (int i = 0; i < productScoreList.size(); i++) {
            ownProductScoreList[i] = Double.parseDouble(productScoreList.get(i).getGrade());
        }
        //然后得到分数表中所有景点的分数集合
        List<Score> productCountInScoreList = scoreDao.findAllGroupByProductId();
        HashMap<String,double[]> ss = new HashMap<String,double[]>();
        //循环所有景点
        for (int i = 0; i < productCountInScoreList.size(); i++) {
            //得到该产品的所有分数
            List<Score> bb = scoreDao.findByProductId(productCountInScoreList.get(i).getProductId());
            double[] otherProductScoreList = new double[bb.size()];
            //循环该产品的所有分数
            for (int j = 0; j < bb.size(); j++) {
                otherProductScoreList[j] = Double.parseDouble(bb.get(j).getGrade());
            }
            //将产品作为key,分数集合作为value存入map
            ss.put(productCountInScoreList.get(i).getProductId(),otherProductScoreList);
        }
        List<Spots> resSpotsList = new ArrayList<>();
        //循环Map依次比对其线性相似度
        ss.forEach((String k, double[] v)->{
            //得到相似度值
            double n = CFUtils.cosineSimilarity(ownProductScoreList,v);
            log.info("id:{},线性相似度:{}",k,n);
            //判断相似度值是否符合自己设定的阈值
            if(n > pearsonCorrelation) {
                //符合相似阈值,放入推荐列表
                resSpotsList.add(spotsDao.findById(k));
            }
        });
        return resSpotsList;
    }

项目实际运行效果

springboot旅游推荐系统 算法解析篇
springboot旅游推荐系统 算法解析篇
springboot旅游推荐系统 算法解析篇
springboot旅游推荐系统 算法解析篇
springboot旅游推荐系统 算法解析篇

运行视频

springboot吊炸天旅游推荐系统 旅游管理系统 旅游网站