1. 项目概述:古诗词情感分析系统的技术实现
作为一名长期从事自然语言处理与Web应用开发的工程师,我最近完成了一个结合大语言模型与知识图谱技术的古诗词情感分析系统。这个项目源于我在古典文学数字化领域的探索,旨在解决传统文本分析方法难以捕捉古诗词深层情感表达的问题。
系统采用Django作为Web框架,集成DeepSeek大模型进行语义理解,同时构建专门针对古诗词领域的知识图谱来增强分析能力。与常规情感分析不同,我们特别关注古诗词中特有的隐喻、典故等修辞手法,通过技术手段实现了对这些复杂表达的情感解读。
从技术角度看,这个项目完美融合了现代AI技术与传统文化研究的需求。系统不仅能自动标注诗词的情感倾向(如"豪放"、"婉约"、"哀怨"等),还能可视化展示分析结果,为文学研究者、教育工作者和学生提供了全新的分析工具。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计与技术选型
2.1 整体架构设计
系统采用典型的三层架构设计,各层之间通过定义良好的接口进行通信:
-
数据层:负责存储和管理所有数据,包括:
- MySQL关系型数据库:存储结构化的诗词文本、作者信息和用户数据
- Neo4j图数据库:存储构建的知识图谱,包含诗人关系、典故解释等图结构数据
- 文件存储:保存模型参数和预处理后的数据集
-
模型层:系统的AI核心,包含:
- DeepSeek大模型微调服务:处理诗词语义理解和情感分析
- 知识图谱查询引擎:提供上下文信息补充
- 缓存服务:优化高频查询响应速度
-
应用层:面向用户的交互界面和API,包括:
- Django Web应用:提供用户界面和业务逻辑
- RESTful API:支持第三方系统集成
- 任务队列:处理异步分析任务
在实际部署中,我们使用Docker容器化各组件,通过Kubernetes进行编排,确保系统的高可用性和可扩展性。
2.2 关键技术选型考量
选择Django作为Web框架主要基于以下考虑:
- 完善的ORM支持,简化数据库操作
- 内置的管理后台,方便内容管理
- 丰富的第三方插件生态
- Python语言的天然优势,便于与AI组件集成
DeepSeek大模型的选型则考虑了:
- 对中文语义的优秀理解能力
- 支持LoRA等高效微调技术
- 相对友好的计算资源需求
- 良好的文档和社区支持
知识图谱选用Neo4j因为:
- 直观的图数据建模方式
- 强大的Cypher查询语言
- 对复杂关系查询的高效支持
- 与Python生态的良好兼容性
3. 知识图谱构建与优化
3.1 数据采集与预处理
构建高质量的知识图谱是系统成功的关键。我们采用了多源数据融合的策略:
主要数据来源:
- 公开古籍数据库:如中国哲学书电子化计划(CTEXT)、《全唐诗》电子版等
- 权威文学研究网站:获取诗人传记、创作背景等资料
- 学术论文和专著:提取专业的诗词解读和注释
数据清洗流程:
- 去重:消除不同来源中的重复记录
- 标准化:统一时间、地点等信息的表示方式
- 纠错:修正明显的录入错误和矛盾
- 补全:通过交叉验证填补缺失的重要信息
实体识别与关系抽取:
我们使用经过领域适配的Spacy中文模型进行命名实体识别,准确率达到了92.3%。针对古诗词特点,特别优化了以下实体类型:
- 人名(诗人、历史人物)
- 地名(古代与现代地理名称)
- 典故(文学、历史典故)
- 意象(常用诗词意象如"明月"、"杨柳"等)
3.2 图数据库设计与实现
Neo4j图模型设计遵循以下原则:
- 节点类型明确,属性完整
- 关系定义清晰,带有语义标签
- 避免过度复杂的图结构
- 考虑查询效率优化
核心节点类型:
cypher复制CREATE (p:Poet {
name: "李白",
dynasty: "唐",
birth_year: 701,
death_year: 762,
style: "豪放",
bio: "唐代著名诗人,字太白,号青莲居士..."
})
CREATE (poem:Poem {
title: "将进酒",
content: "君不见黄河之水天上来...",
era: "盛唐"
})
CREATE (a:Allusion {
name: "折柳",
meaning: "象征离别之情",
origin: "《诗经·小雅·采薇》"
})
典型关系定义:
cypher复制MATCH (p:Poet {name: "李白"}), (poem:Poem {title: "将进酒"})
CREATE (p)-[:WROTE]->(poem)
MATCH (a:Allusion {name: "折柳"}), (poem:Poem {title: "春夜洛城闻笛"})
CREATE (poem)-[:CONTAINS]->(a)
查询优化技巧:
- 为高频查询属性建立索引
- 使用APOC库的过程进行复杂查询
- 对大规模查询实施分页处理
- 缓存常用查询结果
4. 大模型微调与情感分析引擎
4.1 领域数据准备与增强
古诗词情感分析面临的最大挑战是标注数据的稀缺性。我们采用以下策略构建训练集:
原始数据收集:
- 从3000首经典诗词中人工标注情感标签
- 邀请古典文学专家参与标注
- 对每首诗词标注主要情感和次要情感
- 记录标注过程中的争议和讨论
数据增强方法:
- 同义词替换:保持情感不变的情况下替换词汇
- 典故替换:用相同情感的不同典故进行替换
- 句式变换:调整语序和表达方式
- 风格模仿:基于诗人风格生成新样本
标注示例:
json复制{
"text": "床前明月光,疑是地上霜。举头望明月,低头思故乡。",
"main_sentiment": "思乡",
"secondary_sentiment": ["孤独", "忧郁"],
"allusions": [
{
"text": "明月",
"meaning": "象征思乡之情",
"source": "传统文化意象"
}
]
}
4.2 模型微调技术实现
我们采用LoRA(Low-Rank Adaptation)技术对DeepSeek模型进行高效微调:
LoRA配置:
python复制from peft import LoraConfig
lora_config = LoraConfig(
r=8, # 低秩矩阵的维度
lora_alpha=16, # 缩放因子
target_modules=["q_proj", "v_proj"], # 适配的注意力模块
lora_dropout=0.05,
bias="none",
task_type="SEQ_CLASSIFICATION"
)
训练关键参数:
- 学习率:3e-5(使用余弦退火调度)
- 批大小:16(受限于GPU显存)
- 训练轮次:10
- 损失函数:带权重的多标签交叉熵
输入输出设计:
输入格式结合原始文本和知识图谱上下文:
code复制[诗词文本] 静夜思·李白\n床前明月光,疑是地上霜。\n
[知识上下文] 李白(701-762),唐代诗人;'明月'常象征思乡;此诗作于作者客居他乡时。
输出为多标签情感概率分布:
json复制{
"思乡": 0.92,
"孤独": 0.85,
"忧郁": 0.78,
"闲适": 0.12,
"豪迈": 0.05
}
4.3 知识图谱增强策略
为提高模型对特定文化背景的理解,我们设计了知识图谱增强机制:
- 实体链接:识别诗词中的实体并链接到知识图谱
- 上下文提取:查询相关实体的背景信息
- 信息融合:将知识图谱信息与原始文本结合输入模型
实现代码示例:
python复制def enhance_with_knowledge_graph(poem_text):
# 实体识别
entities = ner_model(poem_text)
# 知识图谱查询
context = []
for entity in entities:
query = f"""
MATCH (n)
WHERE n.name = '{entity["text"]}' OR '{entity["text"]}' IN n.aliases
RETURN n
"""
result = neo4j_session.run(query)
context.extend([dict(record["n"]) for record in result])
# 上下文生成
context_str = "\n".join(
f"{item['name']}: {item.get('description', '')}"
for item in context
)
return f"[诗词文本] {poem_text}\n[知识上下文] {context_str}"
5. Django系统实现与优化
5.1 后端服务架构
Django项目的核心应用包括:
- poem:诗词数据管理
- analysis:情感分析服务
- knowledge:知识图谱接口
- visualization:可视化数据生成
模型定义示例:
python复制from django.db import models
from django.contrib.postgres.fields import JSONField
class Poem(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey('Poet', on_delete=models.CASCADE)
content = models.TextField()
dynasty = models.CharField(max_length=50)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
indexes = [
models.Index(fields=['title']),
models.Index(fields=['author']),
]
class AnalysisResult(models.Model):
poem = models.OneToOneField('Poem', on_delete=models.CASCADE)
sentiment = JSONField() # 存储情感概率分布
allusions = JSONField() # 识别的典故列表
generated_at = models.DateTimeField(auto_now_add=True)
version = models.CharField(max_length=50) # 模型版本
5.2 异步任务处理
为避免长时间的分析任务阻塞Web请求,我们使用Celery实现异步处理:
Celery配置:
python复制# settings.py
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/1'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
分析任务示例:
python复制@app.task(bind=True)
def analyze_poem_task(self, poem_id):
poem = Poem.objects.get(pk=poem_id)
# 检查缓存
cached_result = cache.get(f'analysis_{poem_id}')
if cached_result:
return cached_result
# 调用模型服务
enhanced_text = enhance_with_knowledge_graph(poem.content)
result = requests.post(
MODEL_SERVICE_URL,
json={'text': enhanced_text},
timeout=30
).json()
# 保存结果
analysis = AnalysisResult.objects.create(
poem=poem,
sentiment=result['sentiment'],
allusions=result['allusions'],
version=MODEL_VERSION
)
# 设置缓存
cache.set(f'analysis_{poem_id}', result, timeout=3600)
return result
5.3 性能优化实践
在实际部署中,我们实施了多项性能优化措施:
-
数据库优化:
- 为高频查询字段添加索引
- 使用select_related和prefetch_related减少查询次数
- 对大文本字段实施延迟加载
-
缓存策略:
- 使用Redis缓存热门诗词的分析结果
- 实现模型输出的内存缓存
- 对静态资源设置CDN缓存
-
前端优化:
- 使用Django-compressor压缩静态资源
- 实现懒加载图片和图表
- 采用分页加载长列表
-
服务监控:
- 使用Prometheus收集性能指标
- 配置Grafana仪表板监控关键指标
- 设置异常报警机制
6. 系统功能展示与使用指南
6.1 核心功能演示
系统提供以下主要功能界面:
-
诗词浏览页面:
- 按朝代、作者、情感类型筛选
- 全文搜索支持
- 分页展示列表
-
情感分析详情页:
- 诗词文本展示(带典故高亮)
- 情感雷达图可视化
- 历史背景和创作解析
-
知识图谱探索页:
- 交互式图数据浏览
- 实体关系可视化
- 关联诗词展示
-
批量分析接口:
- 支持上传诗词文件批量分析
- 提供分析进度查询
- 生成汇总报告下载
6.2 可视化实现技巧
我们使用ECharts实现丰富的可视化效果:
情感雷达图:
javascript复制function initSentimentRadar(sentimentData) {
const chart = echarts.init(document.getElementById('radar-chart'));
const option = {
radar: {
indicator: Object.keys(sentimentData).map(name => ({
name: name,
max: 1
})),
shape: 'circle',
splitNumber: 5,
axisName: {
color: '#333'
}
},
series: [{
type: 'radar',
data: [{
value: Object.values(sentimentData),
name: '情感分布',
areaStyle: {
color: 'rgba(65, 105, 225, 0.6)'
}
}]
}]
};
chart.setOption(option);
window.addEventListener('resize', chart.resize);
}
知识图谱关系图:
javascript复制function renderKnowledgeGraph(graphData) {
const chart = echarts.init(document.getElementById('kg-graph'));
const option = {
tooltip: {},
legend: {
data: graphData.categories.map(c => c.name)
},
series: [{
type: 'graph',
layout: 'force',
data: graphData.nodes,
links: graphData.links,
categories: graphData.categories,
roam: true,
label: {
show: true,
position: 'right'
},
force: {
repulsion: 100,
edgeLength: [50, 200]
},
emphasis: {
focus: 'adjacency',
label: {
show: true
}
}
}]
};
chart.setOption(option);
}
6.3 典型使用场景
-
文学研究:
- 分析特定诗人的情感表达特点
- 追踪情感主题的历史演变
- 比较不同时期或流派的情感特征
-
教学应用:
- 帮助学生理解诗词情感内涵
- 可视化展示诗词间的关联
- 提供创作背景的深度解读
-
文化传播:
- 发现诗词中的情感共鸣点
- 构建个性化的诗词推荐
- 开发互动式文化体验应用
7. 部署实践与运维经验
7.1 生产环境部署方案
我们采用Docker Compose进行服务编排,主要包含以下服务:
- Web服务:Django + Gunicorn + Nginx
- 数据库服务:MySQL + Neo4j
- 缓存服务:Redis
- 模型服务:FastAPI + Triton Inference Server
- 任务队列:Celery + Redis
docker-compose.yml关键配置:
yaml复制version: '3.8'
services:
web:
build: ./web
ports:
- "8000:8000"
depends_on:
- redis
- db
- neo4j
environment:
- DJANGO_SETTINGS_MODULE=config.settings.production
- CELERY_BROKER=redis://redis:6379/0
model:
build: ./model
ports:
- "5000:5000"
deploy:
resources:
limits:
cpus: '4'
memory: 8G
redis:
image: redis:6
ports:
- "6379:6379"
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_NAME}
volumes:
- db_data:/var/lib/mysql
neo4j:
image: neo4j:4.4
environment:
NEO4J_AUTH: neo4j/${NEO4J_PASSWORD}
ports:
- "7474:7474"
- "7687:7687"
volumes:
- neo4j_data:/data
volumes:
db_data:
neo4j_data:
7.2 性能监控与调优
生产环境监控体系包括:
-
基础设施监控:
- 使用Node Exporter收集服务器指标
- 监控CPU、内存、磁盘和网络使用情况
- 设置资源使用阈值告警
-
应用性能监控:
- Django应用集成Prometheus客户端
- 跟踪请求延迟、错误率和吞吐量
- 记录慢查询和性能瓶颈
-
模型服务监控:
- 监控推理延迟和成功率
- 跟踪GPU利用率(如果使用)
- 记录模型预测质量指标
关键Grafana面板指标:
- 请求响应时间(P50, P95, P99)
- 数据库查询性能
- 缓存命中率
- 任务队列积压情况
- 模型推理延迟分布
7.3 安全防护措施
为确保系统安全,我们实施了以下防护措施:
-
数据安全:
- 数据库连接使用SSL加密
- 敏感信息加密存储
- 定期数据备份验证
-
应用安全:
- 实施CSRF和XSS防护
- 严格的输入验证和过滤
- 基于角色的访问控制(RBAC)
-
API安全:
- JWT身份验证
- 速率限制防止滥用
- 详细的访问日志记录
-
基础设施安全:
- 网络隔离(VPC和安全组)
- 定期安全补丁更新
- 入侵检测系统监控
8. 项目总结与经验分享
8.1 技术挑战与解决方案
在项目开发过程中,我们遇到了几个关键挑战:
-
隐喻理解难题:
- 问题:传统模型难以理解"明月"象征"思乡"这类文化特定隐喻
- 解决方案:构建专门的隐喻知识库,并在模型训练中强化这类样本
-
多情感混合问题:
- 问题:一首诗常包含多种交织的情感
- 解决方案:采用多标签分类框架,设计专门的损失函数
-
领域数据稀缺:
- 问题:标注的古诗词情感数据有限
- 解决方案:使用数据增强和迁移学习技术
-
计算资源限制:
- 问题:大模型微调需要大量GPU资源
- 解决方案:采用LoRA等高效微调技术,优化训练流程
8.2 实际应用效果
系统上线后,在多个场景中展现了良好效果:
-
学术研究:
- 帮助研究者发现诗人情感表达规律
- 量化分析诗词情感特征的历史演变
- 支持跨诗人、跨流派的比较研究
-
教育教学:
- 提升学生对诗词情感的理解深度
- 可视化展示增强学习兴趣
- 提供个性化的诗词推荐
-
文化传播:
- 通过情感共鸣增强文化感染力
- 开发互动式文化体验应用
- 支持多语言环境下的文化传播
8.3 未来改进方向
基于当前成果,我们规划了以下改进方向:
-
模型能力提升:
- 引入更大规模的领域预训练
- 探索多模态情感分析(结合书法、吟诵等)
- 开发诗人专属的个性化模型
-
知识图谱扩展:
- 纳入更多历史背景信息
- 建立跨文化的典故关联
- 开发时间轴可视化功能
-
系统功能增强:
- 增加协作标注工具
- 开发移动端应用
- 实现个性化推荐系统
-
应用场景拓展:
- 诗词创作辅助工具
- 文化传承游戏化应用
- 跨学科研究平台
在实际开发中,我发现系统性能对知识图谱查询效率非常敏感。一个实用的优化技巧是为高频查询路径预先计算并缓存结果,这能显著提升用户体验。另外,在处理古诗词文本时,特别需要注意繁简体转换和异体字处理,我们最终建立了一个专门的文本规范化管道来解决这个问题。
