1. 项目概述:当古诗词遇上知识图谱
作为一名长期从事文化数据分析的开发者,我一直在思考如何用技术手段让传统文化焕发新生。去年接手的一个古诗词知识图谱项目,让我找到了答案。这个系统以《全唐诗》《全宋词》为基础数据源,构建了包含10万+实体关系的知识网络,实现了三大突破:
- 结构化解析:将零散的古诗词转化为可计算的图数据节点(诗人、朝代、意象等)和关系边(创作、引用、同游等)
- 多维关联:揭示李白与杜甫的交往频次、明月意象的时代演变等传统研究难以量化的隐性知识
- 动态交互:通过可视化技术让用户像探索社交网络一样"玩转"古诗词
技术选型上我们采用Python+Neo4j技术栈,相比传统关系型数据库,图数据库在处理"诗人A-引用-诗人B-同游-诗人C"这类多层关系时,查询效率提升20倍以上。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 数据采集与清洗
数据是知识图谱的基石。我们主要从三个维度获取原始数据:
- 结构化数据采集:
- 使用Scrapy框架爬取古诗文网等平台
- 关键字段包括:诗词全文、标题、作者、朝代、注释
- 反爬策略:随机User-Agent + 动态IP池 + 请求间隔控制
python复制# 示例:诗词元数据爬取
def parse_poem(response):
item = {}
item['title'] = response.xpath('//h1/text()').get().strip()
item['author'] = response.xpath('//div[@class="author"]/a/text()').get()
item['dynasty'] = response.xpath('//div[@class="author"]/text()').re(r'((.*?))')[0]
item['content'] = '\n'.join(response.xpath('//div[@class="content"]/text()').getall())
yield item
-
非结构化数据处理:
- 古籍扫描件通过PaddleOCR识别
- 使用正则表达式清理特殊符号(如□表示缺字)
- 构建专有名词词典提升分词准确率
-
数据标准化难点:
- 诗人别名处理(如苏轼=苏东坡=东坡居士)
- 朝代时间重叠(如唐末五代时期)
- 地点古今对照(长安→西安,汴京→开封)
2.2 知识图谱构建
2.2.1 图数据库建模
选择Neo4j的三大理由:
- 原生图存储引擎,避免关系型数据库的多表连接
- Cypher查询语言直观表达图遍历逻辑
- 支持ACID事务保证数据一致性
实体关系模型设计:
mermaid复制graph LR
Poet --创作--> Poem
Poe
