如何编写诗词分类脚本——从零构建智能诗词库的完整指南
目录导读
- 为何需要诗词分类脚本? —— 人工智能与古典文学的碰撞
- 核心分类维度解析 —— 从朝代、格律到情感标签
- 脚本技术选型 —— Python、正则表达式与深度学习模型的选择
- 实战步骤:6步构建诗词分类器 —— 从数据清洗到模型部署
- 常见问题与优化技巧 —— 避坑指南与SEO友好性设计
- 问答环节 —— 解决你关于诗词分类脚本的10个高频问题
为何需要诗词分类脚本?
你是否曾面对海量诗词手忙脚乱?比如想整理“李白所有描写月亮的诗”,或筛选“宋代婉约派词作”,手动翻阅古籍显然不现实,据《全唐诗》统计,唐代存诗约50000首,而《全宋词》收录词作近20000首。诗词分类脚本正是解决这一痛点的数字工具——它通过算法自动识别诗词的朝代、作者、体裁、主题甚至情感倾向,让古籍检索效率提升百倍。

核心价值:
- 学术研究:快速统计某朝代“边塞诗”的用词频率运营**:为诗词APP自动生成“春日”“离别”主题专辑
- 教育应用:帮助中小学生按“豪放派”或“婉约派”赏析词作
核心分类维度解析
一个成熟的诗词分类脚本至少需包含以下4个维度:
1 朝代分类
- 规则:通过诗句中“唐”“宋”“元”等关键词,或标注作者生平年份(如“公元701-762年”对应李白)。
- 难点:部分作者跨朝代(如李煜为南唐后主,常归入“五代十国”),需建立“作者-朝代”映射表。
2 体裁分类
- 诗:五言绝句、七言律诗、乐府诗等(通过句数、每句字数、平仄规律判断)
- 词:词牌名(如“蝶恋花”、“满江红”可正则提取)
- 曲:元曲常见“天净沙”“山坡羊”等
- 脚本技巧:用正则表达式
^[五七]言[绝律]诗$匹配诗体,用【[词牌名]】匹配词牌。
3 主题分类(情感+风格)
- 主题标签:“山水田园”(王维诗)、“怀古伤今”(赤壁诗)、“送别”(长亭意象)
- 情感倾向:积极(“春风得意”)、消极(“泪痕红浥”)、中性
- NLP方法:基于词频统计(如“愁”“泪”“月”高频关联“悲”类)或预训练模型(如BERT进行情感分类)。
4 作者归属
- 通过数据库匹配:如“床前明月光”自动关联“李白”。
- 但需注意重名作者(如“张若虚”仅存2首诗,需单独处理)。
脚本技术选型
根据任务复杂度,推荐以下3种方案:
| 方案 | 适用场景 | 技术栈 | 分类准确率 |
|---|---|---|---|
| 规则引擎 | 少量数据、简单分类(朝代、体裁) | Python + re正则 + Pandas | 85%~92% |
| 传统机器学习 | 中等数据量、多主题分类(如诗词风格) | Scikit-learn + TF-IDF + SVM | 70%~88% |
| 深度学习 | 大量数据、情感分析、隐含语义 | BERT(CNN/pytorch) + 词向量 | 90%~97% |
推荐方案:对初学者先采用“规则引擎+机器学习”混合模式。
- 先用正则提取朝代、词牌名等结构化信息
- 再用朴素贝叶斯分类器基于“关键词频率”判断主题(如“边塞”分类:
['烽火','孤城','羌笛'])
实战步骤:6步构建诗词分类器
第一步:数据收集与清洗
- 来源:开源诗词API(如“古诗文网”)、公开数据集(清华《全唐诗》txt文件)
- 清洗:去除HTML标签、繁体转简体、统一标点,示例代码:
import re def clean_poem(text): text = re.sub(r'<[^>]+>','',text) # 去标签 text = text.replace(',',',').replace('。','.').strip() return text
第二步:定义分类标签
- 创建字典
labels = {'genre':['五言绝句','七律','小令'], 'dynasty':['唐','宋','明'], 'theme':['爱情','边塞','田园']}
第三步:构建特征提取器
- 结构化特征:诗句数量(如4句为“绝句”)、每句字数(统一检测字符串长度)
- 词频特征:使用CountVectorizer提取100个高频词作为“主题词”
# 示例:提取每句末尾字检测押韵情况(辅助判断律诗) ending_chars = [line[-1] for line in poem_lines if line]
第四步:训练分类模型(以主题分类为例)
from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.svm import SVC vectorizer = TfidfVectorizer(max_features=2000) X = vectorizer.fit_transform(all_poems) y = all_themes model = SVC(kernel='linear').fit(X, y)
- 小技巧:训练数据至少要包含5000首以上的高质量标注样本,否则容易过拟合。
第五步:测试与优化
- 使用交叉验证,重点关注“混淆矩阵”:常把“边塞诗”误归类为“战争诗”,可通过增加“意象词权重”(
'征衣'*2)提升区分度。
第六步:部署与输出
- 输出格式建议为JSON,方便集成到网站或APP:
{:"静夜思", "author":"李白", "dynasty":"唐", "genre":"五言绝句", "themes":["思乡","明月","孤独"], "emotion":"中性偏忧伤" } - SEO友好提示:在输出HTML页面时,为每首诗词的“朝代”标签添加
<span itemprop="genre">等结构化标记,有助于搜索引擎收录“唐代思乡诗”等长尾关键词。
常见问题与优化技巧
Q1:诗词中存在繁体字、异体字怎么办?
- 需集成
zhconv库进行繁简转换,并建立异体字映射表(如“峯”转为“峰”)。
Q2:如何避免“同作者同风格”导致的过拟合?
- 在训练数据中,确保每个作者的作品不超过总样本的5%,例如李白提交200首后,其余用杜甫、王维等平衡。
Q3:脚本运行速度慢怎么办?
- 对正则表达式预编译:
pattern = re.compile(r'^[五七]言[绝律]诗$');对大规模数据使用Dask并行化处理。
优化建议:
- 缓存机制:作者朝代关系表、词牌名列表存储在Redis中,避免每次重复计算。
- 降维处理:利用PCA将词频向量从2000维压缩至100维,提升SVM训练速度30%以上。
问答环节
问题1:诗词分类脚本与传统图书分类法(如中国古籍分类)有何区别? 答:图书分类侧重“经史子集”的出版属性,而诗词分类脚本更关注“内容语义”和“形式特征”,比如能识别出王昌龄《出塞》兼具“边塞”和“七绝”标签。
问题2:能否用ChatGPT代替脚本分类? 答:可以,但成本高,GPT-4对10万首诗词批量分类需几千元API费用,而自建脚本仅需服务器成本,且脚本可离线部署,适合古籍保护等敏感场景。
问题3:开源脚本有哪些推荐?
答:GitHub项目poetry-classifier(基于TensorFlow)和chinese-poetry-classification(基于朴素贝叶斯)均可fork,注意后者需自行扩充“山水”标签词库。
问题4:如何让分类结果在百度/谷歌搜索更友好?
答:结构化数据标记是关键,在JSON输出中添加"itemprop":"genre",并在网页嵌入Schema.org的CreativeWork类型,
<div itemprop="creativeWork" itemscope itemtype="http://schema.org/CreativeWork"> <meta itemprop="genre" content="七言绝句"> <meta itemprop="about" content="边塞"> </div>
这样做后,搜索结果会显示“朝代:《出塞》(唐代·边塞诗)”的小部件,点击率提升约18%。
问题5:遇到“一首诗词可分属多个朝代”(如《敕勒歌》被归入北朝和隋代)怎么办? 建议采用“软分类”——输出概率权重,如“朝代:[‘北朝(0.8)’, ‘隋代(0.2)’]”,同时在数据库设计为多对多关系。