NKCorpus:利用海量网络数据构建大型高质量中文数据集

摘要

【目的】大规模、高质量的中文数据集对于大型中文预训练语言模型及其他自然语言处理模型的训练至关重要,因此需要设计并完善一种可以构建大规模中文数据集的框架。【方法】利用语言提取、文本清洗、数据去重等多种方法对原始数据进行处理获取数据集,并利用并行技术对数据处理框架的效率进行优化。【结果】提出了一个流程完善且高效的可以利用海量网络数据构建大型高质量中文数据集的框架NKCorpus,并且利用NKCorpus构建了约700GB的可直接用于中文预训练语言模型的训练工作的高质量中文数据集。【结论】NKCorpus已能够基本满足当前对于大规模、高质量中文数据集的高效构建需求。

关键词: 自然语言处理; 中文数据集; 数据集构建

引言

近年来,随着深度学习的发展,预训练语言模型(Pretrained Language Model, PLM)的研究取得了巨大进展。与有监督学习相比,预训练语言模型能够充分利用大规模的无标注数据学习通用语言特征,且仅需要通过少试、单试甚至零试学习就能完成各项自然语言处理下游任务,具备一定的常识和认知泛化能力[1]。随着PLM的快速发展,除模型结构、模型规模外,大规模的高质量训练数据对模型效果的提升起到了关键作用[2-3]PLM使用的训练数据通常来源广泛、内容丰富,具有数十GB到数TB的规模。然而,仅靠庞大的数据规模并不能保证模型的训练效果,还需要数据拥有较高的质量和可靠性[4]。因此,对于大型PLM及其他自然语言处理模型来说,使用大规模高质量的中文数据集进行训练至关重要。

在目前的PLM相关工作中,BookCorpus[5]WikipediaWebText[6]C4[3]等开源大规模高质量英文数据集已被广泛使用。开源的大规模高质量中文数据集却较少,nlp_chinese_corpus1(1 https://github.com/fanziwei/nlp_chinese_corpus)CAIL2018[7]MedDialog[8]等常用中文数据集的规模普遍不大,难以满足大参数量模型的训练需求。一个可行的数据集获取思路是对相对容易收集的低质量数据进行处理,筛选出高质量数据。但目前成熟的数据处理框架[4,9 -10]普遍没有针对中文数据处理进行设计或者没有开源代码,无法直接使用。此外,在面向大规模数据构建时,现有方案的数据处理流程也有不少需要优化改进的地方。

为了更好地应对当前公开数据集规模较小以及构建大规模高质量中文数据集困难的问题,本文提出了一种构建大规模高质量数据集的框架NKCorpusNKCorpus可以利用网络上多类别的海量原始数据构建大规模高质量的中文数据集,主要包括网络数据下载、中文数据提取、文本过滤及清洗、数据去重、高质量数据筛选、文本格式处理功能。本文的贡献可总结为以下四个方面:

1)设计并实现了一个完整、高效的大规模高质量中文数据集构建框架,可根据对数据规模和数据质量的不同需求灵活构建数据集。此外,NKCorpus是一个通用框架,用户可以通过对语言提取、文本过滤及清洗的流程进行少量修改,用于构建其他语言的数据集。

2)针对现有开源中文数据集规模较小的问题,NKCorpus利用海量原始网络数据构建大规模高质量数据集,以适应规模日渐增长的PLM对于训练数据集的需求。

3)针对现有开源中文数据集质量较低的问题,NKCorpus通过文本过滤及清洗、数据去重、高质量数据筛选等多个步骤,保证了数据的质量与多样性。

