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

你知道如何使用Hugging Face Hub下载数据集, 但你经常会发现自己正在处理存储在笔记本电脑或远程服务器上的数据。在本节中，我们将向您展示如何使用 🤗 Datasets来加载 Hugging Face Hub 上不可用的数据集。

##
使用本地和远程数据集

🤗 Datasets 提供了加载脚本来加载本地和远程数据集。它支持几种常见的数据格式，例如：

Data format | Loading script | Example
--- | --- | ---
CSV & TSV | `csv` | `load_dataset("csv", data_files="my_file.csv")`
Text files | `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 dataset, 这是一个大规模的意大利语问答数据集。

训练和测试都托管在 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 行(行分隔的 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使用的规则对与指定模式匹配的文件进行全局定位（例如，您可以通过设置’data_files=“*.JSON”‘将目录中的所有JSON文件作为单个拆分进行全局定位）。有关更多详细信息，请参阅🤗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 = "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 Machine Learning Repository上的另一个数据集并尝试使用上述技术在本地和远程加载它。另外,可以尝试加载CSV或者文本格式存储的数据集(有关这些格式的更多信息,请参阅文档)。