CCNet: Extracting High Quality Monolingual Datasets from Web Crawl Data
ArXiv1911.00359 CCNet: Extracting High Quality Monolingual Datasets from Web Crawl Data
Github facebookresearch/cc_net: Tools to download and cleanup Common Crawl data
概述
- 为保证数据质量,倾向于通过维基百科等高质量数据来源合成
ad-hoc datasets
(专门构建的数据集),但是低资源语言不好做 - paper从CC数据集出发,执行了FastText所提出的pipeline,但不同之处:
- 保留文档级别的结构,支持Bert等需要段落级别的模型训练
- 之前的方法切成单个句子,只关心局部上下文,切分成了n-gram
- 增加一个可选的单语言过滤
- 针对目标语言进行筛选
- 筛选出接近维基百科风格的文档
- 在目标语言的维基百科等语料上训练一个语言模型
- 通过困惑度进行文档打分,只保留那些 perplexity 较低的文档
- 保留文档级别的结构,支持Bert等需要段落级别的模型训练
- 与传统方法相比:
- 传统方法:多数只适用于英语的特殊方法,手动设置规则
- paper:通用性强,适用于多种语言
Method
- 下载网页快照的.WET文件,为每个段落生成哈希值,转化为.bin的二进制文件
- 独立处理每个WET下的文档,通过哈希进行去重,识别语言,计算困惑度
- 按照语言和困惑度得分重新分组,保存为 JSON 格式的文件
预处理
- 每个快照包含大约 20 到 30TB 的未压缩纯文本
- 将 WET 文件分组为每个 5GB 的分片(shard),转化为json格式
- json中的每一条entry:记录了url、文本等信息,代表了一个网页的内容
- 文本中含有段落
- 所以这里的逻辑是:快照(.WET) > shard > entry > 段落
去重
需要删除不同网页之间的重复段落(占了70%),为方便去重:
-
标准化
-
字符全部小写
-
所有数字变成0
-
删除所有Unicode的Punctuation Marks(标点符号)、Accent Marks(重音符号),完成段落标准化
-
标点
- 英文标点:
.,!?;:"'()[]{}-–—…@#$%^&*
- 中文标点:
,。!?;:“”‘’()【】《》……
- 法语标点:
«»
- 阿拉伯语标点:
،؛؟
- 日文标点:
、。,・「」『』
Accent:表示发音变化或区分拼写
- 法语:
à, é, ô, ù, ç
- 西班牙语:
ñ, á, é
- 德语:
ä, ö, ü
- 波兰语:
ą, ę, ś, ź
- 希腊语:
ά, έ, ό
- 计算哈希
- 对每个shard的每个段落计算SHA哈希值(160位),保存为二进制文件
.bin
- 每个段落的前64位作为其id便于维护
- 对每个段落,查询处理过的**一些(见后文)**shard的二进制文件,若出现过则舍弃,否则保存在本shard二进制文件中
- 对每个shard的每个段落计算SHA哈希值(160位),保存为二进制文件
由于很多步骤都是独立的,因此支持并行
- 对于网页数据,需要去掉导航栏、cookie、联系信息等
语言识别
- FastText模型,基于 Wikipedia、Tatoeba 和 SETimes 数据集进行训练
- 支持176种语言,为每一种语言输出0-1的置信度(总和为1)
- 若某语言得分超过0.5则进行确认,否则舍弃(无法识别语言)
语言模型过滤
- 对每种语言,训练了一个tokenizer和语言模型
- KenLM 库实现的5-gram模型(处理大量数据效率高)
- 使用tokenizer对每一个entry进行分词,使用语言模型计算每个段落的困惑度
消融实验
- 先去重再语言识别
- 可以去除一些英文的Cookie警告,防止误识别为英文
- 去重跨越的shard越多去除内容越多,去重效果越好,但是自然开销变大
- 选择50均衡了资源与性能
最终数据集的指标
- 使用训练好的语言模型对段落进行困惑度(perplexity)评分,作为衡量文本质量的代理指标。
- 结果发现:
- 高质量内容(如新闻、写作规范的内容)通常位于数据集的“头部”(head)
- 含有关键词列表或与 Wikipedia 差异较大的口语化内容会落在“尾部”(tail)
- 不同语言的困惑度分布差异较大,这主要是由于训练语言模型所使用的 Wikipedia 数据大小不同,而不是某些语言本身缺乏高质量内容。
- 因此,为每种语言设置了不同的困惑度阈值,将语料库划分为三个部分:
- Head(头部) :高质量段落
- Middle(中部)
- Tail(尾部) :较低质量段落
为了验证数据集的质量,作者使用 fastText 和 BERT 模型进行实验:
fastText 实验
- 对英语和波兰语的不同质量子集(head、mid、tail)训练词向量
- 在标准的类比任务数据集(Mikolov et al., 2013)上评估性能
- 结果表明 :随着从 tail 到 head 的变化,模型性能逐步提升,说明基于困惑度的过滤方法能有效提升数据质量
子集 | 英语总分 | 波兰语总分 |
---|---|---|
head | 77.9 | 65.3 |
mid | 74.2 | 62.8 |
tail | 62.0 | 59.9 |
BERT 实验
- 分别使用 Wikipedia 和 CCNet 提取的 head 数据训练 BERT-BASE 模型
- 训练语言包括:英语(en)、俄语(ru)、中文(zh)、乌尔都语(ur)
- 使用 XNLI 任务评估模型表现
语言 | Wikipedia 准确率 | CCNet 准确率 | 提升幅度 |
---|---|---|---|
en | 82.8 | 85.0 | +2.2 |
ru | 73.3 | 76.4 | +3.1 |
zh | 77.0 | 77.9 | +0.9 |
ur | 57.3 | 64.3 | +7.0 ✅(显著提升) |
特别是对于低资源语言乌尔都语(ur),Wikipedia 数据太小导致模型几乎无效,而使用 CCNet 提取的数据训练后,准确率提升了 7 个百分点 ,证明了该数据集对低资源语言预训练的重要性。
维基百科的数据不足,CCNet从CC中提取了高质量语言专用的数据,效果显著