CC_Cleaner:一种丝滑高效且易扩展的数据清洗流程

WT/XT/MC    July 06, 2023

AGI 是数据 x 算法 x 算力的完美实践,是科研 + 工程 + 组织的优雅艺术。而在大模型训练的前置阶段,大数据的清洗是数据处理的基础。

以 Common Crawl 数据集为例,它可以轻松地在 Amazon 上获取到,是一个免费的、规模达到 PB 级别的网络爬虫数据集,其包括了超过 12 年间收集到的数据:原始网页数据(WARC)、元数据提取(WAT)和文本提取(WET)。如何对庞杂的原始数据进行清洗,得到高质量的数据集是一个值得研究的问题。本文将为大家介绍幻方深度求索实践优化后的数据清洗流程: cc_cleaner。

概述

FaceBook 在《CCNet: Extracting High Quality Monolingual Datasets from Web Crawl》工作中提出了从 WET 数据出发,清洗得到高质量数据集的流程。我们在此基础上做出了一些改进,提出了一种更为灵活、高效、强可拓展性的数据清洗流程,实现了更适合萤火集群的 cc_cleaner,其主要流程如下图所示:

01

相较于 cc_net,幻方 cc_cleaner 具有以下优点/特点:

  1. 更为完整的流程

    • 相较于从 WET 出发的 cc_net,幻方 cc_cleaner 从原始的 WARC 文件出发,提供了更加完整的数据 pipeline
  2. 扩展性更高、流程配置化

    • 数据清洗步骤中的算法、模型均可进行配置(如图所示),采用模块化方案,用户要自定义算法也只需继承原有函数,给定一个配置文件即可定义整个数据清洗流程
  3. 任务流程无感知

    • 适配了萤火集群,任务被打断重启之后,不会重复处理数据,无需额外异常处理
    • 自动进行任务分配,能方便地进行水平扩容
  4. 速度更快

    • 基于高速文件系统 3fs(高达 7TB/s 读取,500GB/s 写入),大大提高了文件处理的效率

文本预处理

不同于 cc_net,我们的 cc_cleaner 从原始的 warc 数据开始做处理,通过 URL 过滤、文本抽取两步之后,生成对应的 WET 文件。其中 URL 过滤我们使用了一个包含 4.6M 个域名的黑名单,去除了包含欺诈/色情内容的网页。

清洗之后的 WET 文件在之后流程的使用中并不方便,为了更快、更方便地处理数据,我们为每一个 WET 文件生成了对应的 meta 文件,用于存储 WET 的信息摘要,其中包括:

  1. 原网页 URL
  2. 标题
  3. 对应 WET 文件路径
  4. Data index(指明该 meta 对应的文件内容位置、长度等)

可以看到,meta 文件是 WET 的索引,通过更新 meta 中的内容,我们就可以实现对原始 WET 文件的修改、删除等操作。在生成 meta 文件时,我们会顺便生成文本的 minhash 用于去重,对于每一个文本,会生成一个 128 位的 int64 hash 值。

02

生成出来的 meta

去重

对于文本预处理中生成的每一个 meta 文件,有一个 128 位的 int64 hash 值,我们利用这个 hash 值进行去重。另外,cc_cleaner 的预处理内置了按行去重的功能,开启后将在处理 meta 时就把重复的行提前去掉。

对于 url page 的去重,首先按照去重率要求对 128 位 hash 进行分块,对于每一块 hash 的去重都是一个独立的任务,可以并行进行操作。cc_cleaner 会将每一块 hash 按照资源总量再次进行分配(例如 10 节点 * 256 核,就模 2560 进行二次分片),从前向后遍历数据,hash 相同的数据认为是重复的,并记录重复数据 index。之后将每块中记录的重复 index 从 meta 中删除,生成新的 meta,就实现了全局的去重。

语言分类

语言分类是对 WET 数据使用语言分类器进行分类,cc_cleaner 内置了 cc_net 使用的 fastText 分类器,用户也可以指定其他的分类器。通过遍历 meta 可以读取到原始的网页内容,对网页内容进行 lid 打分后,保留得分最高且大于 0.5 的 3 个分类,记录进 meta。如果没有语言得分超过 0.5,那这个数据将会被丢弃。

质量清洗

在抽取文本数据、去重并确定了网页数据的语言之后,仍然需要对文本进行一定的清洗来提高质量,称为质量清洗。幻方 cc_cleaner 内置了 cc_net 使用的 perplexity,这是一个在高质量数据上训练好的打分器,用来对 tokenize 之后的数据进行困惑度打分。

03

lid+困惑度打分示例

除此之外,cc_cleaner 还提供了以下清洗流程:

  1. Document-level 过滤规则,例如:

    • 丢弃单词数不在 50~100000 之间的文档
    • 丢弃平均单词长度不在 3~10 之间的文档
    • 丢弃“符号-单词”比例大于 0.1 的 (’#’ 和 ’…’ 符号)文档
    • 丢弃超过90%的行以 ‘•’ 开头或超过 30% 的行以 ’…’ 结尾的文档
  2. line-level 过滤规则,例如:

    • 丢弃主要包含大写字母的行
    • 丢弃只包含数字的行
    • 如果行的内容是一个计数(例如:转发 12次 评论 5条 点赞 30个)就丢弃
    • 丢弃只包含一个单词的行

小结

通过上述流程,我们就生成了可以最终的 meta 数据,只需要通过 meta 数据读取原本的 wet 数据,进行 tokenize 之后就可以生成用于大语言模型训练的数据。可以发现,我们除了生成 wet 数据的文本提取步骤,其余的步骤都是对远小于原始数据的 meta 文件进行操作,用到的分类器、语言模型等均可以进行配置,这大大降低了研究人员修改数据清洗流程生成数据集的难度、时间。


本文作者: WT/XT/MC


您可以转载、不违背作品原意地摘录及引用本技术博客的内容,但必须遵守以下条款: 署名 — 您应当署名原作者,但不得以任何方式暗示幻方为您背书,亦不会对幻方的权利造成任何负面影响。 非商业性使用 — 您不得将本技术博客内容用于商业目的。 禁止演绎 — 如果基于该内容改编、转换、或者再创作,您不得公开或分发被修改内容,该内容仅可供个人使用。