加载文本数据集

Ascend GPU CPU 数据准备

在线运行下载Notebook下载样例代码查看源文件

概述

MindSpore提供的mindspore.dataset模块可以帮助用户构建数据集对象,分批次地读取文本数据。同时,在各个数据集类中还内置了数据处理和数据分词算子,使得数据在训练过程中能够像经过pipeline管道的水一样源源不断地流向训练系统,提升数据训练效果。

此外,MindSpore还支持分布式场景数据加载,用户可以在加载数据集时指定分片数目,具体用法参见数据并行模式加载数据集

下面,本教程将简要演示如何使用MindSpore加载和处理文本数据。

准备环节

  1. 准备文本数据,内容如下:

    Welcome to Beijing
    北京欢迎您!
    我喜欢English!
    
  1. 创建tokenizer.txt文件并复制文本数据到该文件中,将该文件存放在./datasets路径下。执行如下代码完成本步骤。

[ ]:
import os

if not os.path.exists('./datasets'):
    os.mkdir('./datasets')
file_handle = open('./datasets/tokenizer.txt', mode='w')
file_handle.write('Welcome to Beijing \n北京欢迎您! \n我喜欢English! \n')
file_handle.close()

数据集结构为:

./datasets
└── tokenizer.txt

0 directories, 1 file
  1. 导入mindspore.datasetmindspore.dataset.text模块。

[10]:
import mindspore.dataset as ds
import mindspore.dataset.text as text

加载数据集

MindSpore目前支持加载文本领域常用的经典数据集和多种数据存储格式下的数据集,用户也可以通过构建自定义数据集类实现自定义方式的数据加载。各种数据集的详细加载方法,可参考编程指南中数据集加载章节。

下面演示使用MindSpore.dataset模块中的TextFileDataset类加载数据集。

  1. 配置数据集目录,创建数据集对象。

[3]:
DATA_FILE = './datasets/tokenizer.txt'
dataset = ds.TextFileDataset(DATA_FILE, shuffle=False)
  1. 创建字典迭代器,通过迭代器获取数据,可以获得分词前的数据。

[4]:
for data in dataset.create_dict_iterator(output_numpy=True):
    print(text.to_str(data['text']))
Welcome to Beijing
北京欢迎您!
我喜欢English!

数据处理

MindSpore目前支持的数据处理算子及其详细使用方法,可参考编程指南中数据处理章节。

下面演示构建pipeline,对文本数据集进行混洗和文本替换操作。

  1. 对数据集进行混洗。

[5]:
ds.config.set_seed(58)
dataset = dataset.shuffle(buffer_size=3)

for data in dataset.create_dict_iterator(output_numpy=True):
    print(text.to_str(data['text']))
我喜欢English!
Welcome to Beijing
北京欢迎您!
  1. 对数据集进行文本替换。

[6]:
replace_op1 = text.RegexReplace("Beijing", "Shanghai")
replace_op2 = text.RegexReplace("北京", "上海")

dataset = dataset.map(operations=replace_op1)
dataset = dataset.map(operations=replace_op2)

for data in dataset.create_dict_iterator(output_numpy=True):
    print(text.to_str(data['text']))
我喜欢English!
Welcome to Shanghai
上海欢迎您!

数据分词

MindSpore目前支持的数据分词算子及其详细使用方法,可参考编程指南中分词器章节。

下面演示使用WhitespaceTokenizer分词器来分词,该分词是按照空格来进行分词。

  1. 创建tokenizer

[7]:
tokenizer = text.WhitespaceTokenizer()
  1. 执行操作tokenizer

[8]:
dataset = dataset.map(operations=tokenizer)
  1. 创建字典迭代器,通过迭代器获取数据。

[9]:
for data in dataset.create_dict_iterator(num_epochs=1, output_numpy=True):
    print(text.to_str(data['text']).tolist())
['我喜欢English!']
['Welcome', 'to', 'Shanghai']
['上海欢迎您!']