数据集和数据变换

数据集

在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_iteratorcreate_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官网 教学