如果我的数据集不在 Hub 上怎么办?
您知道如何使用 Hugging Face Hub 下载数据集,但您经常会发现自己处理存储在笔记本电脑或远程服务器上的数据。在本节中,我们将向您展示如何使用 🤗 Datasets 加载不在 Hugging Face Hub 上的数据集。
处理本地和远程数据集
🤗 Datasets 提供加载脚本以处理本地和远程数据集的加载。它支持几种常见的数据格式,例如
数据格式 | 加载脚本 | 示例 |
---|---|---|
CSV & TSV | csv | load_dataset("csv", data_files="my_file.csv") |
文本文件 | text | load_dataset("text", data_files="my_file.txt") |
JSON & JSON Lines | json | load_dataset("json", data_files="my_file.jsonl") |
腌制后的 DataFrame | pandas | load_dataset("pandas", data_files="my_dataframe.pkl") |
如表所示,对于每种数据格式,我们只需要在 load_dataset()
函数中指定加载脚本的类型,以及一个 data_files
参数,该参数指定一个或多个文件路径。让我们首先从本地文件加载数据集;稍后我们将看到如何使用远程文件执行相同的操作。
加载本地数据集
对于此示例,我们将使用 SQuAD-it 数据集,这是一个用于意大利语问答的大规模数据集。
训练和测试拆分托管在 GitHub 上,因此我们可以使用简单的 wget
命令下载它们
!wget https://github.com/crux82/squad-it/raw/master/SQuAD_it-train.json.gz !wget https://github.com/crux82/squad-it/raw/master/SQuAD_it-test.json.gz
这将下载两个名为 SQuAD_it-train.json.gz 和 SQuAD_it-test.json.gz 的压缩文件,我们可以使用 Linux gzip
命令解压缩它们
!gzip -dkv SQuAD_it-*.json.gz
SQuAD_it-test.json.gz: 87.4% -- replaced with SQuAD_it-test.json SQuAD_it-train.json.gz: 82.2% -- replaced with SQuAD_it-train.json
我们可以看到压缩文件已被 SQuAD_it-train.json 和 SQuAD_it-test.json 替换,并且数据以 JSON 格式存储。
✎ 如果您想知道上面 shell 命令中为什么有 !
字符,那是因为我们是在 Jupyter notebook 中运行它们。如果您想在终端中下载和解压缩数据集,只需删除前缀即可。
要使用 load_dataset()
函数加载 JSON 文件,我们只需要知道我们是否正在处理普通的 JSON(类似于嵌套字典)或 JSON Lines(换行符分隔的 JSON)。与许多问答数据集一样,SQuAD-it 使用嵌套格式,所有文本都存储在 data
字段中。这意味着我们可以通过如下指定 field
参数来加载数据集
from datasets import load_dataset
squad_it_dataset = load_dataset("json", data_files="SQuAD_it-train.json", field="data")
默认情况下,加载本地文件会创建一个具有 train
拆分的 DatasetDict
对象。我们可以通过检查 squad_it_dataset
对象来查看这一点
squad_it_dataset
DatasetDict({
train: Dataset({
features: ['title', 'paragraphs'],
num_rows: 442
})
})
这向我们展示了训练集的行数和与之关联的列名。我们可以通过索引到 train
拆分中来查看其中一个示例,如下所示
squad_it_dataset["train"][0]
{
"title": "Terremoto del Sichuan del 2008",
"paragraphs": [
{
"context": "Il terremoto del Sichuan del 2008 o il terremoto...",
"qas": [
{
"answers": [{"answer_start": 29, "text": "2008"}],
"id": "56cdca7862d2951400fa6826",
"question": "In quale anno si è verificato il terremoto nel Sichuan?",
},
...
],
},
...
],
}
太好了,我们加载了第一个本地数据集!但虽然这对训练集有效,但我们真正想要的是将 train
和 test
拆分都包含在一个 DatasetDict
对象中,以便我们可以同时对这两个拆分应用 Dataset.map()
函数。为此,我们可以向 data_files
参数提供一个字典,该字典将每个拆分名称映射到与该拆分关联的文件
data_files = {"train": "SQuAD_it-train.json", "test": "SQuAD_it-test.json"}
squad_it_dataset = load_dataset("json", data_files=data_files, field="data")
squad_it_dataset
DatasetDict({
train: Dataset({
features: ['title', 'paragraphs'],
num_rows: 442
})
test: Dataset({
features: ['title', 'paragraphs'],
num_rows: 48
})
})
这正是我们想要的。现在,我们可以应用各种预处理技术来清理数据、对评论进行标记化等等。
load_dataset()
函数的 data_files
参数非常灵活,可以是单个文件路径、文件路径列表或将拆分名称映射到文件路径的字典。您还可以根据 Unix shell 使用的规则来 glob 与指定模式匹配的文件(例如,您可以通过将 data_files
设置为 "*.json"
来将目录中的所有 JSON 文件 glob 为单个拆分)。有关更多详细信息,请参阅 🤗 Datasets 的 文档。
🤗 Datasets 中的加载脚本实际上支持输入文件的自动解压缩,因此我们可以跳过使用 gzip
,直接将 data_files
参数指向压缩文件
data_files = {"train": "SQuAD_it-train.json.gz", "test": "SQuAD_it-test.json.gz"}
squad_it_dataset = load_dataset("json", data_files=data_files, field="data")
如果您不想手动解压缩许多 GZIP 文件,这将非常有用。自动解压缩也适用于其他常见格式,如 ZIP 和 TAR,因此您只需将 data_files
指向压缩文件即可!
既然您知道如何在笔记本电脑或台式机上加载本地文件,那么让我们看看如何加载远程文件。
加载远程数据集
如果您在公司担任数据科学家或程序员,则您要分析的数据集很可能存储在某些远程服务器上。幸运的是,加载远程文件与加载本地文件一样简单!我们不是提供本地文件的路径,而是将 load_dataset()
的 data_files
参数指向存储远程文件的的一个或多个 URL。例如,对于托管在 GitHub 上的 SQuAD-it 数据集,我们可以将 data_files
指向 SQuAD_it-*.json.gz URL,如下所示
url = "https://github.com/crux82/squad-it/raw/master/"
data_files = {
"train": url + "SQuAD_it-train.json.gz",
"test": url + "SQuAD_it-test.json.gz",
}
squad_it_dataset = load_dataset("json", data_files=data_files, field="data")
这返回了上面获得的相同的 DatasetDict
对象,但节省了我们手动下载和解压缩 SQuAD_it-*.json.gz 文件的步骤。这结束了我们对各种加载不在 Hugging Face Hub 上托管的数据集的方法的探索。现在我们有了一个可以使用的数据集,让我们开始动手使用各种数据整理技术吧!