HuggingFace课程笔记:使用Datasets库高效处理数据

HuggingFace课程笔记:使用Datasets库高效处理数据

course The Hugging Face course on Transformers course 项目地址: https://gitcode.com/gh_mirrors/cou/course

在机器学习项目中,数据预处理往往占据了大部分时间。HuggingFace的Datasets库提供了一系列强大的工具来帮助我们高效地清洗和转换数据。本文将深入探讨如何使用Datasets库进行数据切片、清洗和转换操作。

数据加载与初步探索

我们以药物评论数据集为例,该数据集包含患者对各种药物的评价、治疗条件和满意度评分(1-10分)。首先,我们需要加载这个TSV格式的数据:

from datasets import load_dataset

data_files = {"train": "drugsComTrain_raw.tsv", "test": "drugsComTest_raw.tsv"}
drug_dataset = load_dataset("csv", data_files=data_files, delimiter="\t")

数据采样技巧:在开始分析前,获取一个随机样本是了解数据的好方法:

drug_sample = drug_dataset["train"].shuffle(seed=42).select(range(1000))

通过这个小样本,我们可以快速发现数据中的问题:

  • 匿名ID列命名不明确
  • 条件标签大小写不一致
  • 评论中包含HTML转义字符和换行符

数据清洗实战

1. 列重命名

首先处理匿名ID列,我们验证并重命名这个列:

# 验证ID唯一性
for split in drug_dataset.keys():
    assert len(drug_dataset[split]) == len(drug_dataset[split].unique("Unnamed: 0"))

# 重命名列
drug_dataset = drug_dataset.rename_column(
    original_column_name="Unnamed: 0", new_column_name="patient_id"
)

2. 处理缺失值和标准化

条件列中存在缺失值(None)且大小写不一致,我们需要先过滤缺失值,然后标准化:

# 使用lambda函数过滤None值
drug_dataset = drug_dataset.filter(lambda x: x["condition"] is not None)

# 定义转换函数
def lowercase_condition(example):
    return {"condition": example["condition"].lower()}

# 应用转换
drug_dataset = drug_dataset.map(lowercase_condition)

3. 特征工程:计算评论长度

了解评论长度分布对文本分析很重要:

def compute_review_length(example):
    return {"review_length": len(example["review"].split())}

drug_dataset = drug_dataset.map(compute_review_length)

我们可以通过排序查看极端值:

# 查看最短评论
drug_dataset["train"].sort("review_length")[:3]

# 过滤过短评论
drug_dataset = drug_dataset.filter(lambda x: x["review_length"] > 30)

4. 处理HTML转义字符

评论中包含HTML转义字符,使用Python的html模块处理:

import html

drug_dataset = drug_dataset.map(lambda x: {"review": html.unescape(x["review"])})

高效数据处理技巧

批量处理加速

map()方法的batched参数可以显著提升处理速度:

# 批量处理HTML转义
new_drug_dataset = drug_dataset.map(
    lambda x: {"review": [html.unescape(o) for o in x["review"]]}, batched=True
)

分词处理性能对比

使用快速分词器结合批量处理可以获得最佳性能:

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")

def tokenize_function(examples):
    return tokenizer(examples["review"], truncation=True)

# 快速分词器+批量处理
tokenized_dataset = drug_dataset.map(tokenize_function, batched=True)

性能对比数据:

| 处理方式 | 快速分词器 | 慢速分词器 | |------------------|-----------|-----------| | 批量处理(batched=True) | 10.8秒 | 4分41秒 | | 单条处理 | 59.2秒 | 5分3秒 |

多进程处理

对于不支持快速分词的情况,可以使用多进程:

slow_tokenizer = AutoTokenizer.from_pretrained("bert-base-cased", use_fast=False)

def slow_tokenize_function(examples):
    return slow_tokenizer(examples["review"], truncation=True)

tokenized_dataset = drug_dataset.map(slow_tokenize_function, batched=True, num_proc=8)

多进程性能对比:

| 处理方式 | 快速分词器 | 慢速分词器 | |-----------------------|-----------|-----------| | 批量+多进程(num_proc=8) | 6.52秒 | 41.3秒 | | 单条+多进程 | 9.49秒 | 45.2秒 |

总结

通过本文,我们学习了如何使用HuggingFace Datasets库高效地处理和清洗数据。关键要点包括:

  1. 使用map()filter()进行数据转换和清洗
  2. 通过批量处理(batched=True)显著提升处理速度
  3. 对于计算密集型操作,使用多进程(num_proc)进一步加速
  4. 优先选择快速分词器以获得最佳性能

这些技巧不仅适用于文本数据,也可以应用于其他类型的数据处理任务。掌握这些方法将大大提升你的数据预处理效率。

course The Hugging Face course on Transformers course 项目地址: https://gitcode.com/gh_mirrors/cou/course

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

霍潇青

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

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

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

打赏作者

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

抵扣说明:

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

余额充值