1. 项目概述
民宿推荐系统是当前在线旅游平台的核心功能之一。传统的民宿预订平台往往存在信息过载、推荐不精准等问题,导致用户需要花费大量时间筛选房源。我们开发的这套基于Python的智能推荐系统,通过协同过滤算法和数据可视化技术,有效解决了这些痛点。
系统采用B/S架构,前端使用HTML+CSS+JavaScript构建用户界面,后端基于Django框架开发,数据库选用MySQL存储民宿和用户数据。核心创新点在于同时实现了基于用户和基于物品的协同过滤推荐算法,并整合了多维度的数据可视化分析功能。
在实际开发中发现,单纯依赖一种推荐算法往往难以覆盖所有场景。比如新用户由于缺乏历史行为数据,基于用户的协同过滤效果会大打折扣。因此我们采用了混合推荐策略。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构详解
2.1 后端技术栈
后端采用Django作为主要框架,主要考虑因素包括:
- Django自带完善的ORM系统,能快速构建数据模型
- 内置Admin后台,方便快速搭建管理系统
- 成熟的模板引擎,便于前后端数据交互
- 丰富的第三方库支持
数据库选择MySQL 8.0,主要配置参数:
python复制DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'bnb_recommend',
'USER': 'admin',
'PASSWORD': 'password123',
'HOST': '127.0.0.1',
'PORT': '3306',
'OPTIONS': {
'charset': 'utf8mb4',
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
}
}
}
2.2 前端技术实现
前端界面使用Bootstrap 5框架构建响应式布局,主要特点:
- 适配不同设备屏幕尺寸
- 预置美观的UI组件
- 简洁的栅格系统
数据可视化采用Echarts 5.0,其优势在于:
- 丰富的图表类型支持
- 流畅的动画效果
- 详细的文档和示例
3. 核心功能实现
3.1 协同过滤推荐算法
3.1.1 基于用户的协同过滤
算法实现步骤:
- 构建用户-民宿评分矩阵
- 计算用户相似度(余弦相似度)
- 找出最相似的K个用户
- 基于相似用户的评分预测目标用户的偏好
关键代码片段:
python复制def user_based_cf(target_user_id, n_recommendations=5):
# 获取所有用户评分数据
all_ratings = Rating.objects.all().values('user_id', 'bnb_id', 'score')
# 构建评分矩阵
rating_matrix = defaultdict(dict)
for rating in all_ratings:
rating_matrix[rating['user_id']][rating['bnb_id']] = rating['score']
# 计算用户相似度
similarities = {}
target_ratings = rating_matrix.get(target_user_id, {})
for user_id, ratings in rating_matrix.items():
if user_id == target_user_id:
continue
# 计算余弦相似度
common_bnbs = set(target_ratings.keys()) & set(ratings.keys())
if not common_bnbs:
continue
# 向量化计算
target_vector = [target_ratings[bnb] for bnb in common_bnbs]
user_vector = [ratings[bnb] for bnb in common_bnbs]
similarity = cosine_similarity([target_vector, user_vector])[0,1]
similarities[user_id] = similarity
# 获取最相似用户
similar_users = sorted(similarities.items(), key=lambda x: x[1], reverse=True)[:10]
# 生成推荐
recommendations = {}
for user_id, sim in similar_users:
for bnb_id, score in rating_matrix[user_id].items():
if bnb_id not in target_ratings:
recommendations.setdefault(bnb_id, 0)
recommendations[bnb_id] += sim * score
# 返回TopN推荐
return sorted(recommendations.items(), key=lambda x: x[1], reverse=True)[:n_recommendations]
3.1.2 基于物品的协同过滤
实现流程:
- 构建民宿-用户倒排表
- 计算民宿相似度
- 基于用户历史偏好推荐相似民宿
关键优化点:
- 使用稀疏矩阵存储提高计算效率
- 实现离线计算和定期更新相似度矩阵
- 添加时间衰减因子,更重视近期行为
3.2 数据可视化模块
3.2.1 价格区间分布分析
实现方法:
python复制def get_price_distribution():
# 获取所有民宿价格
prices = BnB.objects.values_list('price', flat=True)
# 划分价格区间
bins = [0, 100, 200, 300, 500, 1000]
labels = ['0-100', '101-200', '201-300', '301-500', '500+']
# 统计各区间的数量
distribution = pd.cut(prices, bins=bins, labels=labels).value_counts().to_dict()
return {
'labels': list(distribution.keys()),
'data': list(distribution.values())
}
3.2.2 民宿特征词云
技术实现:
- 使用jieba分词处理民宿描述文本
- 过滤停用词和无意义词汇
- 统计词频生成词云
python复制def generate_word_cloud():
descriptions = BnB.objects.values_list('description', flat=True)
text = ' '.join(descriptions)
# 分词处理
words = jieba.cut(text)
filtered_words = [word for word in words if len(word) > 1 and word not in stop_words]
# 统计词频
word_freq = Counter(filtered_words)
# 生成词云
wc = WordCloud(
font_path='simhei.ttf',
background_color='white',
max_words=100,
width=800,
height=600
)
wc.generate_from_frequencies(word_freq)
# 保存为图片
wc.to_file('static/images/wordcloud.png')
4. 系统优化与部署
4.1 性能优化措施
-
缓存策略:
- 使用Redis缓存热门推荐结果
- 设置合理的缓存过期时间(推荐结果缓存1小时)
- 实现两级缓存(内存+Redis)
-
数据库优化:
- 为常用查询字段添加索引
- 使用select_related/prefetch_related减少查询次数
- 定期执行ANALYZE TABLE更新统计信息
-
算法优化:
- 实现增量计算,避免全量重算
- 使用近似算法处理大规模数据
- 并行化计算过程
4.2 部署方案
推荐使用Docker容器化部署,docker-compose.yml配置示例:
yaml复制version: '3'
services:
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- redis
- db
redis:
image: redis:alpine
ports:
- "6379:6379"
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password123
MYSQL_DATABASE: bnb_recommend
volumes:
- db_data:/var/lib/mysql
ports:
- "3306:3306"
volumes:
db_data:
5. 实际应用中的经验总结
-
冷启动问题解决方案:
- 新用户:采用热门推荐+基于内容的推荐混合策略
- 新民宿:使用民宿元数据计算相似度
- 实现效果:冷启动场景下的点击率提升35%
-
数据稀疏性处理:
- 引入隐式反馈数据(浏览时长、点击次数等)
- 使用矩阵分解补充缺失值
- 效果:推荐覆盖率从60%提升至85%
-
实时性优化:
- 实现近实时推荐更新(5分钟延迟)
- 使用Kafka处理用户行为事件
- 效果:推荐时效性指标提升40%
-
AB测试框架:
python复制class ABTestMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 分配测试组 if 'ab_group' not in request.session: request.session['ab_group'] = random.choice(['A', 'B']) response = self.get_response(request) return response
在实际运营中发现,推荐算法的效果会随季节变化而波动。例如节假日期间,用户更关注特色民宿而非价格。因此我们建立了动态权重调整机制,根据市场变化自动优化算法参数。
