如果我的数据集不在 Hub 上怎么办?
您知道如何使用 Hugging Face Hub 下载数据集,但您经常会发现自己使用存储在笔记本电脑或远程服务器上的数据。在本节中,我们将向您展示如何使用 🤗 数据集加载不在 Hugging Face Hub 上的数据集。
使用本地和远程数据集
🤗 数据集提供了加载脚本,用于处理本地和远程数据集的加载。它支持几种常见的数据格式,例如
数据格式 | 加载脚本 | 示例 |
---|---|---|
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") |
腌制的数据帧 | 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 笔记本中运行它们。如果您想在终端中下载和解压缩数据集,只需删除前缀。
要使用 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")
默认情况下,加载本地文件会创建一个 DatasetDict
对象,其中包含一个 train
拆分。我们可以通过检查 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 使用的规则,对匹配特定模式的文件进行通配符匹配(例如,您可以通过将 data_files
设置为 "*.json"
来将目录中的所有 JSON 文件作为单个拆分进行通配符匹配)。有关详细信息,请参阅 🤗 数据集 文档。
🤗 数据集中的加载脚本实际上支持对输入文件的自动解压缩,因此我们可以通过将 data_files
参数直接指向压缩文件来跳过使用 gzip
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 上的数据集的各种方法的介绍。现在我们已经有了可以用来玩耍的数据集,让我们深入了解各种数据整理技术吧!
✏️ 试试看! 选择另一个托管在 GitHub 或 UCI 机器学习资源库 上的数据集,尝试使用上述技术在本地和远程加载它。作为奖励,尝试加载存储在 CSV 或文本格式中的数据集(有关这些格式的更多信息,请参阅 文档)。