NLP(六十二)HuggingFace中的Datasets使用

news2024/11/22 21:35:19

  Datasets库是HuggingFace生态系统中一个重要的数据集库,可用于轻松地访问和共享数据集,这些数据集是关于音频、计算机视觉、以及自然语言处理等领域。Datasets 库可以通过一行来加载一个数据集,并且可以使用 Hugging Face 强大的数据处理方法来快速准备好你的数据集。在 Apache Arrow 格式的支持下,通过 zero-copy read 来处理大型数据集,而没有任何内存限制,从而实现最佳速度和效率。

  当需要微调模型的时候,需要对数据集进行以下操作:

  1. 数据集加载:下载、加载数据集
  2. 数据集预处理:使用Dataset.map() 预处理数据
  3. 数据集评估指标:加载和计算指标

  可以在HuggingFace官网来搜共享索数据集:https://huggingface.co/datasets​ 。本文中使用的主要数据集为squad数据集,其在HuggingFace网站上的数据前几行如下:

squad数据集前几行

加载数据

  • 加载Dataset数据集

  Dataset数据集可以是HuggingFace Datasets网站上的数据集或者是本地路径对应的数据集,也可以同时加载多个数据集。

  以下是加载英语阅读理解数据集squad, 该数据集的网址为:https://huggingface.co/datasets/squad ,也是本文中使用的主要数据集。

import datasets

# 加载单个数据集
raw_datasets = datasets.load_dataset('squad')
# 加载多个数据集
raw_datasets = datasets.load_dataset('glue', 'mrpc')
  • 从文件中加载数据

  支持csv, tsv, txt, json, jsonl等格式的文件

from datasets import load_dataset

data_files = {"train": "./data/sougou_mini/train.csv", "test": "./data/sougou_mini/test.csv"}
drug_dataset = load_dataset("csv", data_files=data_files, delimiter=",")
  • 从Dataframe中加载数据
import pandas as pd
from datasets import Dataset 

my_dict = {"a": [1, 2, 3], "b": ['A', 'B', 'C']} 
dataset1 = Dataset.from_dict(my_dict) 
 
df = pd.DataFrame(my_dict) 
dataset2 = Dataset.from_pandas(df)

查看数据

  • 数据结构

  数据结构包括:

  • 数据集的划分:train,valid,test数据集
  • 数据集的数量
  • 数据集的feature

  squad数据的数据结构如下:

DatasetDict({
    train: Dataset({
        features: ['id', 'title', 'context', 'question', 'answers'],
        num_rows: 87599
    })
    validation: Dataset({
        features: ['id', 'title', 'context', 'question', 'answers'],
        num_rows: 10570
    })
})
  • 数据切分
import datasets

raw_dataset = datasets.load_dataset('squad')

# 获取某个划分数据集,比如train
train_dataset = raw_dataset['train']
# 获取前10条数据
head_dataset = train_dataset.select(range(10))
# 获取随机10条数据
shuffle_dataset = train_dataset.shuffle(seed=42).select(range(10))
# 数据切片
slice_dataset = train_dataset[10:20]

更多特性

  • 数据打乱(shuffle)

  shuffle的功能是打乱datasets中的数据,其中seed是设置打乱的参数,如果设置打乱的seed是相同的,那我们就可以得到一个完全相同的打乱结果,这样用相同的打乱结果才能重复的进行模型试验。

import datasets

raw_dataset = datasets.load_dataset('squad')
# 打乱数据集
shuffle_dataset = train_dataset.shuffle(seed=42)
  • 数据流(stream)

  stream的功能是将数据集进行流式化,可以不用在下载整个数据集的情况下使用该数据集。这在以下场景中特别有用:

  1. 你不想等待整个庞大的数据集下载完毕
  2. 数据集大小超过了你计算机的可用硬盘空间
  3. 你想快速探索数据集的少数样本
from datasets import load_dataset

