【Hugging Face】datasets 库中的 map() 方法:对数据集中的每个样本进行转换、过滤、扩展等操作

Hugging Face datasets 库中的 map 方法

mapdatasets 库中最重要的 数据处理 方法之一,它可以 对数据集中的每个样本进行转换、过滤、扩展 等操作,适用于 文本预处理、数据增强、特征提取、标签转换等任务


1. map 方法的基本用法

map 适用于 整个数据集数据集的某个子集(如 train/test/validation),它的基本语法如下:

dataset = dataset.map(function, batched=False, num_proc=None)
参数作用
function处理单个样本或多个样本的函数
batched是否批量处理数据(默认 False
num_proc进行多进程加速(默认 None
remove_columns移除不需要的列

2. map 的基本示例

假设我们有一个文本分类数据集:

from datasets import load_dataset

dataset = load_dataset("imdb")
print(dataset["train"][0])

输出:

{'text': 'This is a great movie!', 'label': 1}

2.1. 处理单个样本

如果我们想要将 text 转换为小写:

def lowercase(example):
    example["text"] = example["text"].lower()
    return example

dataset = dataset.map(lowercase)
print(dataset["train"][0])

输出:

{'text': 'this is a great movie!', 'label': 1}

3. map 处理多个字段

如果我们想要 添加新字段,例如计算 text 的长度:

def add_length(example):
    example["text_length"] = len(example["text"])
    return example

dataset = dataset.map(add_length)
print(dataset["train"][0])

输出:

{'text': 'this is a great movie!', 'label': 1, 'text_length': 23}

4. map 进行批量处理(batched=True

如果 batched=Truemap一次处理多个样本,可以 提高处理速度

def add_length_batch(batch):
    batch["text_length"] = [len(text) for text in batch["text"]]
    return batch

dataset = dataset.map(add_length_batch, batched=True)

当数据集 较大 时,batched=True 会显著加快 map 的执行速度。


5. 使用 num_proc 进行多进程加速

如果数据集非常大,可以使用 num_proc 进行 多进程处理

dataset = dataset.map(lowercase, num_proc=4)
  • num_proc=4 表示 使用 4 个 CPU 进程同时处理数据
  • 适用于 大规模数据集,如 wikitextc4

6. map 方法的高级用法

6.1. 只修改特定列

如果 function 只修改某个列,map 会默认保留其他列:

dataset = dataset.map(lowercase, input_columns=["text"])

6.2. 移除不需要的列

如果你想移除 text_length 列:

dataset = dataset.map(lowercase, remove_columns=["text_length"])

6.3. 处理多个字段

如果你想 合并多个字段

def merge_texts(example):
    example["merged_text"] = example["title"] + " " + example["text"]
    return example

dataset = dataset.map(merge_texts)

7. map 方法 vs filter 方法

方法作用
map修改或扩展数据(如文本预处理)
filter筛选数据(如移除短文本)

示例:筛选 文本长度大于 100 的数据:

dataset = dataset.filter(lambda example: len(example["text"]) > 100)

8. map 适用于哪些任务?

任务适用
文本预处理
分词
计算特征
数据增强
标签转换

9. 总结

  1. mapdatasets 处理数据的核心方法,可 批量修改数据集中的样本
  2. 支持 batched=True 进行批量处理,提高速度
  3. 支持 num_proc 进行多进程加速,适用于大规模数据集。
  4. 可以新增、修改、删除字段,也可配合 filter 进行数据筛选。
### Hugging Face PTB 数据集 使用方法和示例 #### 加载PTB数据集 为了加载 Penn Tree Bank (PTB) 数据集,在Hugging Face datasets中可以直接调用`load_dataset`函数来获取该数据集。此操作简化了下载和准备过程,使研究人员可以专注于模型开发而不是数据预处理。 ```python from datasets import load_dataset dataset = load_dataset('ptb_text_only', 'penn_treebank') ``` 这段代码将会加载PTB数据集并将其存储在变量`dataset`中[^1]。 #### 探索数据结构 一旦成功加载数据集之后,可以通过访问字典键查看不同分割部分的数据条目数量以及样本内容: ```python print(dataset['train'][0]) ``` 上述命令展示了训练集中第一个文本实例的内容,帮助理解所处理的具体文本形式。 #### 文本预处理 对于大多数NLP任务而言,通常需要对原始文本执行一些基本的清理工作,比如转换成小写字母、去除特殊字符等。此外还可以利用分词器将句子分解成语料单位以便后续建模使用。 ```python def preprocess_function(examples): return tokenizer(examples["sentence"], truncation=True) tokenized_datasets = dataset.map(preprocess_function, batched=True) ``` 这里定义了一个简单的预处理函数,并通过`.map()`方法批量应用于整个数据集上。注意这里的`tokenizer`对象应当预先初始化好并与特定模型相匹配[^2]。 #### 构建PyTorch DataLoader 当准备好经过编码后的输入序列后,下一步就是创建迭代器以供训练期间高效读取批次化样例。这一步骤借助于`torch.utils.data.DataLoader`类完成。 ```python from torch.utils.data import DataLoader data_collator = DataCollatorWithPadding(tokenizer=tokenizer) dataloader = DataLoader( tokenized_datasets["train"], shuffle=True, collate_fn=data_collator, batch_size=8 ) ``` 以上配置设置了一个带有随机打乱功能的数据装载器,并指定了批大小参数为8。同时引入了`DataCollatorWithPadding`组件自动调整每一批次内的填充长度至最长项一致[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值