1. 项目概述:中华古诗词智能分析系统全栈开发实录
去年参与某文化机构委托的古诗词数字化项目时,我深刻体会到传统文学研究与现代技术融合的痛点——研究人员需要手动翻阅大量典籍来建立诗人间的关联,而教学机构则缺乏直观展示诗词情感特征的工具。这正是我们开发这套中华古诗词智能分析系统的初衷:通过知识图谱构建诗词间的语义网络,结合情感分析模型量化诗词情感特征,最终以可视化形式呈现传统文化的数据之美。
这个毕业设计级别的项目完整实现了以下核心功能链:
- 基于Scrapy+BeautifulSoup的多源诗词数据采集管道
- 使用BiLSTM-CRF模型进行古汉语命名实体识别
- Neo4j图数据库构建包含50万+节点的诗词知识网络
- 基于RoBERTa-wwm-ext的细粒度情感分析模型(准确率89.2%)
- 采用Vue+D3.js的前端可视化矩阵
2. 核心架构设计与技术选型
2.1 整体技术栈布局
系统采用典型的三层架构设计,在技术选型上特别考虑了古诗词文本处理的特殊性:
code复制数据层:Scrapy爬虫集群 + MySQL8.0 + Neo4j 4.4
处理层:Jieba分词 + LTP4.0 + PyTorch1.12
应用层:Flask-RESTful + Vue3 + ECharts5
技术选型关键考量:古诗词中存在大量通假字和倒装句式,需要同时支持现代汉语和文言文处理的工具链。我们最终选用LTP而非StanfordNLP,因其在古汉语词性标注任务上的F1值高出7.3个百分点。
2.2 知识图谱Schema设计
诗词知识图谱的实体-关系模型经过三次迭代优化,最终确定的Schema包含6类实体和12类关系:
mermaid复制erDiagram
POET ||--o{ POEM : "创作"
POEM ||--|{ IMAGE : "包含"
POEM ||--|| DYNASTY : "所属朝代"
POET ||--|| DYNASTY : "活跃于"
IMAGE ||--o{ THEME : "象征"
THEME ||--o{ EMOTION : "关联情感"
实际存储时采用Neo4j的索引优化策略:
- 为高频查询的诗人节点建立全文索引
- 对"创作"关系添加时间属性(create_year)
- 使用APOC库实现意象节点的自动聚类
3. 数据采集与预处理实战
3.1 多源数据采集方案
我们构建了分布式爬虫系统来应对不同数据源的结构差异:
python复制class PoemSpider(scrapy.Spider):
custom_settings = {
'DOWNLOAD_DELAY': 2,
'CONCURRENT_REQUESTS_PER_DOMAIN': 4
}
def parse(self, response):
# 处理古诗文网的特殊编码
text = response.xpath('//div[@class="cont"]/text()').extract()
yield {
'title': self.clean_title(text[0]),
'author': self.parse_author(text[1]),
'content': ''.join(text[2:])
}
关键处理技巧:
- 对《全唐诗》PDF版本使用OCR+人工校验
- 针对搜韵网的动态加载采用Selenium中间件
- 建立朝代名称映射表(如"唐"→"唐朝")
3.2 数据清洗管道设计
原始数据中存在三大典型问题需要处理:
- 异体字问题(如"峯"→"峰")
- 注释混入正文("[注]"开头的行)
- 作者别名归一化("李太白"→"李白")
我们开发了基于规则+模型的混合清洗方案:
python复制def clean_content(text):
# 异体字转换
with open('variant_chars.json') as f:
mapping = json.load(f)
for old, new in mapping.items():
text = text.replace(old, new)
# 去除注释
text = re.sub(r'\[.*?\]', '', text)
# 标点标准化
return normalize_punctuation(text)
清洗后的数据质量指标:
- 字符级准确率:99.87%
- 元数据完整度:98.2%
- 重复数据去除率:12.3%
4. 知识图谱构建核心技术
4.1 古汉语实体识别模型
针对古诗词中的特殊实体类型,我们在BERT-base基础上进行领域适配:
python复制class PoetryNERModel(nn.Module):
def __init__(self, pretrained_path):
super().__init__()
self.bert = BertModel.from_pretrained(pretrained_path)
self.bilstm = nn.LSTM(
input_size=768,
hidden_size=256,
bidirectional=True
)
self.crf = CRF(num_tags=len(tag2id))
def forward(self, input_ids, attention_mask):
outputs = self.bert(input_ids, attention_mask)
lstm_out, _ = self.bilstm(outputs.last_hidden_state)
return self.crf.decode(lstm_out)
模型训练关键参数:
- 学习率:2e-5(前2epoch)→5e-6(后续)
- Batch size:32(受限显存)
- 最大序列长度:128(覆盖95%诗句)
在自建测试集上的表现:
| 实体类型 | 精确率 | 召回率 | F1值 |
|---|---|---|---|
| 诗人 | 94.2% | 93.7% | 94.0% |
| 地名 | 88.5% | 86.2% | 87.3% |
| 意象 | 91.1% | 90.3% | 90.7% |
4.2 关系抽取实践
采用半监督学习策略解决标注数据不足的问题:
- 人工标注2000条高质量关系样本
- 使用Bootstrapping方法扩展训练集
- 构建基于注意力机制的关系分类器
典型关系抽取规则示例:
python复制def extract_creator_relation(doc):
patterns = [
[{'POS':'PROPN'}, {'LEMMA':'作'}, {'POS':'NOUN'}],
[{'POS':'NOUN'}, {'LEMMA':'出自'}, {'POS':'PROPN'}]
]
matcher = PhraseMatcher(nlp.vocab)
for pattern in patterns:
matcher.add("CREATOR", [pattern])
return matcher(doc)
5. 情感分析模型优化之路
5.1 领域适应预训练
我们发现通用BERT在古诗词情感分析任务上表现不佳(准确率仅72%),因此进行两阶段优化:
-
继续预训练:
- 语料:30万首古诗词+50万条注释
- 新增训练目标:对仗句预测、韵脚预测
-
任务微调:
- 标签体系:7类细粒度情感(哀愁、豪迈、闲适等)
- 采用Label Smoothing缓解样本不均衡
优化前后对比:
| 模型版本 | 准确率 | Macro-F1 |
|---|---|---|
| BERT-base | 72.1% | 68.3% |
| 领域BERT | 85.6% | 83.2% |
| +对抗训练 | 89.2% | 87.8% |
5.2 混合分析策略
最终系统采用模型+规则的双通道分析方案:
python复制def analyze_emotion(text):
# 模型预测
model_pred = bert_model.predict(text)
# 规则匹配
rule_score = 0
for word in jieba.cut(text):
if word in emotion_lexicon:
rule_score += emotion_lexicon[word]
# 加权融合
final_label = model_pred if abs(rule_score) < 2 else \
'positive' if rule_score > 0 else 'negative'
return final_label
6. 可视化系统开发关键点
6.1 知识图谱可视化优化
面对大规模图数据渲染的挑战,我们实现以下优化:
- 基于WebWorker的异步布局计算
- 采用QuadTree进行碰撞检测
- 实现LOD(Level of Detail)分级展示:
javascript复制function updateGraphDetail(zoomLevel) {
if (zoomLevel > 5) {
showAllNodesAndLinks();
} else if (zoomLevel > 3) {
showMajorAuthors();
} else {
showDynastyOverview();
}
}
6.2 情感可视化设计
创新性地采用"情感地图"形式展示时空分布:
javascript复制const options = {
timeline: {
data: dynasties,
autoPlay: true
},
series: [{
type: 'scatter',
coordinateSystem: 'geo',
symbolSize: function(val) {
return Math.sqrt(val[2]) * 5;
},
data: convertToGeoData(emotionData)
}]
};
7. 部署与性能优化
7.1 微服务化部署方案
系统采用Docker Compose编排关键服务:
yaml复制version: '3'
services:
neo4j:
image: neo4j:4.4
ports: ["7474:7474", "7687:7687"]
volumes:
- ./neo4j/data:/data
api:
build: ./backend
ports: ["5000:5000"]
depends_on:
- neo4j
frontend:
build: ./frontend
ports: ["8080:8080"]
7.2 性能瓶颈突破
通过压力测试发现的三个关键优化点:
-
知识图谱查询优化:
- 使用APOC库的路径展开替代多跳查询
- 对常用查询建立预计算视图
-
情感分析服务批处理:
- 将单条请求改为批量处理
- 实现动态批处理大小调整算法
优化前后性能对比(100并发):
| 场景 | 平均响应时间 | 吞吐量 |
|---|---|---|
| 原始 | 1243ms | 78qps |
| 优化 | 467ms | 214qps |
8. 项目扩展方向
在实际使用中我们发现了几个有价值的扩展点:
-
跨模态分析:
- 关联历代书画作品中的意象
- 构建"诗画共现"关系网络
-
风格迁移应用:
- 基于GPT-3微调的古诗生成
- 实现"杜甫风格写现代事"等趣味功能
-
教学辅助功能:
- 自动生成诗词鉴赏模板
- 知识点关联推荐系统
这个项目给我的深刻启示是:传统文化与AI技术的结合,不仅需要算法创新,更需要领域知识的深度融入。我们在开发过程中与多位古文学专家合作,仅标注规范就迭代了17个版本,这才使得系统最终能准确识别"折柳"的离别意象、"明月"的思乡内涵等文化符号。
