HuggingFace | 如何下载数据集并加载

发布时间 2023-07-06 13:57:09作者: 张Zong在修行

HuggingFace中对于数据集的使用有个datasets库。datasets是一个用于加载和处理各种自然语言处理(NLP)数据集的Python库,它由Hugging Face开发。该库提供了一个统一的API,可以方便地访问多个数据集,并且支持自定义数据集。datasets库的主要特点包括:

  • 多个数据集:datasets库提供了许多常用的NLP数据集,包括GLUE、SQuAD、CoNLL、IMDB、WikiText、Amazon Reviews等。
  • 数据集处理:datasets库提供了许多方法和工具,可以轻松地处理和转换数据集,例如过滤、切分、映射、缓存等。
  • 高效性能:datasets库使用了多线程和缓存等技术来提高数据集的读取和处理效率,同时也支持GPU加速。
  • 自定义数据集:datasets库还支持自定义数据集,可以将自己的数据集转换成datasets库支持的格式,并在模型训练中使用。

使用datasets库,可以轻松地加载和处理各种NLP数据集,从而加速NLP模型的开发和研究。同时,该库也可以与Hugging Face的其他工具和库(如transformers)配合使用,从而构建完整的NLP应用程序。

datasets库如何加载自定义数据集

1、从Hugging Face Datasets Hub加载

要下载和加载一个Hugging Face数据集,可以使用以下步骤:

  1. 安装Hugging Face库和datasets子库:
!pip install transformers
!pip install datasets
  1. 导入datasets子库:
from datasets import load_dataset
  1. 使用load_dataset方法加载一个数据集。例如,要加载IMDB情感分析数据集,可以使用以下代码:
dataset = load_dataset('imdb')

第一次执行代码将下载IMDB数据集并将其加载到名为dataset的变量中。

  1. 可以使用dataset变量中的方法和属性来访问数据集。例如,要查看数据集的大小,可以使用以下代码:
print(len(dataset['train']))
print(len(dataset['test']))

这将打印出训练集和测试集的大小。

  1. 可以使用dataset变量中的traintest属性来访问训练集和测试集的数据。例如,要查看训练集中第一条数据,可以使用以下代码:
print(dataset['train'][0])

这将打印出训练集中第一条数据的内容。

注意:使用load_dataset方法加载数据集时,如果数据集还没有下载,那么首先会进行下载。下载的数据集将默认保存在~/.cache/huggingface/datasets目录下。而且下载数据集的时候很容易超时,需要我们多次尝试执行,或者报错信息会给你访问不了的网址,我们可以去打开网页尝试是否可以不用梯子下载下来,如果可以,我们在使用代码去尝试下载,因为主动下载下来的只是数据,没有匹配datasets库的格式

datasets库下载的数据集

自己找到网址并下载的数据集

如果我们不行把数据集保存到默认的位置,我们可以这样下载然后加载到本执行文件夹下的imdb文件夹下。如果这个文件夹不存在,会自动创建一个,然后里面是下载的数据。

dataset = load_dataset('imdb', cache_dir="./imdb")

总的来说,使用datasets.load_dataset方法,从Hugging Face Datasets Hub中下载和加载数据集。

2、自定义或本地加载数据集

要加载自定义数据集,可以使用datasets库中的DatasetDictDataset类。以下是一个简单的例子,展示如何加载一个自定义数据集:

from datasets import DatasetDict, Dataset

# 定义数据集
my_dataset = Dataset.from_dict({
    "text": ["Hello, world!", "How are you?"],
    "label": [1, 0]
})

# 将数据集添加到DatasetDict中
dataset_dict = DatasetDict({"my_dataset": my_dataset})

# 打印数据集
print(dataset_dict["my_dataset"])

# 将数据集保存到指定位置
my_dataset.save_to_disk("path/to/save/my_dataset")

我们首先使用Dataset.from_dict方法定义了一个包含两个样本的数据集。然后,我们将这个数据集添加到DatasetDict对象中,并使用键名"my_dataset"进行标识。然后,我们打印了DatasetDict对象中的"my_dataset"数据集。最后,我们使用save_to_disk方法将数据集保存到指定位置,其中"path/to/save/my_dataset"表示保存的路径和文件名。

下图就是文件夹下,我们保存的my_dataset数据集。

