NLP 课程文档

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

Hugging Face's logo
加入 Hugging Face 社区

并获取增强型文档体验的访问权限

开始

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

Ask a Question Open In Colab Open In Studio Lab

您知道如何使用 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.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 笔记本中运行它们。如果您想在终端中下载和解压缩数据集,只需删除前缀。

要使用 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?",
                },
                ...
            ],
        },
        ...
    ],
}

太棒了,我们已经加载了我们的第一个本地数据集!但虽然这适用于训练集,但我们真正想要的是将 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 使用的规则,对匹配特定模式的文件进行通配符匹配(例如,您可以通过将 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 或文本格式中的数据集(有关这些格式的更多信息,请参阅 文档)。