旅游推荐平台|酒店推荐平台|基于协同过滤算法实现旅游酒店推荐系统

简介: 旅游推荐平台|酒店推荐平台|基于协同过滤算法实现旅游酒店推荐系统

项目编号:BS-XX-058

一,项目简介

     本项目基于SSM框架开发而成,主要实现旅游网站的信息化管理系统,系统分为前端网站和后台管理部分,前端用户注册登陆后可以在网站上浏览旅游景点,查看旅游酒店,在线预定酒店,查看旅游资讯,发表旅游攻略并参与讨论,全文检索功能等。后台管理用户登陆系统后可以实现相关模块的管理功能:主要包含用户管理,旅游景点管理,旅游资讯管理,旅游酒店管理,预定订单管理,旅游攻略管理等模块。

     本项目基于协同过滤的aprio推荐算法来对旅游酒店信息进行相应的推荐操作,同时实现了旅游景点管理、酒店管理、旅游攻略管理、旅游资讯管理、在线收藏、点赞、评论、投诉建议,实现了在线下单进行旅游酒店的预定操作,并可以进行全文检索查询等,功能强大,内容丰富,页面简洁。

       在本项目中使用协同过滤算法来对酒店信息进行相应的推荐,可以根据自己需要改成旅游推荐或商城推荐均可。算法的核心思路,获得当前所有注册的会员用户,以及所有用户对酒店浏览和互动的操作数据后,比对用户的相似性,生成相关的数据集,然后使用协同过滤核心算法将运算的结果得出后在前端展示。核心算法展示如下,以供大家参考使用 :

/**
   * 
   * @param usersize 用户数量
   * @param userdata 用户记录
   * @param recommendUser 推荐的用户
   * @return
   */
  public static String xietongjob(int usersize,String[] userdata,String recommendUser){
    /**
     * 输入用户-->物品条目  一个用户对应多个物品
     * 用户ID 物品ID集合
     *   A    a b d
     *   B    a c
     *   C    b e
     *   D    c d e
     */
    int N = usersize;//用户数量
    int[][] sparseMatrix = new int[N][N];//建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】
    Map<String, Integer> userItemLength = new HashMap();//存储每一个用户对应的不同物品总数  eg: A 3
    Map<String, Set<String>> itemUserCollection = new HashMap();//建立物品到用户的倒排表 eg: a A B
    Set<String> items = new HashSet();//辅助存储物品集合
    Map<String, Integer> userID = new HashMap();//辅助存储每一个用户的用户ID映射
    Map<Integer, String> idUser = new HashMap();//辅助存储每一个ID对应的用户映射
    System.out.println("Input user--items maping infermation:<eg:A a b d>");
    for(int i = 0; i < N ; i++){//依次处理N个用户 输入数据  以空格间隔
      String[] user_item = userdata[i].split("@");
      int length = user_item.length;
      userItemLength.put(user_item[0], length-1);//eg: A 3
      userID.put(user_item[0], i);//用户ID与稀疏矩阵建立对应关系
      idUser.put(i, user_item[0]);
      //建立物品--用户倒排表
      for(int j = 1; j < length; j ++){
        if(items.contains(user_item[j])){//如果已经包含对应的物品--用户映射,直接添加对应的用户
          itemUserCollection.get(user_item[j]).add(user_item[0]);
        }else{//否则创建对应物品--用户集合映射
          items.add(user_item[j]);
          itemUserCollection.put(user_item[j], new HashSet<String>());//创建物品--用户倒排关系
          itemUserCollection.get(user_item[j]).add(user_item[0]);
        }
      }
    }
    System.out.println(itemUserCollection.toString());
    //计算相似度矩阵【稀疏】
    Set<Entry<String, Set<String>>> entrySet = itemUserCollection.entrySet();
    Iterator<Entry<String, Set<String>>> iterator = entrySet.iterator();
    while(iterator.hasNext()){
      Set<String> commonUsers = iterator.next().getValue();
      for (String user_u : commonUsers) {
        for (String user_v : commonUsers) {
          if(user_u.equals(user_v)){
            continue;
          }
          sparseMatrix[userID.get(user_u)][userID.get(user_v)] += 1;//计算用户u与用户v都有正反馈的物品总数
        }
      }
    }
    System.out.println(userItemLength.toString());
    System.out.println("==============Input the user for recommendation:<eg:A>");
    System.out.println("==userID=="+userID);
    System.out.println("========userID.get(recommendUser)=========="+userID.get(recommendUser));
    System.out.println("items==================="+items);
    //计算用户之间的相似度【余弦相似性】
    int recommendUserId = userID.get(recommendUser);
    for (int j = 0;j < sparseMatrix.length; j++) {
        if(j != recommendUserId){
          System.out.println(idUser.get(recommendUserId)+"--"+idUser.get(j)+"相似度:"+sparseMatrix[recommendUserId][j]/Math.sqrt(userItemLength.get(idUser.get(recommendUserId))*userItemLength.get(idUser.get(j))));
        }
    }
    String out="";
    //计算指定用户recommendUser的物品推荐度
    for(String item: items){//遍历每一件物品
      Set<String> users = itemUserCollection.get(item);//得到购买当前物品的所有用户集合
      if(users.contains(recommendUser)){//如果被推荐用户没有购买当前物品,则进行推荐度计算
        double itemRecommendDegree = 0.0;
        for(String user: users){
          itemRecommendDegree += sparseMatrix[userID.get(recommendUser)][userID.get(user)]/Math.sqrt(userItemLength.get(recommendUser)*userItemLength.get(user));//推荐度计算
        }
        out+=","+item;
        System.out.println("The item "+item+" for "+recommendUser +"'s recommended degree:"+itemRecommendDegree);
      }
    }
    return out;
  }

