数据清洗与质量过滤

03-数据工程 核心≈ 20 分钟 #数据清洗#去重#质量过滤 reviewed
我的状态:

前置知识点

一句话定义

数据清洗是构造之后、训练之前的守门环节:去重、过滤低质、校验格式、脱敏,把「喂给模型的每一口都是干净的」变成可执行的流水线。

为什么重要

重复样本让模型记忆而非学习(输出复读);低质回答直接拉低输出质量下限;格式脏数据会在模板拼接时产生错位样本;未脱敏数据是合规事故。清洗规则每一条都便宜,跳过的代价都昂贵。

前置知识

kp-010 的数据 schema 与来源结构。

核心概念

  • 精确去重:对样本内容做哈希(如 md5/sha1),完全相同即剔除。
  • 近重复检测:MinHash 或 embedding 向量近邻,找出「改几个字」的相似对。
  • 规则过滤:长度边界、语言检测、乱码率、字段完整性。
  • 模型打分:用强模型按 1-5 分评估每条样本的质量,低分剔除或重写。
  • 脱敏:手机号、身份证、姓名等 PII 识别与替换。

原理与机制

清洗流水线的推荐顺序(先便宜后昂贵):格式校验(json schema 合法、字段非空、output 非空)→ 精确去重 → 规则过滤(长度:过短无信息、超长多为粘贴脏数据;语言:与任务语言匹配;乱码与特殊字符率)→ 近重复(阈值经验值:MinHash Jaccard > 0.8 视为重复)→ 模型打分(只对通过前四关的样本做,控制成本)→ 脱敏。每一步记录剔除数量与原因分布——剔除率突然异常(如某类样本被剔 40%)本身就是数据质量问题的信号。

质量分布的意义:模型输出质量大致向训练数据的质量中位数回归,而不是被最优样本拉高。因此「删除最差 10%」对效果的影响常常大于「新增最好 10%」。

图示

原始jsonl → 格式校验 → 精确去重 → 规则过滤 → 近重复 → 模型打分 → 脱敏 → 训练集
             (最便宜)                                (最贵,放最后)
每步记录: 剔除n条(原因x占比y%) → 异常剔除率=数据问题的报警器

直观类比

做菜前的洗菜择菜:烂叶子(低质)不择,一锅都带苦味;重复的菜(重复样本)放十份同样的,味道不会更浓,只会齁。

实例或案例

5 万条原始日志经流水线后剩 1.87 万条:格式错误 12%、精确重复 31%、长度/语言过滤 9%、近重复 6%、模型打分低分 5%。其中「精确重复 31%」暴露了日志系统重试导致的重复入库——这条洞察反过来修了上游数据管道。最终 1.87 万条训练的模型显著优于 5 万条全量训练。

操作步骤

import hashlib, json
seen, out = set(), []
for line in open("raw.jsonl"):
    d = json.loads(line)
    text = d["instruction"] + d.get("input", "") + d["output"]
    h = hashlib.sha1(text.strip().encode()).hexdigest()
    if h in seen: continue          # 精确去重
    if not (10 < len(d["output"]) < 4000): continue   # 长度规则
    seen.add(h); out.append(d)
json.dump(out, open("clean.jsonl", "w"), ensure_ascii=False)

在此基础上叠加:langdetect 语言过滤 → datasketch MinHash 近重复 → 强模型打分 prompt(「按准确性与表达质量打 1-5 分,输出 JSON」)→ 正则脱敏(手机号/身份证/邮箱)。

排错清单

  • 清洗后数据所剩无几:放宽阈值前先看剔除原因分布,常见是长度阈值过严或语言检测误杀。
  • 把高质量难样本当噪声删了:模型打分对超长/复杂回答常给低分,打分 prompt 要声明「详尽不扣分」。
  • 去重后仍见相似样本:精确 hash 抓不住近重复,启用 MinHash 或 embedding 相似度。
  • 脱敏正则误伤业务内容(如把产品型号当手机号):脱敏规则要白名单豁免,且保留原始备份。

常见误区

  • 只去重文本相同:同一问题的十种问法(近重复)同样造成分布偏斜。
  • 清洗只在项目开始做一次:应固化为脚本,每次数据更新都重跑,并纳入版本管理。
  • 模型打分替代人工:打分模型自身有偏差,只能做初筛,抽检不可省。

与其他知识点的关系

清洗后的多源数据如何配比见 kp-012;与评测集的重叠检测(去污染)是另一个独立环节,见 kp-013;数据合规的法律面见 kp-032。

延伸阅读

本节不适用:清洗是工程实践积累,无单篇奠基文献;各步阈值建议在自己的数据上画分布曲线后再定。

自测题

  1. 为什么精确去重要放在模型打分之前?

答:成本排序——hash 去重近乎零成本且能先砍掉大量重复,打分按条计费,只应花在幸存样本上。

  1. 「删除最差 10%」和「新增最好 10%」哪个优先?

答:通常先删差——模型输出向训练数据质量中位数回归,去低质对下限的提升更直接。

  1. 某类样本剔除率突然 40%,说明什么?

答:不是清洗太严,而是该类数据源本身有问题(如上游重复入库或格式损坏),应回查数据来源而不是调阈值。

相关知识点