古诗词知识图谱与智能分析系统开发实践

1. 项目概述:古诗词知识图谱与智能分析系统

这个毕业设计项目融合了自然语言处理、知识图谱和深度学习技术,构建了一个面向中华古诗词的多功能分析系统。系统主要包含四大核心模块:知识图谱构建与可视化、情感分析、智能问答以及AI自动写诗功能。作为计算机专业的综合性毕业设计,它涵盖了从数据采集、知识表示到智能应用的全流程开发。

我在实际开发中发现,古诗词领域的数据具有独特的结构化特征:每首诗包含标题、作者、朝代、正文等固定字段,同时涉及丰富的意象、情感和典故。这种特性使其特别适合用知识图谱进行表示,也为后续的情感分析和智能创作提供了优质语料。

2. 核心技术架构解析

2.1 知识图谱构建方案

古诗词知识图谱采用Neo4j图数据库作为存储引擎,其构建流程包含三个关键步骤:

  1. 数据采集与清洗
# 示例:使用Scrapy爬取古诗文网数据 import scrapy class PoemSpider(scrapy.Spider): name = 'gushiwen' start_urls = ['https://www.gushiwen.cn'] def parse(self, response): for poem in response.css('.sons'): yield { 'title': poem.css('b::text').get(), 'author': poem.css('.source a::text').getall(), 'content': ''.join(poem.css('.contson::text').getall()) }
  1. 实体关系抽取
  • 使用BiLSTM-CRF模型进行命名实体识别
  • 基于依存句法分析提取实体关系
  • 典型实体类型:诗人、朝代、意象、典故
  1. 图谱存储设计
// Neo4j节点关系示例 CREATE (p:Poem {title:'静夜思'}) CREATE (a:Author {name:'李白', dynasty:'唐'}) CREATE (i:Image {name:'明月'}) CREATE (p)-[:WRITTEN_BY]->(a) CREATE (p)-[:CONTAINS_IMAGE]->(i)

2.2 情感分析模块实现

古诗词情感分析面临特殊挑战:文言文表达与现代汉语差异大,情感表达更为含蓄。我们采用双通道混合模型:

  1. 特征提取层
  • 使用BERT-wwm-ext获取上下文相关词向量
  • 同时采用TextCNN捕捉局部情感特征
  1. 分类器设计
class SentimentModel(nn.Module): def __init__(self, bert_path): super().__init__() self.bert = BertModel.from_pretrained(bert_path) self.conv = nn.ModuleList([ nn.Conv1d(768, 256, k) for k in [3,4,5] ]) self.fc = nn.Linear(768+256*3, 3) # 三分类:喜/哀/中 def forward(self, x): bert_out = self.bert(x)[0] # [B,L,768] cnn_out = [conv(bert_out.permute(0,2,1)) for conv in self.conv] cnn_out = torch.cat([F.max_pool1d(o, o.size(2)).squeeze(2) for o in cnn_out], 1) return self.fc(torch.cat([bert_out[:,0], cnn_out], 1))

注意事项:古诗词情感标注需要领域专家参与,我们采用"弱监督+主动学习"策略,先用规则生成初始标签,再由专家校正关键样本。

3. 智能问答系统开发

3.1 问答系统架构设计

系统采用混合式架构,结合规则匹配和深度学习:

用户问题 → 意图识别 → 知识图谱查询 → 答案生成 │ ↑ ↓ │ 语义解析 ← 向量检索

3.2 核心实现代码

class QASystem: def __init__(self, kg_conn): self.kg = kg_conn self.sim_model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2') def answer(self, question): # 意图分类 intent = self.classify_intent(question) if intent == 'author_info': cypher = f""" MATCH (a:Author)-[:WRITTEN_BY]->(p:Poem) WHERE a.name CONTAINS '{extract_entity(question)}' RETURN a.name, a.dynasty, COUNT(p) as count """ return self.kg.query(cypher) elif intent == 'poem_content': # 向量相似度检索 emb = self.sim_model.encode(question) return self.vector_search(emb) def classify_intent(question): # 使用预训练BERT进行意图分类 ...

