type
status
password
date
slug
summary
category
URL
tags
icon
Datasets 提供了三大特性:1、用于许多公共数据集的单行数据加载器;2、高效的数据预处理;3、NLP 任务相关的许多内置评估指标。
数据源
加载数据集
Data format | Loading script | Example |
CSV & TSV | csv | load_dataset("csv", data_files="my_file.csv") |
Text文本文件 | text | load_dataset("text", data_files="my_file.txt") |
JSON & JSON Lines文件 | json | load_dataset("json", data_files="my_file.jsonl") |
Pickled DataFrames(pandas) | pandas | load_dataset("pandas", data_files="my_dataframe.pkl") |
加载公开数据集:
HuggingFace提供了 3500 个可用数据集
load_dataset
:可以从远端加载数据集。加载数据集后会返回一个数据集对象。list_datasets
:展示所有数据集加载csv文件
加载json文件
读取多个json
加载压缩文件
当你不想手动解压GZIP文件时,上面提供的功能确实很省事。当然,对于ZIP和TAR格式,加载脚本也是支持的。只需要通过
data_files
参数设置好即可!加载远端数据集
load_dataset()
函数加载远端数据和加载本地文件的代码区别不大,只是将本地文件路径修改为URL路径。例如对于SQuAD-it-dataset
数据集,可以如下设置data_files
参数进行加载。该方法是发现加载的路径地址为URL时,会调用网络加载模块下载和解压数据,并存储为DatasetDict
对象。一大数据加载
现在上GB的数据集是非常常见的,例如训练BERT和GPT2的数据集。加载如此之大的数据集对内存大要求很高。Datasets针对大数据加载的痛点做了很多工作,在加载数据上使用内存映射的方法,使得加载数据不再受内存大小的限制,只要磁盘空间够大,就能够快速加载大数据文件。
本节将介绍如何加载825GB大小的语料库,该库名称为the Pile。依赖库安装
内存映射
流式处理
当数据量特别大的时候,比如我们要处理完整的Pile数据集(825GB),那么首先要下载下来,这就已经很费时了。为解决该问题,Datasets提供了一个流式数据加载方式,它可以实现在线的下载和处理数据(不需要下载完整的数据)。使用
load_dataset()
函数实现流式加载数据集,只需要设置参数streaming=True
。与我们熟悉的
Dataset
不同,上面代码返回的结果为IterableDataset
对象。如果要读取IterableDataset
对象数据,我们需要使用迭代读取的方式。map函数-流式处理
与
Dataset.map()
函数类似,如果要做数据预处理的话,可以使用IterableDataset.map()
函数进行操作。与Dataset.map()
的主要区别在于,IterableDataset.map()
处理的结果也需要迭代读取。为了加速流式数据的分词,可以设置参数batched=True
。默认的批尺寸为1000,如果要指定其他值,可以修改参数batch_size
。
shuffle函数-流式处理
同样也可以使用
IterableDataset.shuffle()
函数打乱数据,但是与Dataset.shuffle()
函数类似,IterableDataset.shuffle()
只会打乱在缓存中的数据,即只有buffer_size
个数据会被打乱。取数-流式处理
划分数据集-流式处理
可以使用
IterableDataset.skip()
函数来创建训练和验证数据集split
。合并数据集-流式处理
基于
interleave_datasets()
函数,将一个IterableDataset
对象列表转换为一个IterableDataset
对象这里使用基于Python
itertools
工具中的islice()
函数来获取数据集中的前两个example,我们发现这两个例子,第一个对应第一个合并的数据集,第二个对应第二个合并的数据集。数据结构
dateset数据集并不是使用传统的 csv 或 excel 格式,而是使用对象形式,该对象以某种结构存储数据集的元数据。
- 内置数据集在 features 和 num_rows 键中说明了列及样本数量。
数据结构说明
常用函数
排序
打乱顺序
选择函数
从数据集中取出某些指定的部分。结果仍然是dataset
dataset.select([0,1,2,3])的结果是dataset
dataset[0,1,2,3]的结果是字典
过滤
切分数据集
把数据集切分,10%为测试集。
分桶
把数据集均数若干份,取其中的第几份。
列重命名
列删除
dataset转换到其他格式
set_format函数用来实现与其它库数据格式的转换;
pandas转换为dataset
map函数-数据映射
遍历数据,对每个数据进行处理。
Dataset.map()
方法有一个batched
参数,设置为True,表示进行批量数据处理(默认设置是一次性处理1000个数据)。这个时候可以通过设置num_proc
增加处理进程提高分词处理速度。map
函数加速Dataset.map()
方法有一个batched
参数,设置为True,表示进行批量数据处理(默认设置是一次性处理1000个数据)。这个时候可以通过设置num_proc
增加处理进程提高分词处理速度。Options | Fast tokenizer | Slow tokenizer |
batched=True | 10.8s | 4min41s |
batched=False | 59.2s | 5min3s |
batched=True, num_proc=8 | 6.52s | 41.3s |
batched=False, num_proc=8 | 9.49s | 45.2s |
从上表可知,多进程对多批次快速分词也有加速作用。而在
batched=False
的情况下,slow tokenizer的多进程比fast tokenizer的单进程处理要快。但是通常情况,不推荐在batched=True
情况下设置num_proc=8
保存
Data format | Function |
Arrow | Dataset.save_to_disk() |
CSV | Dataset.to_csv() |
JSON | Dataset.to_json() |
上传数据集
- 首先使用
list_datasets()
函数看下Hub上已经有的数据集。
- 会员登陆
- 登录成功后,可以使用
create_repo()
函数创建新的repo。
- 从Hub上克隆空repo到本地,然后将数据集相关文件放入该repo文件夹中。
Repository.push_to_hub()
将数据集上传到Hub。
- 然后在网页中观察我们的上传结果(登录
repo_url
),如下所示。
- 在Hugging Face Hub,文档存储在repo下的文件
README.md
中。创建该文件之前包括两个步骤: - 使用
datasets-tagging application
来创建YAML
格式的数据集元数据标签。这些标签用来在Hugging Face Hub上进行检索操作,方便快速被他人检索发现。前面我们已经创建了自定义数据集,那么我们需要同时克隆datasets-tagging的repo,并且在本地运行,示例结果如下。 - 阅读 Datasets guide来创建数据集卡片,并且使用该向导作为创建模板。