dataset = load_dataset('oscar-corpus/OSCAR-2201', 'en', split='train', streaming=True)
print(next(iter(dataset)))
  • 数据列重命名(rename columns)

  数据集支持对列重命名。下面的代码将squad数据集中的context列重命名为text:

from datasets import load_dataset

squad = load_dataset('squad')
squad = squad.rename_column('context', 'text')
  • 数据丢弃列(drop columns)

  数据集支持对列进行丢弃,在删除一个或多个列时,向remove_columns()函数提供要删除的列名。单个列删除传入列名,多个列删除传入列名的列表。下面的代码将squad数据集中的id列丢弃:

from datasets import load_dataset

squad = load_dataset('squad')
# 删除一个列
squad = squad.remove_columns('id')
# 删除多个列
squad = squad.remove_columns(['title', 'text'])
  • 数据新增列(add new columns)

  数据集支持新增列。下面的代码在squad数据集上新增一列test,内容全为字符串111:

from datasets import load_dataset

squad = load_dataset('squad')
# 新增列
new_train_squad = squad['train'].add_column("test", ['111'] * squad['train'].num_rows)
  • 数据类型转换(cast)

  cast()函数对一个或多个列的特征类型进行转换。这个函数接受你的新特征作为其参数。

from datasets import load_dataset

squad = load_dataset('squad')
# 新增列
new_train_squad = squad['train'].add_column("test", ['111'] * squad['train'].num_rows)
print(new_train_squad.features)
# 转换test列的数据类型
new_features = new_train_squad.features.copy()
new_features["test"] = Value("int64")
new_train_squad = new_train_squad.cast(new_features)
# 输出转换后的数据类型
print(new_train_squad.features)
  • 数据展平(flatten)

  针对嵌套结构的数据类型,可使用flatten()函数将子字段提取到它们自己的独立列中。

from datasets import load_dataset

squad = load_dataset('squad')
flatten_dataset = squad['train'].flatten()
print(flatten_dataset)

输出结果为:

Dataset({
    features: ['id', 'title', 'context', 'question', 'answers.text', 'answers.answer_start'],
    num_rows: 87599
})
  • 数据合并(Concatenate Multiple Datasets)

  如果独立的数据集有相同的列类型,那么它们可以被串联起来。用concatenate_datasets()来连接不同的数据集。

from datasets import concatenate_datasets, load_dataset

squad = load_dataset('squad')
squad_v2 = load_dataset('squad_v2')
# 合并数据集
squad_all = concatenate_datasets([squad['train'], squad_v2['train']])
  • 数据过滤(filter)

  filter()函数支持对数据集进行过滤,一般采用lambda函数实现。下面的代码对squad数据集中的训练集的question字段,过滤掉split后长度小于等于10的数据:

from datasets import load_dataset

squad = load_dataset('squad')
filter_dataset = squad['train'].filter(lambda x: len(x["question"].split()) > 10)

输出结果如下:

Dataset({
    features: ['id', 'title', 'context', 'question', 'answers'],
    num_rows: 34261
})
  • 数据排序(sort)

  使用sort()对列值根据其数值进行排序。下面的代码是对squad数据集中的训练集按照标题长度进行排序:

from datasets import load_dataset

squad = load_dataset('squad')
# 新增列, title_length, 标题长度
new_train_squad = squad['train'].add_column("title_length", [len(_) for _ in squad['train']['title']])
# 按照title_length排序
new_train_squad = new_train_squad.sort("title_length")
  • 数据格式(set_format)

  set_format()函数改变了一个列的格式,使之与一些常见的数据格式兼容。在类型参数中指定你想要的输出和你想要格式化的列。格式化是即时应用的。支持的数据格式有:None, numpy, torch, tensorflow, pandas, arrow, 如果选择None,就会返回python对象。

  下面的代码将新增标题长度列,并将其转化为numpy格式:

from datasets import load_dataset

