基于Python的自然语言处理系列(37):数据集、预处理与流式处理

        在自然语言处理 (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,从而为特定任务构建更加高效的模型。敬请期待!

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

猜你喜欢

转载自blog.csdn.net/ljd939952281/article/details/142931267