大模型数据清洗教程:从原始文本到训练可用的实操步骤

大模型数据清洗的目标是把原始文本变成格式统一、重复率低、噪声少、可安全用于训练或微调的语料。
如果你手头有一批网页抓取、日志导出或业务文档,下面的步骤可以按顺序执行。

先确认数据源和清洗目标

动手前先回答三个问题:数据来自哪里、最终要给哪个模型用、允许保留哪些内容。
网页抓取数据通常需要去 HTML 标签和广告;
业务文档要脱敏;
多语言语料要先做语言识别。

准备一个工作目录,例如 /data/clean,把原始文件放在 raw/,清洗结果放在 output/。
建议安装 Python 3.9 以上版本,并创建虚拟环境:

python3 -m venv venv
source venv/bin/activate
pip install pandas datasets langdetect beautifulsoup4

如果数据量超过单机内存,优先考虑分批读取或使用流式处理,不要一次性 read_csv 加载几十 GB 文件。

文本去重:精确去重与近似去重

重复数据会放大模型偏见,也浪费训练算力。
先做精确去重,成本低、见效快。
假设原始数据是 JSONL 格式,每行一个 {"text": "..."} 对象:

import hashlib, json

seen = set()
with open('raw/data.jsonl', 'r', encoding='utf-8') as f, \
     open('output/dedup.jsonl', 'w', encoding='utf-8') as out:
    for line in f:
        obj = json.loads(line)
        text = obj.get('text', '').strip()
        if not text:
            continue
        h = hashlib.md5(text.encode('utf-8')).hexdigest()
        if h in seen:
            continue
        seen.add(h)
        out.write(json.dumps({'text': text}, ensure_ascii=False) + '\n')

精确去重后,如果重复率仍然偏高,可以用 MinHash 或 SimHash 做近似去重。
零基础阶段不必自己实现,直接使用 datasets 库的 filter 配合哈希前缀即可做粗粒度去重。

清洗噪声:HTML、乱码与异常字符

网页数据常见的问题是残留 HTML 标签、JavaScript 代码和连续空白。
用 BeautifulSoup 提取纯文本:

from bs4 import BeautifulSoup
import re

def clean_text(raw):
    soup = BeautifulSoup(raw, 'html.parser')
    text = soup.get_text(separator=' ')
    text = re.sub(r'\s+', ' ', text)
    text = re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f]', '', text)
    return text.strip()

处理完以后抽查 20 到 50 条样本,确认没有把正文误删。
如果数据里混有多语言内容,用 langdetect 过滤掉目标语言之外的行:

from langdetect import detect, LangDetectException

def keep_chinese(text):
    try:
        return detect(text) == 'zh-cn'
    except LangDetectException:
        return False

注意:短文本语言识别准确率较低,建议只对长度超过 50 个字符的文本做语言过滤。

质量过滤与格式统一

质量过滤没有统一标准,但可以从长度、符号比例、重复行比例三个维度入手。
例如去掉少于 10 个字符或超过 10000 个字符的文本,去掉标点占比超过 30% 的文本。

格式统一方面,建议把每条样本整理成固定字段,例如:

{"id": "0001", "text": "清洗后的正文", "source": "web", "lang": "zh"}

如果后续用于指令微调,还需要把问答对整理成 instruction、input、output 三个字段。
字段名一旦确定,不要中途修改,否则后续加载数据集时容易报错。

常见坑与验证方法

第一个坑是去重时把不同语义的短文本误判为重复,建议先对长度小于 20 的文本跳过近似去重。
第二个坑是清洗后没有保留原始 ID,导致无法回溯问题样本,务必在输出中保留 source 或原始行号。

验证清洗效果可以跑一个简单统计:

import json
from collections import Counter

lengths = []
with open('output/dedup.jsonl', 'r', encoding='utf-8') as f:
    for line in f:
        text = json.loads(line)['text']
        lengths.append(len(text))

print('样本数:', len(lengths))
print('平均长度:', sum(lengths) / len(lengths))
print('最短:', min(lengths), '最长:', max(lengths))

如果平均长度明显低于原始数据,说明过滤条件可能过严;
如果最短长度仍然为 0,说明空文本没有清理干净。
把统计结果和抽样文本放在一起看,比只看数字更可靠。

几个实际会遇到的疑问

清洗后的数据需要人工标注吗?
不一定。
如果只是继续预训练,质量过滤和去重通常够用;
如果用于指令微调,建议至少人工抽查 100 条,确认格式和内容没有系统性偏差。

数据量很大时 Python 脚本跑不动怎么办?
可以把 JSONL 按行分批读取,或者用 datasets 的流式模式处理,避免一次性载入内存。

清洗规则应该固定吗?
建议把过滤阈值写在配置文件里,例如 min_len: 10、max_punct_ratio: 0.3,这样换数据集时可以快速调整,也方便复现。

整套流程跑完后,保留一份清洗日志,记录每步删除了多少条、剩余多少条。
后续模型效果不理想时,可以回头检查是数据源问题还是清洗过度。

分享到:
上一篇
大模型数据集构建:零基础本地实操流程与避坑
下一篇
大模型数据增强配置:从零搭建可用的图像增强流程
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意