当前位置: 首页 > news >正文

datasets库一些基本方法:filter、map、select等

文章目录

    • 安装
    • 导入 huggingface 数据集
    • filter
    • map
    • select

使用 datasets库,对数据集进行处理可以更方便与高效;

常用的csv、excel 和 json 等数据格式,可以很方便的转换为datasets的样式;

官方文档:🤗 Datasets is a library for easily accessing and sharing datasets for Audio, Computer Vision, and Natural Language Processing (NLP) tasks. https://huggingface.co/docs/datasets/v2.21.0/en/process#select-and-filter

在这里插入图片描述
左侧有很多文章列表,右侧是Process文章的目录,该目录有很多的不错的内容。
有很多内容本博客没有提及,推荐读者阅读原始文档。

安装

pip install datasets

导入 huggingface 数据集

from datasets import load_datasetds = load_dataset("fancyzhx/ag_news")

由于huggingface的服务器在海外,一般都连接不上。如果连接不上,使用代理进行连接。先运行下述代理设置,再运行上述的数据集导入:

import os
os.environ['HTTP_PROXY'] = 'http://127.0.0.1:7890'
os.environ['HTTPS_PROXY'] = 'http://127.0.0.1:7890'

ds的features:

ds["train"].features

输出结果:

{'text': Value(dtype='string', id=None),'label': ClassLabel(names=['World', 'Sports', 'Business', 'Sci/Tech'], id=None)}

fancyzhx/ag_news 是一个文本分类数据集,有['World', 'Sports', 'Business', 'Sci/Tech'] 四个类别。

ds

输出结果:

DatasetDict({train: Dataset({features: ['text', 'label'],num_rows: 120000})test: Dataset({features: ['text', 'label'],num_rows: 7600})
})
ds["test"][0]

输出结果:

{'text': "Fears for T N pension after talks Unions representing workers at Turner   Newall say they are 'disappointed' after talks with stricken parent firm Federal Mogul.",'label': 2}

filter

datasets的数据集对象有filter方法,实现对数据集元素进行筛选。
比如,想筛选出在训练集中,label 全为2的数据。

tmp = ds["train"].filter(lambda x: x["label"] == 2)
print(tmp)
print(tmp[0])

输出结果:

Filter: 100%|██████████| 120000/120000 [00:00<00:00, 453257.78 examples/s]
Dataset({features: ['text', 'label'],num_rows: 30000
})
{'text': "Wall St. Bears Claw Back Into the Black (Reuters) Reuters - Short-sellers, Wall Street's dwindling\\band of ultra-cynics, are seeing green again.", 'label': 2}

如上述的输出结果所示,在训练集中label为2的数据有30000条。最后一行是筛选出的一个示例。

map

数据集转换,原始的数据集通常可能不满足需求,要对其进行一些转化。
要让大模型对文本进行分类,需要给样例数据中添加一些提示词。

下述是大模型给文本分类的提示词:

prompt_cls = """你是文本分类领域的专家,请你给下述文本分类,把它分到下述类别中:
* World
* Sports
* Business
* Science / Technology'text是待分类的文本,label是文本的类别:
text: {text}
label: 
"""

想把原始的数据集中的text,自动放入到{text}中,实现代码如下:

def trans2llm(item):item["text"] = prompt_cls.format(text=item["text"])return itemtmp = ds["test"].map(trans2llm)
print(tmp[0])

输出结果:

Map: 100%|██████████| 7600/7600 [00:00<00:00, 57726.64 examples/s]
{'text': "你是文本分类领域的专家,请你给下述文本分类,把它分到下述类别中:\n* World\n* Sports\n* Business\n* Science / Technology'\n\ntext是待分类的文本,label是文本的类别:\ntext: Fears for T N pension after talks Unions representing workers at Turner   Newall say they are 'disappointed' after talks with stricken parent firm Federal Mogul.\nlabel: \n", 'label': 2}

如上述结果所示,使用map完成了数据集的转换。
map需要传入一个数据处理的函数,本例子中的函数是:trans2llm
trans2llm接收的参数是原始数据集的item,返回的结果是一个新的item。

select

数据集采样,随机采样、下标采样等;
有时候,可能只想要数据集的随机一部分样本、某些下标的样本。

因为使用filter不能筛选下标

ds["train"].select([0, 10, 20, 30, 40, 50])

输出结果:

Dataset({features: ['text', 'label'],num_rows: 6
})

如果我们要在数据集中,随机采样,只需要传入随机的下标就可以:

import random  
numbers = list(range(1000))
# 从这个列表中随机选择100个不重复的数  
random_numbers = random.sample(numbers, 100)
# 打印生成的随机数列表  
print(random_numbers)
# 通过长度验证是否有重复元素
print(len(set(random_numbers)) == len(random_numbers))

获取随机采样的样本数据:

ds["train"].select(random_numbers)

输出结果:

Dataset({features: ['text', 'label'],num_rows: 100
})

http://www.mrgr.cn/news/2871.html

相关文章:

  • 【秋招笔试】8.18大疆秋招(第三套)-三语言题解
  • SpringSecurity
  • 实习三十:ansible
  • 【中项第三版】系统集成项目管理工程师 | 第 15 章 组织保障
  • C++特殊类设计
  • 【MySQL】表的约束
  • ComfyUI的部署,Ubuntu22.04系统下——点动科技
  • 基于Conda的Python版本管理与Python包管理
  • 探索顶级PDF水印API:PDFBlocks(2024年更新)
  • Flutter Web 正式官宣弃用 HTML renderer , Canvas 路线成为唯一
  • 统一服务入口-Gateway(一)
  • 使用 Python 爬虫进行网站流量分析:Referer 头的利用
  • LeetCode239.滑动窗口最大值
  • CSS的:dir()伪类:根据文本方向定制样式的灵活工具
  • 【文献阅读】Lorentzian Linear Graph Convolutional Networks For Node Classification
  • EmguCV学习笔记 C# 5.1 基本变换
  • SQLite 删除表
  • Leetcode-高频面试题-143.重排链表
  • 树莓派3B运行rasa init和rasa shell遇到的tensorflow报错总结
  • SOMEIP_ETS_052: echoUTF8DYNAMIC_wrong_BOM