加载文本数据集
Ascend
GPU
CPU
数据准备
概述
MindSpore提供的mindspore.dataset
模块可以帮助用户构建数据集对象,分批次地读取文本数据。同时,在各个数据集类中还内置了数据处理和数据分词算子,使得数据在训练过程中能够像经过pipeline管道的水一样源源不断地流向训练系统,提升数据训练效果。
此外,MindSpore还支持分布式场景数据加载,用户可以在加载数据集时指定分片数目,具体用法参见数据并行模式加载数据集。
下面,本教程将简要演示如何使用MindSpore加载和处理文本数据。
准备环节
准备文本数据,内容如下:
Welcome to Beijing 北京欢迎您! 我喜欢English!
创建
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
导入
mindspore.dataset
和mindspore.dataset.text
模块。
[10]:
import mindspore.dataset as ds
import mindspore.dataset.text as text
加载数据集
MindSpore目前支持加载文本领域常用的经典数据集和多种数据存储格式下的数据集,用户也可以通过构建自定义数据集类实现自定义方式的数据加载。各种数据集的详细加载方法,可参考编程指南中数据集加载章节。
下面演示使用MindSpore.dataset
模块中的TextFileDataset
类加载数据集。
配置数据集目录,创建数据集对象。
[3]:
DATA_FILE = './datasets/tokenizer.txt'
dataset = ds.TextFileDataset(DATA_FILE, shuffle=False)
创建字典迭代器,通过迭代器获取数据,可以获得分词前的数据。
[4]:
for data in dataset.create_dict_iterator(output_numpy=True):
print(text.to_str(data['text']))
Welcome to Beijing
北京欢迎您!
我喜欢English!
数据处理
MindSpore目前支持的数据处理算子及其详细使用方法,可参考编程指南中数据处理章节。
下面演示构建pipeline,对文本数据集进行混洗和文本替换操作。
对数据集进行混洗。
[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
北京欢迎您!
对数据集进行文本替换。
[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
分词器来分词,该分词是按照空格来进行分词。
创建
tokenizer
。
[7]:
tokenizer = text.WhitespaceTokenizer()
执行操作
tokenizer
。
[8]:
dataset = dataset.map(operations=tokenizer)
创建字典迭代器,通过迭代器获取数据。
[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']
['上海欢迎您!']