LLM 课程文档
如果我的数据集不在 Hub 上怎么办?
并获得增强的文档体验
开始入门
如果我的数据集不在 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") |
Pickled DataFrames | 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")
默认情况下,加载本地文件会创建一个带有 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?",
},
...
],
},
...
],
}
太棒了,我们已经加载了我们的第一个本地数据集!虽然这适用于训练集,但我们真正想要的是在一个 DatasetDict
对象中包含 train
和 test
拆分,以便我们可以一次跨两个拆分应用 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 中的加载脚本实际上支持自动解压缩输入文件,因此我们可以通过将 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 或文本格式存储的数据集(有关这些格式的更多信息,请参阅 文档)。