squad = load_dataset('squad')
# 新增列, title_length, 标题长度
new_train_squad = squad['train'].add_column("title_length", [len(_) for _ in squad['train']['title']])
# 转换为numpy支持的数据格式
new_train_squad.set_format(type="numpy", columns=["title_length"])
  • 数据指标(load metrics)

  HuggingFace Hub上提供了一系列的评估指标(metrics),前20个指标如下:

from datasets import list_metrics
metrics_list = list_metrics()
print(', '.join(metric for metric in metrics_list[:20]))

输出结果如下:

accuracy, bertscore, bleu, bleurt, brier_score, cer, character, charcut_mt, chrf, code_eval, comet, competition_math, coval, cuad, exact_match, f1, frugalscore, glue, google_bleu, indic_glue

  从Hub中加载一个指标,使用 datasets.load_metric() 命令,比如加载squad数据集的指标:

from datasets import load_metric
metric = load_metric('squad')

  输出结果如下:

Metric(name: "squad", features: {'predictions': {'id': Value(dtype='string', id=None), 'prediction_text': Value(dtype='string', id=None)}, 'references': {'id': Value(dtype='string', id=None), 'answers': Sequence(feature={'text': Value(dtype='string', id=None), 'answer_start': Value(dtype='int32', id=None)}, length=-1, id=None)}}, usage: """
Computes SQuAD scores (F1 and EM).
Args:
    predictions: List of question-answers dictionaries with the following key-values:
        - 'id': id of the question-answer pair as given in the references (see below)
        - 'prediction_text': the text of the answer
    references: List of question-answers dictionaries with the following key-values:
        - 'id': id of the question-answer pair (see above),
        - 'answers': a Dict in the SQuAD dataset format
            {
                'text': list of possible texts for the answer, as a list of strings
                'answer_start': list of start positions for the answer, as a list of ints
            }
            Note that answer_start values are not taken into account to compute the metric.
Returns:
    'exact_match': Exact match (the normalized answer exactly match the gold answer)
    'f1': The F-score of predicted tokens versus the gold answer
Examples:

    >>> predictions = [{'prediction_text': '1976', 'id': '56e10a3be3433e1400422b22'}]
    >>> references = [{'answers': {'answer_start': [97], 'text': ['1976']}, 'id': '56e10a3be3433e1400422b22'}]
    >>> squad_metric = datasets.load_metric("squad")
    >>> results = squad_metric.compute(predictions=predictions, references=references)
    >>> print(results)
    {'exact_match': 100.0, 'f1': 100.0}
""", stored examples: 0)

  load_metric还支持分布式计算,本文不再详细讲述。

  load_metric现在已经是老版本了,新版本将用evaluate模块代替,访问网址为:https://github.com/huggingface/evaluate 。

  • 数据映射(map)

  map就是映射,它接收一个函数,Dataset中的每个元素都会被当作这个函数的输入,并将函数返回值作为新的Dataset。常见的map函数的应用是对文本进行tokenize:

from datasets import load_dataset
from transformers import AutoTokenizer

squad_dataset = load_dataset('squad')

checkpoint = 'bert-base-cased'
tokenizer = AutoTokenizer.from_pretrained(checkpoint)

def tokenize_function(sample):
    return tokenizer(sample['context'], truncation=True, max_length=256)

tokenized_dataset = squad_dataset.map(tokenize_function, batched=True)

  输出结果如下:

DatasetDict({
    train: Dataset({
        features: ['id', 'title', 'context', 'question', 'answers', 'input_ids', 'token_type_ids', 'attention_mask'],
        num_rows: 87599
    })
    validation: Dataset({
        features: ['id', 'title', 'context', 'question', 'answers', 'input_ids', 'token_type_ids', 'attention_mask'],
        num_rows: 10570
    })
})
  • 数据保存/加载(save to disk/ load from disk)

  使用save_to_disk()来保存数据集,方便在以后重新使用它,使用 load_from_disk()函数重新加载数据集。我们将上面map后的tokenized_dataset数据集进行保存:

