🚦huggingface的datasets库使用
2023-2-1
| 2024-6-5
0  |  阅读时长 0 分钟
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:展示所有数据集
notion image

加载csv文件

notion image

加载json文件

notion image
读取多个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()

上传数据集

  1. 首先使用list_datasets()函数看下Hub上已经有的数据集。
    1. 会员登陆
      1. 登录成功后,可以使用create_repo()函数创建新的repo。
        1. 从Hub上克隆空repo到本地,然后将数据集相关文件放入该repo文件夹中。
          1. Repository.push_to_hub()将数据集上传到Hub。
            1. 然后在网页中观察我们的上传结果(登录repo_url),如下所示。
              1. notion image
            1. 在Hugging Face Hub,文档存储在repo下的文件README.md中。创建该文件之前包括两个步骤:
              1. 使用datasets-tagging application来创建YAML格式的数据集元数据标签。这些标签用来在Hugging Face Hub上进行检索操作,方便快速被他人检索发现。前面我们已经创建了自定义数据集,那么我们需要同时克隆datasets-tagging的repo,并且在本地运行,示例结果如下。
              2. 阅读 Datasets guide来创建数据集卡片,并且使用该向导作为创建模板。

            计算指标

            代码实战

          2. NLP
          3. huggingface中的Tokenizer详解spark分布式预测pytorch模型
            Loading...
            目录