数据集和数据变换
数据集
在mindnlp中,内置了一些数据集的调用接口,可以直接下载使用。按照以下分类,目前包含的数据集有:
机器翻译
IWSLT2016
IWSLT2017
Multi30k
问答任务
SQuAD1
SQuAD2
序列标注
CoNLL2000Chunking
UDPOS
文本分类
AG_NEWS
AmazonReviewFull
AmazonReviewPolarity
CoLA
DBpedia
IMDB
MNLI
MRPC
QNLI
QQP
RTE
SogouNews
SST2
STSB
WNLI
YahooAnswers
YelpReviewFull
YelpReviewPolarity
文本生成
LCSTS
PennTreebank
WikiText2
WikiText103
数据集加载
加载数据集的方法有两种,第一种是通过对应接口调用,第二种则是通过一个统一的接口进行调用。
方法1:通过对应接口加载
可以在 mindnlp.dataset 下找到对应的数据集接口,并进行调用,这里以 Multi30k 数据集为例:
from mindnlp.dataset import Multi30k
通过注释或者网站对应的接口 文档 查看参数列表以及返回值等信息:
参数:
root (str) - 存放数据集的目录。默认:”~/.mindnlp”。
split (str|Tuple[str]) - 要返回的数据集分块。默认:(‘train’, ‘valid’, ‘test’).
language_pair (Tuple[str]) - 包含源语言和目标语言的元组。默认:(‘de’, ‘en’).
proxies (dict) - 定义代理的字典,例如:{“https”: “https://127.0.0.1:7890”}.
返回:
datasets_list (list) - 加载完成的数据集分块列表。如果只加载了一个数据集分块, 如:’trian’,那么就只返回这个数据集分块,而不是一个列表。
方便起见,除了第一个参数,其他使用默认参数:
multi30k_train, multi30k_valid, multi30k_test = Multi30k("./dataset")
当然,如果想只取训练集,只需要修改参数:
multi30k_train = Multi30k(root="./dataset", split='train')
方法2:通过统一接口加载
通过一个统一的 load 接口进行加载,第一个参数为数据集的名称字符串,用以指定数据集:
from mindnlp.dataset import load
multi30k_train, multi30k_valid, multi30k_test = load('multi30k')
其他参数可以通过查询接口继续添加,如:
multi30k_train, multi30k_valid, multi30k_test = load('multi30k', root="./dataset")
自定义数据集
如果想要自定义数据集,请查看mindspore官网上的 数据集自定义教程 。
数据集迭代
数据集中一般有多列,可以使用 get_col_names() 接口查看列名:
dataset_train.get_col_names()
['de', 'en']
数据集加载后,一般以迭代方式获取数据,然后送入神经网络中进行训练。我们可以用 create_tuple_iterator 或 create_dict_iterator 接口创建数据迭代器,迭代访问数据。结合上面的列名接口:
for de_value, en_value in dataset_train.create_tuple_iterator():
print(de_value)
print(en_value)
break
Zwei junge weiße Männer sind im Freien in der Nähe vieler Büsche.
Two young, White males are outside near many bushes.
数据集变换处理
数据集常用操作
数据集变换处理中最重要的操作是 map 操作,可以针对数据集指定列(column)添加数据变换(Transforms),将数据变换应用于该列数据的每个元素,并返回包含变换后元素的新数据集。这里使用 BasicTokenizer 对数据集的两列进行分词,并使用 from_dataset 生成词表:
from mindnlp.dataset.transforms import BasicTokenizer
tokenizer = BasicTokenizer(True)
dataset_train= dataset_train.map([tokenizer], 'en')
dataset_train= dataset_train.map([tokenizer], 'de')
en_vocab = text.Vocab.from_dataset(dataset_train, 'en', special_tokens=['<pad>', '<unk>'], special_first= True)
de_vocab = text.Vocab.from_dataset(dataset_train, 'de', special_tokens=['<pad>', '<unk>'], special_first= True)
vocab = {'en':en_vocab, 'de':de_vocab}
mindnlp中的数据预处理
对于不同领域中的不同数据集,有不同的处理流程,mindnlp提供了数据集的特定处理函数帮助我们快速处理数据。和前面的加载方法一样,这里同样有两种方法调用该处理函数。以 Multi30k 数据集为例:
方法1:通过对应接口处理
可以在 mindnlp.dataset 下找到对应数据集接口,名称为数据集名称加下划线以及 Process ,其中的 vocab 为如上生成的词表:
from mindnlp.dataset import Multi30k_Process
train_dataset = Multi30k_Process(train_dataset, vocab=vocab)
通过注释或者网站对应的接口 文档 查看参数列表以及返回值等信息:
参数:
dataset (GeneratorDataset) - Multi30k数据集。
vocab (Vocab) - 词表对象,用于存储分词和索引的映射。默认为空。如果为空,一个新的词表对象将会被创建。
batch_size (int) - 指定每个批处理数据包含的数据条目。默认值:64。
max_len (int) - 句子的最大长度。默认值:500。
drop_remainder (bool) - 当最后一批数据包含的数据条目小于batch_size时,是否丢弃该批次,而不将其传递到下一个操作。默认值:False,不丢弃。
返回:
dataset (MapDataset) - 预处理操作后返回的数据集。
方法2:通过统一接口
from mindnlp.dataset import process
dataset_train = process('Multi30k', dataset_train, vocab = vocab)
完整代码请查看github仓库 示例
自定义的预处理
如果想自行处理数据集,更多的操作请看mindspore官网 教学