外观
A4 数据:让训练集成为可审计的实验变量
模型优化器不会知道一段文本是正文、导航栏、重复转载,还是被错误编码的乱码。它只会按频率学习这些内容。A4 把注意力从网络结构移到数据管线:从 Common Crawl HTML 提取正文,做语言和质量过滤,处理敏感字段,精确与近似去重,然后控制训练预算比较效果。高质量数据的定义需要由目标任务与评测支撑,不能只等同于“看起来像教科书”。
从网页记录到文档对象
WARC 保存抓取记录及原始内容,WAT 包含提取的元数据,WET 包含提取后的文本。已有 WET 不意味着提取结果适合训练;导航模板、脚注与内容重复仍需要检查。处理 HTML 应使用解析器识别结构,而不是用一个正则删掉所有尖括号:损坏的 HTML、脚本内容、代码片段都可能误伤。
推荐每个阶段保留一个最小文档对象:doc_id、来源标识、文本、语言置信度、过滤原因、内容 hash、处理版本。不必把全部原始 HTML 永久放进训练文件,但应能从处理记录解释“这篇文档为什么被保留”。每个过滤器输出保留数量、字节数和抽样例子;否则多个过滤器串联后只剩一个总数,无法定位误删。
flowchart LR A[WARC 记录] --> B[正文提取] B --> C[语言识别与质量过滤] C --> D[敏感字段处理] D --> E[精确去重] E --> F[MinHash LSH 候选] F --> G[相似度复核与文档聚类] G --> H[隔离验证集后分词打包]
查看流程图文本
flowchart LR A[WARC 记录] --> B[正文提取] B --> C[语言识别与质量过滤] C --> D[敏感字段处理] D --> E[精确去重] E --> F[MinHash LSH 候选] F --> G[相似度复核与文档聚类] G --> H[隔离验证集后分词打包]
过滤不是越多越好
语言识别器返回的分数不是普遍校准的真概率。代码、多语混写和短文本常是难例;统一阈值可能误删目标领域内容。启发式质量特征可包括词数、平均词长、重复行比例、标点与字母比例;学习型分类器则从高质量/低质量样本学出分界。两者都可能偏好某种写作风格。
邮箱、电话号码等字段可以用模式识别后替换,但规则必须明确处理范围、误报与格式变体;示例文本和合成数据足以测试,不需要收集真实个人信息。删除整篇文档与局部替换会改变不同分布特征,应该作为实验配置。内容过滤器也需要检查分领域误差,而非把单个分数当真值。
精确去重的最小正确版本
先定义规范化,再求稳定 hash:统一空白是否合适?大小写是否保留?数字是否保留?把所有数字抹去可能把不同数学题误判为重复;删除所有空白可能破坏代码。我们的小实验只折叠连续空白并去除首尾空白,SHA-256 相同者保留第一次。
python
clean = re.sub(r"\s+", " ", text).strip()
digest = hashlib.sha256(clean.encode("utf-8")).digest()
if clean and digest not in seen:
seen.add(digest)
kept.append(clean)这是文档级教学实现。官方 A4 还要求精确行级去重,语义与整篇去重不同:两篇不同文章可能共享整段模板。做行级去重时须记录是否破坏段落连贯性。Python 内置 hash() 有进程随机化,不适合作为跨进程、跨运行的稳定内容 ID;多进程处理尤其要避免各 shard 独立去重后仍保留跨 shard 重复。
MinHash 和 LSH 在近似什么
把文档变成 n-gram shingle 集合
把长度
LSH 输出候选,不是最终判定。候选需要按所选相似度复核,或明确采用签名阈值的近似策略。候选关系可用并查集聚类;但“相似”未必传递,A 近似 B、B 近似 C 并不保证 A 近似 C。按连通分量删到一份是更强的聚类策略,应承认可能过度合并。
短文档不足 n 个词时 shingle 集合可能为空。两个空集的数学约定不能直接变成“这两篇文档重复”;本地 Jaccard 函数对空并集返回 1,实际管线必须先把短文档转入单独策略。这个例子说明工具函数的定义与业务判定之间还有一层约束。
评估过滤效果的控制变量
用相同模型、相同有效训练 token 数、相同评测集比较原始与过滤数据。过滤后数据较少,若训练相同步数会重复更多遍;观察到变化可能来自重复率,而不只是质量。至少报告原始文档数、保留率、token 数、重复次数和领域构成。
训练集与验证/测试集也需做相似性检查,不能只在各自内部去重。若验证题及其改写已在训练中出现,评测会奖励记忆。决定去污染策略之后冻结验证集,不能因为某些指标不好再悄悄修改它。
自测与本地扩展
algorithms.py 提供空白规范化、稳定精确去重、shingles 与 Jaccard;它没有下载 Common Crawl,也没有完整 MinHash/LSH 作业实现。先给原创语料制造重复行、空白变化、局部增删三种扰动,比较精确与 shingle 相似度能发现什么。再实现固定种子的 MinHash,验证估计误差随签名长度变化。
去重后 validation loss 变差,能否断言去重无用?
先检查训练 token 预算、重复次数、数据分布和验证污染。去重可能降低对重复验证文本的记忆,也可能误删重要领域数据;只有控制这些因素并检查具体错误,才能解释结果。保留率本身不是质量指标。
来源:A4 2025 固定讲义、Common Crawl 数据说明、MinHash 与 LSH 教材第 3 章。下一章:对齐。