4)为了便于其他研究者使用NKCorpus,我们开源了NKCorpus的源代码2(2 https://gitee.com/lidongwen1997/nkunlp-preprocessing)

1 相关工作

对于英文数据集,目前已有较多成熟的数据处理方案。Radford等人[6]使用Reddit平台出站链接指向的网页文本,构建数据量达到40GBWebText数据集;Zhu等人[5]使用网络书籍文本,构建数据量达6.2GBBookCorpus数据集;英文维基数据集3(3 https://dumps.wikimedia.org/enwiki/)包含英文维基网站中的文章、模板及元页面等信息,数据总量19GB;Colin等人[3]对爬取的大批量网络文本进行清洗筛选,构建了数据量近750GBC4数据集。这些数据集在此前的PLM相关工作中发挥了重要作用[11],但由于其数据均为英文数据,无法应用于中文PLM训练工作。

目前广泛使用的中文数据集有Xu等人综合中文维基、新闻、翻译、社区问答及百科问答五个来源构建的nlp_chinese_corpus1数据集,数据量16.8GB;Xiao等人[7]收集了中华人民共和国最高人民法院发布的260多万件刑事案件,构建近3.4GBCAIL2018数据集;Chen等人[8]收集110万段医患对话,构建数据量达到2GBMedDialog数据集;Sun等人[12]对新浪新闻数据进行筛选过滤,构建了THUCNews数据集,包含74万篇新闻文档,数据量达到2.19GB;与英文维基数据集相似,中文维基数据集4(4 https://dumps.wikimedia.org/zhwiki/5)对中文维基中的文章、页面文本等进行汇总,共包含2.3GB的文本数据。虽然这些中文数据集质量较高,但其数据规模均很小,无法满足大规模中文模型训练的需求。

除以上公开数据集外,很多用于从低质量数据中提取高质量数据的数据处理方案被提出。Xu等人[9]基于C4数据集[3]的数据筛选流程,对其所依据的启发性规则进行更改、拓展,并重新设计了中文语句选取、不文明词句筛除、无意义语句筛除、短文本筛除及数据去重等一系列步骤,处理Common Crawl数据后得到数据量达100GBCLUECorpus2020数据集。Yuan等人[13]对大量网页数据进行清洗、筛选、去重处理,最终得到数据量达3TBWuDaoCorpora,该数据集规模较大,但是其处理过程中并未对数据进行直接的质量评估及筛选,且目前仅公开了200GB的数据。Lin等人[14]收集了来自百科全书、网络、法庭及产品描述等多种来源的广域数据,然后进行集中统一的清洗筛选,最终得到的M6-corpus数据中中文数据量达292GB。他们的工作中并未包含数据间的去重处理,且该数据集及数据处理代码未公开。Zeng等人[15]搭建了面向大型数据处理的分布式集群,利用数据清洗过滤、去重、质量评估等流程处理了近80TB原始数据后得到一个约1.1TB的高质量中文数据集,然而,其数据并未公开并且开源代码流程也不够完整5(5 https://git.openi.org.cn/PCLPlatform.Intelligence/ DataCollector/src/branch/master)Guillaume等人[4]设计的CCNet数据处理流程用于构建单语言数据集,首先对已有数据分片并根据文本哈希值进行去重,接着使用语言分类器进行语言类型识别,此后根据分词器[16]对数据进行分词,并放入训练好的5-gram Kneser-Ney[17]语言模型中计算数据的困惑度,划分出低、中、高三个质量层级的数据,最后根据文本语言类型与质量进行合并,得到最终数据集。虽然目前已有较多的数据处理方案被提出,但是现有方案仍存在无开源代码、公开的数据集规模较小、数据处理流程不完善、未针对中文数据设计清洗流程等问题。为了解决以上问题,本文提出了NKCorpus

2 背景

语言模型是根据已有的一部分语句预测句中的下一个元素是什么。其标准定义为,对于语言序列w1,w2,…,wnw1,w2,…,wn,计算该序列的概率,P(w1,w2,…,wn)Pw1,w2,…,wn[18]。语言模型经历了80年代的专家语法规则模型,2000年左右的统计语言模型,目前通常使用神经网络语言模型。神经网络语言模型通过构建神经网络的方式来探索和建模自然语言内在的依赖关系。而对于大型PLM来说,通常需要大量的高质量数据进行模型训练,以得到在各类自然语言处理应用上效果较好的模型。如表1所示,目前具有领先水平的英文预训练模型GPT2[6]GPT3[1]训练时分别使用了40GB和近1TB的数据,其数据类别覆盖网络数据、书籍、出版物、百科数据等。而对于中文PLM模型,2020年智源研究院和清华大学团队合作,使用来自百科、网络、数据、新闻等领域的100GB数据训练并开源了清源 CPM[19];2021426,华为诺亚方舟实验室、鹏城实验室等技术团队发布盘古αα”,一个参数达到2000亿的中文预训练模型,主要使用了500GB的网络和书籍数据进行训练[13];202161,万亿参数量模型悟道2.04.9TB高质量数据上训练,一统文本和视觉两大任务领域;20219,浪潮人工智能研究院正式发布的1.0”是目前最大规模的单体中文语言模型,参数规模高达2,457亿,使用的训练中文数据量达5,000GB,在新闻分类、原生中文推理、成语阅读理解填空、名词代词关系等多项应用上获得领先成绩。

1   大型预训练语言模型及对应训练数据规模

Table 1  Large scale pre-trained language models and their cor-responding training data size

模型

参数量

训练数据量

GPT-2

15亿

40GB

CPM

26亿

100GB

GPT-3

1750亿

1TB

盘古αα

2000亿

500GB

1.0

2457亿

5TB

悟道2.0

17500亿

4.9TB

新窗口打开下载CSV

公开出版的书籍、报纸等高质量数据远不能满足大型中文预训练语言模型训练时的海量数据需求,因此需要利用丰富的网络数据资源。Common Crawl6(6 https://commoncrawl.org/)是一个非盈利组织,每月会随机检索并即时爬取网络数据。Common Crawl公开了自2013年至今所有已爬取的数据,并且每月还在不断更新中,目前约有PB数量级的文本数据。Common Crawl提供三种格式的数据,分别为:

1WARC:爬取的原始数据。该格式可直接映射到网络爬取过程,包含HTTP响应及爬取的元数据等。

2WAT:包括三种(请求、响应、元数据)重要元数据。对于HTML,保留返回头信息和页面链接。

3WET:文本数据。从原始数据中提取出的文本数据。

数据集的构建仅需利用网页中包含的文本数据,因此WET格式的数据能够更高效率地提供信息。表2展示了Common Crawl提供的部分数据的统计信息,2017年至202112月共有463.82TB的原始文本数据。利用网络数据构建大型数据集首先需要对Common Crawl提供的WET数据进行下载。

2   2017年至2021WET文件规模统计

Table 2  Statistics of the WET file size from 2017 to 2021

年份

压缩后大小(TB

2017

109.66

2018

101.02

2019

96.61

2020

79.19

2021

77.34

总计

463.82

新窗口打开下载CSV

Common Crawl爬取的数据覆盖英文、俄文、德文、中文、日文、法文等百余种语言7(7 https://commoncrawl.github.io/cc-crawl- statistics/plots/languages)。表3展示了20219月至12月部分语言统计信息,据统计,所有数据中40%以上为英文数据,而仅有约5%为中文数据。Common Crawl整体数据量过大且中文数据比例较少,不适于全部使用来构建中文数据集,因此需要对其中的中文数据进行提取。

3   20219月至12月部分语言统计信息

Table 3  Language statistics from September to December, 2021

时间

英文

俄文

德文

中文

9

45.45%

6.53%

5.61%

4.99%

10

45.40%

6.80%

5.68%

4.83%

11/12

46.25%

5.99%

5.41%

5.30%

新窗口打开下载CSV

此外,网络数据中可能存在色情、暴力、反动和其他类型的不良文本,对构建一个良好的、正向的模型有极大的负面影响。再者,内容转载、引用、抄袭等现象导致网络数据重复率非常高,也会降低最终获取数据集的多样性。网络中存在的大量不成文或随机输入的文本也会大大降低数据集的质量。针对以上问题,需要设计出细致完善的方案对不良、重复数据进行删除,以提高数据集的质量。

3 框架设计

本文设计了一种流水线式的数据处理框架NKCorpus,该框架可以从海量的原始网络数据中构建规模较大、内容覆盖较广、质量较高的中文数据集。NKCorpus采取了模块化的功能设计,数据处理流程可从任意步骤灵活开始或结束,以适应不同下游任务训练数据集的构建需求。本章将详细介绍NKCorpus的处理流程以及每个步骤的具体解决方案。

3.1 整体流程

1展示了NKCorpus的整体处理流程,共包含六个模块:

1

1   NKCorpus整体流程

Fig.1   The overview of NKCorpus

1)数据下载模块:通过下载获取海量原始文本。该模块可通过修改数据链接的方式用于多种数据类型或数据来源的下载,具有一定通用性。本项目中被用于下载Common Crawl提供的海量网络文本数据。

2)中文提取模块:从数据中提取出对研究有帮助的内容,具体到本项目中为提取出所有语言类型为中文的文本数据。通过修改语言类型设置,也可用于其他单语言数据或多语言数据的提取。

3)文本过滤及清洗模块:根据一定的规则去掉不良数据。不良数据既包括色情、反动等违反公序良俗的内容,也包括过短的句子、网页的导航栏文字等无意义的内容。

4)篇章级去重模块:使用哈希算法计算文本的特征值,去掉特征值相同且文本相似度超过一定阈值的冗余数据。

5)高质量数据筛选模块:通过计算文本困惑度[4]去掉不成文、不通顺等质量较低的数据。

6)文本格式处理模块:将文本字符转换为ID,并添加开始和结束标识符,将数据转换为可以直接输入模型的格式。

3.2 数据下载

构建大型数据集需要海量的原始文本数据资源,本项目中需要下载Common Crawl提供的近PB的数据,这对网络带宽要求极高,如果仅在单台机器上下载,需要的时间让人无法忍受。因此,NKCorpus选择支持多设备节点并行下载并对下载任务进行统一调度管理。

Common Crawl将每月整理的数据分为多个WET文件进行存储,每个WET文件的大小在100MB200MB,这样的数据存储格式为多节点并行工作提供了便利。对于单个数据下载进程来说,进程首先向数据库请求任务,得到一个未下载的WET文件的下载路径并进行下载工作,下载完成后更新数据库状态。

3.3 中文提取

下载得到的Common Crawl数据中包含多种语言数据,为了有效提取出中文数据,NKCorpus采取高效的语言检测算法并设计了以行为检测单位的方案,能够尽量去除非中文文本的同时减少有效数据的损失。

通过综合评估三种文本检测方法langid[20]langdetect8(8 https://github.com/shuyo/language-detection)fastText[10],NKCorpus选用了运行效率较高、文本检测准确率也较高的fastText算法进行文本检测。Buck等人[21]指出网页文本中通常会包含多种不同语言,为了尽可能多地保存中文数据并避免有效数据损失,NKCorpus以文本中的行作为语言判断的单位。对于每行,定义中文占比为单行文本中中文字符(包括简体中文、繁体中文和中文标点)数量与单行文本中除特殊字符(空格符、占位符、缩进等)外的所有字符数量的比值。当单行文本长度较长时,采取较低的阈值可以保留较多有意义的中文句子;单行文本长度较短时,采取较高的阈值可以保留含有中文的短文本(如短标题等)且不保留过多其他语言的文本。NKCorpus采用表4展示的阈值进行中文数据提取,当中文占比大于阈值时,保留该行文本,否则删除。

4   文本长度与中文比例阈值

Table 4  The Chinese threshold for each length of text

文本长度

阈值

170

80%

71230

70%

大于230

60%

新窗口打开下载CSV


 

3.4 文本过滤及清洗

通常中文提取后的数据中仍存在较多问题,不能直接用于构建训练数据集。NKCorpus通过一系列步骤对数据进行过滤清洗,可以将冗余文本、不良文本以及过短文本去除。

3.4.1 完整内容提取

完整内容提取是将不成句或与正文内容无关的文本去除。主要去除以下几个部分的内容:(1)导航栏、短链接等不成句子的内容;2)网页提示信息、声明信息等网页模板类内容;3)时间、访问量等与正文内容无关的内容。

