如何编写诗词分类脚本

wen 实用脚本 30

如何编写诗词分类脚本——从零构建智能诗词库的完整指南

目录导读

  1. 为何需要诗词分类脚本? —— 人工智能与古典文学的碰撞
  2. 核心分类维度解析 —— 从朝代、格律到情感标签
  3. 脚本技术选型 —— Python、正则表达式与深度学习模型的选择
  4. 实战步骤:6步构建诗词分类器 —— 从数据清洗到模型部署
  5. 常见问题与优化技巧 —— 避坑指南与SEO友好性设计
  6. 问答环节 —— 解决你关于诗词分类脚本的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%

推荐方案:对初学者先采用“规则引擎+机器学习”混合模式。

  1. 先用正则提取朝代、词牌名等结构化信息
  2. 再用朴素贝叶斯分类器基于“关键词频率”判断主题(如“边塞”分类:['烽火','孤城','羌笛']

实战步骤: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)’]”,同时在数据库设计为多对多关系。

抱歉,评论功能暂时关闭!