4. AI自动写诗模块

4.1 基于Transformer的生成模型

采用GPT-2架构进行改造,关键创新点:

  1. 韵律控制
class RhymeAwareAttention(nn.Module): def __init__(self, embed_dim): super().__init__() self.rhyme_proj = nn.Linear(1, embed_dim) def forward(self, q, k, v, rhyme_pos): # rhyme_pos标记韵脚位置 rhyme_feat = self.rhyme_proj(rhyme_pos.float()) return scaled_dot_product_attention(q + rhyme_feat, k, v)
  1. 多任务学习
  • 联合训练生成和诗句补全任务
  • 使用课程学习策略,先学习五言再过渡到七言

4.2 生成效果优化技巧

  1. 温度采样策略
def temperature_sampling(logits, temp=0.7): logits = logits[:, -1, :] / temp return torch.multinomial(F.softmax(logits, dim=-1), num_samples=1)
  1. 后处理规则
  • 平仄检查
  • 意象一致性验证
  • 避免现代词汇混入

5. 可视化界面实现

5.1 技术选型

前端采用Vue+Echarts+D3.js组合:

  • Vue.js:组件化开发
  • Echarts:常规数据图表
  • D3.js:知识图谱关系可视化

5.2 核心可视化组件

// 知识图谱力导向图 function initForceGraph(container, data) { const simulation = d3.forceSimulation(data.nodes) .force("link", d3.forceLink(data.links).id(d => d.id)) .force("charge", d3.forceManyBody().strength(-500)) .force("center", d3.forceCenter(width/2, height/2)); // 绘制节点和连线 const link = container.append("g").selectAll("line") .data(data.links).enter().append("line"); const node = container.append("g").selectAll("circle") .data(data.nodes).enter().append("circle") .call(d3.drag() .on("start", dragstarted) .on("drag", dragged)); }

6. 系统集成与部署

6.1 技术栈组合

组件技术选型考虑因素
后端框架Flask + Gunicorn轻量级,适合NLP服务
数据库Neo4j + MySQL图数据+结构化数据并存
缓存Redis高频查询结果缓存
前端Vue3 + Element Plus响应式设计
部署Docker Compose环境一致性

6.2 性能优化实践

  1. 缓存策略
@app.route('/api/poem/<poem_id>') @cache.memoize(timeout=3600) def get_poem(poem_id): return db.query_poem(poem_id)
  1. 异步处理
@app.route('/generate', methods=['POST']) def generate_poem(): task = generate.delay(request.json) return {'task_id': task.id}, 202

7. 项目难点与解决方案

7.1 古诗词分词挑战

问题:传统分词工具对文言文效果差

解决方案

  • 基于BPE(Byte Pair Encoding)训练专用分词器
  • 加入平仄特征作为额外输入
class ClassicalTokenizer: def __init__(self, vocab_file): with open(vocab_file) as f: self.bpe_codes = json.load(f) def tokenize(self, text): # 实现BPE算法 tokens = [] while text: # 查找最长匹配 ... return tokens

7.2 知识图谱关系稀疏

问题:诗人关系数据不足

解决方案

  • 基于共现分析挖掘潜在关系
  • 使用TransE算法进行关系预测
def train_transE(entities, relations, triplets): # 实现TransE训练过程 for h, r, t in triplets: h_emb = entity_emb[h] t_emb = entity_emb[t] loss = torch.norm(h_emb + relation_emb[r] - t_emb, p=1) ...

8. 项目扩展方向

  1. 跨模态应用
  • 根据古诗生成意境画
  • 为画作自动题诗
  1. 教育应用
  • 古诗学习路径推荐
  • 自动批改诗词作业
  1. 技术深化
  • 引入大语言模型增强生成质量
  • 开发移动端AR鉴赏功能

这个项目完整展示了如何将传统文化与现代AI技术相结合。在实际开发中,最大的体会是:处理领域特定问题时,通用NLP模型往往需要针对性的改造。比如我们发现,直接在古诗词数据上继续预训练BERT,比使用现成的中文BERT效果提升约15%。