针对于上述需要去除的信息,NKCorpus设置了两个过滤器进行内容的过滤:(1)网页开始和结尾截取;2)完整句子检测。网页开始和结尾通常为导航栏或者提示声明等无关内容,一般不含标点。通过遍历整体内容,找到第一个标点符号和最后一个标点符号,将不与第一个标点相关(中间存在空格、换行符等)的内容以及最后一个标点之后的内容进行删除。此外,在网页中间通常包含一些导航、标题、链接、日期等与正文内容无关的信息。可以通过对句子的完整性进行检测的方案提取出连续且有意义的内容。由于网页中不同部分的标点符号密度不同[22],NKCorpus针对文本内容进行逐行检测,根据行内是否存在标点判断其是否为完整语句。

3.4.2 控制符检测

网页中一些具有特殊含义的控制符例如\x01\x02\x08\u3000等在文本中不具有实际意义,会对不良文本检测造成干扰。因此,NKCorpus利用正则匹配的方法将控制符删除。

3.4.3 不良文本去除

在去除不良文本时,如果以行为单位对数据进行是否为不良数据的判定(包含过高比例或者过多数量的不良词汇),会造成许多的误判,并且可能造成数据内容的不连续导致文本质量降低。因此,NKCorpus选择以篇章作为不良文本的检测单位。NKCorpus检测每篇文章中包含的不良词汇表中的词汇,并计算不良词汇的出现次数以及占全文的比重,以此来判断整段文本是否为不良文本。不良文本去除的关键是不良词汇表的构建,我们首先基于公开项目9(9 https://github.com/fighting41love/funNLP/tree/master/data)提供的词库对文本进行预检测,然后通过检查未能成功检测出的不良文本对不良词汇表进行补充。最终构建得到的不良词汇表中统计信息如表5所示。此外,NKCorpus支持对不同类别的不良词汇进行不同力度的检测,通过调整不同类别对应的阈值实现不同严格程度的检测。

5   各类不良词汇统计信息

Table 5  Statistics of censored words

类别

数量

色情

1690

反动

792

暴恐

254

民生

734

贪腐

97

其他

2559

新窗口打开下载CSV


 

3.4.4 文本长度检测

通常,文本质量与长度呈正相关,因此对篇章级别的内容进行长度限定是有意义的。进行长度筛选时,既需要筛去一定数量的低质量、不完整数据,也需要避免过多地将数据中篇幅较短但有实际意义的内容删除。NKCorpus最终确定文本长度的筛选阈值为20,可以有效达到以上目的。

3.5 数据去重

Common Crawl中存在较多的重复文本[4,10],因此需要设计合理的去重流程,保证数据集的多样性。NKCorpus针对文本进行篇章级去重并采用先局部再整体的设计实现方案(具体可参考章节§4.2.2,能够在不牺牲效果的情况下拥有较高的处理效率。

传统基于MD5[23]等哈希函数的算法仅能检测出完全相同的文本,会导致文本相似度非常高但不完全相同的文本被保留下来。Jaccard算法[24]]基于长文本的n-gram计算两条数据间的相似度,Jaccard相似度越高表示原始文本越相似。通过计算数据间的Jaccard相似度,便能够较为方便地去除高相似度文本。但Jaccard算法需要将所有数据两两配对,并沿原始文本进行滑动窗口计算,时间复杂度非常高,难以应用于大规模数据。

NKCorpus选用局部敏感哈希(Locally Sensitive Hashing,LSH)[25]算法结合Jaccard算法来进行大规模的数据去重处理。LSH基于MinHash[26]算法构建,能高效处理海量高维数据的相似性问题,LSH能够使两个相似度很高的数据以较高的概率映射成同一个哈希值,两个相似度很低的数据以极低的概率映射成同一个哈希值。NKCorpus采用相同的哈希函数处理所有数据获取哈希值,并通过比较哈希值判断两条数据是否可能相似。如果相似性分数高于阈值,再比较两条原始数据的Jaccard相似度。结合使用两种算法可以保证较高的效率和较好的去重效果。

3.6 高质量数据筛选

上述处理步骤可以筛去文本中的正文无关内容和重复数据,但表达混乱的文本并不能被很好地识别。NKCorpus使用当前颇受认可的困惑度筛选方式,从已有数据中筛选出语句通顺的文本,以此提高数据整体质量。

NKCorpus首先使用公开的新闻、百科类等高质量数据[12]训练了一个小型GPT-3[1]模型(下文简称:GPT-3S)。将待检测数据处理后(可以使用§3.7)逐条输入模型,并利用模型输出结果计算文本困惑度[1],困惑度公式为:

困惑度=∏Ni=11p(wi|w1w2…wi1)−−−−−−−−−−−−−−−√N困惑度=∏i=1N1pwiw1w2…wi-1N

1

其中w1,w2,…,wiw1,w2,…,wi表示文本第1,2,i1,2,…i个字出现的概率,NN表示文本长度。困惑度越低表示文本质量越高,因此NKCorpus保留困惑度低于阈值的数据来保证保留数据的质量。

3.7 文本格式处理

PLM无法直接接受文本数据,而是需要将文本数据转换为数字ID的格式。NKCorpus基于BERT[27]提供的数据格式处理方案进行调整,将文本按字分割并转换为ID形式,并在一条数据起始位置添加开始标识,在结束位置添加结束标识。然后根据数据集构建需求确定是否将不同文章进行拼接处理。最后使用滑动窗口分割的方式将数据处理为PLM需要的长度。

使用字而非词进行切割主要有以下优势:(1 在神经网络框架下进行中文自然语言处理任务,“级别的表现几乎总是优于级别的表现;2)对大部分中文自然语言处理任务而言,使用字更为方便,不需要进行额外分词,“级别的分割容易引起数据稀疏问题、OOVout-of-vocabulary)问题和训练过拟合问题[28]

