Hugging Face Course-Diving in 抱抱脸 Datasets library

在这里插入图片描述
在这一章节我们将会探讨以下问题:

  • What do you do when your dataset is not on the Hub?(如果你的数据集不在hub里怎么办)
  • How can you slice and dice a dataset? (And what if you really need to use Pandas?)(如何对数据去切片和切块)
  • What do you do when your dataset is huge and will melt your laptop’s RAM?(如果数据集很大并且会炸掉你的RAM的时候该怎么办)
  • What the heck are “memory mapping” and Apache Arrow?(内存映射是什么鬼?还有Apache Arrow?)
  • How can you create your own dataset and push it to the Hub?

What if my dataset isn’t on the Hub?(如何加载自己的数据集)

以下是一些加载数据集的方式:

在这里插入图片描述
常用的加载方法:

data_files = {"train": "data/train.tsv", "validation" : "data/validation.tsv"
    ,"test": "data/test.tsv"}
data = load_dataset("csv", data_files=data_files,delimiter="\t")

Time to slice and dice(数据的切片)

对于我们一次性读取的数据集字典DatasetDict

>>>data
DatasetDict({
    train: Dataset({
        features: ['PhraseId', 'SentenceId', 'Phrase', 'Sentiment'],
        num_rows: 140000
    })
    validation: Dataset({
        features: ['PhraseId', 'SentenceId', 'Phrase', 'Sentiment'],
        num_rows: 16060
    })
    test: Dataset({
        features: ['PhraseId', 'SentenceId', 'Phrase', 'Sentiment'],
        num_rows: 66292
    })
})

可以用对应的名称进行访问,得到一个Dataset类型的数据

>>>raw_train_dataset = data["train"]
>>>raw_train_dataset[0]
{'PhraseId': 1,
 'SentenceId': 1,
 'Phrase': 'A series of escapades demonstrating the adage that what is good for the goose is also good for the gander , some of which occasionally amuses but none of which amounts to much of a story .',
 'Sentiment': 1}

如果想要打乱顺序,并取出固定数量的数据,可以使用以下代码:

train_data = data["train"].shuffle(seed=42).select(range(1000))

对列名进行修改:

drug_dataset = drug_dataset.rename_column(
    original_column_name="Unnamed: 0", new_column_name="patient_id"
)

过滤掉空的数据:

drug_dataset = drug_dataset.filter(lambda x: x["condition"] is not None)

加列:

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]

用函数直接添加一列:
向数据集添加新列的另一种方法是使用该Dataset.add_column()函数。这允许您将列作为 Python 列表或 NumPy 数组提供,并且在Dataset.map()不适合您的分析的情况下可以很方便。

我们需要处理的最后一件事是评论中是否存在 HTML 字符代码。我们可以使用 Python 的html模块来对这些字符进行转义,如下所示:

import html

text = "I'm a transformer called BERT"
html.unescape(text)

输出:

"I'm a transformer called BERT"

也可以使用lambda:

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

The map() method’s superpowers

用批量读取来加速:

new_drug_dataset = drug_dataset.map(
    lambda x: {"review": [html.unescape(o) for o in x["review"]]}, batched=True
)

在这里插入图片描述
Dataset.map()也有一些自己的并行化能力。由于它们不受 Rust 的支持,因此它们不会让慢速分词器赶上快速分词器,但它们仍然会有所帮助(尤其是当您使用没有快速版本的分词器时)。要启用多处理,请使用num_proc参数并指定要在调用中使用的进程数Dataset.map():

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来加速处理通常是一个好主意,只要你使用的函数还没有自己进行某种多线程处理。

From Datasets to DataFrames and back

Dataset类转化为PandasDataframe

drug_dataset.set_format("pandas")

一旦我们完成了 Pandas 分析,我们总是可以Dataset使用Dataset.from_pandas()如下函数创建一个新对象:

from datasets import Dataset

freq_dataset = Dataset.from_pandas(frequencies)
freq_dataset

Creating a validation set 创建验证集

🤗 Datasets 提供了一个Dataset.train_test_split()基于scikit-learn. 让我们用它来将我们的训练集拆分为trainvalidation拆分(我们设置了seed可重复性的参数):

drug_dataset_clean = drug_dataset["train"].train_test_split(train_size=0.8, seed=42)
# Rename the default "test" split to "validation"
drug_dataset_clean["validation"] = drug_dataset_clean.pop("test")
# Add the "test" set to our `DatasetDict`
drug_dataset_clean["test"] = drug_dataset["test"]
drug_dataset_clean

输出:

DatasetDict({
    train: Dataset({
        features: ['patient_id', 'drugName', 'condition', 'review', 'rating', 'date', 'usefulCount', 'review_length', 'review_clean'],
        num_rows: 110811
    })
    validation: Dataset({
        features: ['patient_id', 'drugName', 'condition', 'review', 'rating', 'date', 'usefulCount', 'review_length', 'review_clean'],
        num_rows: 27703
    })
    test: Dataset({
        features: ['patient_id', 'drugName', 'condition', 'review', 'rating', 'date', 'usefulCount', 'review_length', 'review_clean'],
        num_rows: 46108
    })
})

虽然🤗 Datasets 会缓存每个下载的数据集和对它执行的操作,但有时你会想要将数据集保存到磁盘(例如,以防缓存被删除)。如下表所示,🤗 Datasets 提供了三个主要功能来以不同的格式保存您的数据集:
在这里插入图片描述
例如,让我们以 Arrow 格式保存我们清理过的数据集:

>>>drug_dataset_clean.save_to_disk("drug-reviews")
drug-reviews/
├── dataset_dict.json
├── test
│   ├── dataset.arrow
│   ├── dataset_info.json
│   └── state.json
├── train
│   ├── dataset.arrow
│   ├── dataset_info.json
│   ├── indices.arrow
│   └── state.json
└── validation
    ├── dataset.arrow
    ├── dataset_info.json
    ├── indices.arrow
    └── state.json

保存数据集后,我们可以使用load_from_disk()如下函数加载它:

from datasets import load_from_disk

drug_dataset_reloaded = load_from_disk("drug-reviews")
drug_dataset_reloaded

输出:

DatasetDict({
    train: Dataset({
        features: ['patient_id', 'drugName', 'condition', 'review', 'rating', 'date', 'usefulCount', 'review_length'],
        num_rows: 110811
    })
    validation: Dataset({
        features: ['patient_id', 'drugName', 'condition', 'review', 'rating', 'date', 'usefulCount', 'review_length'],
        num_rows: 27703
    })
    test: Dataset({
        features: ['patient_id', 'drugName', 'condition', 'review', 'rating', 'date', 'usefulCount', 'review_length'],
        num_rows: 46108
    })
})

Big data? 🤗 Datasets to the rescue!

Creating your own dataset

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值