跳到主要内容

数据清洗与去重

要解决的问题

原始 crawl 含 HTML 噪声、 boilerplate、乱码、近重复与完全重复段落。不去重则模型浪费算力记忆重复 n-gram,并放大记忆化与泄露风险;不清洗则 tokenizer 与 loss 被垃圾字符主导。目标是在可接受成本下,将语料变为干净、近似独立同分布的训练流。

核心概念

类型手段复杂度
格式清洗去 HTML、unicode 规范化、控制字符
启发式过滤长度、符号比、行重复、脏词表低~中
精确去重行级 / 文档级 hash(MD5、SHA)
模糊去重MinHash + LSH、SimHash、后缀数组

设文档 dd,指纹 h(d)h(d)。精确去重保留首个 hh,丢弃其余;模糊去重若 sim(di,dj)>τ\text{sim}(d_i,d_j)>\tau 则只保留代表元。

全局 dedup 常用 MinHash 估计 Jaccard:

J(A,B)i=1khi(A)hi(B)kJ(A,B) \approx \frac{|\cap_{i=1}^{k} h_i(A) \cap h_i(B)|}{k}

方法/算法

推荐 pipeline 顺序(与 Dolma、FineWeb 实践一致):

  1. 规范化:NFKC、统一换行、可选小写(多语言需谨慎)。
  2. 段落切分:按空行或 \n\n 得 segment,便于行级 dedup。
  3. 精确 dedup:对 segment 做 hash 集合;对整篇文档再做 document-level hash。
  4. 模糊 dedup:对 segment 计算 MinHash 签名 → LSH 桶内比对,阈值常用 0.7~0.9(需在小样本上调)。
  5. 跨快照去重:多个月份 CC 合并时,对 URL+正文联合去重,避免月度增量重复。

工程实践

  • 工具:datatrove、deduplicate-text-datasets、Google datasketch、Spark dropDuplicates
  • 算力:模糊去重最吃 CPU/RAM;可对长文档先 sketch 子采样 再全量比对。
  • 可观测:报告 dedup 前后 token 数、唯一文档率、最长重复簇大小。
  • 与质量过滤关系:清洗去重后仍要做 3.1.3 质量过滤,二者不可互换。

代表工作

局限与注意点

  • 过度去重:高阈值会删掉合法引用、模板化新闻,损害多样性。
  • 近重复≠无价值:问答站、许可证文本重复率高但语义仍可能有用,需分源策略。
  • 多语言:中文无空格分词,行级切分规则要与 分词 策略一致。
  • 顺序依赖:先质量过滤再全局 dedup 可省算力,但可能漏掉「低质但重复」样本,需 A/B。

去重强度与效果(经验)

策略典型 token 保留率风险
仅精确70%~90%近重复残留
+ 模糊 0.850%~70%误删引用
跨月全局再降 10%~20%算力成本高

实践检查清单

  • 报告 segment 级与 document 级去重贡献
  • 抽样检查被删簇是否含高价值模板(许可证、API 文档)
  • 中文语料单独验证切分规则

小结

去重是降低记忆化与算力浪费的第一道杠杆;阈值应在小样本上对比 PPL 与 benchmark 后再全量运行。

相关章节