通过NKCorpus 提供的六个步骤§3.2§3.7§3.2§3.7,可以获取覆盖包括新闻、娱乐、人物、电影等各个领域的高质量中文数据集。

4 工程实现及结果

4.1 项目环境及选型

NKCorpus工程项目实现及实验验证使用的软硬件环境分别如表6、表7所示。其中,MySQL 8是一种关系型数据库,在项目中用于任务管理,MySQL 8及以上版本支持FOR UPDATE SKIP LOCKED语句,可以自动跳过被上锁的数据条目,方便进行进程间同步,避免访问冲突。MongoDB是一种非关系型、基于分布式文件存储的开源数据库系统,在高负载的情况下可以通过添加节点数量来保证存储空间和处理能力。由于数据去重阶段需要存储大量的哈希值,因此选用MongoDB进行数据存储。

6   项目软件环境

Table 6  Project software environment

类别

条目

版本

开发语言

Python

3.7.0

数据库

MySQL

8.0.27

MongoDB

4.4.9

新窗口打开下载CSV

7   项目硬件环境

Table 7  Project hardware environment

类别

型号

数量

CPU

16C32T Intel(R) Xeon(R) Gold 5218 CPU @2.30GHz

2

RAM

192G

1

离线存储磁盘

4TB

100

新窗口打开下载CSV


 

