1.下载:
datasets的下载非常简单,直接使用pip指令进行安装即可:
pip install datasets
若要使用datasets库对音频数据进行处理,下载指令不同:
pip install datasets[audio]
同理,对图像数据的处理的下载指令也不同:
pip install datasets[vision]
2.加载数据:
2.1 从 Hub 加载数据集:
这种方法适用于你已经在 Hugging Face Hub上找到了对应的数据库,直接使用该方法加载即可:
dataset = load_dataset("你的数据集名称")
这种方式加载的dataset类型为 DatasetDict ,它里面可能有训练集,验证集等,可以通过添加参数split得到你想要的数据集:
dataset = load_dataset("你的数据集名称", split="train")
dataset = load_dataset("你的数据集名称", split="train[10:100]")
如果你的数据集下面有不同种类的子数据集,直接写数据集名称会报错,此时,添加子数据集名称即可,例如PolyAI/minds14数据集下面有众多子数据集:'cs-CZ', 'de-DE', 'en-AU', 'en-GB', 'en-US', 'es-ES', 'fr-FR', 'it-IT', 'ko-KR', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'zh-CN', 'all',此时若使用刚才的指令便会出错,需要修改:
mindsFR = load_dataset("PolyAI/minds14", "fr-FR", split="train")
有时Hub中的数据集中的数据是通过脚本文件加载的,故我们需要添加一个参trust_remote_code使得代码运行时可以正常加载数据:
load_dataset("c4", "en", split="train", trust_remote_code=True)
2.2加载自己的数据集:
如果是你自己的数据集格式很简单,可以使用load_daatset直接传入文件路径,使用通用的数据集脚本导入:
from datasets import load_dataset
ds = load_dataset('csv', data_files='path/to/local/my_dataset.csv')
from datasets import load_dataset
ds = load_dataset('json', data_files='path/to/local/my_dataset.json')
当你的数据集格式比较复杂时,使用自定义脚本进行导入:
from datasets import load_dataset
ds = load_dataset('自定义py脚本文件路径', split='train')
当编写自己的脚本文件时,要继承GeneratorBasedBuilder类,并应该有_info,_split_generator,_generate_examples三个方法。_info()负责定义数据集的信息,并且要对数据的字段进行定义;_split_generator传入参数 DownloadManager下载或检索数据文件,将它们组织成分片,并为生成过程定义特定参数,返回datasets.SplitGenerator,这里有两个参数:name为分片的标准,gen_kwargs为文件路径;_generate_examples读取并解析数据文件以进行拆分,生成具体的数据样本,这里要传入文件路径,打开文件按照在_info()定义的数据字段读取。
3.查看数据集:
查看数据集信息:
print(datasets)
按行查看:这里的datasets是 DatasetDict 类型
print(datasets["train"][0])
print(datasets["train"][:2])
查看字段名称:
print(datasets["train"].column_names)
查看字段具体信息:
print(datasets["train"].features)
4.对数据集进行操作:
划分训练集与测试集:
datasets = dataset.train_test_split(test_size=0.1)
截选数据集,选取前两行:
datasets["train"].select([0, 1])
打乱数据,提高泛化能力:
dataset = dataset.shuffle()
筛选数据集:例如只选择标题中含有“中国”的标题
filter_dataset = datasets["train"].filter(lambda example: "中国" in example["title"])
数据映射,这里要使用datasets库的map方法:
def fix(example):
对数据进行操作
return example
fix_dataset = datasets.map(fix)
在数据映射中,可能更改字段值,可能去除空值,规范化等等都可以实现,如果是NLP任务,可以在这一步实现对读入文本数据的预处理,进行词向量的截取和填充,例如。
def preprocess_function(examples):
return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=128)
tokenized_datasets = dataset.map(preprocess_function, batched=True)
5.数据集的保存与加载:
datasets.save_to_disk("保存路径")
datasets = load_from_disk("保存路径")
6.数据的填充:
在之前的代码中,我们可以在数据映射时使用tokenizer进行词嵌入与词向量的填充,例如:
tokenizer(examples["text"], truncation=True, padding="max_length", max_length=128)
但是该种方法第一不是批处理,浪费时间,第二,所有样本都被以128的最长长度填充,有时候会浪费空间,所以我们可以采用transformers的DataCollatorWithPadding库来进行填充,例如在进行词嵌入后得到tokenized_dataset,之后与 DataLoader
一起使用,以实现更高效的数据加载和批次处理:
collator = DataCollatorWithPadding(tokenizer=tokenizer)
dl = DataLoader(tokenized_dataset, batch_size=4, collate_fn=collator, shuffle=True)
此时它会按照一个批次内的样本的最长长度对该批次内样本进行填充,可能不同批次内的数据填充长度不一,而且批次化处理速度更快。