第二章:去芜存菁——数据清洗之术

在这里插入图片描述

数据清洗如炼丹,去芜存菁莫等闲。

【本章导读】

采集而来的数据,如同刚从河中舀起的水,泥沙俱下,杂质众多。若不清洗,模型将学习到错误知识,产生有害输出。本章将揭示数据清洗的核心技术。


一、为何要清洗数据?

【数据污染之害】

劣质数据的危害:

污染类型 危害 举例
重复数据 过拟合,浪费算力 同一文章出现千次
低质内容 学习垃圾知识 广告、垃圾邮件
有害内容 输出有害信息 暴力、歧视内容
错误信息 学习错误知识 谣言、假新闻
个人隐私 隐私泄露风险 身份证号、电话

二、去重之道:避免走火入魔

【去重心法】

重复数据如同走火入魔,让模型反复学习相同内容,浪费修炼时间,且容易过拟合。

【去重方法】

1. 精确去重

直接比较文本是否完全相同:

def exact_dedup(data):
    """精确去重"""
    seen = set()
    unique = []
    for text in data:
        if text not in seen:
            seen.add(text)
            unique.append(text)
    return unique

2. 近似去重

使用MinHash、SimHash等算法检测相似文档:

# MinHash近似去重原理
# 1. 将文档转换为特征集合(如n-gram)
# 2. 计算多个哈希函数的最小值
# 3. 比较MinHash签名相似度
# 4. 相似度超过阈值则视为重复

MinHash原理图解:

文档A: "大模型修炼秘籍" → 特征: {大模型, 模型修, 型修炼, 修炼秘, 炼秘籍}
                              ↓ MinHash
                              签名: [3, 7, 1, 9, 2]

文档B: "大模型修炼心法" → 特征: {大模型, 模型修, 型修炼, 修炼心, 炼心法}
                              ↓ MinHash
                              签名: [3, 7, 5, 8, 4]

相似度 = 相同签名数 / 总签名数 = 2/5 = 40%

3. 段落级去重

不仅去除完全重复的文档,还要去除文档内重复的段落。

【去重效果】

以GPT-3训练数据为例:

去重阶段 数据量 减少比例
原始数据 45TB -
文档去重后 38TB 15.6%
段落去重后 35TB 7.9%

三、质量筛选:只取精华

【筛选心法】

数据质量决定模型上限。宁可少而精,不可多而滥。

1. 启发式规则

基于简单规则快速过滤:

def heuristic_filter(text):
    """启发式质量过滤"""
    # 过滤太短的文本
    if len(text) < 100:
        return False
    
    # 过滤词频异常的文本(重复词太多)
    words = text.split()
    if len(set(words)) / len(words) < 0.3:
        return False
    
    # 过滤包含太多特殊字符的文本
    special_chars = sum(1 for c in text if not c.isalnum() and not c.isspace())
    if special_chars / len(text) > 0.3:
        return False
    
    return True

常用启发式规则:

规则 阈值 目的
文本长度 >100字符 过滤碎片内容
平均词长 3-10字符 过滤异常文本
特殊字符比例 <30% 过滤乱码
数字比例 <50% 过滤表格数据
大写字母比例 <80% 过滤标题党

2. 语言模型打分

用训练好的语言模型评估文本质量:

def lm_quality_score(text, model):
    """语言模型质量打分"""
    # 计算困惑度
    perplexity = model.perplexity(text)
    
    # 困惑度越低,质量越高
    return 1 / perplexity

困惑度(Perplexity)解释:

困惑度衡量语言模型对文本的"惊讶程度":

  • 困惑度低 → 模型不惊讶 → 文本符合语言规律 → 质量高
  • 困惑度高 → 模型很惊讶 → 文本不符合语言规律 → 质量低

3. 分类器筛选

训练分类器识别高质量文本:

输入: 文本
  ↓
特征提取
  ↓
分类器(如FastText)
  ↓
输出: 高质量/低质量

训练数据来源:

  • 正例:维基百科、高质量文章
  • 负例:广告、垃圾内容、机器生成文本

四、有害内容过滤:驱除毒气

【有害内容类型】

类型 举例 危害
暴力内容 暴力描写、伤害指导 诱导暴力行为
色情内容 成人内容 不适合所有用户
仇恨言论 种族歧视、性别歧视 传播偏见
非法内容 犯罪指导、毒品制作 违法行为
个人隐私 身份证、电话、地址 隐私泄露

【过滤方法】

1. 关键词过滤

SENSITIVE_WORDS = [...]  # 敏感词列表

def keyword_filter(text):
    """关键词过滤"""
    for word in SENSITIVE_WORDS:
        if word in text:
            return False
    return True

2. 分类器过滤

输入: 文本
  ↓
安全分类器
  ↓
输出: 安全/暴力/色情/仇恨/非法

3. 正则表达式过滤

import re

def privacy_filter(text):
    """隐私信息过滤"""
    # 身份证号
    text = re.sub(r'\d{17}[\dXx]', '[ID_REMOVED]', text)
    
    # 手机号
    text = re.sub(r'1[3-9]\d{9}', '[PHONE_REMOVED]', text)
    
    # 邮箱
    text = re.sub(r'[\w.-]+@[\w.-]+\.\w+', '[EMAIL_REMOVED]', text)
    
    return text

五、数据增强:炼化提纯

【增强方法】

1. 回译增强

原文(中文)→ 翻译为英文 → 再翻译回中文 → 得到改写版本

2. 同义词替换

原文: "大模型修炼需要大量数据"
改写: "大模型训练需要海量语料"

3. 格式统一

  • 统一编码格式(UTF-8)
  • 统一换行符
  • 去除HTML标签
  • 标准化空白字符

六、清洗流程总览

【完整清洗流程】

原始数据
    ↓
┌─────────────────┐
│  格式标准化      │ 统一编码、去除HTML
└─────────────────┘
    ↓
┌─────────────────┐
│  去重处理        │ 精确去重、近似去重
└─────────────────┘
    ↓
┌─────────────────┐
│  质量筛选        │ 启发式规则、模型打分
└─────────────────┘
    ↓
┌─────────────────┐
│  有害内容过滤    │ 关键词、分类器
└─────────────────┘
    ↓
┌─────────────────┐
│  隐私脱敏        │ 正则表达式替换
└─────────────────┘
    ↓
清洗后的高质量数据

七、本章心法总结

【口诀】

数据清洗如炼丹,去芜存菁莫等闲。
去重去劣驱毒气,质量为先记心间。

【要点回顾】

步骤 方法 目的
去重 精确去重、近似去重 避免过拟合
质量筛选 启发式规则、模型打分 提升数据质量
有害过滤 关键词、分类器 确保安全
隐私脱敏 正则表达式 保护隐私

【下一章预告】

清洗后的数据,如同提炼后的灵气,但仍需化为模型可吸收的形态。下一章,我们将学习Tokenization之术,将文本转化为模型可理解的基本单元。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