1. 项目背景与核心价值
白酒作为中国传统消费品,其市场数据蕴含着丰富的商业价值。这个毕业设计项目巧妙地将数据可视化、AI问答和Python技术栈结合,构建了一个完整的白酒数据分析与推荐系统。不同于普通的电商推荐系统,本项目需要处理白酒特有的香型、度数、产地等专业维度,这对数据建模提出了更高要求。
我在实际开发中发现,白酒数据具有几个鲜明特点:首先是地域特征明显,不同省份对香型偏好差异巨大;其次是价格带分布广,从几十元到上万元的产品需要分层处理;最重要的是用户评价维度特殊,"醇厚度"、"回味"等指标需要专门设计情感分析模型。这些特点让这个毕业项目具备了独特的挑战性和实用性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 整体技术栈选型
系统采用经典的三层架构:
- 前端:ECharts + Flask(轻量易部署)
- 业务层:Python科学计算栈(Pandas, NumPy)
- 数据层:MySQL + Redis缓存
- AI模块:Sentence-BERT + 自定义分类器
选择Flask而非Django的考虑:毕业项目需要快速迭代演示,Flask的轻量级特性更适合教学场景。实际测试中,在4核8G的学生服务器上,Flask能稳定支持50+并发请求。
2.2 数据流设计
mermaid复制graph TD
A[原始数据] --> B(Pandas预处理)
B --> C{数据类型}
C -->|结构化| D[MySQL]
C -->|非结构化| E[Elasticsearch]
D --> F[特征工程]
E --> G[文本向量化]
F & G --> H[推荐引擎]
H --> I[可视化接口]
注意:实际开发中要特别注意白酒评价文本的特殊性,比如"酱香突出"这类行业术语需要定制词库
3. 数据采集与清洗实战
3.1 多源数据获取
我们整合了三类数据源:
- 电商平台API(京东、天猫)
- 垂直酒类网站爬虫(使用Scrapy)
- 自建问卷系统(收集用户偏好)
爬虫开发中的关键技巧:
python复制# 处理动态加载的评论数据
def parse_reviews(response):
data = response.json()
for item in data['comments']:
# 专门处理白酒特有的评价关键词
if '回味' in item['content']:
yield {
'feature': 'aftertaste',
'score': len(item['content'].split('回味')) - 1
}
3.2 数据清洗的特别处理
白酒数据需要特殊清洗规则:
- 度数字段:统一转换为%vol格式
- 容量规格:将"500ml""一斤"等统一标准化
- 产地处理:建立省市二级关联表
常见坑点:某些品牌会标注"53度飞天茅台"这类复合字段,需要正则表达式拆分:
python复制import re
pattern = r'(\d+)度(.*)'
match = re.match(pattern, "53度飞天茅台")
if match:
degree, name = match.groups()
4. 可视化大屏实现
4.1 ECharts高级配置
针对白酒数据特点,我们设计了四种核心视图:
- 香型地域分布热力图
- 价格-评分气泡图
- 品牌销售趋势面积图
- 用户画像雷达图
关键配置示例:
javascript复制option = {
series: [{
type: 'pie',
radius: ['40%', '70%'],
data: [
{value: 1048, name: '酱香型'},
{value: 735, name: '浓香型'},
{value: 580, name: '清香型'},
{value: 300, name: '兼香型'}
],
itemStyle: {
borderRadius: 10,
borderColor: '#fff',
borderWidth: 2
}
}]
}
4.2 动态交互实现
通过Flask+WebSocket实现实时更新:
python复制@app.route('/update_data')
def update_data():
new_data = get_realtime_sales()
socketio.emit('data_update', new_data)
return jsonify(status='success')
前端监听代码:
javascript复制socket.on('data_update', function(data){
chart.setOption({
series: [{
data: data
}]
});
});
5. AI问答模块开发
5.1 问答引擎架构
采用混合模式:
- 规则引擎处理结构化查询("500元以下的酱香酒")
- BERT模型处理语义查询("适合长辈生日宴的酒")
模型训练关键代码:
python复制from sentence_transformers import SentenceTransformer
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
# 白酒领域微调
train_examples = [
InputExample(texts=['商务宴请', '茅台 五粮液']),
InputExample(texts=['婚宴用酒', '红花郎 剑南春'])
]
train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=16)
model.fit(train_objectives=[(train_dataloader, train_loss)], epochs=5)
5.2 典型问题处理方案
- 价格区间查询:
sql复制SELECT * FROM products
WHERE price BETWEEN ? AND ?
ORDER BY sales DESC LIMIT 10
- 场景推荐(使用余弦相似度):
python复制def recommend_by_scene(scene):
scene_vec = model.encode(scene)
products = get_all_products()
similarities = []
for p in products:
sim = cosine_similarity(scene_vec, p['vector'])
similarities.append((p, sim))
return sorted(similarities, key=lambda x: x[1], reverse=True)[:5]
6. 推荐算法优化
6.1 混合推荐策略
结合三种算法:
- 协同过滤(用户行为相似度)
- 内容推荐(产品特征匹配)
- 时序推荐(节日季节因素)
算法权重动态调整公式:
code复制final_score = 0.4*CF + 0.3*CB + 0.2*TF + 0.1*random
6.2 冷启动解决方案
对于新用户采用三级降级策略:
- 先询问3个偏好问题
- 若无反馈,采用地域默认偏好
- 最后使用热销榜单
实现代码:
python复制def cold_start(user):
if user.answers:
return content_based(user.answers)
elif user.location:
return region_based(user.location)
else:
return get_hot_sales(limit=10)
7. 项目部署与性能优化
7.1 学生服务器部署方案
推荐配置:
- Ubuntu 20.04 LTS
- MySQL 8.0 + Redis 6.2
- Python 3.8虚拟环境
- Gunicorn + Nginx反向代理
启动脚本示例:
bash复制gunicorn -w 4 -b 0.0.0.0:8000 app:app \
--access-logfile access.log \
--error-logfile error.log \
--timeout 120
7.2 性能优化技巧
-
数据库层面:
- 为香型、价格区间建立组合索引
- 使用Redis缓存热门查询
-
算法层面:
- 预计算推荐结果(每小时更新)
- 使用FAISS加速向量检索
-
前端层面:
- 图表数据懒加载
- WebP格式图片压缩
8. 毕业答辩准备建议
8.1 演示重点设计
建议突出三个亮点:
- 白酒领域知识图谱构建
- 评价文本的情感分析创新
- 混合推荐策略的AB测试结果
8.2 常见问题应对
准备好这些问题的答案:
- 如何保证推荐结果的多样性?
- 冷启动问题具体如何解决?
- 与传统推荐系统相比的创新点?
我在实际答辩中发现,评委特别关注"项目是否真的理解白酒行业特点"。建议准备几个典型case:
- 为什么酱香型在北方推荐权重较低
- 节日期间推荐策略的调整方法
9. 项目扩展方向
如果想继续深化项目,可以考虑:
- 加入社交数据(微信小程序收集)
- 开发移动端应用(Flutter跨平台)
- 接入实时销售数据流(Kafka+Spark)
一个有趣的扩展点:通过用户拍照识别酒瓶,结合CV技术实现"扫一扫荐酒"功能。这需要:
python复制import cv2
def recognize_bottle(image):
# 使用预训练的YOLO模型
model = cv2.dnn.readNet('bottle_model.weights', 'bottle_model.cfg')
blob = cv2.dnn.blobFromImage(image, 1/255, (416,416))
model.setInput(blob)
outputs = model.forward(model.getUnconnectedOutLayersNames())
# 后处理识别结果...
这个毕业项目最让我有成就感的是,通过技术手段揭示了白酒消费中那些"只可意会"的规律。比如我们发现:在江浙沪地区,38-42度的酒款在商务场景中接受度最高,这与当地饮食偏清淡的特点高度相关。这种洞察才是数据系统真正的价值所在。
