在自然语言处理 (NLP) 中,数据的加载、预处理和处理效率是模型训练成功的关键因素之一。使用高效的数据处理框架,特别是在数据量庞大的情况下,是实现高性能训练的基础。本篇博文将介绍如何使用 Huggingface Datasets 来加载、处理和保存数据集。我们将详细探讨如何使用本地数据文件、流式处理大规模数据、清理和标准化数据,以及如何与 Pandas 集成进行高级数据分析。无论是小型实验还是大规模训练,这些工具和技术都能帮助你提升工作效率。
1. 使用自定义数据集
在本节中,我们展示如何加载并处理本地或远程的数据集,包括如何使用 Huggingface Datasets 的不同加载脚本。
数据格式和加载脚本
数据格式 | 加载脚本 | 示例 |
CSV 和 TSV | csv | load_dataset("csv", data_files="my_file.csv") |
文本文件 | text | load_dataset("text", data_files="my_file.txt") |
JSON 和 JSON Lines | json | load_dataset("json", data_files="my_file.jsonl") |
Pickled DataFrames | pandas | load_dataset("pandas", data_files="my_dataframe.pkl") |
加载本地数据集
使用 UCI 药物评论数据集作为示例,我们首先下载并解压文件:
wget -P data/ "https://archive.ics.uci.edu/ml/machine-learning-databases/00462/drugsCom_raw.zip"
unzip data/drugsCom_raw.zip -d data/
接着加载本地 TSV 文件:
from datasets import load_dataset
drug_dataset = load_dataset(
"csv",
data_files="data/drugsComTrain_raw.tsv",
delimiter="\t"
)
要同时加载训练集和测试集,可以这样设置:
data_files = {
"train": "data/drugsComTrain_raw.tsv",
"test": "data/drugsComTest_raw.tsv"
}
drug_dataset = load_dataset("csv", data_files=data_files, delimiter="\t")
2. 数据集的流式处理
Huggingface Datasets 提供了流式处理的功能,避免了内存限制。我们可以通过设置 streaming=True
实现:
drug_dataset_streamed = load_dataset(
"csv",
data_files=data_files,
delimiter="\t",
streaming=True
)
流式数据集返回的是 IterableDataset
对象,可以使用 iter()
迭代:
print(next(iter(drug_dataset_streamed["train"])))
对于流式数据集,可以使用 map()
进行动态处理:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")
tokenized_dataset = drug_dataset_streamed.map(lambda x: tokenizer(x["review"]))
3. 数据预处理
我们可以通过 map()
和 filter()
轻松实现数据清理和标准化。
规范化列名
drug_dataset = drug_dataset.rename_column(
original_column_name="Unnamed: 0",
new_column_name="patient_id"
)
标准化标签和过滤数据
将 condition
列内容转换为小写,并过滤掉短评论:
drug_dataset = drug_dataset.map(lambda x: {"condition": x["condition"].lower()})
drug_dataset = drug_dataset.filter(lambda x: len(x["review"].split()) > 30)
处理HTML字符
import html
drug_dataset = drug_dataset.map(lambda x: {"review": html.unescape(x["review"])})
4. 高效预处理
我们使用 batched=True
和快速 tokenizer 加速数据处理:
tokenizer = AutoTokenizer.from_pretrained("bert-base-cased", use_fast=True)
tokenized_dataset = drug_dataset.map(
lambda x: tokenizer(x["review"], truncation=True),
batched=True
)
5. 使用 Pandas 进行分析
将数据集转换为 Pandas DataFrame 进行分析:
drug_dataset.set_format("pandas")
train_df = drug_dataset["train"][:]
print(train_df.head())
分析后,可以将 Pandas 数据转换回 Huggingface Dataset:
from datasets import Dataset
train_dataset = Dataset.from_pandas(train_df)
6. 数据集的拆分与保存
我们可以将训练集拆分为训练集和验证集:
drug_dataset_clean = drug_dataset["train"].train_test_split(train_size=0.8, seed=42)
drug_dataset_clean["validation"] = drug_dataset_clean.pop("test")
将处理后的数据集保存到磁盘:
drug_dataset_clean.save_to_disk("drug-reviews")
加载已保存的数据:
from datasets import load_from_disk
drug_dataset_reloaded = load_from_disk("drug-reviews")
结语
在本篇博文中,我们深入探讨了如何使用 Huggingface Datasets 加载、处理和管理数据集,从本地文件读取到流式处理大规模数据,为训练提供了全面的支持。借助
map()
、filter()
等函数,我们能够轻松实现数据预处理,如清理 HTML 标签、规范标签格式以及去除异常数据。此外,我们还展示了如何结合 Pandas 进行高级数据分析,并将处理后的数据集保存为不同格式,确保在项目中的灵活使用。掌握这些数据操作技巧后,你将更有信心应对各种 NLP 数据集的处理需求,并为后续的模型训练打下扎实基础。在下一篇文章中,我们将探索如何从现有语料库训练一个新的 tokenizer,从而为特定任务构建更加高效的模型。敬请期待!
如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!
欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。
谢谢大家的支持!