作为一名在自然语言处理领域摸爬滚打多年的开发者,去年我接手了一个让我眼前一亮的毕业设计指导项目——基于知识图谱的古诗词智能系统。这个看似传统的文科课题,实际上融合了知识图谱构建、情感计算、智能问答和生成式AI四大技术模块。最让我惊讶的是,当学生用Python将苏轼的《水调歌头》节点与"思乡"、"中秋"等情感标签通过图数据库关联起来时,那些沉睡千年的文字突然在屏幕上"活"了过来。
这个系统的核心价值在于它解决了三个痛点:一是通过可视化技术降低了古诗词的认知门槛,二是用情感分析量化了诗人的创作风格,三是借助大模型实现了"与李白对话"的沉浸式体验。对于计算机专业的学生而言,它完美平衡了技术深度与文化内涵;对于文史爱好者,则提供了全新的研究工具。在接下来的内容里,我将拆解这个项目的技术实现路径,包括如何从零构建包含5万+诗词实体的知识图谱,以及如何让BERT模型理解"杨柳岸晓风残月"中的离愁别绪。
我们对比了三种主流方案:
Neo4j vs NetworkX:最终选择Neo4j图数据库(社区版)存储诗词关系,其Cypher查询语言对"诗人-朝代-题材"这类多跳查询性能优于NetworkX的Python实现。实测显示,查询杜甫所有边塞诗的响应时间从NetworkX的1200ms降至Neo4j的80ms。
SnowNLP vs LTP:情感分析模块测试发现,哈尔滨工业大学的LTP工具包在古汉语情感极性判断准确率达到78.3%,比通用SnowNLP高22个百分点。特别是对"凭栏处潇潇雨歇"这类复杂意象,LTP的依存句法分析能准确捕捉"潇潇"对"雨"的情感强化作用。
Seq2Seq vs GPT:写诗模块中,采用LoRA微调的ChatGLM2-6B在七言绝句生成任务上,其韵律合格率(92%)远超传统Seq2Seq模型(64%),且能保持"春风又绿江南岸"式的意象连贯性。
我们的ETL流程包含四个关键步骤:
数据采集:用Scrapy爬取古诗文网(www.gushiwen.cn)的50万条数据,通过XPath提取正文、注释、赏析等字段。遇到的反爬策略主要是动态Cookie,解决方案是在DownloaderMiddleware中模拟登录态保持。
实体识别:使用LAC(Lexical Analysis for Chinese)进行命名实体识别时,发现其对古汉语地名识别率不足。我们通过添加《中国历史地图集》的地名库,将"长安"、"汴京"等古地名的识别F1值从0.61提升到0.89。
关系抽取:采用基于依存句法的规则匹配方法,从"李白《赠汪伦》"这类文本中提取"作者-作品"关系。对于"苏轼效法陶渊明"这类隐含关系,则用BERT构建的语义相似度模型进行推断。
图谱构建:最终形成的图谱包含:
特别注意:古诗词中的通假字(如"见"通"现")需要在数据清洗阶段统一处理,否则会影响后续分析。我们建立了包含1200组通假字的映射表进行标准化。
采用PyVis库构建前端交互界面时,遇到大规模节点渲染性能问题。通过以下优化实现流畅交互:
python复制# Neo4j数据导出示例
from py2neo import Graph
graph = Graph("bolt://localhost:7687", auth=("neo4j", "password"))
query = """
MATCH (p:Poem)-[r:WRITTEN_BY]->(a:Author)
WHERE a.name = '李白'
RETURN p.title as poem, p.dynasty as dynasty
"""
df = graph.run(query).to_data_frame()
古诗词情感分析的难点在于隐喻表达。我们构建了双层分析体系:
词典层:整合《汉语情感词库》与自建的800个古典意象情感标签
模型层:在LCQMC数据集上微调BERT-wwm-ext,加入注意力机制聚焦关键意象。对"感时花溅泪"的测试显示:
模型评估结果:
| 测试集 | 准确率 | 召回率 | F1值 |
|---|---|---|---|
| 唐诗 | 81.2% | 79.8% | 0.805 |
| 宋词 | 76.4% | 74.1% | 0.752 |
基于RAG(Retrieval-Augmented Generation)架构实现:
检索模块:用FAISS构建诗词向量索引,Sentence-BERT编码查询语句。对"找几首描写秋天思乡的诗"这类查询,通过计算"秋天"、"思乡"与诗词内容的余弦相似度排序结果。
生成模块:采用Prompt模板引导ChatGLM生成符合语境的回答。关键技巧包括:
问答示例:
code复制用户:为什么杜甫被称为"诗圣"?
系统:根据《新唐书》记载和历代评论,杜甫获此称号主要有三个原因:
1. 艺术成就:"语不惊人死不休"的创作态度
2. 思想深度:"朱门酒肉臭"的社会关怀
3. 历史地位:集前代诗歌艺术之大成
(引用《杜甫研究学刊》2018年第3期)
在ChatGLM2-6B基础上进行三阶段微调:
生成效果对比:
| 输入提示 | 普通GPT输出 | 我们的模型输出 |
|---|---|---|
| "生成一首描写边塞的七绝" | "大漠风尘日色昏(合律) 红旗半卷出辕门(意象突兀)" |
"黄沙百战穿金甲(合律) 不破楼兰终不还(意境连贯)" |
在AWS c5.2xlarge实例上测试时,发现三个性能痛点:
知识图谱查询延迟:优化前平均响应时间2.3s
大模型推理内存溢出:加载6B模型需要24GB内存
并发请求处理:当50+用户同时提问时API超时
基于Vue.js+Element UI实现的功能亮点:
javascript复制// 情感趋势可视化示例
const options = {
xAxis: {
data: ['青年期', '中年期', '晚年期']
},
series: [{
name: '积极情绪',
data: [0.6, 0.4, 0.3],
markLine: {
data: [{ type: 'average', name: '平均值' }]
}
}]
}
问题1:诗人别名字段冗余
问题2:时空冲突校验
错误类型1:反语误判
错误类型2:典故误解
问题:生成现代语汇
这个项目给我的最大启示是:当技术遇上人文,产生的不是简单的工具替代,而是认知维度的拓展。有学生在验收时说:"原来‘云想衣裳花想容’里的‘想’字,在情感分析系统里会亮起粉红色的光。"这种数字技术与传统美学的化学反应,或许正是计算机专业做文化类项目的独特价值。