组织你的仓库
要托管和分享你的数据集,请在 Hugging Face Hub 上创建一个数据集仓库,并上传你的数据文件。
本指南将向你展示在上传数据集时如何组织你的数据集仓库。具有支持的结构和文件格式(.txt
、.csv
、.parquet
、.jsonl
、.mp3
、.jpg
、.zip
等)的数据集将通过 load_dataset() 自动加载,它将在 Hub 上的数据集页面上有一个数据集查看器。
主要用例
最简单的数据集结构包含两个文件:train.csv
和 test.csv
(适用于任何支持的文件格式)。
您的仓库还将包含一个 README.md
文件,其中包含在数据集页面上显示的 数据集卡片。
my_dataset_repository/
├── README.md
├── train.csv
└── test.csv
在这种简单情况下,您将获得一个包含两个拆分的 数据集:train
(包含来自 train.csv
的示例)和 test
(包含来自 test.csv
的示例)。
在 YAML 中定义您的拆分和子集
拆分
如果您有多个文件,并希望定义哪些文件进入哪些拆分,您可以使用 README.md
文件顶部的 YAML configs
字段。
例如,假设您的仓库与这个仓库类似
my_dataset_repository/
├── README.md
├── data.csv
└── holdout.csv
您可以通过在 README.md
文件顶部的 YAML 块中添加 configs
字段来定义您的拆分。
---
configs:
- config_name: default
data_files:
- split: train
path: "data.csv"
- split: test
path: "holdout.csv"
---
您可以使用路径列表在每个拆分中选择多个文件
my_dataset_repository/
├── README.md
├── data/
│ ├── abc.csv
│ └── def.csv
└── holdout/
└── ghi.csv
---
configs:
- config_name: default
data_files:
- split: train
path:
- "data/abc.csv"
- "data/def.csv"
- split: test
path: "holdout/ghi.csv"
---
或者,您可以使用 glob 模式自动列出所有需要的文件
---
configs:
- config_name: default
data_files:
- split: train
path: "data/*.csv"
- split: test
path: "holdout/*.csv"
---
请注意,即使只有一个配置,config_name
字段也是必需的。
配置
您的数据集可能包含一些您想单独加载的数据子集。在这种情况下,您可以在 YAML 中的 configs
字段内定义配置列表。
my_dataset_repository/
├── README.md
├── main_data.csv
└── additional_data.csv
---
configs:
- config_name: main_data
data_files: "main_data.csv"
- config_name: additional_data
data_files: "additional_data.csv"
---
每个配置在 Hugging Face Hub 上单独显示,可以通过将配置名称作为第二个参数传递来加载。
from datasets import load_dataset
main_data = load_dataset("my_dataset_repository", "main_data")
additional_data = load_dataset("my_dataset_repository", "additional_data")
构建器参数
不仅 data_files
,而且其他构建器特定的参数可以通过 YAML 传递,允许在加载数据的方式上更加灵活,而无需任何自定义代码。例如,定义在每个配置中使用哪个分隔符来加载您的 csv
文件
---
configs:
- config_name: tab
data_files: "main_data.csv"
sep: "\t"
- config_name: comma
data_files: "additional_data.csv"
sep: ","
---
请参阅 特定构建器的文档,以查看它们具有哪些配置参数。
您可以使用 default: true
设置默认配置,例如,如果您设置了
- config_name: main_data
data_files: "main_data.csv"
default: true
自动拆分检测
如果未提供 YAML, 🤗 Datasets 会在数据集仓库中搜索特定模式,以自动推断数据集拆分。模式的顺序从自定义文件名拆分格式开始,如果未找到模式,则将所有文件视为单个拆分。
目录名称
您的数据文件也可以放置在名为 train
、test
和 validation
的不同目录中,每个目录包含该拆分的数据文件
my_dataset_repository/
├── README.md
└── data/
├── train/
│ └── bees.csv
├── test/
│ └── more_bees.csv
└── validation/
└── even_more_bees.csv
文件名拆分
如果您没有非传统的拆分,那么您可以将拆分名称放置在数据文件的任何位置,它会被自动推断。唯一的规则是拆分名称必须用非单词字符分隔,例如 test-file.csv
,而不是 testfile.csv
。支持的分隔符包括下划线、短划线、空格、点和数字。
例如,以下文件名都是可接受的
- train 拆分:
train.csv
、my_train_file.csv
、train1.csv
- validation 拆分:
validation.csv
、my_validation_file.csv
、validation1.csv
- test 拆分:
test.csv
、my_test_file.csv
、test1.csv
以下是一个所有文件都放置在名为 data
的目录中的示例
my_dataset_repository/
├── README.md
└── data/
├── train.csv
├── test.csv
└── validation.csv
自定义文件名拆分
如果您的数据集拆分具有非 train
、test
或 validation
的自定义名称,那么您可以将数据文件命名为 data/<split_name>-xxxxx-of-xxxxx.csv
。
以下是一个包含三个拆分(train
、test
和 random
)的示例
my_dataset_repository/
├── README.md
└── data/
├── train-00000-of-00003.csv
├── train-00001-of-00003.csv
├── train-00002-of-00003.csv
├── test-00000-of-00001.csv
├── random-00000-of-00003.csv
├── random-00001-of-00003.csv
└── random-00002-of-00003.csv
单个拆分
当 🤗 Datasets 找不到上述任何模式时,它会将所有文件视为单个 train 拆分。如果您的数据集拆分未按预期加载,可能是由于模式不正确导致的。
拆分名称关键字
有多种方法可以命名拆分。验证拆分有时被称为“dev”,而测试拆分可能被称为“eval”。这些其他拆分名称也受支持,并且以下关键字是等效的
- train, training
- validation, valid, val, dev
- test, testing, eval, evaluation
以下结构是一个有效的仓库
my_dataset_repository/
├── README.md
└── data/
├── training.csv
├── eval.csv
└── valid.csv
每个拆分多个文件
如果你的其中一个拆分包含多个文件, 🤗 Datasets 仍然可以根据文件名推断出它是训练、验证和测试拆分。例如,如果你的训练和测试拆分跨越多个文件
my_dataset_repository/
├── README.md
├── train_0.csv
├── train_1.csv
├── train_2.csv
├── train_3.csv
├── test_0.csv
└── test_1.csv
确保你 train
集的所有文件在其名称中都包含 train(测试和验证也是如此)。即使你在文件名中为 train
添加前缀或后缀(例如 my_train_file_00001.csv
), 🤗 Datasets 仍然可以推断出相应的拆分。
为了方便起见,你也可以将你的数据文件放入不同的目录中。在这种情况下,拆分名称将从目录名推断出来。
my_dataset_repository/
├── README.md
└── data/
├── train/
│ ├── shard_0.csv
│ ├── shard_1.csv
│ ├── shard_2.csv
│ └── shard_3.csv
└── test/
├── shard_0.csv
└── shard_1.csv