1. 项目背景与核心价值

重庆作为全球知名的美食之都,拥有超过5万家餐饮商户和200余种特色小吃。传统的美食推荐方式主要依赖人工点评和简单评分,难以应对三个核心痛点:首先,游客面对海量选择容易陷入"决策瘫痪";其次,地域性口味差异导致推荐精准度不足;最后,季节性食材变化和网红店更迭使得静态推荐列表快速过时。

这个毕业设计项目通过大数据与深度学习技术构建动态推荐系统,实现了三个突破性价值:

  1. 实时性:系统每6小时更新一次推荐列表,动态反映商户营业状态和用户评价变化
  2. 个性化:采用多维度用户画像,包括口味偏好(辣度接受度)、消费场景(单人/聚餐)、预算区间等12个特征维度
  3. 可解释性:创新性地在深度学习模型中融入注意力机制,能直观展示"为什么推荐这家店"的关键因素

实操心得:在重庆本地测试期间发现,将"步行可达距离"作为权重因子能显著提升推荐采纳率,这与山城特殊的地理环境密切相关。

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流程,关键处理步骤包括:

  1. 数据清洗:处理重庆方言特色评价(如"巴适得板"→5星)
  2. 地理编码:将模糊地址转换为经纬度(使用高德地图API)
  3. 特征工程:
    • 构建"辣度指数":基于菜品描述文本分析(如"微辣"=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个特色特征:

  1. 火锅兼容度:评估店铺对"油碟"配料的支持程度
  2. 爬坡友好度:基于店铺周边坡度数据(获取自DEM高程图)
  3. 夜宵指数:营业时间超过23:00的加权系数
  4. 方言亲和度:服务员使用当地方言的频率
  5. 防空洞系数:特殊历史建筑改造的店铺加分

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 方言文本处理技巧

针对重庆方言的特殊表达:

  1. 建立同义词词典:
    • "嘿好吃" → "非常好吃"
    • "不摆了" → "无可挑剔"
  2. 使用jieba自定义词典:
    jieba.load_userdict("chongqing_dialect.txt")
    
  3. 在BERT预训练时加入方言语料

6. 项目扩展方向

在实际部署后,我们发现了三个有价值的改进点:

  1. 实时流量监控:在解放碑等热门区域部署Wi-Fi探针,实时感知客流量变化
  2. 跨平台迁移:将推荐逻辑封装成Docker镜像,可快速部署到微信小程序
  3. 冷启动优化:设计"重庆美食能力测试"问卷,通过10道题快速建立用户画像

这个项目最具挑战性的部分在于平衡算法复杂度和实时性要求。我们最终采用"离线训练+在线微调"的架构,使得模型既能捕捉深层特征,又能快速响应突发变化(如疫情期间的口味偏好转变)。所有源码和数据集已整理成可一键执行的Docker镜像包,这对毕业设计答辩演示特别友好。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