中文情感分析作为自然语言处理的重要分支,在电商评论、舆情监控等领域具有广泛应用价值。本项目采用Python+Django作为后端核心,结合Vue.js前端框架,构建了一套完整的深度学习中文情感分析系统。系统架构分为数据采集层、预处理层、模型训练层和应用服务层四个主要部分。
数据采集层通过爬虫技术获取各大平台的用户评论数据,存储至MySQL数据库。预处理层采用Jieba分词工具进行中文分词,结合哈工大停用词表过滤无关词汇,并通过Word2Vec或BERT等模型生成词向量。模型训练层基于TensorFlow/Keras框架搭建BiLSTM+Attention神经网络模型,在ChnSentiCorp等中文情感分析数据集上达到92%以上的准确率。
提示:在实际部署时,建议使用Nginx+Gunicorn方案提高Django应用的并发处理能力,同时采用Redis缓存高频访问的模型预测结果。
系统主要包含三大功能模块:用户管理、文本分析和可视化展示。用户管理模块实现基于JWT的认证授权,支持角色权限控制;文本分析模块提供单条文本即时分析和批量文件上传分析两种模式;可视化展示模块使用ECharts生成情感分布饼图和时序趋势折线图。
技术栈选型考量:
中文文本预处理包含特殊字符过滤、繁简转换和分词三个关键步骤。我们使用以下处理流程:
python复制import jieba
from opencc import OpenCC
def preprocess(text):
# 特殊字符过滤
text = re.sub(r'[^\w\s]', '', text)
# 繁简转换
cc = OpenCC('t2s')
text = cc.convert(text)
# 分词处理
words = jieba.lcut(text)
# 停用词过滤
words = [w for w in words if w not in stopwords]
return ' '.join(words)
对于短文本情感分析,需要特别注意处理网络新词和表情符号。建议定期更新用户词典,并使用正则表达式提取表情符号作为额外特征。
模型结构包含嵌入层、双向LSTM层、Attention层和全连接层:
python复制from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Embedding, Bidirectional, LSTM, Dense
def build_model(vocab_size, embedding_dim, max_length):
inputs = Input(shape=(max_length,))
x = Embedding(vocab_size, embedding_dim)(inputs)
x = Bidirectional(LSTM(128, return_sequences=True))(x)
x = AttentionLayer()(x) # 自定义Attention层
outputs = Dense(1, activation='sigmoid')(x)
model = Model(inputs=inputs, outputs=outputs)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
模型训练采用早停策略(Early Stopping)和动态学习率调整(ReduceLROnPlateau),在验证集准确率连续3个epoch不提升时降低学习率,5个epoch不提升时提前终止训练。
后端提供以下核心API端点:
| 端点 | 方法 | 描述 | 参数示例 |
|---|---|---|---|
| /api/login | POST | 用户登录 | |
| /api/analyze | POST | 单条文本分析 | |
| /api/batch-analyze | POST | 批量文件分析 | FormData(file: csv) |
| /api/history | GET | 查询分析历史 |
使用Django REST framework实现序列化和权限控制:
python复制from rest_framework.viewsets import ModelViewSet
from rest_framework.permissions import IsAuthenticated
class AnalysisViewSet(ModelViewSet):
permission_classes = [IsAuthenticated]
@action(detail=False, methods=['post'])
def single_analysis(self, request):
text = request.data.get('text')
# 调用模型预测
result = predict(text)
return Response({'sentiment': result})
主要页面组件结构:
关键交互逻辑示例(使用axios):
javascript复制// 文本分析请求
async analyzeText() {
try {
const res = await this.$axios.post('/api/analyze', {
text: this.inputText
})
this.result = res.data.sentiment > 0.5 ? '积极' : '消极'
} catch (err) {
this.$message.error('分析失败')
}
}
推荐使用Docker容器化部署,目录结构如下:
code复制├── docker-compose.yml
├── nginx
│ ├── Dockerfile
│ └── nginx.conf
├── backend
│ ├── Dockerfile
│ └── requirements.txt
└── frontend
├── Dockerfile
└── nginx.conf
关键配置要点:
针对高并发场景的优化措施:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 预测结果全为同一类别 | 类别不平衡或模型未收敛 | 检查训练数据分布,增加采样或调整类别权重 |
| 预测时间过长 | 输入文本过长或模型过大 | 限制输入长度,或转换为轻量级模型 |
| 对特定领域文本效果差 | 领域适配不足 | 进行领域自适应训练或微调预训练模型 |
跨域问题解决方案:
python复制CORS_ALLOWED_ORIGINS = [
"http://localhost:8080",
"http://your-domain.com"
]
CORS_ALLOW_METHODS = ['GET', 'POST']
文件上传大小限制调整:
python复制# settings.py
DATA_UPLOAD_MAX_MEMORY_SIZE = 10 * 1024 * 1024 # 10MB
在实际开发中,我们发现中文编码问题是最常见的坑之一。建议统一使用UTF-8编码,并在所有文件操作中明确指定:
python复制with open('file.txt', 'r', encoding='utf-8') as f:
content = f.read()