4.2 项目工程实现

NKCorpus的工程实现具有基本功能覆盖全面、性能及可靠性有保障、错误处理成熟完善的特性。

项目实现时对各个功能模块进行抽象和解耦,具体设计分为通用基础组件、子功能组件、错误处理组件等。整体设计如图2所示,NKCorpus的设计能够保证系统的通用性、灵活性和可靠性,组件的高度抽象也增强了代码的复用性,避免代码冗余。

2

 

2   NKCorpus整体结构

Fig.2   Overview of NKCorpus

此外,NKCorpus的实现支持多机多线程处理任务,具有高扩展性,在有大量计算设备可用时,其效率与设备数量基本成线性关系,可以充分利用设备计算资源,提升运算效率。如图3所示,任务执行设备与存储磁盘协同进行模块任务。首先,下载服务器从互联网上下载数据至存储磁盘。接着,中文提取服务器对已下载的数据进行中文提取工作并存储到相同的存储磁盘上。然后,这些中文提取完毕的文件依次由清洗服务器进行文本过滤及清洗工作,由去重服务器进行数据去重工作,筛选服务器进行高质量数据筛选工作,最后由格式处理服务器进行格式转换获取可以直接用于语言模型训练的数据。下载服务器、中文提取服务器等各类型服务器在物理意义上可以是相同的服务器也可以是不同的服务器,在执行不同模块功能时使用不同的名称进行表示。

