前言
你知道如何使用Hugging Face Hub下载数据集,但很多时候你会发现自己正在处理存储在你笔记本电脑或远程服务器上的数据。在本节中,我们将向你展示如何使用🤗 Datasets来加载数据集,即使这些数据集在Hugging Face Hub上不可用。
src link: https://huggingface.co/learn/nlp-course/chapter5/2
Operating System: Ubuntu 22.04.4 LTS
参考文档
处理本地和远程数据集
🤗 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数据集,这是一个用于意大利语问题回答的大规模数据集。
训练和测试分割托管在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对象。我们可以通过检查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对象中包含训练和测试分割,这样我们就可以一次性对两个分割应用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文件作为一个分割进行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上托管的数据集的方法的尝试。现在我们已经有了一个可以操作的数据集,让我们开始动手尝试各种数据整理技术吧!
结语
第二百二十六篇博文写完,开心!!!!
今天,也是充满希望的一天。