datasets(HuggingFace)学习笔记
一、概述
(1)HuggingFace 是一家公司,提供了大量机器学习相关的数据集、模型、工具。
(2)HuggingFace datasets 是一个轻量级的数据集框架,用于数据集的加载、保存、预处理等。
(3)datasets 底层使用 Apache Arrow 格式,使得加载数据集没有内存限制。
(4)datasets 常用的模块有:
- Dataset:数据集对象,代表一个数据集,用于单个数据集的保存、加载、处理等操作
- DatasetDict:数据集字典,代表多个数据集,用于多个数据集的保存、加载、处理等操作
- load_dataset:用于加载原始数据文件,并返回 DatasetDict
- load_from_disk:用于加载HuggingFacet 自定义的数据文件,并返回 DatasetDict 或 Dataset
二、Dataset(数据集)
(1)Dataset:数据集对象,代表一个数据集,用于单个数据集的保存、加载、处理等操作
(2)本节介绍 Dateset 对象的常用操作
2.1 创建 Dataset 数据集
(1)由 python 字典创建
from datasets import Dataset ds = Dataset.from_dict({'name': ['Jason', 'Jerry'], 'age': [18, 19]})
from datasets import Dataset ds = Dataset.from_list([{'name':'Jason', 'age':18}, {'name':'Jerry', 'age':19}])
(3)由 pandas 创建
df = pd.DataFrame({'name': ['Jason', 'Jerry'], 'age': [18, 19]}) ds = Dataset.from_pandas(df)
2.2 加载 Dataset 数据集
(1)从 json 文件加载
######################################### # ./data.json 文件内容 {"name":"Jason","age":18} {"name":"Jerry","age":19} ######################################### # 加载 json 文件 from datasets import Dataset ds = Dataset.from_json('./data.json')
(2)从 csv 文件加载
######################################### # ./data.csv 文件内容 name,age Jason,18 Jerry,19 ######################################### # 加载 csv 文件 from datasets import Dataset ds = Dataset.from_csv('./data.csv')
(3)从 txt 文件加载
######################################### # ./data.txt 文件内容 你好 hello world ######################################### # 加载 txt 文件 >>> from datasets import Dataset >>> ds = Dataset.from_text('./data.txt') >>> ds Dataset({features: ['text'], num_rows: 3}) >>> ds[0] {'text': '你好'}
(4)从 save_to_disk 保存的文件加载
- Dataset.save_to_disk 方法,可以将数据集保存为文件夹
- Dataset.load_from_disk方法,可以加载对应的文件夹
######################################### # 保存数据集 from datasets import Dataset ds = Dataset.from_dict({'name': ['Jason', 'Jerry'], 'age': [18, 19]}) ds.save_to_disk('./hg_save_data') ''' 保存的目录结构 ./hg_save_data ├── data-00000-of-00001.arrow ├── dataset_info.json └── state.json ''' ######################################### # 加载数据集 ds = Dataset.load_from_disk('./hg_save_data')
2.3 转换 Dataset 为其它格式
(1)转换 为 字典对象
>>> from datasets import Dataset >>> ds = Dataset.from_dict({'name': ['Jason', 'Jerry'], 'age': [18, 19]}) >>> ds.to_dict() {'name': ['Jason', 'Jerry'], 'age': [18, 19]}
(2)转换 为 列表对象
>>> from datasets import Dataset
>>> ds = Dataset.from_dict({'name': ['Jason', 'Jerry'], 'age': [18, 19]})
>>> ds.to_list()
[{'name': 'Jason', 'age': 18}, {'name': 'Jerry', 'age': 19}]
(3)转换 为 pandas
>>> from datasets import Dataset >>> ds = Dataset.from_dict({'name': ['Jason', 'Jerry'], 'age': [18, 19]}) >>> ds.to_pandas() name age 0 Jason 18 1 Jerry 19
(4)转换 为 tf_dataset
>>> from datasets import Dataset >>> ds = Dataset.from_dict({'name': ['Jason', 'Jerry'], 'age': [18, 19]}) >>> ds.to_tf_dataset() <_PrefetchDataset element_spec={ 'name': TensorSpec(shape=(), dtype=tf.string, name=None), 'age': TensorSpec(shape=(), dtype=tf.int64, name=None) }>
2.4 保存 Dataset 数据集
(1)保存为 json 文件
from datasets import Dataset ds = Dataset.from_dict({'name': ['Jason', 'Jerry'], 'age': [18, 19]}) ds.to_json('./data.json') ######################################### # ./data.json 文件内容 {"name":"Jason","age":18} {"name":"Jerry","age":19}
(2)保存为 csv 文件
from datasets import Dataset ds = Dataset.from_dict({'name': ['Jason', 'Jerry'], 'age': [18, 19]}) ds.to_csv('./data.csv') ######################################### # ./data.csv 文件内容 name,age Jason,18 Jerry,19
(3)保存为 HuggingFace 提供的格式
from datasets import Dataset ds = Dataset.from_dict({'name': ['Jason', 'Jerry'], 'age': [18, 19]}) ds.save_to_disk('./hg_save_data') ''' 保存的目录结构 ./hg_save_data ├── data-00000-of-00001.arrow ├── dataset_info.json └── state.json '''
2.5 处理 Dataset 数据
2.5.1 数据集查看
>>> from datasets import Dataset >>> ds = Dataset.from_dict({'name': ['Jason', 'Jerry'], 'age': [18, 19]}) >>> ds Dataset({ features: ['name', 'age'], num_rows: 2 })
2.5.2 数据查看
# 查看单条数据 >>> ds[0] {'name': 'Jason', 'age': 18} # 查看多条数据 >>> ds[0:2] {'name': ['Jason', 'Jerry'], 'age': [18, 19]}
2.5.3 数据选择
########################################### # 顺序批量:选择前 10 条数据 ds.select(range(10)) ########################################### # 随机批量:随机的顺序与 seed 的值有关,如果值一样,则随机的顺序也一样 ds.shuffle(seed=42).select(range(10))
2.5.4 数据过滤
>>> ds = Dataset.from_dict({'name': ['Jason', 'Jerry'], 'age': [18, 19]}) >>> new = ds.filter(lambda item: item['age']>18 ) >>> new.to_dict() {'name': ['Jerry'], 'age': [19]}
2.5.5 数据map
>>> ds = Dataset.from_dict({'name': ['Jason', 'Jerry'], 'age': [18, 19]}) >>> >>> def func(item): ... item['age'] = item['age']+10 ... return item ... >>> >>> new = ds.map(func) >>> new.to_dict() {'name': ['Jason', 'Jerry'], 'age': [28, 29]}
2.5.6 数据排序
>>> ds = Dataset.from_dict({'name': ['Jason', 'Jerry'], 'age': [18, 19]}) >>> new = ds.sort('age', reverse=True) >>> new.to_dict() {'name': ['Jerry', 'Jason'], 'age': [19, 18]}
2.5.7 更改列名
>>> ds = Dataset.from_dict({'name': ['Jason', 'Jerry'], 'age': [18, 19]}) >>> new = ds.rename_column('name', 'id') >>> new.to_dict() {'id': ['Jason', 'Jerry'], 'age': [18, 19]}
三、DatasetDict (数据集字典)
(1)DatasetDict :即数据集字典
- 代表多个数据集对象组成的字典,key值就是数据集的名字,value值就是数据集对象
- 每个数据集被称为一个 split
(2)DatasetDict 是 python Dict 的子类,所有字典方法均可以使用
(3)本节介绍 DatesetDict 对象的常用操作
>>> from datasets import DatasetDict >>> from datasets import Dataset >>> >>> ds1 = Dataset.from_dict({'name': ['Jason', 'Jerry'], 'age': [18, 19]}) >>> ds2 = Dataset.from_dict({'name': ['Tom', 'Kerry'], 'age': [20, 21]}) >>> >>> ds_dict = DatasetDict() >>> ds_dict['train'] = ds1 >>> ds_dict['test'] = ds2 >>> >>> ds_dict DatasetDict({ train: Dataset({ features: ['name', 'age'], num_rows: 2 }) test: Dataset({ features: ['name', 'age'], num_rows: 2 }) })
3.1 保存 DatasetDict
(1)DatasetDict 只支持保存为 Hugging Face 提供的格式
from datasets import DatasetDict from datasets import Dataset ds1 = Dataset.from_dict({'name': ['Jason', 'Jerry'], 'age': [18, 19]}) ds2 = Dataset.from_dict({'name': ['Tom', 'Kerry'], 'age': [20, 21]}) ds_dict = DatasetDict() ds_dict['train'] = ds1 ds_dict['test'] = ds2 ds_dict.save_to_disk('./ds_dict_save_data') ''' 目录结构 ./ds_dict_save_data ├── 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
(1)从 json 文件加载
######################################### # ./data.json 文件内容 {"name":"Jason","age":18} {"name":"Jerry","age":19} ######################################### # 加载 单个 数据集 >>> DatasetDict.from_json({'train':'./data.json'}) DatasetDict({ train: Dataset({ features: ['name', 'age'], num_rows: 2 }) }) ######################################### # 加载 多个 数据集 >>> DatasetDict.from_json({'train':['./data.json','./data.json']}) DatasetDict({ train: Dataset({ features: ['name', 'age'], num_rows: 4 }) })
(2)从 csv 文件加载
######################################### # ./data.csv 文件内容 name,age Jason,18 Jerry,19 ######################################### # 加载 单个 数据集 >>> DatasetDict.from_csv({'train':'./data.csv'}) DatasetDict({ train: Dataset({ features: ['name', 'age'], num_rows: 2 }) }) ######################################### # 加载 多个 数据集 >>> DatasetDict.from_csv({'train':['./data.csv','./data.csv']}) DatasetDict({ train: Dataset({ features: ['name', 'age'], num_rows: 4 }) })
(3)从 txt 文件加载
######################################### # ./data.txt 文件内容 你好 hello world ######################################### # 加载 单个 数据集 >>> DatasetDict.from_text({'train':'./data.txt'}) DatasetDict({ train: Dataset({ features: ['text'], num_rows: 3 }) }) ######################################### # 加载 多个 数据集 >>> DatasetDict.from_text({'train':['./data.txt','./data.txt']}) DatasetDict({ train: Dataset({ features: ['text'], num_rows: 6 }) })
(4)从 save_to_disk 保存的格式加载
DatasetDict.load_from_disk('./ds_dict_save_data') ''' DatasetDict({ train: Dataset({ features: ['name', 'age'], num_rows: 2 }) test: Dataset({ features: ['name', 'age'], num_rows: 2 }) }) '''
3.3 处理 DatasetDict 数据
DatasetDict 支持部分数据处理方法(如 map/filter),可以作用到每个 split 上,具体用法参考 Dataset 章节
四、load_dataset
load_dataset 用于各种数据集文件的加载,并返回 DatasetDict 对象
(1)加载 json 等原始数据文件
from datasets import load_dataset # 加载单个文件 # ds_dict 为 DatasetDict ds_dict = load_dataset("csv", data_files="data.csv") ds_dict = load_dataset("text", data_files="data.txt") ds_dict = load_dataset("json", data_files="data.json") ds_dict = load_dataset("pandas", data_files="data.pkl") # 加载多个文件 ds_dict = load_dataset('text', data_files={'train': ['data.txt', 'data.txt'], 'test': 'data.txt'})
(2)远程加载 HuggingFace 提供的数据集
- load_dataset("imdb"):将从 HuggingFace 下载名为 imdb 的数据集
>>> from datasets import load_dataset >>> ds_dict = load_dataset("imdb") >>> ds_dict DatasetDict({ # 数据集 train train: Dataset({ features: ['text', 'label'], num_rows: 25000 }) # 数据集 test test: Dataset({ features: ['text', 'label'], num_rows: 25000 }) # 数据集 unsupervised unsupervised: Dataset({ features: ['text', 'label'], num_rows: 50000 }) }) # 获取 train 数据集对象 >>> ds_dict['train'] Dataset({ features: ['text', 'label'], num_rows: 25000 })
(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")
五、load_from_disk
(1)load_from_disk:
- 加载 DatasetDict.save_to_disk 方法保存的数据文件时,返回 DatasetDict
- 加载 Dataset.save_to_disk 方法保存的数据文件时,返回 Dataset
################################################################# # DatasetDict 目录结构 ./ds_dict_save_data ├── 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 ################################################################# # 加载 DatasetDict >>> from datasets import load_from_disk >>> ds_dict = load_from_disk("./ds_dict_save_data") >>> ds_dict DatasetDict({ train: Dataset({ features: ['name', 'age'], num_rows: 2 }) test: Dataset({ features: ['name', 'age'], num_rows: 2 }) }) ################################################################# # Dataset 目录结构 ./ds_save_data/ ├── data-00000-of-00001.arrow ├── dataset_info.json └── state.json ################################################################# # 加载 Dataset >>> ds = load_from_disk('./ds_save_data') >>> ds Dataset({ features: ['name', 'age'], num_rows: 2 })
六、其它结构
Features 略
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)