基于大数据的重庆美食个性化推荐系统设计与实践
·
1. 项目背景与核心价值
重庆作为全球知名的美食之都,拥有超过5万家餐饮商户和200余种特色小吃。传统的美食推荐方式主要依赖人工点评和简单评分,难以应对三个核心痛点:首先,游客面对海量选择容易陷入"决策瘫痪";其次,地域性口味差异导致推荐精准度不足;最后,季节性食材变化和网红店更迭使得静态推荐列表快速过时。
这个毕业设计项目通过大数据与深度学习技术构建动态推荐系统,实现了三个突破性价值:
- 实时性:系统每6小时更新一次推荐列表,动态反映商户营业状态和用户评价变化
- 个性化:采用多维度用户画像,包括口味偏好(辣度接受度)、消费场景(单人/聚餐)、预算区间等12个特征维度
- 可解释性:创新性地在深度学习模型中融入注意力机制,能直观展示"为什么推荐这家店"的关键因素
实操心得:在重庆本地测试期间发现,将"步行可达距离"作为权重因子能显著提升推荐采纳率,这与山城特殊的地理环境密切相关。
2. 系统架构设计解析
2.1 数据采集层实现方案
采用混合数据获取策略,核心数据源包括:
- 大众点评API(合规获取):通过官方开发者账户申请,每日限额5000次请求
- 美团爬虫方案:使用Scrapy-Redis构建分布式爬虫,关键反反爬措施包括:
- 动态User-Agent轮换池(维护200个有效Agent)
- 基于LBS的地理位置模拟(精确到街道级别)
- 请求间隔随机化(2-5秒浮动)
# 示例:美团店铺详情页爬虫中间件
class MeituanDownloaderMiddleware:
def process_request(self, request, spider):
request.headers['User-Agent'] = random.choice(self.user_agents)
request.meta['proxy'] = self.get_proxy()
time.sleep(random.uniform(2, 5))
2.2 数据处理流水线设计
构建基于Apache Beam的ETL流程,关键处理步骤包括:
- 数据清洗:处理重庆方言特色评价(如"巴适得板"→5星)
- 地理编码:将模糊地址转换为经纬度(使用高德地图API)
- 特征工程:
- 构建"辣度指数":基于菜品描述文本分析(如"微辣"=1,"特辣"=5)
- 计算"网红指数":结合抖音/小红书提及频次
避坑指南:重庆部分老店使用当地方言注册店名(如"珮姐"实际读"pei姐"),需建立特殊映射词典。
3. 核心算法实现细节
3.1 混合推荐模型架构
创新性地组合三种算法:
- Wide & Deep模型:处理结构化特征(价格、评分等)
- GraphSAGE:构建商户关系图(基于用户共现行为)
- BERT-wwm:处理评论文本(特别适配重庆方言)
class HybridModel(tf.keras.Model):
def __init__(self):
super().__init__()
self.bert = load_bert_model()
self.graph_sage = GraphSAGE()
self.wide = WideNetwork()
def call(self, inputs):
text_emb = self.bert(inputs['text'])
graph_emb = self.graph_sage(inputs['graph'])
wide_out = self.wide(inputs['features'])
return tf.concat([text_emb, graph_emb, wide_out], axis=1)
3.2 地域化特征工程
针对重庆特有的饮食文化,设计了5个特色特征:
- 火锅兼容度:评估店铺对"油碟"配料的支持程度
- 爬坡友好度:基于店铺周边坡度数据(获取自DEM高程图)
- 夜宵指数:营业时间超过23:00的加权系数
- 方言亲和度:服务员使用当地方言的频率
- 防空洞系数:特殊历史建筑改造的店铺加分
4. 系统部署实战
4.1 大数据集群配置方案
使用3台阿里云ECS搭建Hadoop集群(总成本控制在800元/月):
- Master节点:8核16G(部署NameNode+ResourceManager)
- Worker节点:4核8G ×2(数据节点)
- 关键配置优化:
<!-- yarn-site.xml --> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>6144</value> <!-- 预留2G给系统 --> </property>
4.2 推荐服务性能优化
通过以下手段将API响应时间控制在200ms内:
- 预计算:每日凌晨生成热门商户候选集
- 分级缓存:
- Redis缓存热门推荐(TTL=1小时)
- 本地缓存用户画像(Guava Cache)
- 模型轻量化:使用TensorRT加速推理
5. 典型问题排查实录
5.1 数据倾斜解决方案
在处理用户行为日志时发现,某网红火锅店导致严重数据倾斜:
- 现象:某个Reducer任务耗时是其他任务的50倍
- 定位:通过Spark UI观察各Task处理数据量
- 解决:采用两阶段聚合方案
// 第一阶段:添加随机前缀局部聚合 val stage1 = rdd.map(x => (random.nextInt(10)+"_"+x._1, x._2)) .reduceByKey(_ + _) // 第二阶段:去除前缀全局聚合 val stage2 = stage1.map(x => (x._1.split("_")(1), x._2)) .reduceByKey(_ + _)
5.2 方言文本处理技巧
针对重庆方言的特殊表达:
- 建立同义词词典:
- "嘿好吃" → "非常好吃"
- "不摆了" → "无可挑剔"
- 使用jieba自定义词典:
jieba.load_userdict("chongqing_dialect.txt") - 在BERT预训练时加入方言语料
6. 项目扩展方向
在实际部署后,我们发现了三个有价值的改进点:
- 实时流量监控:在解放碑等热门区域部署Wi-Fi探针,实时感知客流量变化
- 跨平台迁移:将推荐逻辑封装成Docker镜像,可快速部署到微信小程序
- 冷启动优化:设计"重庆美食能力测试"问卷,通过10道题快速建立用户画像
这个项目最具挑战性的部分在于平衡算法复杂度和实时性要求。我们最终采用"离线训练+在线微调"的架构,使得模型既能捕捉深层特征,又能快速响应突发变化(如疫情期间的口味偏好转变)。所有源码和数据集已整理成可一键执行的Docker镜像包,这对毕业设计答辩演示特别友好。
更多推荐


所有评论(0)