同时对于未登陆用户,采用aprio算法进行相关性的推荐,以保证登陆用户和未登陆用户均可有相应的信息推荐,核心算法如下:

/**
   * 专门有个算法包
   * 然后算法的逻辑也在这里,
   * 而且把算法之外额逻辑也加了
   * 注!为了应对一开始人员访问数据量不够推荐算法使用的情况,就进行了数据补足,这个业务逻辑就非常完美了。
   * 
   * java推荐算法
   * @param request
   */
  public void tuijiansuanfa(HttpServletRequest request){
      Itemset originalItem = new Itemset();
      List<Map> lista = db.queryForList("select * from t_customer");
      for (int i = 0; i < lista.size(); i++) {
        TreeSet<String> itemset = new TreeSet<String>();
        List<Map> listb = db.queryForList("select * from t_productclick where customerId=?",new Object[]{lista.get(i).get("id")});
        for (int j = 0; j < listb.size(); j++) {
          itemset.add(listb.get(j).get("productId")+"");
        }
        originalItem.itemset.add(itemset);
      }
      Aprioti.originalItem=originalItem;
      List<Long> outList = Aprioti.aprioriProcess();
      String in ="";
      if(outList!=null&&outList.size()>0){
        for (int i = 0; i < outList.size(); i++) {
          in+=","+outList.get(i);
        }
      }
      String sqlall="select a.*  from t_product a where 1=1 ";
      String sql=sqlall;
      if(in!=null&&!"".equals(in)){
        sql+=" and id in ("+in.substring(1,in.length())+")";
      }
      sql+="  order by rand() limit 8 ";
      //以上推荐算法最总结果在根据随机安排推荐
      //注!为了应对一开始人员访问数据量不够推荐算法使用的情况,就进行了数据补足,这个业务逻辑就非常完美了。
      List tuijianList = db.queryForList(sql);
      int a = 8;
      int b = 0;
      if(tuijianList==null||tuijianList.size()<8){
        if(tuijianList!=null){
          b = 8-tuijianList.size();
        }
        List list2 = db.queryForList(sqlall+" order by rand() limit "+b);
        tuijianList.addAll(list2);
      }else{
      }
      request.setAttribute("tuijianList", tuijianList);
  }

二,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

后台开发技术:Spring+mybatis+springmvc

前台开发技术:jquery+ajax+easyui

核心算法:协同过滤算法  APRIO算法

apriori关联规则算法的原理设计较为简单,著名的“啤酒和尿布”说的就是Apriori算法,通俗来讲apriori旨在寻找频繁项集,以帮助商家将消费者有可能一起搭配购买的物品放置在同一个地方,提高消费者的购物效率和良好的购物体验感。Apriori还是十大数据挖掘算法之一,可见Apriori关联规则算法的重要性。

三,系统展示

下面展示一下本系统的部分功能:

前端页面展示

http://localhost:8080/front/index.html

旅游景点

旅游酒店

旅游资讯

旅游攻略

我的酒店预定

我的贴子

我的收藏

我的信息

投诉建议

后台用户登陆:  http://localhost:8080/adminLogin/login.html

个人中心

轮播图管理

旅游资讯管理

用户管理

内容管理:包含酒店管理,景点管理,资读管理三大模块

旅游攻略管理

投诉建议管理

四,核心代码展示

 

