基于Django与BERT的酒店评论文本情感分析系统设计
2026/9/23 2:14:24 网站建设 项目流程

1. 项目背景与核心价值

酒店评论文本情感分析是自然语言处理(NLP)领域的一个经典应用场景。随着在线旅游平台(OTA)的快速发展,每天都会产生海量的酒店评论数据。这些非结构化的文本数据蕴含着消费者对酒店服务的真实感受,但人工阅读和分析这些评论既耗时又难以量化。

基于深度学习的文本情感分析技术能够自动识别评论中的情感倾向(正面、负面或中性),帮助酒店管理者快速了解客户满意度,发现服务短板,甚至预测市场趋势。对于大数据专业的学生而言,这个选题既贴合专业方向,又具备实际应用价值,同时技术难度适中,非常适合作为毕业设计项目。

我选择Django作为Web框架主要基于以下考虑:首先Python生态对深度学习支持良好,其次Django自带的管理后台可以快速搭建数据展示界面,最后其MTV模式清晰易懂,便于毕业设计答辩时的代码讲解。整个项目从数据采集、模型训练到可视化展示形成了一个完整的大数据应用闭环。

2. 技术架构设计解析

2.1 整体技术栈选型

项目采用典型的三层架构:

  • 前端展示层:Django模板+Bootstrap5
  • 业务逻辑层:Django视图+Rest Framework
  • 数据存储层:MySQL+Redis缓存

深度学习模型训练使用PyTorch框架,相比TensorFlow更易于调试和部署。考虑到毕业设计场景,我特别选择了预训练的BERT-base模型进行微调,而不是从零开始训练,这样可以在有限的计算资源下获得更好的效果。

提示:如果实验室GPU资源有限,可以改用更轻量级的ALBERT或DistilBERT模型,它们参数量更少但性能损失不大。

2.2 数据库设计要点

评论数据表(comments)的核心字段包括:

CREATE TABLE `comments` ( `id` int NOT NULL AUTO_INCREMENT, `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, `sentiment` tinyint DEFAULT NULL COMMENT '0负面 1中性 2正面', `score` float DEFAULT NULL COMMENT '情感强度', `hotel_id` int DEFAULT NULL, `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), FULLTEXT KEY `ft_content` (`content`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

特别注意:

  1. 使用utf8mb4字符集以支持emoji表情
  2. 为content字段添加全文索引(FT)加速模糊查询
  3. sentiment字段使用tinyint而非varchar节省存储空间

2.3 模型训练关键参数

在模型训练阶段,有几个超参数需要特别注意调整:

training_args = TrainingArguments( output_dir='./results', num_train_epochs=3, per_device_train_batch_size=16, per_device_eval_batch_size=64, warmup_steps=500, weight_decay=0.01, logging_dir='./logs', logging_steps=10, evaluation_strategy="steps", load_best_model_at_end=True, )

这些参数需要根据你的数据集大小和GPU显存进行调整。例如显存不足时,可以减小batch_size但相应地增加gradient_accumulation_steps。

3. 核心功能实现细节

3.1 数据采集与清洗

酒店评论数据可以通过以下方式获取:

  1. 公开数据集(如携程公开评论)
  2. 爬虫采集(需遵守robots协议)
  3. 人工构造模拟数据

数据清洗的关键步骤:

def clean_text(text): # 去除HTML标签 text = re.sub(r'<[^>]+>', '', text) # 去除特殊字符但保留中文标点 text = re.sub(r'[^\w\s\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b]', '', text) # 繁体转简体 text = OpenCC('t2s').convert(text) # 去除连续重复字符 text = re.sub(r'(.)\1{3,}', r'\1', text) return text.strip()

3.2 情感分析模型实现

基于HuggingFace Transformers库的模型微调代码框架:

from transformers import BertTokenizer, BertForSequenceClassification tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') model = BertForSequenceClassification.from_pretrained('bert-base-chinese', num_labels=3) def tokenize_function(examples): return tokenizer(examples["text"], padding="max_length", truncation=True, max_length=128) # 数据集预处理 dataset = dataset.map(tokenize_function, batched=True) dataset.set_format(type='torch', columns=['input_ids', 'attention_mask', 'label']) # 训练循环 trainer = Trainer( model=model, args=training_args, train_dataset=small_train_dataset, eval_dataset=small_eval_dataset, compute_metrics=compute_metrics, ) trainer.train()

3.3 Django后端接口

提供REST API的关键视图:

from rest_framework.decorators import api_view from django.http import JsonResponse @api_view(['POST']) def analyze_comment(request): text = request.data.get('text', '') if not text: return JsonResponse({'error': 'Empty text'}, status=400) # 调用模型预测 inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True, max_length=128) outputs = model(**inputs) probs = torch.nn.functional.softmax(outputs.logits, dim=-1) return JsonResponse({ 'sentiment': int(torch.argmax(probs)), 'confidence': float(torch.max(probs)) })

4. 系统功能扩展建议

4.1 可视化分析模块

除了基础的情感分类,可以增加:

  1. 关键词云生成
  2. 情感趋势时间线
  3. 各服务维度(卫生、位置、设施等)的满意度雷达图

使用ECharts实现的示例代码:

function initChart() { var chart = echarts.init(document.getElementById('chart')); var option = { tooltip: {}, radar: { indicator: [ { name: '卫生', max: 100 }, { name: '服务', max: 100 }, { name: '位置', max: 100 }, { name: '设施', max: 100 }, { name: '性价比', max: 100 } ] }, series: [{ type: 'radar', data: [{value: [85, 90, 78, 82, 88]}] }] }; chart.setOption(option); }

4.2 实时分析功能

通过WebSocket实现评论实时分析看板:

# consumers.py class CommentConsumer(WebsocketConsumer): def connect(self): self.accept() def receive(self, text_data): text = json.loads(text_data)['text'] # 调用模型分析 result = analyze(text) self.send(json.dumps({ 'sentiment': result['sentiment'], 'keywords': extract_keywords(text) }))

5. 部署与性能优化

5.1 生产环境部署方案

推荐使用Docker Compose部署:

# docker-compose.yml version: '3' services: web: build: . ports: - "8000:8000" depends_on: - redis - db redis: image: redis:alpine db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: rootpass MYSQL_DATABASE: sentiment MYSQL_USER: user MYSQL_PASSWORD: pass volumes: - db_data:/var/lib/mysql volumes: db_data:

5.2 性能优化技巧

  1. 模型服务化:使用TorchServe将模型部署为独立服务
  2. 缓存机制:对重复评论使用Redis缓存结果
  3. 异步处理:Celery处理耗时分析任务
# tasks.py @app.task(bind=True) def async_analyze(self, text): try: # 分析逻辑 return result except Exception as e: self.retry(exc=e, countdown=60)

6. 常见问题与解决方案

6.1 模型准确率不高

可能原因及对策:

  1. 数据不平衡:使用过采样或类别权重
    from torch.nn import CrossEntropyLoss weights = torch.tensor([1.0, 1.5, 1.0]) # 中性样本权重更高 criterion = CrossEntropyLoss(weight=weights)
  2. 领域差异:使用酒店评论数据继续预训练
  3. 文本过长:调整max_length或尝试长文本模型

6.2 系统响应慢

优化方案:

  1. 启用Gzip压缩
    MIDDLEWARE = [ 'django.middleware.gzip.GZipMiddleware', # ... ]
  2. 数据库查询优化
    # 错误方式 comments = Comment.objects.all() for c in comments: print(c.hotel.name) # N+1查询问题 # 正确方式 comments = Comment.objects.select_related('hotel').all()

7. 毕业设计答辩要点

  1. 技术亮点阐述

    • 如何解决中文文本分析的挑战
    • 模型微调的具体改进点
    • 系统架构设计的考量
  2. 演示技巧

    • 准备几个典型评论案例(正面、负面各3个)
    • 展示不同参数下的效果对比
    • 强调系统的实际应用场景
  3. 常见问题准备

    • 为什么选择BERT而不是其他模型?
    • 如何处理带有讽刺意味的评论?
    • 系统的准确率如何评估?

提示:答辩前务必进行多次完整流程测试,确保演示时不会出现技术问题。可以准备一个备份视频以防现场环境问题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询