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]})
(2)由 python 列表创建
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 略

posted @   文跃君  阅读(962)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示