一、概述
(1)datasets 使用 Apache Arrow 格式,使得加载数据集没有内存限制
(2)datasets 的重要模块:
- load_dataset:用于加载原始数据文件
- load_from_disk:用于加载Arrow数据文件
- DatasetDict:用于操作多个数据集,保存、加载、处理等
- Dataset:用于操作单个数据集,保存、加载、处理等
二、数据加载
2.1 load_dataset
(1)本地加载 json 等原始数据文件
from datasets import load_dataset
# 加载单个文件
# ds_dict 为 DatasetDict
ds_dict = load_dataset("csv", data_files="my_file.csv")
ds_dict = load_dataset("text", data_files="my_file.txt")
ds_dict = load_dataset("json", data_files="my_file.jsonl")
ds_dict = load_dataset("pandas", data_files="my_dataframe.pkl")
# 加载多个文件
ds_dict = load_dataset('text', data_files={'train': ['my_text_1.txt', 'my_text_2.txt'], 'test': 'my_test_file.txt'})
# 加载时,指定 key 值,即split名称
ds_dict = load_dataset("json", data_files={"demo":"./data/SQuAD_it-train.json"}, field="data") # field:数据集在json文件的'data'字段中
ds_dict = load_dataset("json", data_files="./data/SQuAD_it-train.json", field="data") # field:数据集在json文件的'data'字段中
(2)远程加载 HuggingFace 中的原始数据文件
from datasets import load_dataset
ds_dict = load_dataset('cail2018') # cail2018 是某个司法比赛数据集
(3)远程加载 url 指定的原始数据文件
from datasets import load_dataset
url = "https://github.com/crux82/squad-it/raw/master/"
data_files = {
"train": url + "SQuAD_it-train.json.gz",
"test": url + "SQuAD_it-test.json.gz",
}
'''
field 字段
数据集是json格式的文件
数据在json体的'data'字段中
因此要指定 field = 'data'
'''
ds_dict = load_dataset("json", data_files=data_files, field="data")
2.2 load_from_disk
(1)用于加载 save_to_disk 方法保持的数据文件,即 Arrow 格式
#################################################################
# 数据集加载
from datasets import load_from_disk
ds_dict = load_from_disk("path/of/my/directory")
ds = load_from_disk("path/of/my/dataset/directory")
#################################################################
# 数据集保存
ds_dict.save_to_disk("path/of/my/dataset/directory")
ds.save_to_disk("path/of/my/dataset/directory")
三、DatasetDict
(1)DatasetDict 是存储 dataset 的字典,继承自 python dict,可以使用所有的字典方法 (2)代码示例from datasets import load_dataset
file1="./data/squad-json/SQuAD_it-train.json"
file2="./data/squad-json/SQuAD_it-test.json"
ds_dict = load_dataset("json", data_files={'train':file1, 'test':file2}, field="data")
'''
>>> print(ds_dict)
DatasetDict({
train: Dataset({
features: ['paragraphs', 'title'],
num_rows: 442
})
test: Dataset({
features: ['paragraphs', 'title'],
num_rows: 48
})
})
'''
ds = ds_dict['train']
3.1 DatasetDict -> 数据集文件
#########################################################
# ds_dict 保存
ds_dict.save_to_disk("./mydata")
'''
mydata
├── dataset_dict.json
├── test
│ ├── data-00000-of-00001.arrow
│ ├── dataset_info.json
│ └── state.json
└── train
├── data-00000-of-00001.arrow
├── dataset_info.json
└── state.json
'''
3.2 数据集文件 - > DatasetDict
#########################################################
# ds_dict 加载
ds_dict = DatasetDict.load_from_disk('./mydata')
'''
DatasetDict({
train: Dataset({
features: ['paragraphs', 'title'],
num_rows: 442
})
test: Dataset({
features: ['paragraphs', 'title'],
num_rows: 48
})
})
'''
3.3 其它操作
DatasetDict 支持部分数据处理方法(如 map/filter),可以作用到每个 split 上,具体用法参考 Dataset 章节
四、Dataset
(1)Dataset 用于存储数据集,依赖于 features 数据结构4.1 Dataset 查看
from datasets import load_dataset
########################################################
# 示例1
ds_dict = load_dataset("./data/imdb")
ds = ds_dict['train']
'''
>>> ds
Dataset({
features: ['text', 'label'],
num_rows: 25000
})
'''
########################################################
# 示例2
file1="./data/squad-json/SQuAD_it-train.json"
file2="./data/squad-json/SQuAD_it-test.json"
ds_dict = load_dataset("json", data_files={'train':file1, 'test':file2}, field="data")
ds = ds_dict['test']
'''
>>> ds
Dataset({
features: ['paragraphs', 'title'],
num_rows: 48
})
'''
4.2 Dataset -> 数据文件
#########################################
# ds -> 数据文件
ds.to_json('./mydata.json')
ds.to_csv('./mydata.csv')
ds.save_to_disk('./mydata')
'''
mydata/
├── data-00000-of-00001.arrow
├── dataset_info.json
└── state.json
'''
4.3 Dataset -> 内存对象
#########################################
# ds -> 内存对象
ds.to_dict()
ds.to_list()
ds.to_pandas()
ds.to_tf_dataset()
4.4 数据文件 -> Dataset
#########################################
# 数据文件 -> ds
ds = Dataset.from_json('./data.json')
ds = Dataset.from_csv('./data.csv')
ds = Dataset.load_from_disk('./mydata')
'''
>>> ds
Dataset({
features: ['paragraphs', 'title'],
num_rows: 48
})
'''
4.5 内存对象 -> Dataset
#########################################
# 内存对象 -> ds
ds = Dataset.from_dict({'name': ['Jason', 'Jerry'], 'age': [18, 19]})
'''
Dataset({
features: ['name', 'age'],
num_rows: 2
})
'''
df = pd.DataFrame({'name': ['Jason', 'Jerry'], 'age': [18, 19]})
ds = Dataset.from_pandas(df)
'''
Dataset({
features: ['name', 'age'],
num_rows: 2
})
'''
Dataset.from_list(...)
Dataset.from_file(...)
Dataset.from_text(...)
Dataset.from_buffer(...)
4.6 数据查看
# 查看单条数据
>>> ds[0]
{'text': 'I rented I AM...', 'label': 0}
# 查看多条数据
>>> ds[0:2]
{'text': ['I rented I AM...', '"I Am Curious...'], 'label': [0, 0]}
4.7 数据选择
###########################################
# 顺序批量:选择前 10 条数据
ds.select(range(10))
###########################################
# 随机批量:随机的顺序与 seed 的值有关,如果值一样,则随机的顺序也一样
ds.shuffle(seed=42).select(range(10))
4.8 数据过滤
>>> ds.filter(lambda x: 'hello' in x['text'])
Dataset({
features: ['text', 'label'],
num_rows: 59
})
4.9 数据map
def func(x):
text = x['text']
x['text'] = text.replace('hello', 'HELLO')
return x
>>> ds.map(func)
Dataset({
features: ['text', 'label'],
num_rows: 25000
})
4.10 数据排序
>>> ds.sort('label')
Dataset({
features: ['text', 'label'],
num_rows: 25000
})
4.11 更改列名
>>> ds.rename_column('label', 'mylabel')
Dataset({
features: ['text', 'mylabel'],
num_rows: 25000
})
五、其它结构
5.1 Features
(1)Dataset 对应着一个数据表 (2)Feature 对应着数据表中的一列标签:datasets,HuggingFace,笔记,Dataset,json,dict,dataset,data,ds From: https://www.cnblogs.com/wky-blogs/p/18317537