3

 

3   任务执行设备与存储磁盘协同执行任务示意图

Fig.3   The diagram of computing devices and storage devices


 

4.2.1 通用基础组件

NKCorpus对系统进行了抽象以提高复用性。配置读取组件、数据库连接组件、进度监控组件、网络检测组件、任务获取组件被所有数据处理模块调用,因此抽离出来作为通用基础组件。

配置读取组件。为了灵活地控制参数,NKCorpus实现了一套从配置文件中读取参数的机制。配置文件分为默认配置文件与本地配置文件两个部分,默认配置文件随系统版本进行更新,提供默认参数以及配置文件规范;本地配置文件不会被同步到系统中,用于用户需要自行修改配置参数的情况。

数据库连接组件。各功能子模块均需与数据库连接获取任务信息或者更新任务状态,因此NKCorpus提供了统一的数据库连接组件。用户只需修改配置文件中的数据库地址、数据库名称等参数即可方便地访问数据库,无需编写复杂代码。

进度监控组件。执行任务时,用户希望及时地了解任务的状态及进度,以便恰当地开始新任务或者临时结束任务。处理模块实现时均以文件为处理单位,因此可以使用统一的进度监控组件,输出任务处理进度。

网络检测组件。数据下载时需要与网络进行连接以及由于数据库与任务执行代码可能不在同一个计算设备上,处理进程需要利用网络与数据库进行连接。NKCorpus提供的网络检测组件首先检测网络是否连通,未连通时会提示用户进行网络连接。

任务获取组件。为了支持多机、多进程执行任务并保证一定的容错性,NKCorpus提供两种任务获取方案,一种是扫描本地数据目录的方式获取任务,首先扫描本地数据目录获取到本地存在的文件列表后,根据一定规则选取文件,再在数据库中查找对应条目,若能成功查找到对应条目则任务获取成功;另一种是从数据库中检索待执行的任务。

4.2.2 模块功能组件及模块实现

各模块(见§3)工作流程大致相同,数据下载模块任务获取采用从数据库检索任务的方案,其他模块均采用扫描本地文件获取任务的方案,具体工作流程如图4所示,首先读取配置文件中有关具体任务的配置信息,检测网络连接是否正常,再建立与数据库连接,然后重复执行任务获取、任务执行、数据库状态更新三个步骤,直到用户手动停止任务或者全部任务执行完毕后退出,其中任意步骤出错则会进行对应的错误处理流程。

4

图4   NKCorpus 数据处理工作流程

 

4   NKCorpus 数据处理工作流程

Fig.4   The data processing workflow of NKCorpus

除去重外的模块均针对单文件进行处理,处理过程中不存在内存不足的问题。由于去重模块需要对所有文件(TB级别)进行处理,无法一次性加载到内存中。NKCorpus特别设计了先局部再全局的方案,工作流程如图5所示。首先,针对本地的200个文件进行局部去重,一次性将文件加载到内存中,计算LSH后对可能重复的数据计算Jaccard相似度,仅保留高相似度数据中的一条,其余进行删除处理。然后进行全局去重,将所有局部去重后的数据的LSH与数据库中存储的已完成去重的数据的LSH进行比较,如果存在哈希值重复,则取回数据库中的记录(包括数据存储路径、文件中的唯一标识等),通过计算Jaccard相似度确认正在处理的数据中是否存在与已处理的数据高度相似的数据,若存在则删除。通过两阶段去重工作,可以使用有限的内存高效完成去重工作。

5

 

5   去重模块组件工作流程

Fig.5   The workflow of the deduplication component


 

4.2.3 性能及可靠性

性能。为了保证性能,NKCorpus进行了四个方面的优化:(1)任务并行:为了提高数据处理的效率,充分利用计算资源,每个步骤都支持多线程、多进程、多机并行进行处理。并且对每一部分的代码都进行了优化,以达到资源高效利用。(2)任务自动流转:每个处理进程在上一个处理任务完成(或失败)后可以修改数据库中相关的状态,并自动获取新任务开始执行,无需人工参与。(3)分时处理任务:针对服务器可能出现的性能周期性波动(例如处理数据的服务器被多人共享,白天空闲算力及可用内存较少导致数据处理效率较低或因内存不足频繁失败),用户可配置一个允许NKCorpus进行处理的时间段,在设置时间段内才会执行任务,时间段之外自动停止处理,无需人工干预。(4)处理流程自动化:数据处理流水线中的每一个步骤可以进行自动衔接,单文件被上一个模块处理后,可以自动被下一个处理模块所对应的处理进程处理。

