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
类的相关方法生成数据集。
生成数据集可以以 MapDataset
和 IterDataset
两种类型返回,分别是对 paddle.io.Dataset
和 paddle.io.IterableDataset
的扩展,只需在 load_dataset()
时设置 lazy 参数即可获取相应类型。Flase
对应返回 MapDataset
,True
对应返回 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'>
关于 MapDataset
和 IterDataset
功能和异同可以参考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"])
另外需要注意数据集的是没有默认加载选项的,splits
和data_files
必须至少指定一个。
通过使用PaddleNLP提供的 load_dataset()
, MapDataset
和 IterDataset
。任何人都可以方便的定义属于自己的数据集。
从本地文件创建数据集时,推荐 根据本地数据集的格式给出读取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)的形式,这样可以更好的构建 MapDataset
和 IterDataset
两种数据集。同时将单条数据写成字典的格式,这样也可以更方便的监测数据流向。
事实上,MapDataset
在绝大多数时候都可以满足要求。一般只有在数据集过于庞大无法一次性加载进内存的时候我们才考虑使用 IterDataset
。任何人都可以方便的定义属于自己的数据集。
自定义数据读取function中的参数可以直接以关键字参数的的方式传入 load_dataset()
中。而且对于自定义数据集,lazy
参数是 必须 传入的。