1. 项目概述:古诗词知识图谱与智能分析系统
这个毕业设计项目融合了自然语言处理、知识图谱和深度学习技术,构建了一个面向中华古诗词的多功能分析系统。系统主要包含四大核心模块:知识图谱构建与可视化、情感分析、智能问答以及AI自动写诗功能。作为计算机专业的综合性毕业设计,它涵盖了从数据采集、知识表示到智能应用的全流程开发。
我在实际开发中发现,古诗词领域的数据具有独特的结构化特征:每首诗包含标题、作者、朝代、正文等固定字段,同时涉及丰富的意象、情感和典故。这种特性使其特别适合用知识图谱进行表示,也为后续的情感分析和智能创作提供了优质语料。
2. 核心技术架构解析
2.1 知识图谱构建方案
古诗词知识图谱采用Neo4j图数据库作为存储引擎,其构建流程包含三个关键步骤:
- 数据采集与清洗:
# 示例:使用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()) }- 实体关系抽取:
- 使用BiLSTM-CRF模型进行命名实体识别
- 基于依存句法分析提取实体关系
- 典型实体类型:诗人、朝代、意象、典故
- 图谱存储设计:
// 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 情感分析模块实现
古诗词情感分析面临特殊挑战:文言文表达与现代汉语差异大,情感表达更为含蓄。我们采用双通道混合模型:
- 特征提取层:
- 使用BERT-wwm-ext获取上下文相关词向量
- 同时采用TextCNN捕捉局部情感特征
- 分类器设计:
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架构进行改造,关键创新点:
- 韵律控制:
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)- 多任务学习:
- 联合训练生成和诗句补全任务
- 使用课程学习策略,先学习五言再过渡到七言
4.2 生成效果优化技巧
- 温度采样策略:
def temperature_sampling(logits, temp=0.7): logits = logits[:, -1, :] / temp return torch.multinomial(F.softmax(logits, dim=-1), num_samples=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 性能优化实践
- 缓存策略:
@app.route('/api/poem/<poem_id>') @cache.memoize(timeout=3600) def get_poem(poem_id): return db.query_poem(poem_id)- 异步处理:
@app.route('/generate', methods=['POST']) def generate_poem(): task = generate.delay(request.json) return {'task_id': task.id}, 2027. 项目难点与解决方案
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 tokens7.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. 项目扩展方向
- 跨模态应用:
- 根据古诗生成意境画
- 为画作自动题诗
- 教育应用:
- 古诗学习路径推荐
- 自动批改诗词作业
- 技术深化:
- 引入大语言模型增强生成质量
- 开发移动端AR鉴赏功能
这个项目完整展示了如何将传统文化与现代AI技术相结合。在实际开发中,最大的体会是:处理领域特定问题时,通用NLP模型往往需要针对性的改造。比如我们发现,直接在古诗词数据上继续预训练BERT,比使用现成的中文BERT效果提升约15%。