ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

大模型古诗词高质量训练数据集:清洗、标注与结构化实践

大模型古诗词高质量训练数据集:清洗、标注与结构化实践 简介本资源是一份面向大语言模型训练与古诗文NLP任务的高质量中文古诗词数据集覆盖先秦至现代的历代经典作品适用于AI研究员、自然语言处理工程师及古典文学数字化研究者解决高质量古诗文本清洗不足、格式不统一、标注缺失等实际建模痛点。压缩包为ZIP格式大小123.72MB包含经系统性清洗与标准化处理的多源古诗文本文件主要涵盖唐诗、宋词、花间集、纳兰性德词、曹操诗集等核心子集涉及标题规范化、异体字修正如“愚千慮切”→“愚衷千虑切”、冗余标点/注释剔除、作者信息净化、阙字补全如“灯火阑珊处”及体例统一如词牌名、标题结构、序文位置调整等关键处理。目前已有382人学习下载用户可直接获取开箱即用的干净语料显著降低数据预处理成本支撑诗词生成、风格迁移、古文理解等下游任务的快速验证与迭代。1. 这不是“古诗大全”而是一套专为大模型训练打磨的先秦至现代古诗词数据集清洗逻辑、标注结构、质量阈值全公开你下载过几十个“古诗词数据集”解压后发现一半是重复的《唐诗三百首》网页抓取版三分之一夹杂着百度文库格式乱码剩下的是带广告水印的 PDF OCR 错字——这种“数据集”喂给大模型不是训练是投毒。本项目标题里的“大模型高质量数据”不是宣传话术而是指每首诗都经过人工校对版本溯源格律标注语义分层去重指纹计算且全部文本满足 tokenization 可逆性、BPE 子词边界友好、上下文窗口适配三大硬指标。它不面向诗词爱好者做展示而是面向 NLP 工程师做 fine-tuning、instruct-tuning、RLHF 偏好建模的真实生产级语料。适用场景非常具体比如你要微调一个能写七律平仄合规、用典不穿帮、押韵不混韵部的模型或者你需要构造“诗人风格迁移”任务的 contrastive pair又或者你在做古文白话对齐的 instruction 数据增强——这时候你缺的不是“量”而是“可编程的结构化质量”。这个 zip 包里没有 PDF、没有图片、没有 HTML只有 3 个核心文件poems.jsonl主数据流、metadata.csv版本/作者/体裁/韵部/平仄谱索引、quality_report.pdf含字符错误率、OCR 残留检测、重复率热力图。它不是“整理”是“重造”。2. 数据构建全流程从原始文献到可训练语料的 7 道工序与 3 类过滤器2.1 原始来源不是“网上爬”而是“版本锚定”为什么必须锁定《四部丛刊》《全宋诗》《清人诗文集总目提要》等 12 套底本很多所谓“古诗数据集”直接爬百度百科或古诗文网结果同一首《春晓》出现 7 种断句“春眠不觉晓 / 春眠不 觉晓 / 春 眠 不 觉 晓”标点混用“”“。”“。”“”甚至把《全唐诗》卷 123 的张九龄诗错标成卷 213 的王维诗。本数据集采用“版本锚定法”所有文本必须回溯至权威影印底本或校勘本。例如《全唐诗》以中华书局 1960 年影印本为源每首诗标注source_edition: QTS_1960_shzh《全宋诗》用北京大学出版社 1991 年版标注source_edition: QSS_1991_pku先秦部分则严格采用阮元《十三经注疏》嘉庆刻本 清华简、上博简释文交叉验证。这意味着每条记录的source_id字段形如QTS_123.45《全唐诗》卷123第45首或SHUO_007《说苑》第七卷可直接定位原书页码所有异体字、通假字、避讳字均保留原貌但额外提供standardized_form字段如“於”→“于”“裏”→“里”供 tokenizer 预处理时选择是否归一对存在多个权威版本的诗如《离骚》有洪兴祖补注本、朱熹《楚辞集注》本在variants字段中并列存储标注variant_type: commentary或textual避免简单合并导致语义失真。提示不要用open(poems.txt).read()直接加载——poems.jsonl是严格按行 JSON 格式每行一个 poem dict必须用jsonlines或pandas.read_json(..., linesTrue)解析否则会因换行符、引号嵌套崩溃。2.2 清洗不是“删空格”而是“语义保真清洗”4 类噪声识别与 3 层校验机制清洗阶段放弃正则暴力替换采用基于规则轻量模型的混合策略。核心是守住两条红线不改变原意、不丢失结构。具体流程OCR 残留识别层针对扫描本转换文本用预训练的小型 CNN 模型仅 1.2MB检测典型 OCR 错字模式如“”→“0”、“”→“l”、“”→“O”、“丶”→“、”。该模型在自建的 5000 行古籍 OCR 错误样本上 F10.92误杀率0.3%。标点归一化层将“”‘’《》【】等 12 类引号/括号统一为英文半角但保留中文顿号、分号、冒号因涉及诗句节奏切分删除所有※★◆等装饰符号将……统一为…Unicode U2026避免 BPE 切分为………。结构校验层对律诗/绝句强制执行line_count 4 or line_count 8对词牌校验pattern_match: true使用cn-poetry库的 213 个词谱模板匹配对古风诗则检查rhyme_scheme_consistency押韵字在《平水韵》或《词林正韵》中的韵部一致性。人工抽检层每 1000 条随机抽 5 条由 3 名古典文献学背景人员双盲校对错误率2%则整批返工。清洗后生成cleaned_text字段原始raw_text仍保留在raw_source字段中供 debug 时溯源。2.3 标注不是“打标签”而是“可计算的诗学结构”平仄、韵部、用典、情感四维标注体系大模型需要的不是“这是唐诗”而是“这句的第三字是仄声押《平水韵》上声‘马’韵典出《史记·项羽本纪》情感倾向为悲慨”。本数据集提供四维结构化标注字段名类型示例说明pingze_patternlist[str][平,仄,平,仄,仄,平,平]七言律句标准格式每个字对应一个声调平/仄基于《广韵》反切与现代读音映射rhyme_infodict{char: 山, yunbu: 删, tone: 平, position: 7}押韵字、所属韵部、声调、在句中位置从1开始allusionslist[dict][{source: 史记, chapter: 项羽本纪, quote: 力拔山兮气盖世}]典故出处、章节、原文引用非模糊关键词匹配sentimentdict{primary: heroic, confidence: 0.87}使用微调过的roberta-base-finetuned-chinese-poetry-sentiment模型预测含置信度这些字段不是人工填写而是通过 pipeline 自动生成pingze_pattern由cn-poetry的get_pingze()函数计算rhyme_info调用chinese-rhyme-dict库查《平水韵》表allusions用基于 BERT 的 span-level NER 模型在《文选》《艺文类聚》标注语料上训练识别典故实体sentiment则是 finetune 后的多分类模型。所有标注结果均附带annotator_version和confidence_score低置信度项标记为needs_review。3. 数据集结构详解3 个核心文件如何协同支撑大模型训练任务3.1poems.jsonl不是“诗集合”而是“可流式加载的训练样本流”poems.jsonl是数据集的主干共 217,843 行截至 2024 年 6 月每行是一个 JSON 对象结构高度标准化。关键字段如下省略非核心字段{ id: QTS_001.003, title: 感遇·其一, author: 张九龄, dynasty: 唐, period_start: -600, period_end: 907, content: [兰叶春葳蕤桂华秋皎洁。, 欣欣此生意自尔为佳节。, 谁知林栖者闻风坐相悦。, 草木有本心何求美人折。], cleaned_content: [兰叶春葳蕤桂华秋皎洁。, 欣欣此生意自尔为佳节。, 谁知林栖者闻风坐相悦。, 草木有本心何求美人折。], pingze_pattern: [[平,仄,平,仄,仄,平,平,仄], ...], rhyme_info: [{char: 洁, yunbu: 屑, tone: 入, position: 8}, ...], allusions: [], sentiment: {primary: elegant, confidence: 0.92}, source_edition: QTS_1960_shzh, quality_score: 0.987, token_count: 128 }注意三点content是原始分行数组非拼接字符串便于做line-by-line的 masked language modelingcleaned_content与content完全对齐确保清洗不破坏行结构token_count是经jiebabert-base-chinesetokenizer 预估的 token 数用于快速筛选适配 2048/4096 窗口的样本。加载代码示例推荐流式避免内存爆炸import jsonlines import tqdm def load_poem_stream(filepath, min_quality0.95, max_tokens2048): 流式加载高质量、短 token 的诗返回生成器 with jsonlines.open(filepath) as reader: for poem in tqdm.tqdm(reader, descLoading poems): if (poem.get(quality_score, 0) min_quality or poem.get(token_count, 9999) max_tokens): continue # 构造训练样本前3行预测第4行或整首做 causal LM yield { input_ids: tokenizer.encode( .join(poem[cleaned_content][:-1]), truncationTrue, max_length1024 ), labels: tokenizer.encode( poem[cleaned_content][-1], truncationTrue, max_length512 ) } # 使用 for sample in load_poem_stream(poems.jsonl): # feed to your model pass这段代码的关键在于它不把整份数据集 load 进内存而是按需 yield 样本并内置质量与长度过滤。min_quality0.95滤掉校对存疑项max_tokens2048确保 fit 进主流 context window。这是生产环境的标准做法不是 demo 写法。3.2metadata.csv不是“表格”而是“可 SQL 查询的诗学知识图谱索引”metadata.csv是 217,843 行 × 28 列的 CSV 文件本质是poems.jsonl的关系型索引。它让“找诗”变成数据库查询而非全文扫描。核心设计原则所有字段可排序、可分组、可 join。例如idauthordynastygenreyunbupingze_typefirst_charlast_charera_groupQTS_001.003张九龄唐五古屑仄起仄收兰折盛唐era_group将 2000 年跨度划分为先秦,两汉,魏晋南北朝,隋唐,五代,北宋,南宋,元,明,清,近现代11 个可统计组pingze_type是律诗/绝句的平仄类型编码如仄起仄收、平起平收共 16 类支持按格律聚类first_char/last_char用于快速构建“藏头诗”或“顶针诗”任务yunbu直接对应《平水韵》106 韵部可GROUP BY yunbu统计各韵部样本量。用 pandas 加载后可直接做复杂筛选import pandas as pd meta pd.read_csv(metadata.csv) # 找出所有“押东韵”的盛唐七律且作者生卒年在 650-750 之间 tang_dong meta[ (meta[dynasty] 唐) (meta[genre] 七律) (meta[yunbu] 东) (meta[era_group] 盛唐) ] # 获取对应 poem id 列表去 poems.jsonl 中提取原文 target_ids tang_dong[id].tolist()注意metadata.csv的id字段与poems.jsonl中的id严格一一对应这是 join 的唯一键。不要用author或title做关联——同名诗太多如《咏柳》有 17 个作者版本。3.3quality_report.pdf不是“文档”而是“数据可信度的审计报告”这份 23 页 PDF 不是文字说明而是用真实数据生成的审计视图Page 1-3整体质量分布直方图quality_score 密度曲线标出 0.95/0.98/0.99 分位点Page 4-8各朝代样本量 质量箱线图发现清代样本量最大但中位 quality_score 最低因大量地方志抄本 OCR 错误率高Page 9-12OCR 错误热力图按字符位置统计错误率显示第 3-5 字错误率峰值因古籍版心偏移Page 13-16重复检测报告使用 simhash minhash发现 127 组高度相似诗如《全唐诗》与《唐诗别裁集》互见诗已去重并标注duplicate_group_idPage 17-23人工抽检原始记录含校对员 ID、修改痕迹、争议点讨论摘要。这份报告的意义在于当你被质疑“你们的数据真的干净吗”你可以直接打开 PDF 第 7 页指出“盛唐部分 quality_score 中位数 0.982IQR0.015远高于全集均值 0.963”——这是工程师的语言不是产品经理的承诺。4. 避坑指南我在用这个数据集微调 Qwen2-7B 时踩过的 5 个真实坑4.1 现象模型生成的诗押韵混乱明明训练数据里rhyme_info字段齐全为何没学会原因rhyme_info是 metadata不是训练目标。如果你只把content当作纯文本喂给模型它根本看不到“押韵”这个概念。大模型不会自动从字形推断韵部。解决必须显式构造 rhyme-aware training objective。两种方案方案 A推荐在 prompt 中加入韵部约束如请用《平水韵》东韵写一首七律首句平起平收然后 fine-tune 时用rhyme_info中的yunbu字段做 reward modelingPPO 训练方案 B轻量在 tokenizer 后插入 special token如RHYME:东并在cleaned_content末尾添加该 token让模型学习预测韵部。实测方案 A 生成合规率提升 42%方案 B 提升 18%。4.2 现象pingze_pattern字段全是平或仄但模型输出的平仄完全不对甚至把“一”字当平声实际为入声原因pingze_pattern基于《广韵》反切系统而现代汉语普通话读音已变。“一”在古音中是入声字仄但在jieba或bert-base-chinesetokenizer 中被切分为单字 token 后模型只看到字形不知古音。解决必须在 embedding 层注入声调信息。我采用的方法是为每个汉字预计算ancient_tone_id0平1上2去3入存入 lookup table在模型输入时将token_id与tone_id拼接为(token_id, tone_id)pair送入 dual-embedding layer实测使平仄预测准确率从 63% 提升至 89%。代码核心如下# tone_embedding: [vocab_size, 4, 64] - 每个字每个声调一个向量 tone_emb self.tone_embedding[token_ids, tone_ids] # shape: [bs, seq_len, 64] token_emb self.word_embedding[token_ids] # shape: [bs, seq_len, 768] # 拼接后过 linear 投影 combined torch.cat([token_emb, tone_emb], dim-1) input_embeds self.projection(combined) # [bs, seq_len, 768]4.3 现象用metadata.csv做 era_group 分组采样时发现“近现代”组样本极少仅 127 首但poems.jsonl里明明有李叔同、鲁迅的诗原因era_group字段的划分逻辑是“创作年代”不是“作者生卒年”。李叔同《送别》创作于 1915 年民国但era_group标为近现代而鲁迅《自题小像》写于 1903 年清光绪二十九年所以标为清。数据集严格遵循历史分期不按作者国籍或政治归属。解决如果任务需要“民国时期诗”应联合查询period_start/period_end字段如period_start 1912 and period_end 1949而非依赖era_group。era_group仅用于粗粒度统计精细控制必须用时间字段。4.4 现象加载poems.jsonl时频繁 OOM即使只取前 1000 行原因jsonlines默认逐行json.loads()但古诗文本含大量 Unicode 符号如〇、々、〆Python 的json模块解析慢且内存占用高。实测 10 万行解析耗时 42 秒峰值内存 3.2GB。解决改用ijson库的迭代解析或更优方案——用pandas.read_json(..., linesTrue, dtypeFalse)它底层用 C 实现10 万行仅 3.8 秒内存峰值 890MB。关键参数dtypeFalse避免 pandas 自动 infer 类型导致 string 转 categoryconvert_datesFalse禁用日期自动转换无日期字段chunksize1000分块读取配合tqdm流式处理。4.5 现象allusions字段中标注的《史记》典故模型生成时却常错用成《汉书》内容原因allusions是静态标注但模型训练时未做强制约束。LLM 在生成时会“自由发挥”尤其当 prompt 中未明确要求“严格按标注典故生成”。解决在 inference 阶段引入 constrained decoding。我用transformers的LogitsProcessor实现提取allusions中的source如史记和chapter如项羽本纪在 decode 每个 token 时屏蔽所有史记以外的典籍相关词如汉书、后汉书的 token id实测使典故准确率从 51% 提升至 86%且不降低流畅度。核心逻辑class AllusionConstrainer(LogitsProcessor): def __init__(self, forbidden_sources: List[str]): self.forbidden_ids [] for src in forbidden_sources: # 获取 tokenizer 中所有含 src 字符的 token id ids [i for i, t in enumerate(tokenizer.vocab) if src in t or src in tokenizer.convert_ids_to_tokens([i])] self.forbidden_ids.extend(ids) def __call__(self, input_ids, scores): scores[self.forbidden_ids] -float(inf) return scores5. 进阶技巧用这个数据集做“风格可控生成”的 3 种落地方法与效果对比5.1 方法一LoRA 微调 Prompt Engineering —— 快速上线适合 MVP 验证这是最轻量、最快见效的方案。不改动 base model只训练 LoRA adapter再用 prompt 控制风格。关键在于 prompt 设计必须与数据集标注对齐。步骤从metadata.csv中筛选目标风格诗如“李白豪放洒脱”提取其sentiment.primary为heroic或romantic的样本构造 instruction 数据{instruction: 用李白风格写一首七绝主题山水, input: , output: ...}LoRA rank16, alpha32, target_modules[q_proj,v_proj]训练 3 epoch推理时 prompt 为你是一位模仿李白风格的诗人。请严格遵循1. 情感倾向为 heroic2. 多用夸张比喻3. 押《平水韵》东韵。写一首七绝主题云。效果生成合规率 78%人工评估风格相似度 4.2/5.05 分制训练耗时 2.1 小时A10 GPU。优势快、省资源劣势风格泛化弱换主题如“边塞”需重新微调。5.2 方法二ControlNet-style Condition Injection —— 精准控制适合产品级部署借鉴 CV 领域 ControlNet 思路将诗学结构平仄、韵部、情感作为 condition vector 注入 transformer。这不是 hack而是修改 attention 计算。实现在每一层 transformer 的attention_scores后加入 condition bias# condition_vector shape: [bs, 1, hidden_dim]来自 metadata 编码 condition_bias self.condition_proj(condition_vector) # [bs, 1, head_dim] # broadcast to [bs, num_heads, seq_len, seq_len] bias condition_bias.view(bs, self.num_heads, 1, -1) attention_scores attention_scores biascondition_vector 由pingze_pattern转 one-hot、rhyme_info.yunbuembedding、sentiment.primarylabel encoding拼接而成。效果生成合规率 93%风格迁移准确率cross-style generation达 86%支持实时切换条件如“把杜甫诗转李白风格”。代价需修改模型架构训练耗时 18 小时A100×2。5.3 方法三Retrieval-Augmented GenerationRAG—— 零训练适合冷启动场景当没有 GPU 资源时用poems.jsonl做向量库检索相似诗作为 context。关键是 embedding 必须捕捉诗学特征不能只用 sentence-transformers。我的做法用bert-base-chinese提取cleaned_content的 [CLS] 向量但额外拼接 3 个 handcrafted featureslen(content)行数、avg_line_length平均字数、rhyme_density押韵字占比拼接后降维到 128 维PCA存入 FAISS用户 query“写一首悲慨的五律”先用关键词匹配sentiment.primarygriefgenre五律再用 embedding 检索 top-3 相似诗拼入 prompt。效果无需训练响应 200ms人工评估生成质量 3.8/5.0且天然规避幻觉所有内容源自真实诗。注意rhyme_density计算公式为len(rhyme_info) / len(content)需从poems.jsonl预计算并存入向量库。方法合规率风格准确率训练成本推理延迟适用场景LoRAPrompt78%4.2/5.02.1h (A10)100msMVP 快速验证Condition Injection93%4.7/5.018h (A100×2)350ms产品级可控生成RAG65%3.8/5.00h200ms冷启动/边缘设备最后说一句血泪经验别迷信“数据量大”先秦到现代跨度太大强行混训会让模型在“之乎者也”和“的了呢吧”间精神分裂。我最终拆成 3 个子集分别训练先秦两汉文言主导、唐宋诗律成熟期、元明清近现代白话渗透期效果比单一大集提升 22%。这个 zip 包里poems.jsonl的dynasty字段就是为你做这件事准备的——别跳过它。希望帮到你。本文还有配套的精品资源点击获取
返回列表