错误处理。NKCorpus使用设计错误处理方案保证处理流程的可靠性。(1)统一任务管理:为了解决多个进程同时处理数据导致的进程同步问题,使用数据库进行统一的数据管理,存放任务(文件)的相关信息(包括文件URI、处理状态、文件大小等)。(2)高并发一致性、安全性保证:高并发时可能出现访问冲突的问题。在处理大量的数据时,难免会出现错误,可能会带来数据一致性方面的隐患。NKCorpus设计在程序出现异常或捕获Ctrl + C等中断指令时,会回滚数据库并恢复本地文件。以及本地文件全部使用双重备份机制,任务获取后(功能执行前)首先将要处理的数据文件进行备份;任务执行后将数据转移到另一存储地址。定时检查两份数据一致性,仅当两份文件信息完全一致时,删除备份文件;否则将备份文件转移回待处理文件夹,等待下一次任务执行时重新处理该文件。因此能够保证在高并发(数百个进程同时运行)时,整个系统的可靠性与数据一致性。(3)网络连通性检查:由于需要通过网络连接中央数据库或者进行下载任务,所以需要保证网络的可用性。处理进程开始时需要检测网络通断,如果失败进行重试。重试超过一定次数表示网络不通,此时报错并正常退出程序。(4)全流程错误处理:在整个程序的运行过程中,任何时刻出现错误都会捕获该错误并进行相应处理(重试或者退出任务并报告错误)。

4.2.4 任务并行支持

为了提高数据的整体处理效率,NKCorpus支持多线程、多进程、多机协同工作,并且提供了易上手的配置方案,可以充分利用任意的空闲计算资源。

多线程。为了提高对单文件处理速度,NKCor-pus在中文提取、文本过滤及清洗、数据去重、高质量数据筛选和文本格式处理等模块均提供了多线程支持,可以有效减少因处理单文件时间过长,中间出现网络中断或计算资源不可用而造成的任务失败。例如,在中文提取子功能中,以行为单位进行判断,而单文件中包含若干行,可以通过建立线程池,将行文本分配到空闲线程中进行中文比例检测。对单文件的处理效率随线程数呈线性提高且单多线程的方案文件处理成功率较单线程也有优势。

单机多进程。每个进程以文件作为单位进行处理,与中央数据库通信获取文件处理状态,这种使用中央数据库统一管理任务状态的方案使得任务不会重复执行;通过扫描文件夹的方式对文件进行任务处理直至文件夹为空也能保证不会漏掉待处理文件。以上两点设计使得NKCorpus能够支持单机多进程执行任务,充分利用计算资源。

多机并行。考虑到有大量计算资源可用的情况,NKCorpus对多机并行也提供了良好的支持,主要体现在:(1)一键配置环境:工程实现中打包了需要的所有环境,可以方便地一键配置环境;配备了完善的使用手册,简单修改配置文件即可根据资源的空闲情况、已有数据情况执行数据处理流程;2)硬盘存储数据:数据存储在离线磁盘而非计算设备上,既保证了充分的存储资源同时也能保证数据不和设备绑定,任务未执行完成而计算资源资源不可用时可以方便地切换计算设备并保证数据的完整性和可用性。

4.3 关键技术验证

4.3.1 去重处理方案

NKCorpus在去重部分采用了先局部再全局的方案,可以有效地降低与已去重数据冲突的概率以及数据库查询时间,从而提高整体的去重效率。本文对比了传统去重方案与本文提出的方案,传统方案即一次处理一个文件立即与已去重数据进行全局去重。去重效率实验结果如图6及表8所示,本文提出的方案具有明显优势,在处理前200个文件(每个文件大小约13MB,包含约1,500篇文章)时,用时仅为传统方法的68.5%,而在处理第800至第1,000个文件时,用时为传统方法的41.5%,随着累计处理文件数量的增加,先局部再整体的优势愈发明显。并且可以看出,随着累计处理文件数量的增加,本文提出的方案每次处理200个文件的用时没有显著增加,该方案对于数据整体数量的增加更具有鲁棒性。此外,本文通过对比两种方案去重后保留的数据数量和数据重合度来验证两种方案的效果。累计处理1,000个文件后,传统去重方案与本文提出的方案保留的数据数量分别为1,153,843条和1,144,754,二者基本一致。数据重合度通过对两种方案保留的数据两两计算Jaccard相似度得到,Jaccard相似度高于阈值则认为保留数据重合,传统去重方案获取的1,153,843条数据中有1,150,465条与本文提出方案保留数据一致,占比达到99.71%;本文提出方案保留数据全部与传统方案重合。以上实验结果可以看出两种方案的去重效果基本保持一致。总体来讲,本文提出的方案在不牺牲效果的前提下具有更高效率,更加适用于大规模数据的去重工作。

6

 

6   先局部再全局方案效率验证

Fig.6   The comparison of single deduplication and batch dedu-plication

8   先局部再全局去重效率验证

Table 8  The comparison of single deduplication and batch dedu-plication

累计处理
文件数

