数据预处理的流水线:清洗、去重与工程账

语料的原罪:原始数据有多脏

上一篇「训练集群的工程学」讲的是作业怎么把数据吃进去;本篇退到上游,讲数据在被吃进去之前,是怎么被做成「能吃」的样子。这条上游流水线的质量,直接决定模型能力的上限——同样一张卡、同样一份代码,喂不同的语料,训出来的模型判若两人。

公开预训练语料的大头是网络爬取数据,而爬回来的原始数据远没有想象中干净:HTML 标记与导航菜单残留、广告与 cookie 提示、乱码与错误编码、模板化生成的垃圾页、以及同一篇文章被转载几百次的重复内容。行业里反复被验证的经验是:几十 TB 的原始爬取语料,过完整条清洗流水线后往往只剩零头,大部分体积都被丢弃。也就是说,数据工程的第一性工作是「扔」,而不是「存」——判断什么该扔、扔得又快又稳,就是本篇的主角。

顺带交代语料的来路:除了网络爬取,还有代码仓库、电子书、论文、百科与问答社区,各来源的脏法不同、清洗逻辑也不同——代码要去注释噪音与测试残渣,书籍要修排版断行,问答要剥离页面装饰。流水线通常按来源分线清洗,各自产出合格语料,最后按配方混合;本篇后面讲的各道工序在每条线上都要走一遍,只是参数不同。

第一道工序:规则清洗

文档级启发式

规则清洗的第一层是文档级的启发式规则,业内以 CCNet、Gopher 等公开工作总结的规则集为代表。常见维度包括:语言识别置信度不达标直接丢弃;文档长度过短(比如只有一两句话)可疑;符号与数字占比过高,说明是表格或代码碎片而非正文;平均行长异常——过短像菜单列表,过长像压缩失败;停用词覆盖率过低说明不是自然语言。每条规则单独看都朴素,组合起来能砍掉原始语料里相当大比例的垃圾。

规则阈值没有万能值,需要按目标语料分布抽样人审后调整——规则改一个阈值,下游模型的行为就可能变化。所以每条规则的参数都要当作配置资产来管理、留版本记录,而不是散落在代码里的魔法数字。

还有一层容易忽略的复杂度:规则要按内容类型分线套用。代码文档里符号占比高是常态,拿通用网页规则去筛会把代码语料误杀殆尽;中英混排的内容会被单语语言识别判成低置信度。所以工程上常见「先路由、再清洗」的结构——先判内容类型,再套对应的规则组,每组规则的阈值独立调优。

行级处理与格式修复

文档内部还有第二层:按行处理。网页正文里混着导航条、页脚版权声明、推荐位标题,这些通常以重复行或超短行的形态出现——统计行级重复率,把反复出现的行删掉;整篇文档行级重复率过高则整篇丢弃。格式修复也在这一步:编码探测与转换、HTML 正文抽取(定位正文容器、剥掉标签,思路与本站抓取订阅文章的正文提取一致)、特殊字符归一化。这层活琐碎,但每一处偷懒都会在语料里留下可见的伤疤,最终变成模型输出里莫名其妙的怪癖。

正文抽取是格式修复里最重的一块。通行做法是对页面结构打分定位正文容器:正文段落文本密度高、标点连续,导航与广告文本碎、链接密。容器定位失败的兜底是整篇丢弃——宁缺毋滥,把菜单栏当正文喂给模型的代价,远大于少收几篇文档。

第二道工序:去重的两把尺子

精确去重:哈希抓模板

最便宜的重复是「一字不差」的重复:同一篇新闻被原样转载、同一个模板页生成了千万个实例。对付它们用精确去重:对整篇文档(或规范化后的正文)算哈希,哈希进集合,后来者撞上就丢。哈希查重是常数时间操作,可以扛住海量文档;代价是只能抓完全一致,转载时改个标题、换个标点就漏网。规范化做得越好(去空白、统一大小写、剥残留标记),精确去重的命中率越高,成本又几乎不变,所以永远值得先做。

规范化管线的顺序有讲究:先剥格式、统一大小写与空白,再算哈希,规范化越彻底命中率越高;但过度规范化也有反效果——把标点全删之后,短文档容易撞车误伤。规范化的力度按语料形态实测调整,并把版本记进数据谱系,改一次力度等于换一次去重结果。

模糊去重:MinHash 加 LSH

真正的大头是近似重复:同一篇文章的几十个转载变体、拼接改写的内容农场产物。模糊去重不要求全文一致,只要求「足够像」,业界主流方案是 MinHash 加局部敏感哈希(LSH)的组合,思路分三步。

第一步,把每篇文档表示成片段集合:通常按连续 n 元词组切 shingle,文档变成一堆片段的集合,两篇文档的相似度就用集合的 Jaccard 相似度衡量(交集除以并集)。第二步,MinHash 压缩签名:用多个哈希函数分别对片段集合取最小哈希值,得到一个短签名;两条文档签名中相同位所占的比例,是 Jaccard 相似度的无偏估计——比较相似度从「比对两个大集合」降为「比对两个短向量」。第三步,LSH 分带加速:把签名切成若干段(band),两篇文档只要任意一段完全相同就成为候选对,再对候选对精算相似度决定去留。分带把全量两两比较的平方级开销压到只处理少数候选对,百万乃至亿级文档的去重才跑得动。

参数选择有个直觉范围:签名长度用几十到几百个哈希函数,band 数量与每 band 行数的乘积等于签名长度;band 越多、每 band 行数越少,相似度门槛越低,召回高但候选对也跟着多。目标阈值定在多高(比如相似度超过八成才算重复)是业务决策——新闻转载该删,格式高度雷同的公文未必——三件参数组合要按目标阈值实测校准,别抄一套参数就当万灵药。

