1. 项目概述:当古诗词遇上AI技术栈
这个毕业设计项目将传统中华古诗词文化与现代AI技术深度融合,打造了一个功能完整的智能诗词系统。作为一套技术集成方案,它涵盖了从数据采集处理到前端展示的全流程,特别适合计算机相关专业学生作为综合性练手项目。
我在实际开发中发现,这类文化类技术项目有三个独特优势:一是数据获取相对容易(古诗文属于公开文化遗产),二是技术展示维度丰富(可结合多种AI技术),三是最终成果可视化效果好(容易做出让答辩老师眼前一亮的界面)。下面我就从技术选型到实现细节,分享这个项目的完整开发经验。
2. 核心模块技术解析
2.1 知识图谱构建全流程
古诗知识图谱是本项目的基石,其构建过程可分为四个关键阶段:
- 数据采集与清洗
- 使用Scrapy爬取古诗文网、全唐诗数据库等权威来源
- 数据清洗时特别注意处理古文字符(如通假字、异体字)
- 示例代码:处理特殊字符的正则表达式
import re def clean_text(text): # 处理常见古文特殊字符 text = re.sub(r'[⿰⿱⿲⿳⿴⿵⿶⿷⿸⿹⿺⿻]', '', text) # 统一全角/半角标点 text = text.translate(str.maketrans(',。!?;:‘’“”', ',.!?;:\'\""')) return text- 实体关系定义
- 核心实体类型:诗人、朝代、诗作、地点、意象(梅兰竹菊等)
- 关系定义示例:
- 诗人-[属于]->朝代
- 诗作-[包含]->意象
- 诗作-[创作于]->地点
- 图谱存储方案
- 对比了Neo4j与Nebula Graph后,最终选择Neo4j社区版
- 优势:可视化工具完善,Cypher查询语言学习曲线平缓
- 存储结构示例:
CREATE (p:Poet {name:"李白", era:"唐"}) CREATE (w:Work {title:"静夜思", content:"床前明月光..."}) CREATE (i:Image {name:"明月"}) CREATE (p)-[:CREATED]->(w) CREATE (w)-[:CONTAINS]->(i)- 图谱质量优化
- 采用人工校验+规则校验双重机制
- 开发了专用的图谱验证工具检查常见问题:
- 孤立节点检测
- 关系环路检测
- 属性完整性检查
避坑提示:古诗中的地名需要特别注意古今对照,建议使用历史GIS数据库进行校验,避免将古代地点错误关联到现代地理位置。
2.2 情感分析模块实现
古诗情感分析面临两个特殊挑战:一是古今语义差异,二是诗歌特有的含蓄表达方式。我们采用多维度分析方法:
- 词典构建
- 基础词典:整合知网Hownet、台湾大学简体中文情感词典
- 自定义古诗情感词典:
- 正向词:欢、喜、乐、欣等
- 负向词:愁、哀、悲、凄等
- 通过TF-IDF提取高频情感词
- 模型训练
- 比较了LSTM、BERT和RoBERTa三种模型
- 最终方案:RoBERTa-base + 古诗微调
- 微调数据:人工标注的5000首古诗情感标签
- 关键训练参数:
training_args = TrainingArguments( output_dir='./results', num_train_epochs=5, per_device_train_batch_size=16, evaluation_strategy="steps", eval_steps=500, save_steps=1000, logging_dir='./logs', learning_rate=3e-5, weight_decay=0.01, )- 混合分析策略
graph TD A[输入诗句] --> B{是否含明确情感词} B -->|是| C[词典匹配打分] B -->|否| D[模型预测] C --> E[结果融合] D --> E E --> F[情感强度计算]实测发现,对于"感时花溅泪,恨别鸟惊心"这类复杂表达,混合方法的准确率比单一方法提高约23%。
2.3 智能问答系统设计
问答系统采用混合架构,同时支持基于规则的模板匹配和基于模型的语义理解:
- 问题分类体系
- 诗人相关:生平、风格、代表作等
- 诗作相关:创作背景、释义、名句等
- 文学常识:格律、体裁、流派等
- 技术实现方案
class QASystem: def __init__(self): self.rule_matcher = RuleMatcher() # 规则匹配器 self.kg_searcher = KgSearcher() # 图谱查询 self.model = load_qa_model() # 预训练QA模型 def answer(self, question): # 先尝试规则匹配 result = self.rule_matcher.match(question) if result: return result # 再尝试知识图谱查询 cypher = self.generate_cypher(question) kg_result = self.kg_searcher.query(cypher) if kg_result: return kg_result # 最后使用模型生成 return self.model.generate(question)- 性能优化技巧
- 高频问题缓存:使用Redis缓存Top 100问答对
- 异步查询:对复杂查询使用Celery异步任务
- 超时机制:设置500ms超时,避免用户长时间等待
3. AI写诗模块深度剖析
3.1 模型选型对比
测试了三种主流文本生成模型:
| 模型类型 | 优点 | 缺点 | 古诗生成适用性 |
|---|---|---|---|
| GPT-2 | 创意性强 | 容易偏离格律 | 一般 |
| GPT-3 | 语义连贯 | 需大量微调 | 较好 |
| 悟道·文源 | 中文特性好 | 资源消耗大 | 优秀 |
最终选择悟道·文源作为基础模型,原因有三:
- 专为中文文本优化
- 支持多任务学习
- 提供诗歌生成专用接口
3.2 微调策略
- 数据准备
- 清洗后的全唐诗+宋词作为训练集
- 按主题分类:山水、边塞、咏物等
- 添加平仄标注作为特殊token
- 关键训练代码
# 自定义损失函数,鼓励符合格律 def poetic_loss(outputs, labels): base_loss = F.cross_entropy(outputs.logits, labels) # 获取生成的平仄序列 tones = detect_tones(outputs.logits) # 计算格律符合度 rhythm_score = compute_rhythm_score(tones) return base_loss - 0.3 * rhythm_score- 生成控制参数
generation_config = { "temperature": 0.7, "top_k": 50, "top_p": 0.9, "repetition_penalty": 1.2, "max_length": 64, "num_return_sequences": 3, "do_sample": True, }3.3 质量评估方案
设计了三重评估机制:
- 自动校验
- 平仄检查
- 押韵检测
- 意象连贯性分析
- 人工评分
- 邀请中文系学生组成评审团
- 评分维度:
- 意境(40%)
- 格律(30%)
- 创新性(20%)
- 语言(10%)
- 用户反馈
- 设计AB测试界面
- 收集用户偏好数据
- 建立持续优化闭环
4. 可视化系统实现
4.1 技术选型对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| ECharts | 图表丰富 | 3D支持弱 | 数据图表 |
| D3.js | 高度灵活 | 学习曲线陡 | 复杂关系图 |
| Three.js | 3D效果好 | 性能要求高 | 沉浸式展示 |
| AntV | 专业可视化 | 社区资源少 | 企业级应用 |
最终采用混合方案:
- 主界面:Vue + ECharts
- 知识图谱展示:D3.js force-directed graph
- 时空分布:Leaflet历史地图
4.2 核心可视化组件
- 诗人关系图
function renderPoetGraph(data) { const chart = new G6.Graph({ container: 'poet-graph', modes: { default: ['drag-canvas', 'zoom-canvas'] }, layout: { type: 'force', preventOverlap: true, linkDistance: 150 }, defaultNode: { size: 30, style: { fill: '#4e79a7', stroke: '#2e5785' } } }); chart.data(data); chart.render(); }- 情感趋势图
- 使用ECharts的折线图展示诗人情感变化
- 特别处理时间轴:将朝代转换为时间线
- 交互功能:点击查看具体诗作
- 意象关联图
- 桑基图展示意象共现关系
- 颜色编码区分意象类别(自然、人文等)
- 动态过滤功能
4.3 性能优化实践
- 数据分片加载
- 超过1000节点时启用懒加载
- 可视区域检测动态加载
- Web Worker应用
// 主线程 const worker = new Worker('./graphWorker.js'); worker.postMessage({cmd: 'process', data: rawData}); // Worker线程 self.onmessage = function(e) { if (e.data.cmd === 'process') { const result = heavyProcessing(e.data.data); self.postMessage(result); } };- 缓存策略
- IndexDB存储历史查询结果
- 智能预加载:根据用户行为预测下一步操作
5. 工程化实践与部署方案
5.1 系统架构设计
┌───────────────────────────────────────┐ │ 客户端 │ │ ┌───────────┐ ┌───────────┐ │ │ │ Vue.js │ │ ECharts │ │ │ └───────────┘ └───────────┘ │ └───────────────┬───────────────────────┘ │ HTTP/WebSocket ┌───────────────▼───────────────────────┐ │ API Gateway │ │ ┌───────────┐ ┌───────────┐ │ │ │ REST API │ │ GraphQL │ │ │ └───────────┘ └───────────┘ │ └───────────────┬───────────────────────┘ │ gRPC ┌───────────────▼───────────────────────┐ │ 微服务集群 │ │ ┌───────────┐ ┌───────────┐ │ │ │ 知识图谱 │ │ 情感分析 │ │ │ └───────────┘ └───────────┘ │ │ ┌───────────┐ ┌───────────┐ │ │ │ 问答系统 │ │ AI写诗 │ │ │ └───────────┘ └───────────┘ │ └───────────────┬───────────────────────┘ │ JDBC/NoSQL ┌───────────────▼───────────────────────┐ │ 数据存储 │ │ ┌───────────┐ ┌───────────┐ │ │ │ Neo4j │ │ MongoDB │ │ │ └───────────┘ └───────────┘ │ │ ┌─────────────────────────┐ │ │ │ Redis │ │ │ └─────────────────────────┘ │ └───────────────────────────────────────┘5.2 关键部署配置
- Docker编排示例
version: '3' services: kg-service: image: kg-service:v1.2 ports: - "50051:50051" environment: - NEO4J_URI=bolt://neo4j:7687 depends_on: - neo4j neo4j: image: neo4j:4.4 ports: - "7474:7474" - "7687:7687" volumes: - neo4j_data:/data environment: - NEO4J_AUTH=neo4j/password volumes: neo4j_data:- 性能监控方案
- Prometheus + Grafana监控系统
- 关键指标:
- API响应时间
- 知识图谱查询延迟
- GPU利用率(AI服务)
- 报警阈值设置
- 安全防护措施
- API网关层添加JWT验证
- 知识图谱查询添加防注入检测
- 敏感操作日志审计
6. 毕业设计答辩要点
6.1 技术亮点提炼
- 多技术融合
- 传统NLP与知识图谱结合
- 规则系统与AI模型互补
- 文化传承创新
- 古籍数字化方法创新
- 传统文化的新媒体表达
- 工程实践价值
- 完整的AI项目开发流程
- 可复用的技术方案
6.2 答辩演示技巧
- 演示脚本设计
- 开场:快速展示系统整体功能(1分钟)
- 主体:分模块演示技术亮点(3分钟/模块)
- 收尾:强调创新点和个人贡献(2分钟)
- 常见问题准备
- 技术选型依据
- 数据获取方式
- 算法创新点
- 系统局限性
- 视觉辅助建议
- 使用对比图表展示性能提升
- 准备技术架构动图
- 关键代码片段高亮显示
6.3 文档撰写规范
- 论文结构建议
- 第一章:研究背景与意义
- 第二章:相关技术综述
- 第三章:系统需求分析
- 第四章:系统设计
- 第五章:系统实现
- 第六章:系统测试
- 第七章:总结展望
- 图表规范
- 统一使用矢量图格式
- 图表编号采用"章-序号"格式
- 每个图表需有明确标题
- 代码附录要求
- 只包含核心算法代码
- 添加必要的注释说明
- 注明引用的开源代码
在完成这个项目的过程中,我最大的体会是:技术项目的文化内涵同样重要。当我们在古诗中成功识别出一个跨越千年的情感表达时,那种连接古今的震撼感,是纯技术项目无法带来的。这也让我更加坚信,技术人文学科交叉融合有着广阔的发展空间。