A4(Data: Filtering Language Modeling Data)**
从 Common Crawl(WARC/WET)构建一个可训练的高质量 LM 语料,通过一整套 抽取 → 过滤 → 去重 → 并行处理 → tokenize → 训练验证 的数据管线,最后用固定模型/训练 recipe 在验证集上比拼 perplexity。
A4 总览:三大实现 + 两大运行
要实现(Implement)
- HTML → text 抽取(从原始网页内容提取可训练文本)
- 多种过滤(语言、PII、NSFW/毒性、质量规则、质量分类器等)
- 去重(精确行去重 + 文档级近似去重 MinHash/LSH)
要运行(Run)
- 在不同数据处理决策下训练 LM,对比性能差异(验证 ppl / loss)
1) Filtering Common Crawl:看数据 → 抽取文本 → 语言识别 → PII → 有害内容 → 质量过滤/分类
1.1 look_at_cc:先“看见”原始 CC 文本长啥样(4 分)
- 打开示例 WARC,观察第一条网页:URL、是否可访问、HTML 看起来是什么页面。
- 再看对应 WET(抽取文本):哪些像 HTML 噪声、哪些应该过滤;训练这种数据会出什么问题;它有什么潜在价值。
- 指出:什么应用场景下它算“好数据”,什么场景下不适合。
- 再浏览 25 条 WET 记录,做简短标注:语言、域名、页面类型,并回答“看了多少条才遇到高质量网页”。
能力点:建立“数据直觉”,知道你在过滤什么。
- 写一个函数:输入 HTML 的 byte string → 输出抽取的 text string
- 要求用
resiliparse.extract.html2text.extract_plain_text,并且要处理 非 UTF-8 编码(用 resiliparse 的 encoding detection)。
- 然后跑在一个 WARC 上,对比你抽取的结果 vs 官方 WET,写 2–3 句判断哪个更好。
能力点:网页文本抽取的工程坑(编码、模板噪声、主内容识别)。
1.3 language_identification:fastText 语言识别(6 分)
- 实现:输入 Unicode 文本 → 输出(语言 ID、置信度 0~1),并做必要的语言标签映射(en/zh)。
- 讨论:语言识别出错会导致哪些模型问题?高风险产品如何缓解?
- 在抽取的 CC 文本上抽样 20 条人工标注,对比 fastText 预测:报告错误;估计英语比例;给出建议阈值。
能力点:过滤阈值选择、误判风险与产品化缓解策略。
1.4 mask_pii:PII(邮箱/电话/IP)掩码(3 分)
- 写 3 个 masking 函数:
- email →
|||EMAIL_ADDRESS|||
- phone →
|||PHONE_NUMBER|||(强调“美国常见格式”,容错)
- IPv4 →
|||IP_ADDRESS|||
- 讨论:naive 掩码会对下游 LM 带来什么副作用?如何缓解?
- 在 CC 抽样 20 个发生替换的例子,指出 false positive/negative。
能力点:隐私合规与数据清洗副作用(分布偏移、格式污染)。
1.5 harmful_content:NSFW + toxic/hate fastText 分类(6 分)
- 用 Dolma 提供的 fastText 模型,实现:
- NSFW 分类(label + score)
- toxic speech 分类(label + score)
- 讨论:过滤有害内容对 LM 下游会造成哪些问题?如何缓解?
- 抽样 20 条人工对比分类结果:报告错误、估计有害比例、给出阈值建议。
能力点:安全过滤的阈值、误杀/漏检对模型行为的影响。
1.6 gopher_quality_filters:规则质量过滤(3 分)
- 实现一组 Gopher 风格规则(要求至少实现以下子集):
- 词数 <50 或 >100000 过滤
- 平均词长不在 [3,10] 过滤
- 30% 以上行以 “…” 结尾过滤
- 少于 80% 单词含字母字符过滤
- 抽样 20 条人工对比规则过滤结果,评论分歧。
能力点:可解释的 heuristic filter 与误判分析。
1.7 quality_classifier:训练“质量分类器”(15 分)
- 核心思想:用 Wikipedia 外链作为高质量正例、CC 随机页作负例,训练 fastText 分类器得到 quality score。
- 要求:
- 训练一个质量打分器(numeric score)
- 实现
run_classify_quality:输入文本 → 输出(high-quality or not, score),并通过 sanity test。
能力点:从“规则过滤”升级到“学习型质量过滤”,并做阈值 trade-off。
2) Deduplication:精确去重 + 近似去重(MinHash/LSH)
2.1 exact_deduplication:跨文件“精确行去重”(3 分)
- 两遍扫描:第一遍数每行频次(用 hash 降内存),第二遍重写文件,只保留全 corpus 唯一行。
- 要求:输入多个文件路径 + 输出目录,输出同名文件但去重后内容。
能力点:消除模板/页眉页脚等“完全重复”的噪声,工程上非常常用。
2.2 minhash_deduplication:MinHash + LSH 文档级“模糊去重”(8 分)
- 用 ngram Jaccard 相似度做“近似重复”定义;用 MinHash signature 近似 Jaccard;用 LSH 分桶找候选对,再算真 Jaccard 判重并聚类,最后每簇随机留 1 个。
- 还要求对文本做 normalization(小写、去标点、空白归一、去重音符、NFD normalization)来提升 recall(参考 RefinedWeb)。
- 输出:重写文件到输出目录,只保留未判重或被保留的文档。
能力点:大规模网页语料“模板化相似”去除的核心算法工具箱。
3) Leaderboard 主线:把管线跑在 5000 WET 上 → tokenize → 训练 → 以 ppl 评比
“综合工程”与“最终评估”。
3.1 filter_data:并行过滤 5000 个 WET 文件(6 分)
- 写脚本并行过滤
/data/CC/CC*.warc.wet.gz(5000 个),可自由组合前面实现的 primitives,也可探索其他过滤(如 n-gram LM ppl)。目标:让固定架构训练出的模型在 Paloma C4 100 domains 验证集上 perplexity 最小。
- 允许用 Paloma 验证集来“构造过滤器/分类器”,但严禁把验证文本直接拷贝进训练集。
- 需要统计:每个 filter step 丢弃了多少样本;报告过滤总耗时,并估计跑 100000 个 WET 的耗时。
能力点:真实数据工程:并行、统计、管线可观测性、避免验证泄漏。
3.2 inspect_filtered_data:抽样检查“保留/丢弃/修改”的例子(4 分)
- 从最终数据随机取 5 条:评论质量与是否适合 LM,结合“目标是 C4 ppl”。
- 从被丢弃/修改的里取 5 条:是哪个环节导致丢弃/修改?是否合理?
- 如因此做了迭代,报告迭代版本与变化。
能力点:数据工程的“人工 sanity check + 迭代闭环”。
3.3 tokenize_data:用 GPT-2 tokenizer 把过滤数据序列化为 uint16(2 分)
- 脚本将文本 tokenize,每文档加
<|endoftext|>,flatten 成 np.uint16,tofile() 写出。
- 还要报告最终 tokens 数。
能力点:训练数据格式与性能(memmap 友好、可快速加载)。
3.4 train_model:用固定训练脚本训练 GPT-2 small-shaped 200K steps(2 分)
- 在生成的 tokenized data 上训练,周期性评估 Paloma C4 100 domains validation loss,报告最优 loss 与曲线,并提交 leaderboard。
- 强约束:不许改模型结构与训练 procedure(目标是“优化数据”而非“优化训练”)。
能力点:用固定训练 recipe 做数据消融,公平比较过滤策略。
一句话总结:A4 的任务谱系
- 数据理解:读 WARC/WET、抽样标注与直觉建立(look_at_cc)
- 抽取:HTML bytes → text(encoding + resiliparse)(extract_text)
- 过滤:语言识别、PII 掩码、有害内容、质量规则、质量分类器(language_identification / mask_pii / harmful_content / gopher_quality_filters / quality_classifier)
- 去重:精确行去重 + MinHash/LSH(exact_deduplication / minhash_deduplication)
- 综合工程:并行处理 5000 WET → 可观测统计 → tokenize → 训练验证 → 迭代与 leaderboard(filter_data / inspect / tokenize / train)