为什么值得下这么大功夫?重复语料有三宗罪:浪费算力——同一样本训十遍,九遍是白烧卡;放大记忆——模型对高频内容死记硬背,隐私与版权风险随之放大;污染评测——如果基准测试题以某种变体混进语料,评测分数会虚高。去重的彻底程度,是区分认真做数据与糊弄做数据的分水岭。

第三道工序:质量打分与有害过滤

规则能抓住「长得像垃圾」的,抓不住「内容不行」的。第二层判断交给模型:一类做法是训练一个小型文本分类器(fasttext 这类线性模型是常识口径),用公认高质量语料(如百科、书籍)当正例、随机爬取语料当负例,然后用它给全量语料打分,卡阈值保留高分文档;另一类做法是困惑度过滤——用一个轻量语言模型给文档算困惑度,困惑度异常高(模型读不懂)或异常低(内容机械重复)的都可疑。这些打分器本身也是数据资产,它们的质量决定全量语料的命运,要像对待模型一样迭代评测它们。

打分还有一层自反性风险要警惕:用模型给数据打分、再用这批数据训模型,打分器的偏见会原样印进模型——打分器偏爱百科腔,模型就只学出百科腔。缓解办法是多打分器交叉(规则、分类器、困惑度各留一份意见),外加保留人工抽检的对照集,别让单一裁判垄断生死。

有害内容过滤是合规底线:色情暴力、仇恨言论按分类器与词表拦截;隐私信息(邮箱、电话、证件号这类模式)用正则加模型识别并脱敏或删除。另有一句话必须交代:不同来源数据的配比(网页、代码、书籍、论文各占多少)对模型能力结构影响极大,但那是数据配方的话题,本篇只管把每类数据洗干净,配方另议。

隐私脱敏的工程细节值得一提:邮箱、电话、证件号这类结构化模式用正则抓,人名、地址这类要靠命名实体识别;命中后通常替换成占位符而不是直接删除——删字会破坏句子的通顺性,替换能保留语言的完整形态。脱敏规则同样要调阈值:漏放是合规事故,滥杀又伤语料质量,两边都要留样本人审。

流水线的工程实现与教训

工程形态:分阶段、可重跑、有报表

清洗流水线的典型工程形态是分布式批处理作业:用 Spark 或 Ray 这类框架把「读取、规则清洗、去重、打分、写出」组织成分阶段的任务图,每个阶段的输出整体落盘到对象存储,下一阶段从落盘产物读起。这样做的好处是幂等可重跑——某阶段规则改了,只重跑该阶段及其下游,上游产物原样复用;TB 级语料的每次全量重算都是真金白银的 CPU 时与存储 IO,可增量重算是流水线的生命线。

成本账也要算明白:中间产物会成倍膨胀——原始一份、清洗后一份、去重后一份、带上打分标注又一份,存储开销轻松翻上几倍。产物分级管理是常规解法:常用的下游产物保留全量,中间态压缩归档并设过期时间;每条流水线的 CPU 时与存储开销折算成钱记进台账,改一个阈值之前,先看看它意味着重算多少 TB。

每个阶段都要产出统计报表:进入多少、丢弃多少、各类规则的命中分布、留存率曲线,再配随机抽样的人审样例。没有报表的数据流水线等于盲盒——你不知道某个阈值调整是砍掉了垃圾还是误杀了精华。所有规则版本、语料版本、产物版本的对应关系(数据谱系)要留痕,出问题时能回答「这批数据是用哪版规则、从哪版原料做出来的」。

两条教训:数据油腻与评测泄漏

最后记两条行业公共教训。其一,数据油腻:模型生成的内容正在回流互联网,后来者爬取语料时会不知不觉混入此前模型的输出,再用这种被污染的语料训练,风格与错误会代际放大,社区对此已有相当共识——对机器生成内容的识别正在成为清洗流水线的新工序。其二,评测泄漏:历史上不止一个模型被发现在预训练语料里「背过」基准测试题,公开榜单位次随之失真。两条教训指向同一件事:数据谱系必须可追溯,评测集必须与训练语料做去重隔离检查,这恰好用得上前面 MinHash 那套武器。

再补一条团队的内部教训:做数据实验时要把数据版本冻结——实验进行到一半换了语料,前后成绩不可比,结论全部作废重跑。数据版本管理与实验留痕的纪律,和上一篇讲的模型仓库是同一套思想的两个侧面。

小结

数据预处理的流水线,是把「互联网的混沌」提炼成「训练可用的秩序」的炼油厂。规则清洗用启发式规则与行级处理砍掉明显的垃圾;去重用精确哈希抓模板、用 MinHash 加 LSH 抓变体,省算力、防记忆、保评测;质量打分让模型给模型的食物定级,有害过滤守住合规底线;工程实现上,分阶段落盘、幂等重跑、统计报表与数据谱系是四根支柱。

这条流水线的投入产出是复利式的:语料质量每提升一档,下游每个模型、每次微调都受益;反之,脏数据的问题不会消失,只会在下游以更贵的代价暴露。对团队的考验不在某个精巧算法,而在工程纪律——阈值当配置管、阶段产物可重跑、丢弃有报表、谱系可追溯。把这套纪律立起来,才谈得上「数据是模型的粮食」,而不是「数据是模型的病历」。

← 返回资讯列表

读者留言

COMMENTS 暂无
仅本站原创文章开放留言 · 请勿留下手机号、邮箱等个人信息

还没有留言,来说第一句?