Python构建古诗词知识图谱与情感分析系统

1. 项目背景与核心价值

中华古诗词作为传统文化瑰宝,蕴含着丰富的历史信息和情感表达。这个毕业设计项目通过Python技术栈构建了一个融合知识图谱、情感分析和AI创作的综合性系统。我在实际开发中发现,这种多维度的技术整合能够突破传统诗词研究的局限——比如过去分析李清照《声声慢》只能依赖人工标注情感词,现在通过知识图谱可以直观看到"梧桐"-"细雨"-"愁绪"的意象关联链,结合情感分析模型能自动识别出87.6%的婉约派词作中的忧郁情绪。

关键提示:项目最大的创新点在于将Neo4j图数据库的动态关联能力与BERT模型的语义理解相结合,这是2023年NLP领域较前沿的应用方向

2. 技术架构详解

2.1 知识图谱构建流水线

数据采集阶段特别要注意诗词网站的防爬策略。我使用Scrapy+RotatingProxy组合爬取古诗文网时,通过以下配置有效避免封禁:

class PoetrySpider(scrapy.Spider): custom_settings = { 'DOWNLOAD_DELAY': 2, 'ROTATING_PROXY_LIST': ['ip1:port','ip2:port'], 'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0)' }

实体关系抽取采用BERT-BiLSTM-CRF模型,在标注了5000条古诗文语料后达到92.3%的F1值。这里有个细节处理:对于"明月几时有"这样的诗句,需要先进行"明月/几时/有"的正确分词,否则会误判"明月几"为实体。

2.2 情感分析模型优化

传统情感词典方法在古诗场景准确率仅68%,我们采用以下改进方案:

  1. 基于《知网》情感词典扩展300个古诗专用情感词
  2. 使用LoRA技术微调BERT模型
  3. 引入注意力机制捕捉"却道天凉好个秋"这类反讽表达

训练参数设置值得注意:

trainer = Trainer( model=model, args=TrainingArguments( per_device_train_batch_size=8, learning_rate=3e-5, num_train_epochs=5, lora_rank=64 # LoRA矩阵秩的优化值 ) )

3. 可视化系统实现

3.1 Neo4j图数据库设计

设计Schema时踩过一个坑:最初将"意象"节点直接关联"情感",后发现应该通过"作品"中转。优化后的Cypher查询示例:

MATCH (p:Poet)-[:WRITE]->(w:Work)-[:CONTAIN]->(i:Image) WHERE i.name="月亮" RETURN p.name, w.title, i.emotion

3.2 前端交互优化

使用ECharts实现的三重可视化方案:

  1. 力导向图展示诗人社交网络
  2. 热力图呈现不同朝代情感分布
  3. 词云突出高频意象

实测发现超过500个节点时需要启用WebWorker进行异步渲染,否则会卡顿。这里有个性能优化技巧:

const worker = new Worker('graphWorker.js'); worker.postMessage({nodes: filteredNodes}); worker.onmessage = (e) => { chart.setOption(e.data); }

4. 智能问答系统开发

4.1 问答引擎架构

采用RAG(Retrieval-Augmented Generation)模式,结合传统检索和AI生成的优势。具体流程:

  1. 用户输入"李白描写月亮的诗"
  2. Neo4j检索相关作品
  3. 大模型生成结构化回答

关键配置参数:

retriever: top_k: 5 score_threshold: 0.65 generator: temperature: 0.7 max_length: 300

4.2 自动写诗模块

基于GPT-3的few-shot learning实现,prompt设计很有讲究。例如生成边塞诗时,有效的prompt结构:

【示例1】 标题:从军行 内容:青海长云暗雪山... 风格:豪迈雄壮 【示例2】 标题:凉州词 内容:葡萄美酒夜光杯... 风格:悲壮苍凉 请根据以上示例风格创作新的边塞诗,主题要求:${user_input}

5. 部署与性能调优

5.1 后端API优化

使用FastAPI构建的接口需要进行以下关键配置:

app = FastAPI( title="Poetry API", middleware=[ Middleware(GZipMiddleware), Middleware(HTTPSRedirectMiddleware) ] ) @app.get("/poem/{poem_id}") async def get_poem(poem_id: int): # 添加缓存装饰器 @cache(expire=300) def query_db(): return neo4j_query(...)

5.2 大模型轻量化

为了让7B参数的模型能在消费级GPU运行,我们采用以下技术组合:

  1. 4-bit量化(bitsandbytes库)
  2. 梯度检查点(gradient_checkpointing)
  3. 使用FlashAttention加速

实测在RTX 3090上推理速度从15s/首提升到3s/首,内存占用从24GB降到8GB。

6. 典型问题解决方案

6.1 知识图谱更新问题

初期采用全量更新导致服务中断,后来改为增量更新方案:

  1. 使用Apache Kafka作为消息队列
  2. 设计变更数据捕获(CDC)管道
  3. 实现凌晨2点的定时增量同步

6.2 情感分析歧义处理

对于"却道天凉好个秋"这类复杂表达,我们建立歧义处理规则:

  1. 上下文窗口扩展到前后5句
  2. 引入反讽检测子模型
  3. 人工标注2000条歧义样本进行强化训练

最终将这类case的准确率从54%提升到82%。

7. 项目扩展方向

在实际部署后,我们发现三个有价值的扩展点:

  1. 添加声韵分析模块,用LSTM预测诗句平仄
  2. 结合CLIP模型实现"诗画互译"功能
  3. 开发移动端AR应用,扫描实物触发相关诗词

特别是第三个方向,当用户拍摄真实场景中的"月亮"时,AR界面可以浮现相关的咏月诗句,这个功能在文旅场景很有应用前景。