注意,自定义数据集应该是一个字典,其中每个键名代表一个特征(例如,输入文本、标签、ID等),而每个键值则代表该特征对应的值。在加载自定义数据集时,我们可以使用Dataset.from_dict方法来将字典转换为Dataset对象。

除了使用Dataset.from_dict方法外,还可以使用Dataset.from_pandasDataset.from_csvDataset.from_json等方法来加载不同格式的自定义数据集。这些方法分别支持从Pandas DataFrame、CSV文件、JSON文件中加载数据集。

数据集加载

datasets库中提供了多种加载数据集的方法,可以根据数据集的格式和保存方式选择合适的方法。

以下是一些常见的加载数据集的方法:

  • 从本地文件加载:使用Dataset.from_(format)方法,例如Dataset.from_csvDataset.from_json等,根据数据集的格式选择对应的方法,从本地文件中加载数据集。
  • 从Hugging Face Datasets Hub加载:使用datasets.load_dataset方法,从Hugging Face Datasets Hub中下载和加载数据集。
  • 从Pandas DataFrame加载:使用Dataset.from_pandas方法,将Pandas DataFrame对象转换为Dataset对象。
  • 从Numpy数组加载:使用Dataset.from_dict方法,将包含Numpy数组的字典转换为Dataset对象。

下面是把我们定义的数据集加载下来的代码:

from datasets import DatasetDict, Dataset
import datasets

dataset = datasets.load_from_disk("./my_dataset")

print(len(dataset['text']))
print(len(dataset['label']))
print(dataset['text'][0])

机器翻译中的平行语料加载

这里讲的是自定义的数据。假设我们有一个包含中英双语句子对的平行语料库,其中每个句子对包含一句中文句子和一句英文句子。

from datasets import DatasetDict, Dataset

# 定义数据集
data = {
    "chinese": ["我喜欢吃水果", "你在哪里?"],
    "english": ["I like to eat fruit", "Where are you?"]
}
my_dataset = Dataset.from_dict(data)

# 将数据集添加到DatasetDict中
dataset_dict = DatasetDict({"my_dataset": my_dataset})

# 打印数据集
print(dataset_dict["my_dataset"])

我们首先定义了一个包含两个句子对的数据集,其中"chinese"键名代表中文句子,"english"键名代表英文句子。然后,我们将这个数据集添加到DatasetDict对象中,并使用键名"my_dataset"进行标识。最后,我们打印了DatasetDict对象中的"my_dataset"数据集。

假如我有15万条双语语料数据,保存的格式就是txt,如何使用?

如果你的双语语料库以txt格式存储,每一行都包含一条中英双语句子对,那么你可以使用Python内置的文件读取方法来加载这个数据集,并将其转换为datasets库支持的格式。

例子,展示如何加载一个包含15万条中英双语句子对的txt文件:

from datasets import Dataset

# 打开txt文件,读取所有行
with open("path/to/my/dataset.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()

# 将每个句子对拆分为中文句子和英文句子
data = {
    "chinese": [],
    "english": []
}
for line in lines:
    chinese, english = line.strip().split("\t")
    data["chinese"].append(chinese)
    data["english"].append(english)

# 将数据集转换为Dataset对象
my_dataset = Dataset.from_dict(data)

# 打印数据集
print(my_dataset)

我们首先使用open方法打开txt文件,并使用readlines方法读取所有行。然后,我们遍历每一行,并使用strip方法去除行末的空格和换行符,并使用split方法根据制表符\t将每个句子对拆分为中文句子和英文句子。接下来,我们将中文句子和英文句子分别存储到data字典的"chinese""english"键名中。最后,我们使用Dataset.from_dict方法将data字典转换为Dataset对象,并打印了整个数据集。

需要注意的是,在加载和处理大规模数据集时,可能会遇到内存不足等问题。

from datasets import Dataset

# 打开txt文件,分批读取数据集
my_dataset = Dataset.from_iterable(
    (line.strip().split("\t") for line in open("path/to/my/dataset.txt", encoding="utf-8")),
    columns=["chinese", "english"],
    chunksize=1000
)

# 打印数据集
print(my_dataset)

我们使用from_iterable方法和chunksize参数来分批读取数据集。具体地,每次读取1000条句子对,并将其转换为Dataset对象。