tokenized_dataset.save_to_disk("squad_tokenized")

保存后的文件结构如下:

squad_tokenized/
├── dataset_dict.json
├── train
│   ├── data-00000-of-00001.arrow
│   ├── dataset_info.json
│   └── state.json
└── validation
    ├── data-00000-of-00001.arrow
    ├── dataset_info.json
    └── state.json

  加载数据的代码如下:

from datasets import load_from_disk
reloaded_dataset = load_from_disk("squad_tokenized") 

总结

  本文可作为dataset库的入门,详细介绍了数据集的各种操作,这样方便后续进行模型训练。

参考文献

  1. Datasets: https://www.huaxiaozhuan.com/工具/huggingface_transformer/chapters/2_datasets.html
  2. Huggingface详细入门介绍之dataset库:https://zhuanlan.zhihu.com/p/554678463
  3. Stream: https://huggingface.co/docs/datasets/stream
  4. HuggingFace教程 Datasets基本操作: Process: https://zhuanlan.zhihu.com/p/557032513

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/786046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RocketMQ教程-(5)-功能特性-消费者分类

Apache RocketMQ 支持 PushConsumer 、 SimpleConsumer 以及 PullConsumer 这三种类型的消费者,本文分别从使用方式、实现原理、可靠性重试和适用场景等方面为您介绍这三种类型的消费者。 背景信息​ Apache RocketMQ 面向不同的业务场景提供了不同消费者类型&…

巅峰极客2023 hellosql

随便输一个payload,有waf 这题只有两个回显,分别是太酷啦和nonono,不显示报错、登录成功等各种信息,目前只能想到用时间盲注。 抓包fuzz,194都是被过滤的 不止这些,手工测出来if、sleep、benchmark、*、rp…

HOOPS Visualize | HOOPS Exchange | HOOPS Web Platform

内容采集互联网,功能仅供参考!!! HOOPS 3D Application Framework (HOOPS/3dAF)是由Tech Soft America公司开发并由Spatial再次销售的产品,该产品为当今世界上领先的3D应用程序提供了核心的图形架构和图形功能&#x…

Git版本控制系统入门

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 Git 初识 Git 安装 Git 配置用户信息 掌握 Git 仓库 Git 的三个区域 Git 文件状态 Git 暂存区使用…

【uniapp2.0】解决真机测试底部有空白问题

我的错误做法(不代表别人是否没用) 📌 使用:uni.hideTabBar 报错:"errMsg":"hideTabBar:fail not TabBar page" 根因:这种情况一般是在小程序中为了隐藏tabbar调用的,但是有…

你还在用命令式编程?Python函数式编程让你的代码更优雅!

Python支持函数式编程,函数式编程是一种编程范式,它将计算机程序视为数学函数的组合。 文章目录 一、lambda表达式 lambda表达式的定义 lambda表达式的应用场景 lambda表达式的局限性 lambda表达式的高级用法 二、Python的高阶函数 高阶函数的定义…

(链表) 剑指 Offer II 022. 链表中环的入口节点 ——【Leetcode每日一题】

❓剑指 Offer II 022. 链表中环的入口节点 难度:中等 给定一个链表,返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环,则返回 null。 为了表示给定链表中的环&#xff0c…

Python补充笔记4-面向对象

目录 一、编程思想​ 二、类与对象​ 三、类的创建​ 四、对象的创建​ 五、类属性、类方法、静态方法​ 六、动态绑定属性和方法​ 七、知识点总结 八、面向对象的三大特征 1.封装 2.继承​ 3.多态 九、方法重写 十、object类 十一、特殊方法和特殊属性 1.dict/len/add​ 2.…

python调用百度ai将图片识别为表格excel

