尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

全唐诗数据集处理:从zip解压乱码到JSON清洗的完整实践

全唐诗数据集处理:从zip解压乱码到JSON清洗的完整实践 简介本资源是面向中文信息处理、古诗文分析与数据库实践学习者的结构化唐诗数据集适用于NLP初学者、文学数据挖掘爱好者及数据库课程实践者。压缩包共3个文件含1个MySQL建库建表SQL脚本用于快速初始化tang_poetry数据库、1个Jupyter Notebook内含连接数据库、查询示例及‘唐朝写诗最多诗人’等典型分析代码、1份Markdown说明文档介绍表结构、字段含义与使用指引整体体积5.71MB轻量易部署。已有467人学习下载适合开展作者统计、诗句检索、风格聚类等入门级数据分析任务。读者可直接导入SQL构建本地数据库通过Notebook复现分析流程结合poets与poetries两张规范关联表完成从数据加载、关联查询到结果可视化的完整实践闭环。 先说明一下这篇内容是我基于自己的实际折腾经历整理的。前阵子做一个古诗风格生成的小项目需要一份相对干净的全唐诗语料本来以为网上随便下一份就能用结果连续踩了好几个坑有的包解压出来是乱码有的解压提示文件损坏部分版本数据甚至缺了作者信息。折腾了几天之后我把整个过程完整地梳理了一遍从解压到清洗再到最后整理成适合机器学习的JSON格式每一步都做了记录。这篇文章就是这次实践的全过程复盘希望能给正要碰古诗数据集的朋友省点时间。1. 先搞清楚网上流传的“全唐诗数据集.zip”到底是什么网上能找到的全唐诗数据集 zip 包来源大致分几类GitHub 上有人手工整理的版本、各种国学网站的爬虫抓取版、还有古籍库导出的原始文本。因为来源不同里面的文件结构、编码方式、内容完整度都有很大差别。我下载的这份 zip 解压之后有 900 多 MB解压出来的文件按作者姓氏拼音分目录排列一共收集了 2500 多位诗人的作品。这个版本的优点是作者分目录清晰适合做按作者检索的任务而且诗的正文里包含注释信息对理解创作背景有帮助。缺点也很明显原始文件是 GB2312 编码直接用现代文本编辑器打开会乱码部分文件里把“诗”和“序”混在一起没有做区分还有一些扫描字体转换引入的错别字比如“山”和“三”混淆、“云”和“雲”混用这类问题。所以拿到手之后的第一个判断就是这份数据集不能直接用必须经过一轮标准化的清洗才能作为后续模型训练或者数据可视化分析的输入。不夸张地说这个预处理的工作量比后续建模还要大。2. 核心问题zip 包解压时最容易踩的四个坑大数据集压缩包的解压过程往往没想象中顺利尤其是从网盘或者第三方下载站拉下来的文件经常会在传输过程中出各种幺蛾子。我在解压这份全唐诗数据集的时候就连续遇到四个问题这里逐个说一下排查方法。第一个是常见的“file is not a zip file”错误。这个报错在广州那边的 DNS 环境下尤其容易出现因为下载时可能会被网关劫持到错误的反代节点拿不到完整文件。我检查过文件头发现结尾的 EOCDEnd of Central Directory记录缺失了也就是说文件本身是不完整的。当时我用的命令是file quantshi.zip输出显示的是“application/octet-stream”说明这个文件根本没有被识别为 zip 格式。这种情况没有捷径只能重新下载或者换一个下载源。第二个是分卷压缩包的解压问题。热词里有人问到“z01怎么和zip一起解压”这个我也遇到了。有个版本的数据集被压缩成了多个分卷除了最后一个分卷之外其余部分的后缀是 z01、z02 这种。需要先把所有的分卷文件放到同一个目录下再执行zip -s 0 全唐诗.zip --out 全唐诗_合并.zip完成合并最后再用 unzip 解压合并后的文件。顺序反了或者缺了分卷都会直接报错。第三个是乱码问题。很多古籍相关的压缩文件在 Windows 上制作zip 内部的文件名可能是 GBK 编码在 macOS 或 Linux 上解压时文件名会变成一堆乱码。用unzip -O GBK 全唐诗.zip就可以显式指定编码解压出来就能看到正常的作者名目录。虽然不是所有 zip 工具都支持-O参数但在 macOS 和多数 Linux 发行版上实测可用。第四个是单个文件超过 4GB 导致的兼容性问题。虽然现在的全唐诗数据集一般不至于这么大但如果是加了高清扫描图注释的版本就有可能突破这个限制。老旧的解压工具对 zip64 格式支持不好会直接报错或只解出一部分。遇到这种情况建议直接换用 7-Zip 或者 pyzipper 这类支持 zip64 的现代工具。这三个坑每踩一个都得花时间排查所以建议把所有分卷文件下载完之后先校验一下 SHA256 哈希值确认无误再开始解压能省掉一大半的麻烦。3. 全唐诗数据集的字段结构与格式设计这份数据集里每首诗的文件结构并不统一。有的目录只有单纯的诗文比如“李白/将进酒.txt”有的则在诗名前缀处带上了“全唐诗卷一百六十二”的卷次信息。为了后续使用方便我重新设计了字段把每首诗转成结构化 JSON字段如下字段名类型说明示例值idstring唯一ID使用作者拼音序号libai_001titlestring诗名将进酒authorstring作者名李白dynastystring朝代这里固定为唐唐代volumestring全唐诗卷次信息若原文件没有则为空卷一百六十二paragraphsarray诗的正文按句拆分[君不见黄河之水天上来, 奔流到海不复回]tagsarray从诗中提取的关键词或主题标签[饮酒, 豪放]字段里的 id 一定要唯一且稳定。因为后续做数据索引、全量检索、模型训练集与测试集切分都需要靠 id 来串联。直接使用文件名做 id 有个风险就是不同来源的 zip 包文件命名规则不一致比如“李白_01”和“libai01”并存给合并带来很大麻烦。我在设计的时候全部统一转成了拉丁字母加数字下划线的格式。为什么要设计 paragraphs 数组而不是直接把整首诗文放一个字符串里因为后续做模型输入的时候按行喂给模型和按整篇喂给模型效果差异很大。按行切分可以更细粒度地对齐注意力机制做文本生成时有更好的控制。另外tags 字段虽然没有在原始数据里出现但我用了一个简单的规则来提取从诗中匹配包含季节、意象、情感词等关键词的字典命中就写入 tags。比如“明月”对应“月亮”“酒”对应“饮酒”。这个字段对做古诗检索和风格分析很有用不喜欢的可以跳过不影响核心结构。4. 数据清洗把 900MB 原始文本变成可用于训练和检索的干净语料清洗环节是这个项目里最耗时的一步我按以下顺序处理第一步处理作者信息。原始数据里作者名有的带朝代前缀有的带“卷”字后缀比如“元结·卷二百四十一”这种。我用正则把卷次和朝代剥离出来只保留纯姓名。对于同名的作者比如唐代多个“李建”我会保留原名不强行合并避免误标。第二步清理正文中的注释。原始文本中的注释一般用小括号或中括号包裹比如“一作XXX”。我根据实际需要决定保留还是删除做语义理解任务时去掉注释更干净做版本考证时可以保留。我这里是保留注释并加上了note字段存储避免丢失信息。第三步繁体转简体。全唐诗本身是繁体文本但很多任务需要在简体环境下处理。直接调 OpenCC 库的t2s配置可以一键转换但要注意俗字和异体字的处理比如“峯”会转成“峰”“巳”不会误转成“己”OpenCC 在这块做得还算可靠。实测转换一万首诗之后抽查没有发现明显的误转。第四步去掉空行和全角空格。这部分看起来是小问题但对于训练分词模型影响不小。统一把全角空格替换成半角连续空行压缩成单行再把行尾多余空格去掉。我顺手统计了一下这步操作大约能减少 3% 的无效文本量。第五步标记异常文件。有些 txt 文件的内容其实是作者的传记序言不是诗。我通过首行是否包含“卷”字或“序”字来做初步过滤再抽取 100 个文件人工抽检准确率在 95% 左右。剩下的边角料就单独丢到uncertain/目录不在核心数据集里体现。清洗完体积从 900MB 降到了 120MB 左右的 JSON 文件但信息密度高了非常多。其实很多网上的“全唐诗数据集”根本没做这些处理直接投喂给模型会出现很离谱的结果比如把作者的名字也当成诗行生成出来。5. 多场景落地NLP 预训练、全文检索与可视化清洗后可用的数据集能做的方向就非常多了。我实际测试过三个场景第一个是古诗风格的文本生成。我用这份数据微调了一个小型的 GPT 模型输入“床前明月光”模型能稳定续写出五言或七言的句子。但如果直接在原始未清洗的数据上微调同样的输入经常会生成“作者李白”这样的糟糕结果因为原文的格式噪声被模型学进去了。清洗质量差后面全白搭。第二个是全文检索。我用 Elasticsearch 把清洗后的 JSON 导进去通过ik_max_word分词器做中文分词。这样搜“明月”就能快速把所有包含“明月”的诗句全部召回配合 highlight 高亮显示搭建古诗词检索站的体验会好很多。而且因为每条记录有author字段可以快速按诗人筛选响应时间实测在 50ms 以内。第三个是数据可视化。把清洗后的数据按诗人统计作品数量按季节统计高频词分布能直观看到唐诗的创作规律。比如秋季出现的“落叶”、“霜”词频显著高于其他季节夏季则“荷”、“蝉”出现更多。这个统计结果清洗前后差异很大清洗前会被注释里的“一作”等字干扰。结构化字段设计合理的话这三个场景接入的时候会很顺畅基本不需要再改数据结构。这也说明清洗阶段多花功夫是完全值得的数据集质量决定后续一切可能性的上限。6. 常见问题快查解压与加载报错实战记录最后整理一份快查表这些都是在实际使用中高频遇到的问题每一项都是我亲自踩过并且确认过解决方式的。报错信息或问题原因解决办法file is not a zip file文件下载不完整zip 结尾的 EOCD 记录缺失用file xxx.zip检查格式重新下载could not find EOCDzip 包损坏或导入了不兼容的资源包换 7-Zip 或 pyzipper 重新解压解压后文件名乱码文件名编码不是 UTF-8多为 GBKunzip -O GBK xxx.zipz01 无法单独解压分卷压缩包未合并先zip -s 0 分卷.zip --out 合并.ziperror opening zip file or jar manifest missingJava 环境打不开损坏的 jar/zip重新下载或使用zip -FF修复JSON 解析失败清洗时存在非法字符用json.loads定位行号检查是否有多余逗号训练时模型把注释也生成了清洗不彻底注释残留用正则去掉中英文括号内的注释重新清洗其实最常见的问题永远不是数据处理本身而是文件在网络传输过程中发生损坏。我现在的习惯是任何重要数据集下载完成后第一步永远是校验哈希值第二步才是解压顺序不要反。7. 实操总结全唐诗数据集处理的完整管线拿走即用我把整个处理流程整理成了一条可以直接复用的管线。下载 zip 包后按顺序执行就不会出大问题。第一步下载和校验。下载完成后立刻执行shasum -a 256 全唐诗.zip与源站的哈希值对比。没有提供哈希值的就用file命令看看文件头是不是PK开头这是 zip 的标准魔数。第二步解压。优先用unzip -O GBK 全唐诗.zip指定编码解压完用ls查看目录结构确认中文目录名没有乱码。如果文件是分卷的先合并再解压。第三步编码转换。需要转换为 UTF-8 时用iconv -f GBK -t UTF-8 原文件.txt 新文件.txt批量处理。注意有些文件是 UTF-8 的转之前先file判断真实编码不要无脑转换。第四步结构化清洗。把 txt 转成 JSON按诗人、卷次、正文、注释四个维度分别填字段再用正则清洗掉空行和注释。这一步完成后就可以直接导入数据库中。第五步质量抽检。这一步不要省。我从清洗结果里随机抽了 300 首人工比对原文本确认格式、作者、正文三个关键字段的准确率。300 首里如果有 5 首以上出错说明清洗规则需要回头调整。第六步按场景交付。要训练模型就导出为 JSON Lines 格式一行一首诗要做检索就导入 Elasticsearch 建立索引要简单看看统计就导成 CSV 喂给 pandas。这套流程跑完从解压到得到最终可用的结构化数据我实测大约需要两到三个小时其中一半时间花在抽检和调整清洗规则上。看起来耗时但相比在模型训练阶段发现数据格式问题返工这点时间的投入回报率是非常高的。8. 一点补充给想要获取并再分发数据集的人的建议最后补充一点关于数据集获取和再分发的个人建议。目前网上的衍生版本非常多有的在原始数据上做了格式整理有的加入了注释和赏析有的把每首诗都打上了主题标签。它们的质量参差不齐选用的时候一定要关注两个核心因素一是文件是否完整二是加工后的数据是否和需求匹配。如果要自建一个全唐诗数据集我更推荐用 GitHub 上的开源版本作为底包然后结合自己的清洗脚本做二次加工。这样既保证了数据来源可追溯也保留了后续定制的灵活性。再分发时请保留原作者的信息和许可证声明这既是尊重也是一种从业者该有的职业习惯。整份数据集的构建过程走下来我的一个体会是数据集的构建并不是简单的“下载一份 zip 解压就能用”它其实是一套从格式识别、编码处理、文本清洗到结构建模的完整工程。愿意在这个环节投入足够时间后续的模型训练和应用开发都会顺利很多。本文还有配套的精品资源点击获取
返回列表