HuggingFace课程笔记:使用Datasets库高效处理数据
course The Hugging Face course on Transformers 项目地址: 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库高效地处理和清洗数据。关键要点包括:
- 使用
map()
和filter()
进行数据转换和清洗 - 通过批量处理(batched=True)显著提升处理速度
- 对于计算密集型操作,使用多进程(num_proc)进一步加速
- 优先选择快速分词器以获得最佳性能
这些技巧不仅适用于文本数据,也可以应用于其他类型的数据处理任务。掌握这些方法将大大提升你的数据预处理效率。
course The Hugging Face course on Transformers 项目地址: https://gitcode.com/gh_mirrors/cou/course
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考