python调用百度ai将图片识别为表格excel ocr ocr 百度ai官方文档:https://ai.baidu.com/ai-doc/OCR/Ik3h7y238 import requests import json import base64 import time文档:https://ai.baidu.com/ai-doc/OCR/Ik3h7y238 # 获取access_token def get_acc…

学习笔记--TCP/IP协议

TCP/IP协议 TCP (Transmission Control Protocol)传输控制协议,传输层协议。 一、协议的分层 ISO网络层分为7层 二、分层的作用 具体通信情况: 三、报文传输 三次握手连接,四次挥手释放 参考链接: https://zhuanlan.zhih…

直播带货app开发开发流程分析

随着小视频管理体系愈来愈变成人们的生活中的一部分,也随之短视频卖货逐步形成岗位内主流的转现方式,将短视频平台生产制造变成短视频带货体系计划愈来愈多,那样,把小视频管理体系开发设计变成短视频带货体系必须两步?…

在Microsoft Excel中如何快速合并表格

在 Excel 中分析数据时,在一个工作表中收集所有必要信息的频率是多少?几乎从来没有!当不同的数据分散在许多工作表和工作簿中时,这是一种非常常见的情况。幸运的是,有几种不同的方法可以将多个表中的数据组合成一个表&…

【python】爬楼梯—递归分析(超级详细)

爬楼梯—递归分析 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 示例 1: 输入: 1 输出: 1 解释: 有一种方…

GPT和MBR的区别

磁盘分区是操作系统管理磁盘数据的一项非常重要的功能。在分区时,用户需要选择一种分区表格式来组织磁盘上的分区,这也就是GPT和MBR两种分区表格式的由来。在本文中,将详细探讨GPT和MBR分区表格式的区别和如何选择它们。 1. MBR和GPT分区表格…

electron-egg 加密报错

electron框架:electron-egg 解决方式 npm uninstall bytenode npm install bytenode1.3.6node:internal/modules/cjs/loader:928 throw err; ^ Error: Cannot find module ‘node:assert/strict’ Require stack: D:\electron-egg-test\new-electron-egg\electr…

勘探开发人工智能技术:断层识别

1 断层识别 断层是地下岩层在受到挤压或拉伸力作用下,因脆性变形而形成的地层错断,是一种重要的地质构造特征。断层检测和解释是从地震剖面中认识岩层结构和储层特性的重要步骤。 1.1 数据描述 合成地震数据: 每一个合成地震数据都是由地质模型的反射系数与雷克子波进行褶…

Vite 4.4 正式版发布,全面拥抱 Lightning CSS

一、什么是 Vite Vite 是由 Evan You 推出的下一代前端构建工具,是官方 Vue CLI 的替代品,速度非常快。Vite 利用原生 ESM 并使用 Rollup 处理开发和打包工作。 从功能上讲,它的工作方式类似于预配置的 webpack 和 webpack-dev-server&#…

软考_软件设计师(中级)

视频链接:(zst_2001) https://www.bilibili.com/read/cv18526892?spm_id_from333.999.0.0 文章目录 1、计算机系统2、程序设计语言3、知识产权4、数据库5、面向对象6、UML7、设计模式8、操作系统9、结构化开发10、软件工程11、信息安全&…

【MCU学习】RTthread工程介绍

RT-Thread架构 RT-Thread诞生于2006年,是一款以开源、中立、社区化发展起来的物联网操作系统。 RT-Thread主要采用 C 语言编写,浅显易懂,且具有方便移植的特性(可快速移植到多种主流 MCU 及模组芯片上)。RT-Thread把面…

Ubuntu18.04安装Autoware1.15(解决Openplanner无法绕障的问题:Openplanner2.5)

文章目录 一、下载Autoware1.15源码二、安装依赖三、修改CUDA版本四、编译以及报错解决编译(1)报 undefined reference to cv::Mat::Mat() 的错就按照下面方式改相应包:(2)遇到报错:(3&#xff…