加载文本数据集

Linux Ascend GPU CPU 数据准备 初级 中级 高级

     

概述

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

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

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

准备

  1. 准备文本数据如下。

    Welcome to Beijing!
    北京欢迎您!
    我喜欢English!
    
  2. 创建tokenizer.txt文件并复制文本数据到该文件中,将该文件存放在./test路径中,目录结构如下。

    └─test
        └─tokenizer.txt
    
  3. 导入mindspore.datasetmindspore.dataset.text模块。

    import mindspore.dataset as ds
    import mindspore.dataset.text as text
    

加载数据集

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

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

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

    DATA_FILE = "./test/tokenizer.txt"
    dataset = ds.TextFileDataset(DATA_FILE, shuffle=False)
    
  2. 创建迭代器,通过迭代器获取数据。

    for data in dataset.create_dict_iterator(output_numpy=True):
        print(text.to_str(data['text']))
    

    获取到分词前的数据:

    Welcome to Beijing!
    北京欢迎您!
    我喜欢English!
    

数据处理

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

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

  1. 对数据集进行混洗。

    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!
    北京欢迎您!
    
  2. 对数据集进行文本替换。

    replace_op1 = text.RegexReplace("Beijing", "Shanghai")
    replace_op2 = text.RegexReplace("北京", "上海")
    dataset = dataset.map(operations=[replace_op1, 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

    tokenizer = text.WhitespaceTokenizer()
    
  2. 执行操作tokenizer

    dataset = dataset.map(operations=tokenizer)
    
  3. 创建迭代器,通过迭代器获取数据。

    for data in dataset.create_dict_iterator(output_numpy=True):
        print(text.to_str(data['text']).tolist())
    

    获取到分词后的数据:

    ['我喜欢English!']
    ['Welcome', 'to', 'Shanghai!']
    ['上海欢迎您!']