package com.lvyou.controller.admin;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.lvyou.controller.MyController;
@Controller("adminCustomerController")
@RequestMapping(value = "/admin/customer")
public class AdminCustomerController extends MyController {
  @RequestMapping(value = "/frame")
  public String frame(Model model, HttpServletRequest request)throws Exception {
    return "/admin/customer/frame";
  }
  @RequestMapping(value = "/list")
  public String list(Model model, HttpServletRequest request,String username,String customerName)throws Exception {
    String sql="select a.* from t_customer a where 1=1";
  if(username!=null&&!"".equals(username)){
      sql+=" and username like '%"+username+"%'";
    }
  if(customerName!=null&&!"".equals(customerName)){
      sql+=" and customerName like '%"+customerName+"%'";
    }
    sql+=" order by id desc";
    List list = db.queryForList(sql);
    request.setAttribute("list", list);
    return "/admin/customer/list";
  }
  @RequestMapping(value = "/editSave")
  public ResponseEntity<String> editSave(Model model,HttpServletRequest request,Long id
    ,String username,String password,String customerName,String sex,String address,String phone,Integer account,Integer jf,String status) throws Exception{
    int result = 0;
    if(id!=null){
      String sql="update t_customer set username=?,password=?,customerName=?,sex=?,address=?,phone=?,account=?,jf=?,status=? where id=?";
      result = db.update(sql, new Object[]{username,password,customerName,sex,address,phone,account,jf,status,id});
    }else{
      String sql="insert into t_customer(username,password,customerName,sex,address,phone,account,jf,status) values(?,?,?,?,?,?,?,?,?)";
      result = db.update(sql, new Object[]{username,password,customerName,sex,address,phone,account,jf,status});
    }
    if(result==1){
      return renderData(true,"操作成功",null);
    }else{
      return renderData(false,"操作失败",null);
    }
  }
  @RequestMapping(value = "/editDelete")
  public ResponseEntity<String> editDelete(Model model,HttpServletRequest request,Long id) throws Exception {
    String sql="delete from t_customer where id=?";
    int result = db.update(sql, new Object[]{id});
    if(result==1){
      return renderData(true,"操作成功",null);
    }else{
      return renderData(false,"操作失败",null);
    }
  }
  @RequestMapping(value = "/updateColumnsex")
  public ResponseEntity<String> updateColumnsex(Model model,HttpServletRequest request,Long id,String sex) throws Exception {
    String sql="update t_customer set sex=?   where id=?";
    int result = db.update(sql, new Object[]{sex,id});
    if(result==1){
      return renderData(true,"操作成功",null);
    }else{
      return renderData(false,"操作失败",null);
    }
  }
  @RequestMapping(value = "/edit")
  public String edit(Model model, HttpServletRequest request,Long id)throws Exception {
    if(id!=null){
      //修改
      String sql="select * from t_customer where id=?";
      Map map = db.queryForMap(sql,new Object[]{id});
      model.addAttribute("map", map);
    }String sql="";
    return "/admin/customer/edit";
  }
}
package com.lvyou.controller.admin;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.lvyou.controller.MyController;
@Controller("contactController")
@RequestMapping(value = "/admin/contact")
public class ContactController extends MyController {
  @RequestMapping(value = "/frame")
  public String frame(Model model, HttpServletRequest request,String flag)throws Exception {
    return "/admin/contact/frame";
  }
  @RequestMapping(value = "/list")
  public String list(Model model, HttpServletRequest request,String flag,String phone)throws Exception {
    String aa = "select * from t_customer ";
    List<Map> list11 = db.queryForList(aa);
    System.out.println(list11);
    String sql="select a.phone, a.*,(select max(customerName) from t_customer b where a.customerId=b.id) customerName  from t_contact a where 1=1";
if(1==2){sql+="and customerId="+getCustomer(request).get("id") +" ";}
  if(phone!=null&&!"".equals(phone)){
      sql+=" and phone like '%"+phone+"%'";
    }
    sql+=" order by id desc";
    List list = db.queryForList(sql);
    System.out.println(sql);
    request.setAttribute("list", list);
    System.out.println(list);
    return "/admin/contact/list";
  }
  @RequestMapping(value = "/editSave")
  public ResponseEntity<String> editSave(Model model,HttpServletRequest request,Long id,String flag
    ,Integer customerId,String phone,String content,String insertDate) throws Exception{
    int result = 0;
    if(id!=null){
      String sql="update t_contact set phone=?,content=? where id=?";
      result = db.update(sql, new Object[]{phone,content,id});
    }else{
      String sql="insert into t_contact(customerId,phone,content,insertDate) values(?,?,?,now())";
      result = db.update(sql, new Object[]{getCustomer(request).get("id"),phone,content});
    }
    if(result==1){
      return renderData(true,"操作成功",null);
    }else{
      return renderData(false,"操作失败",null);
    }
  }
  @RequestMapping(value = "/editDelete")
  public ResponseEntity<String> editDelete(Model model,HttpServletRequest request,Long id,String flag) throws Exception {
    String sql="delete from t_contact where id=?";
    int result = db.update(sql, new Object[]{id});
    if(result==1){
      return renderData(true,"操作成功",null);
    }else{
      return renderData(false,"操作失败",null);
    }
  }
  @RequestMapping(value = "/edit")
  public String edit(Model model, HttpServletRequest request,Long id,String flag)throws Exception {
    if(id!=null){
      //修改
      String sql="select * from t_contact where id=?";
      Map map = db.queryForMap(sql,new Object[]{id});
      model.addAttribute("map", map);
    }String sql="";
    return "/admin/contact/edit";
  }
}

