60%的训练数据是垃圾

2026年Q1,我们从Common Crawl(互联网公开数据集)中提取了15TB的训练数据,准备用于训练一个中文大模型。

经过去重和清洗后,只剩下6TB——60%的数据被删除了。 删除的数据包括:重复内容(30%)、低质量内容(15%)、有毒内容(5%)、非目标语言(5%)、格式错误(5%)。

数据去重和清洗,是AI训练中最"无聊"但最"重要"的工作。 以下是完整的去重和清洗流程。

第一步:语言检测与过滤

目标: 只保留中文数据,删除其他语言。

方法: 使用fastText语言检测模型(预训练,支持176种语言),对每条数据进行语言检测。置信度>0.9的数据保留,置信度<0.9的数据删除。

效果: 15TB → 12TB(删除20%的非中文数据)。

坑: fastText对"中英混合"文本的检测不准确。我们额外用规则(中文字符占比>50%)过滤中英混合文本。

第二步:数据去重(Deduplication)

目标: 删除重复的、高度相似的数据。

方法:

  1. 精确去重(Exact Dedup): 删除完全相同的文本(MD5哈希匹配)。快速但粗糙。
  2. 模糊去重(Fuzzy Dedup): 删除高度相似的文本(MinHash + LSH)。慢但精确。

MinHash + LSH的工作原理:

  • MinHash:将文本压缩成"指纹"(128维的哈希向量)
  • LSH(Locality-Sensitive Hashing):将相似的"指纹"分到同一个桶里
  • 同一个桶里的文本,被视为"相似文本",只保留一条

效果: 12TB → 8TB(删除33%的重复数据)。

参数: MinHash的相似度阈值设为0.8。阈值太低(0.5),会删除大量"不重复但相似"的数据;阈值太高(0.95),会保留大量"重复但轻微不同"的数据。

第三步:低质量数据过滤

目标: 删除"垃圾"数据——太短、太长、无意义、低信息量的数据。

方法:

  • 长度过滤:删除<50字符或>100000字符的数据
  • 困惑度过滤:用KenLM语言模型计算文本的困惑度(Perplexity),删除困惑度>1000的数据(无意义文本)
  • 重复度过滤:删除词重复率>80%的数据(如"啊啊啊啊啊啊啊")
  • 特殊字符过滤:删除特殊字符占比>50%的数据(如代码、乱码、HTML标签)

效果: 8TB → 6TB(删除25%的低质量数据)。

困惑度过滤是"神器"——它能识别出"看起来像人话,但实际上是乱码"的文本。 例如:“今天天气很好,我去超市买了苹果。但是,但是,但是,但是,但是…"——这种重复的文本,困惑度会很高。

第四步:PII(个人身份信息)脱敏

目标: 删除或脱敏个人身份信息。

方法: 用正则表达式 + Presidio(微软开源的PII检测工具)检测和脱敏:

  • 手机号:\d{11} → 替换为[PHONE]
  • 身份证号:正则匹配 → 替换为[ID]
  • 邮箱地址:\S+@\S+ → 替换为[EMAIL]
  • IP地址:正则匹配 → 替换为[IP]

效果: 检测到约0.5%的数据包含PII,全部脱敏处理。

坑: 正则表达式不能覆盖所有PII(如"我的手机号是一三八一二三四五六七八”)。需要Presidio这类AI检测工具作为补充。

第五步:有毒内容过滤

目标: 删除包含暴力、色情、仇恨言论、违法内容的数据。

方法: 用敏感词库 + 分类模型(BERT-based)检测有毒内容。

效果: 删除约2%的有毒数据。

坑: 敏感词库和分类模型可能"误杀"正常内容。需要人工审核"边界案例"(如医学文本中的"乳房"、法律文本中的"杀人")。

数据去重和清洗的"成本"

步骤工具处理速度成本(15TB)
语言检测fastText1GB/s$50
精确去重MD5 Hash10GB/s$10
模糊去重MinHash+LSH100MB/s$500
质量过滤KenLM1GB/s$50
PII检测Presidio100MB/s$500
有毒过滤BERT500MB/s$200
总计$1,310

数据去重和清洗的总成本约$1,310(15TB数据)。 相比于GPU训练成本($10,000-$100,000),数据清洗的成本是"零头"。

结语:数据清洗是"必修课"

数据去重和清洗,不是"可选项",而是"必修课"。 60%的"垃圾数据"如果不清理,训练出来的模型会有严重的质量问题——重复输出、无意义输出、错误输出。

数据清洗的ROI是"无限大"的——花$1,310清洗数据,可能(通过提升模型质量)节省$10,000-$100,000的训练成本。 因为脏数据训练出来的模型,可能需要重新训练。

数据清洗的黄金法则:宁可"错杀"一些好数据,也不要"漏掉"任何脏数据。 因为一条脏数据可能污染整个模型的输出。


数据来源:作者团队数据去重与清洗实践(2026年Q1),Common Crawl数据集,MinHash论文(Broder, 1997),Presidio文档。