单次处理一个文件方案累计用时(s

先局部再整体文件方案累计用时(s

200

1685.2

1154.92

400

3674.55

2430.93

600

5866.27

3643.01

800

8497.65

4826.43

1000

11378.84

6020.76

新窗口打开下载CSV


 

4.3.2 多进程、多机效率验证

使用多进程、多机在实验环境下可以达到表9所示的数据处理效率。由于不同处理模块对内存和算力需求不同,单机支持的进程数略有差别,但仍可以看出随着进程数和机器数量的增加,单日处理效率有显著增加并且与进程数量、机器数量基本呈线性关系。

9   各流程单日处理数据量

Table 9  The data processing capability of each process (per day)

处理模块

单机单进程
处理数据量
TB/天)

单机多进程
处理数据量
TB/天)/
对应进程数

双机多进程
处理数据量
TB/天)

数据下载

2.2

2.2/1

4.3

中文提取

0.4

2.4/6

4.8

文本过滤及清洗

0.5

3.2/6

6.5

数据去重

0.7

1.5/2

3.0

高质量数据筛选

0.2

0.6/3

1.2

文本格式处理

2

10.6/5

22

新窗口打开下载CSV


 

4.4 实验结果

本文使用NKCorpus构建了一个约700GB的高质量中文数据集,该数据集规模远高于目前公开的中文数据集并且仍有很大的拓展空间。

本文针对各模块获取的数据量(如表10所示)进行分析,得到以下结论:(1NKCorpus获取的中文数据占所有下载数据的9.7%,Common Crawl给出的语言统计(中文数据占5%左右)略有不同,这可能是因为统计方法不同。此外,使用NKCorpus构造的数据集中保留了一部分其他语言的数据,其他语言数据主要由专有名词、公式、习惯性表达等构成,PLM模型训练时对这些数据加以考虑对训练效果有积极作用。(2)文本过滤及清洗模块过滤掉了65.3%的数据,说明了网络数据中包含较多的低质量数据(不良文本、不完整文本),设计合理的清洗过滤方案是十分必要的,低质量文本比例过高会影响后续的PLM模型训练。(3)数据去重模块保留了22.7%的清洗后数据,也就是说网络数据重复比例极高。越大的PLM模型需要越多的信息进行训练,如果没有经过完善的去重流程,即使获取了大规模的数据集,其中包含的信息量也较为有限,会浪费巨大的资源进行模型训练。(4)高质量筛选模块保留了约46.7%的数据,说明网络环境的自由性和开放性导致网络数据中可能存在较多不通顺、不成文的数据,去除这些低质量数据有助于训练一个较好的PLM模型。整体来讲,NKCorpus中的每一个处理模块都对提高最终构建得到数据集的质量起到了重要保障。

10   NKCorpus各模块获得数据量统计

Table 10  The data size output by each module

处理步骤

已获取数据量(TB

数据下载

195

中文提取

19

文本过滤&清洗

6.6

数据去重

1.5

高质量数据筛选

0.7

文本格式处理

0.7

新窗口打开下载CSV


 

4.5 数据集质量验证

为了验证使用NKCorpus构建出的数据集的质量,本文对比了NKCorpus最终构建出的数据集及CLUECorpus2020[9]的质量。质量评价采用困惑度作为评价指标,困惑度越低表示文本质量越高。为了更加公平地评价两个数据集的质量,本文采用三种模型计算数据困惑度,分别为本文训练的小型GPT模型、KenLM(分字)模型和KenLM(分词)模型[17]。具体上讲,我们首先从两个数据集中各随机抽取1,000条数据,然后利用三个模型进行困惑度计算,最终使用1,000条数据困惑度的平均值作为数据集的质量分数。

实验结果如表11所示。由于不同模型默认使用的窗口大小不同,不同模型困惑度的数量级也不同,但这并不影响相同模型在不同数据集上输出的可比较性。从实验结果中可以看出,使用小型GPT模型和KenLM(分词)模型进行质量评价时,NKCorpus构建得到的数据集质量更具优势,使用KenLM(分字)模型进行质量评价时CLUECorpus质量更具优势。整体来讲,可以认为NKCorpus构建的数据集质量较高,与目前公开的高质量数据集质量相当。

11   NKCorpus构建出的数据集与CLUECorpus2020的质量对比

Table 11  Quality comparison between the dataset built by NK-Corpus and CLUECorpus2020

NKCorpus构建出的数据集

CLUECorpus

小型GPT模型

15.47

68.76

KenLM
(分字)模型

15844.36

11309.31

KenLM
(分词)模型

118246.69

133829.06

新窗口打开下载CSV


 

5 结论与展望

本文提出并实现了NKCorpus,一个可以利用海量网络数据构建大型高质量中文数据集的流水线工作框架。利用该框架我们完成了一个700GB高质量中文数据集的构建工作。该数据集可用于PLM训练或者其他无监督NLP模型的训练,具有广泛的实际应用价值。同时,我们开源了NKCorpus的代码,以便各位学者学习、使用。未来我们将会研究更加通用的,能够处理多种语言数据的处理框架。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗伯特之技术屋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值