NLP 课程文档

如果我的数据集不在 Hub 上怎么办?

Hugging Face's logo
加入 Hugging Face 社区

并获得增强文档体验

开始

如果我的数据集不在 Hub 上怎么办?

Ask a Question Open In Colab Open In Studio Lab

您知道如何使用 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.gzSQuAD_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.jsonSQuAD_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?",
                },
                ...
            ],
        },
        ...
    ],
}

太好了,我们加载了第一个本地数据集!但虽然这对训练集有效,但我们真正想要的是将 traintest 拆分都包含在一个 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 上托管的数据集的方法的探索。现在我们有了一个可以使用的数据集,让我们开始动手使用各种数据整理技术吧!

✏️ 试试看!选择另一个托管在 GitHub 或 UCI 机器学习库 上的数据集,并尝试使用上面介绍的技术在本地和远程加载它。作为加分项,尝试加载以 CSV 或文本格式存储的数据集(有关这些格式的更多信息,请参阅 文档)。