基于Spark的智能餐饮推荐系统报告(只含部分代码)

2024-06-17 03:20

本文主要是介绍基于Spark的智能餐饮推荐系统报告(只含部分代码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 基本信息

1.1 系统名称

基于Spark的智能餐饮推荐系统

1.2 开发运行环境

Linux: Ubuntu 14.04

MySQL: 5.7.16

Hadoop: 2.7.1

Hive: 1.2.1

Sqoop: 1.4.6

Spark: 2.1.0

Eclipse: 3.8 (注意:Eclipse 3.8是一个较旧的版本,考虑使用更新版本)

ECharts: 3.4.0

1.3 使用的核心技术

Spark大数据分析框架

MLlib机器学习库

MySQL数据库管理系统

Hadoop生态系统(HDFS, YARN等)

Hive数据仓库

Sqoop数据导入导出工具

ECharts数据可视化库

  1. 系统功能设计

本系统旨在通过大数据分析,为用户提供个性化的餐饮推荐。通过分析用户的饮食偏好、历史记录等信息,结合餐饮商户的菜品、评价等数据,为用户提供精准、及时的推荐服务

2.1系统总体功能

本系统旨在通过大数据分析,为用户提供个性化的餐饮推荐。通过分析用户的饮食偏好、历史记录等信息,结合餐饮商户的菜品、评价等数据,为用户提供精准、及时的推荐服务。

2.2系统模块详细设计

2.2.1 数据预处理功能模块

对原始数据进行清洗、转换、整合等预处理操作

为后续的数据分析和推荐算法提供规范、统一的数据格式

2.2.2 推荐算法功能模块

推荐算法功能是基于python机器学习库实现的,旨在通过分析用户的历史行为和偏好,以及餐饮商户的菜品、评价等信息,为用户提供个性化的餐饮推荐。该功能采用了协同过滤(Collaborative Filtering)算法,包括用户-用户(User-User)协同过滤和物品-物品(Item-Item)协同过滤,以确保推荐的准确性和多样性。

2.2.3 ECharts功能模块

ECharts 是一个使用 JavaScript 实现的开源可视化库,可以生成各种类型的图表,包括折线图、柱状图、散点图、饼图等。在智能餐饮推荐系统中,ECharts 可以用于展示用户行为数据、菜品销售数据、用户评价等,帮助餐饮管理者直观地了解餐厅的运营情况和用户偏好。

2.3数据库设计(使用E-R图或者三线表)

用户表:存储用户基本信息(如ID、姓名等)

菜单表:存储菜单(编号、菜品名)

  1. 系统实现

3. 数据预处理功能实现

3.1.1 功能描述

数据预处理功能在智能餐饮推荐系统中扮演着至关重要的角色。它负责清洗、转换、整合从各种数据源中收集到的原始数据,以确保数据的质量和一致性,为后续的数据分析和推荐算法提供规范、统一的数据格式。

数据清洗:去除重复、缺失或异常的数据记录,处理格式不一致的数据字段。

数据转换:将数据从原始格式转换为适合分析的格式,例如将字符串类型的日期转换为日期格式,将文本型的评价转换为数值型评分等。

数据整合:将来自不同数据源的数据整合到一起,形成完整的数据集,以便进行统一的分析和处理。

3.1.2 核心代码

第1步:读取数据val path = "/home/hadoop/Meal.json"val df = spark.read.json(path)df.printSchema()df.createOrReplaceTempView("data")spark.sql("select userid, mealid, rating, review from data").show(5)第2步:数据探索scalaspark.sql("select count(*) as records from data").show()spark.sql("select count(distinct userid) as users from data").show()第3步:按日期分组统计数据分布scalaval dataWithDate = spark.sql("select *, (From_Unixtime(reviewtime, 'yyyy-MM-dd')) as reviewdate from data")dataWithDate.createOrReplaceTempView("dataWithDate")第4步:查询最新评分记录scalaval lastRating = spark.sql("select userid, mealid, MAX(reviewtime) as lastdate from data group by userid, mealid")lastRating.createOrReplaceTempView("lastRatingPair")val lastRatingRecord = spark.sql("""select a.userid, a.mealid, a.rating, a.reviewtimefrom data ajoin lastRatingPair bon a.userid = b.userid and a.mealid = b.mealid and a.reviewtime = b.lastdate""")lastRatingRecord.createOrReplaceTempView("lastRatingRecord")第5步:数据去重和排序// 将DataFrame转换为RDDval ratingrdd = lastRatingRecord.rdd.map(row =>(row.getAs[String]("userid"), row.getAs[String]("mealid"), row.getAs[Double]("rating"), row.getAs[Long]("reviewtime")))// 对mealid进行编码val mealzipcode = ratingrdd.map(_._2).distinct.sortBy(x => x).zipWithIndex.map(a => (a._1, a._2.toInt))// 对userid进行编码val userzipcode = ratingrdd.map(_._1).distinct.sortBy(x => x).zipWithIndex.map(a => (a._1, a._2.toInt))// 将编码结果收集到Map中val userzipcodemap = userzipcode.collect().toMapval mealzipcodemap = mealzipcode.collect().toMap// 将原始数据中的userid和mealid替换为编码后的值,并按时间排序val ratingcodelist = ratingrdd.map {case (userid, mealid, rating, reviewtime) =>(userzipcodemap(userid), mealzipcodemap(mealid), rating, reviewtime)}.sortBy(_._4)第6步:数据集分割val totalnum = ratingcodelist.count()val splitpoint1 = (totalnum * 0.8).toIntval splitpoint2 = (totalnum * 0.9).toInt

3.1.3 运行截图

第1步:读取数据

第2步:数据探索

第3步:按日期分组统计数据分布

第4步:查询最新评分记录

第5步:数据去重和排序

第6步:数据集分割

3.2 推荐算法功能实现

3.2.1 功能描述

推荐算法功能是基于python机器学习库实现的,旨在通过分析用户的历史行为和偏好,以及餐饮商户的菜品、评价等信息,为用户提供个性化的餐饮推荐。该功能采用了协同过滤(Collaborative Filtering)算法,包括用户-用户(User-User)协同过滤和物品-物品(Item-Item)协同过滤,以确保推荐的准确性和多样性。

3.2.2 核心代码

import pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.metrics.pairwise import linear_kernelimport chardetdef detect_encoding(file_path):with open(file_path, 'rb') as f:result = chardet.detect(f.read())return result['encoding']user_item_file = 'userzipcode.csv'menu_file = 'meal_list.csv'user_item_encoding = detect_encoding(user_item_file)menu_encoding = detect_encoding(menu_file)user_item_data = pd.read_csv(user_item_file, encoding=user_item_encoding)menu_data = pd.read_csv(menu_file, encoding=menu_encoding)# 后续流程...# 3.合并用户评价数据和菜品名称数据data = pd.merge(user_item_data, menu_data, left_on='MealID', right_on='mealID')# 4.加载训练数据train_data, test_data = train_test_split(data, test_size=0.2, random_state=42)# 5.加载推荐模型tfidf = TfidfVectorizer(stop_words='english')train_tfidf_matrix = tfidf.fit_transform(train_data['Review'])# 6.计算余弦相似度cosine_sim = linear_kernel(train_tfidf_matrix, train_tfidf_matrix)# 7.为用户推荐菜品def get_recommendations(user_id, num_recommendations):# 获取用户的所有评价记录user_reviews = train_data[train_data['UserID'] == user_id]if user_reviews.empty:return "User not found or has no reviews."# 获取用户最后一次评价的菜品索引user_last_review_index = user_reviews.index[-1]# 计算与用户最后一次评价的菜品的相似度sim_scores = list(enumerate(cosine_sim[user_last_review_index]))sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)# 获取前num_recommendations个最相似的菜品的索引sim_scores = sim_scores[1:num_recommendations+1]meal_indices = [i[0] for i in sim_scores]# 返回最相似的菜品名称return train_data.iloc[meal_indices]['meal_name']# 示例:user_id = 'A2WOH395IHGS0T'  # 请根据实际数据中的UserID进行更改num_recommendations = 5recommended_items = get_recommendations(user_id, num_recommendations)print("Recommended Items for User", user_id)for item in recommended_items:print(item)

3.2.3 运行截图

3.3 ECharts功能实现

3.3.1 功能描述

ECharts 是一个使用 JavaScript 实现的开源可视化库,可以生成各种类型的图表,包括折线图、柱状图、散点图、饼图等。在智能餐饮推荐系统中,ECharts 可以用于展示用户行为数据、菜品销售数据、用户评价等,帮助餐饮管理者直观地了解餐厅的运营情况和用户偏好。

3.3.2 核心代码

Jsp代码:

<%@ page language="java" import="dbtaobao.connDb,java.util.*" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%ArrayList<String[]> list = connDb.index();%>    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>ECharts 可视化分析餐饮推荐</title><link href="./css/style.css" type='text/css' rel="stylesheet"/><script src="./js/echarts.min.js"></script></head><body><div class='header'><p>ECharts 可视化分析餐饮推荐</p></div><div class="content"><div class="nav"><ul><li class="current"><a href="#">不同星级菜品消费对比</a></li><li><a href="./index1.jsp">菜品消费是否推荐对比</a></li><li><a href="./index2.jsp">部分菜品消费数量对比</a></li><li><a href="./index3.jsp">销售前五的菜品</a></li></ul></div><div class="container"><div class="title">不同星级菜品消费对比</div><div class="show"><div class='chart-type'>饼图</div><div id="main"></div></div></div></div><script>//基于准备好的dom,初始化echarts实例var myChart = echarts.init(document.getElementById('main'));// 指定图表的配置项和数据option = {backgroundColor: '#2c343c',title: {text: '不同星级菜品消费对比比例图',left: 'center',top: 20,textStyle: {color: '#ccc'}},tooltip : {trigger: 'item',formatter: "{a} <br/>{b} : {c} ({d}%)"},visualMap: {show: false,min: 80,max: 600,inRange: {colorLightness: [0, 1]}},series : [{name:'消费行为',type:'pie',radius : '55%',center: ['50%', '50%'],data:[{value:<%=list.get(0)[1]%>, name:'2'},{value:<%=list.get(1)[1]%>, name:'3'},{value:<%=list.get(2)[1]%>, name:'4'},{value:<%=list.get(3)[1]%>, name:'5'},].sort(function (a, b) { return a.value - b.value}),roseType: 'angle',label: {normal: {textStyle: {color: 'rgba(255, 255, 255, 0.3)'}}},labelLine: {normal: {lineStyle: {color: 'rgba(255, 255, 255, 0.3)'},smooth: 0.2,length: 10,length2: 20}},itemStyle: {normal: {color: '#c23531',shadowBlur: 200,shadowColor: 'rgba(0, 0, 0, 0.5)'}},animationType: 'scale',animationEasing: 'elasticOut',animationDelay: function (idx) {return Math.random() * 200;}}]};// 使用刚指定的配置项和数据显示图表。myChart.setOption(option);</script></body></html>

Java代码:

package dbtaobao;import java.sql.*;import java.util.ArrayList;public class connDb {private static Connection con = null;private static Statement stmt = null;private static ResultSet rs = null;//连接数据库方法public static void startConn(){try{Class.forName("com.mysql.jdbc.Driver");//连接数据库中间件try{con = DriverManager.getConnection("jdbc:MySQL://localhost:3306/dbtaobao","root","123456");}catch(SQLException e){e.printStackTrace();}}catch(ClassNotFoundException e){e.printStackTrace();}}//关闭连接数据库方法public static void endConn() throws SQLException{if(con != null){con.close();con = null;}if(rs != null){rs.close();rs = null;}if(stmt != null){stmt.close();stmt = null;}}//数据库双11 所有买家消费行为比例public static ArrayList index() throws SQLException{ArrayList<String[]> list = new ArrayList();startConn();stmt = con.createStatement();rs = stmt.executeQuery("SELECT `action`, COUNT(*) AS num\n"+ "FROM `user_log`\n"+ "GROUP BY `action`\n"+ "ORDER BY num DESC;\n"+ "");while(rs.next()){String[] temp={rs.getString("action"),rs.getString("num")};list.add(temp);}endConn();return list;}//男女买家交易对比public static ArrayList index_1() throws SQLException{ArrayList<String[]> list = new ArrayList();startConn();stmt = con.createStatement();rs = stmt.executeQuery("SELECT gender, COUNT(*) AS num\n"+ "FROM user_log\n"+ "GROUP BY gender\n"+ "ORDER BY gender DESC;\n"+ "");while(rs.next()){String[] temp={rs.getString("gender"),rs.getString("num")};list.add(temp);}endConn();return list;}//男女买家各个年龄段交易对比public static ArrayList index_2() throws SQLException{ArrayList<String[]> list = new ArrayList();startConn();stmt = con.createStatement();rs = stmt.executeQuery("SELECT gender, age_range, COUNT(*) AS num\n"+ "FROM user_log\n"+ "GROUP BY gender, age_range\n"+ "ORDER BY gender DESC, age_range DESC;\n"+ "");while(rs.next()){String[] temp={rs.getString("gender"),rs.getString("age_range"),rs.getString("num")};list.add(temp);}endConn();return list;}//获取销量前五的商品类别public static ArrayList index_3() throws SQLException{ArrayList<String[]> list = new ArrayList();startConn();stmt = con.createStatement();rs = stmt.executeQuery("SELECT cat_id, COUNT(*) AS num\n"+ "FROM user_log\n"+ "GROUP BY cat_id\n"+ "ORDER BY COUNT(*) DESC\n"+ "LIMIT 5;\n"+ "");while(rs.next()){String[] temp={rs.getString("cat_id"),rs.getString("num")};list.add(temp);}endConn();return list;}//各个省份的总成交量对比public static ArrayList index_4() throws SQLException{ArrayList<String[]> list = new ArrayList();startConn();stmt = con.createStatement();rs = stmt.executeQuery("select province,count(*) num from user_log group by province order by count(*) DESC");while(rs.next()){String[] temp={rs.getString("province"),rs.getString("num")};list.add(temp);}endConn();return list;}}

3.1.3 运行截图

4.总结体会

通过本系统的设计与实现,我深刻体会到了大数据和机器学习在智能推荐领域的应用价值。在实际开发过程中,我遇到了许多挑战,如数据清洗的复杂性、推荐算法的优化等。但通过不断的学习和实践,我逐渐掌握了相关技术,并成功实现了系统的各项功能。未来,我将继续深入研究大数据和机器学习领域,探索更多可能的应用场景。

5.附录

这篇关于基于Spark的智能餐饮推荐系统报告(只含部分代码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068353

相关文章

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven