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

文章目录

  • 加载数据集
    • 快速加载内置数据集
      • 选择子数据集
    • 以内置数据集格式读取本地数据集
  • 如何自定义数据集
    • 从本地文件创建数据集

本文主要是讲解如何使用PaddleNLP中的 load_dataset()方法,包含如何加载内置数据集和自定义数据集。

加载数据集

快速加载内置数据集

目前PaddleNLP内置20余个NLP数据集,涵盖阅读理解,文本分类,序列标注,机器翻译等多项任务。目前提供的数据集可以在 数据集列表 中找到。

msra_ner 数据集为例:

from paddlenlp.datasets import load_dataset
# 读取msra_ner数据集的训练集和测试集
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'> # Default
train_ds = load_dataset("msra_ner", splits="train", lazy=True)
print(type(train_ds))
<class 'paddlenlp.datasets.dataset.IterDataset'>

关于 MapDatasetIterDataset 功能和异同可以参考API文档 datasets。

选择子数据集

有些数据集是很多子数据集的集合,每个子数据集都是一个独立的数据集。例如 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 必须至少指定一个。

如何自定义数据集

通过使用PaddleNLP提供的 load_dataset()MapDatasetIterDataset 。任何人都可以方便的定义属于自己的数据集。

从本地文件创建数据集

从本地文件创建数据集时,推荐 根据本地数据集的格式给出读取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}

# data_path为read()方法的参数
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 。任何人都可以方便的定义属于自己的数据集。

自定义数据读取function中的参数可以直接以关键字参数的的方式传入 load_dataset() 中。而且对于自定义数据集,lazy 参数是 必须 传入的。

你可能感兴趣的:(自然语言处理,自然语言处理,python,paddlepaddle,人工智能,nlp)