PaddleNLP加载数据集和自定义数据数据集

本文主要是讲解如何使用PaddleNLP中的

方法,包含如何加载内置数据集和自定义数据集。

快速加载内置数据集

msra_ner 数据集为例:

from paddlenlp.datasets import load_dataset

train_ds, test_ds = load_dataset("msra_ner", splits=("train", "test"))

load_dataset() 方法会从 paddlenlp.datasets 下找到 msra_ner数据集对应的数据读取脚本(默认路径:paddlenlp/datasets/msra_ner.py),并调用脚本中 DatasetBuilder 类的相关方法生成数据集。

生成数据集可以以 MapDatasetIterDataset 两种类型返回,分别是对 paddle.io.Datasetpaddle.io.IterableDataset 的扩展,只需在 load_dataset() 时设置 lazy 参数即可获取相应类型。 Flase 对应返回 MapDatasetTrue 对应返回 IterDataset,默认值为 None,对应返回 DatasetBuilder 默认的数据集类型,大多数为 MapDataset

from paddlenlp.datasets import load_dataset
train_ds = load_dataset("msra_ner", splits="train")
print(type(train_ds))
<class 'paddlenlp.datasets.dataset.MapDataset'>
train_ds = load_dataset("msra_ner", splits="train", lazy=True)
print(type(train_ds))
<class 'paddlenlp.datasets.dataset.IterDataset'>

有些数据集是很多子数据集的集合,每个子数据集都是一个独立的数据集。例如 GLUE 数据集就包含COLA, SST2, MRPC, QQP等10个子数据集。

load_dataset() 方法提供了一个 name 参数用来指定想要获取的子数据集。使用方法如下:

from paddlenlp.datasets import load_dataset
train_ds, dev_ds = load_dataset("glue", name="cola", splits=("train", "dev"))

以内置数据集格式读取本地数据集

有的时候,我们希望使用数据格式与内置数据集相同的本地数据替换某些内置数据集的数据(例如参加 SQuAD竞赛,对训练数据进行了数据增强)。 load_dataset() 方法提供的 data_files 参数可以实现这个功能。以 SQuAD为例。

from paddlenlp.datasets import load_dataset
train_ds, dev_ds = load_dataset("squad", data_files=("my_train_file.json", "my_dev_file.json"))
test_ds = load_dataset("squad", data_files="my_test_file.json")

注解:
对于某些数据集,不同的split的读取方式不同。对于这种情况则需要在 splits 参数中以传入与 data_files 一一 对应 的split信息。 此时 splits 不再代表选取的内置数据集,而代表以何种格式读取本地数据集。

下面以 COLA 数据集为例:

from paddlenlp.datasets import load_dataset
train_ds, test_ds = load_dataset("glue", "cola", splits=["train", "test"], data_files=["my_train_file.csv", "my_test_file.csv"])

另外需要注意数据集的是没有默认加载选项的, splitsdata_files 必须至少指定一个。

从本地文件创建数据集

从本地文件创建数据集时, 推荐 根据本地数据集的格式给出读取function并传入 load_dataset() 中创建数据集。

以快递单信息抽取任务中的数据为例:

from paddlenlp.datasets import load_dataset

def read(data_path):
    with open(data_path, 'r', encoding='utf-8') as f:

        next(f)
        for line in f:
            words, labels = line.strip('\n').split('\t')
            words = words.split('\002')
            labels = labels.split('\002')
            yield {'tokens': words, 'labels': labels}

map_ds = load_dataset(read, data_path='train.txt',lazy=False)
iter_ds = load_dataset(read, data_path='train.txt',lazy=True)

推荐将数据读取代码写成生成器(generator)的形式,这样可以更好的构建 MapDatasetIterDataset 两种数据集。同时将单条数据写成字典的格式,这样也可以更方便的监测数据流向。

事实上, MapDataset 在绝大多数时候都可以满足要求。一般只有在数据集过于庞大无法一次性加载进内存的时候我们才考虑使用 IterDataset 。任何人都可以方便的定义属于自己的数据集。

Original: https://blog.csdn.net/weixin_55278528/article/details/123832370
Author: 阳光男孩小宁
Title: PaddleNLP加载数据集和自定义数据数据集

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/651631/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球