1. 项目概述:当古典诗词遇上AI技术栈
这个毕业设计项目完美展现了如何用现代技术解构传统文化。我们以Django框架为基础,整合LLM大语言模型的知识图谱能力,构建了一个能分析古诗词情感倾向、实现智能推荐和可视化展示的全栈系统。不同于简单的诗词检索工具,这套系统真正实现了三个维度的智能化:通过情感分析理解诗词内涵,基于知识图谱建立作品关联,利用可视化技术呈现文学脉络。
我去年指导过类似项目时发现,多数诗词平台仅停留在关键词匹配层面。而这个设计的创新点在于:让机器学会"读懂"诗词。比如李清照《声声慢》中"寻寻觅觅,冷冷清清"的孤寂感,系统能通过情感分析模型准确识别为"忧郁"类别,并与作者生平、时代背景等知识图谱节点自动关联。当用户查询婉约派作品时,不仅能推荐风格相近的诗词,还能通过关系图谱展示流派演变过程。
2. 技术架构解析
2.1 核心组件拓扑
整个系统采用分层架构设计,自底向上分为:
- 数据层:使用Neo4j图形数据库存储诗词、作者、朝代等实体关系
- 算法层:BERT+BiLSTM混合模型处理情感分析,GAT图神经网络构建知识图谱
- 应用层:Django REST framework提供API接口
- 展现层:Echarts+Vue.js实现动态可视化
特别要说明模型层的设计考量:单纯用BERT处理古汉语效果不佳,我们加入BiLSTM捕捉诗句中的序列特征。在"感时花溅泪,恨别鸟惊心"这类诗句中,BiLSTM能更好识别"溅泪→悲伤"、"惊心→痛苦"的情感递进关系。
2.2 关键技术选型对比
| 技术选项 | 替代方案 | 选择理由 |
|---|---|---|
| Django | Flask/Spring | 自带Admin后台适合快速构建数据管理界面,ORM对复杂关系型数据支持更好 |
| Neo4j | MySQL | 处理"诗人-流派-作品"这类多跳关系查询时,性能比关系型数据库高2-3个数量级 |
| ECharts | D3.js | 封装好的关系图谱、热力图等组件更成熟,适合毕业设计周期内快速实现可视化效果 |
实践建议:知识图谱存储时,建议将诗句中的意象(如"明月"、"杨柳")单独建模为节点。这样在分析"举头望明月"时,系统能自动关联所有包含"明月"意象的思乡诗。
3. 情感分析模块实现细节
3.1 古汉语情感词典构建
现有开源词典对古诗词覆盖率不足,我们采用半自动构建方案:
- 基于《汉语情感词词典》筛选基础词库
- 使用LLM对《全唐诗》进行情感标注(prompt示例:"请判断'独坐幽篁里'的情感倾向,输出JSON格式")
- 人工校验标注结果,形成包含8724个情感词的专用词典
测试表明,加入"萧瑟"、"阑珊"等古汉语特有词汇后,模型在杜甫诗集的识别准确率从68%提升到83%。
3.2 混合模型训练技巧
模型结构采用BERT-wwm-ext作为编码层,接BiLSTM捕捉诗句时序特征。关键训练参数:
python复制train_args = {
'batch_size': 32,
'learning_rate': 3e-5,
'epochs': 15,
'max_seq_len': 64 # 覆盖96%的五言/七言诗
}
遇到的实际问题:预训练模型对通假字敏感。如"见"通"现"时,原模型会错误识别情感。解决方案是在Fine-tune时加入《古代汉语词典》作为外部知识源。
4. 知识图谱构建实战
4.1 实体关系建模规范
定义六类核心节点和关系:
code复制(诗人)-[属于]->(朝代)
(诗人)-[开创]->(流派)
(诗词)-[包含]->(意象)
(意象)-[象征]->(情感)
(诗词)-[引用]->(典故)
(诗人)-[影响]->(诗人)
使用APOC插件实现自动构建:
cypher复制CALL apoc.periodic.iterate(
'MATCH (p:Poem) WHERE p.content CONTAINS "明月"
MERGE (i:Image {name:"明月"})
MERGE (p)-[r:CONTAINS]->(i)',
{batchSize:100})
4.2 图谱质量优化
初期遇到的主要问题:实体歧义。比如"李白"既指诗人也可能指酒具。通过以下策略解决:
- 添加type字段区分实体类型
- 构建别名索引表(如"青莲居士=李白")
- 设置冲突检测规则(同一朝代不重复创建诗人节点)
5. 可视化子系统设计
5.1 关系图谱呈现方案
采用力导向图+鱼眼放大技术的组合方案:
javascript复制option = {
series: [{
type: 'graph',
layout: 'force',
focusNodeAdjacency: true,
roam: true,
emphasis: { scale: 3 } // 鼠标悬停放大
}]
}
实际应用中发现,直接展示全图谱会导致节点过密。最终采用"三级递进"展示策略:
- 第一级:诗人-流派关系
- 第二级:点击诗人显示作品列表
- 第三级:点击作品展开情感分析详情
5.2 情感热力图实现
将情感值映射为HSL色彩空间:
python复制def emotion_to_color(score):
hue = 240 * (1 - score) # 0(blue)到240(red)
return f"hsl({hue}, 100%, 80%)"
这样"大漠孤烟直"的苍凉感会显示为冷色调,而"春风得意马蹄疾"则呈现暖红色。
6. 典型问题排查记录
6.1 跨朝代关系断裂
现象:查询"苏轼与李白的关系"时路径不完整
根因:未建立跨朝代的流派传承关系
解决方案:添加虚拟的"文学影响"关系边,权重设为0.7
6.2 生僻字编码问题
错误案例:《诗经·豳风》中的"䵷"字导致API报错
处理方法:
- 在Django中间件中加入Unicode规范化处理
- 数据库字符集改为utf8mb4
- 前端添加fallback字体
6.3 推荐冷启动问题
新用户没有历史数据时,采用三级降级策略:
- 优先推荐当前节气相关诗词(立春推《春晓》)
- 其次按地域推荐(IP属湖南则推屈原作品)
- 最后fallback到TOP100热门诗词
7. 部署与性能优化
7.1 生产环境配置建议
针对学生服务器资源有限的情况,给出以下优化方案:
nginx复制# 启用Gzip压缩特别有效,因为诗词平均长度<100字
gzip_types text/plain application/json text/css application/javascript;
gzip_min_length 50; # 远低于默认值
7.2 缓存策略设计
采用分层缓存机制:
- 高频查询(如TOP100诗词):
python复制@cache_page(60 * 60 * 24, key_prefix="top100") def get_hot_poems(request): ... - 知识图谱查询:使用Redis缓存Cypher语句结果
- 静态资源:配置CDN加速
8. 项目扩展方向
在实际部署后,我发现几个值得深化的方向:
-
意象时空分析:将"杨柳""明月"等意象的出现频率按朝代可视化,可以发现唐代边塞诗多用"孤城",而宋词偏爱"阑干"
-
诗人社交网络:通过唱和诗、题跋等数据构建诗人关系图,韩愈作为文坛领袖的中心度(centrality)高达0.73
-
方言发音模拟:用TTS技术还原中古汉语读音,需要特别注意平仄与破读字处理
这个项目最让我惊喜的是,当系统把辛弃疾的《青玉案》与唐代边塞诗关联起来时,确实展现出了文学史上不易察觉的承袭关系。技术不只是工具,它给了我们重新发现传统的全新视角。