五,项目总结

       本项目基于协同过滤的aprio推荐算法来对旅游酒店信息进行相应的推荐操作,同时实现了旅游景点管理、酒店管理、旅游攻略管理、旅游资讯管理、在线收藏、点赞、评论、投诉建议,实现了在线下单进行旅游酒店的预定操作,并可以进行全文检索查询等,功能强大,内容丰富,页面简洁。

相关文章
|
1月前
|
机器学习/深度学习 搜索推荐 算法
协同过滤算法
协同过滤算法
75 0
|
3月前
|
搜索推荐 前端开发 数据可视化
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
本文介绍了一个基于Django框架、协同过滤算法、ECharts数据可视化以及Bootstrap前端技术的酒店推荐系统,该系统通过用户行为分析和推荐算法优化,提供个性化的酒店推荐和直观的数据展示,以提升用户体验。
152 1
|
1月前
|
机器学习/深度学习 监控 搜索推荐
电商平台如何精准抓住你的心?揭秘大数据背后的神秘推荐系统!
【10月更文挑战第12天】在信息爆炸时代,数据驱动决策成为企业优化决策的关键方法。本文以某大型电商平台的商品推荐系统为例,介绍其通过收集用户行为数据,经过预处理、特征工程、模型选择与训练、评估优化及部署监控等步骤,实现个性化商品推荐,提升用户体验和销售额的过程。
73 1
|
1月前
|
机器学习/深度学习 JSON 搜索推荐
深度学习的协同过滤的推荐算法-毕设神器
深度学习的协同过滤的推荐算法-毕设神器
41 4
|
1月前
|
机器学习/深度学习 算法 搜索推荐
django调用矩阵分解推荐算法模型做推荐系统
django调用矩阵分解推荐算法模型做推荐系统
26 4
|
2月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
90 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
2月前
|
机器学习/深度学习 人工智能 算法
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台。果蔬识别系统,本系统使用Python作为主要开发语言,通过收集了12种常见的水果和蔬菜('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜'),然后基于TensorFlow库搭建CNN卷积神经网络算法模型,然后对数据集进行训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地文件方便后期调用。再使用Django框架搭建Web网页平台操作界面,实现用户上传一张果蔬图片识别其名称。
54 0
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
3月前
|
搜索推荐 前端开发 数据可视化
基于Python协同过滤的旅游景点推荐系统,采用Django框架,MySQL数据存储,Bootstrap前端,echarts可视化实现
本文介绍了一个基于Python协同过滤算法的旅游景点推荐系统,该系统采用Django框架、MySQL数据库、Bootstrap前端和echarts数据可视化技术,旨在为用户提供个性化的旅游推荐服务,提升用户体验和旅游市场增长。
277 9
基于Python协同过滤的旅游景点推荐系统,采用Django框架,MySQL数据存储,Bootstrap前端,echarts可视化实现
|
3月前
|
搜索推荐 前端开发 算法
基于用户画像及协同过滤算法的音乐推荐系统,采用Django框架、bootstrap前端,MySQL数据库
本文介绍了一个基于用户画像和协同过滤算法的音乐推荐系统,使用Django框架、Bootstrap前端和MySQL数据库构建,旨在为用户提供个性化的音乐推荐服务,提高推荐准确性和用户满意度。
252 7
基于用户画像及协同过滤算法的音乐推荐系统,采用Django框架、bootstrap前端,MySQL数据库
|
3月前
|
存储 SQL 消息中间件
B端算法实践问题之设计一套实时平台能力如何解决
B端算法实践问题之设计一套实时平台能力如何解决
40 1