Traffine I/O

Bahasa Indonesia

2023-02-03

Hugging Face Datasets

Hugging Face Datasets

Dataset Hugging Face menyediakan situs web yang mencantumkan dataset dan perpustakaan dataset untuk digunakan.

Datasets

Datasets yang tersedia untuk umum dapat ditemukan di tautan berikut.

https://huggingface.co/datasets

Dataset dapat dicari dengan kata kunci, serta difilter berdasarkan kategori tugas, ukuran data, lisensi, dll.

datasets API

API datasets dapat diinstal dengan perintah berikut.

$ pip install datasets

Daftar dataset yang tersedia

Daftar dataset yang tersedia dapat dilihat dengan menggunakan list_dataset.

from datasets import list_datasets, load_dataset, list_metrics, load_metric
from pprint import pprint

pprint(list_datasets())

Pada tanggal 3 Februari 2023, terdapat 20.267 set data.

>> len(list_datasets)

20267

Dataset ini juga dapat ditemukan di tautan berikut.

https://huggingface.co/datasets

Memuat dataset

Dataset dapat dimuat dengan menggunakan load_dataset.

from datasets import load_dataset

dataset = load_dataset(
  'wikitext', # dataset identifier
  'wikitext-103-v1' # instance name in the dataset
)

https://huggingface.co/docs/datasets/v1.11.0/package_reference/loading_methods.html#datasets.load_dataset

Jenis dataset

The loaded dataset is of type DatasetDict.

from datasets import load_dataset

dataset = load_dataset('glue', 'cola')
type(dataset)

datasets.dataset_dict.DatasetDict

Kumpulan data dapat dikonversi ke berbagai jenis sebagai berikut.

dataset.set_format(type='python') # (default) Python object
dataset.set_format(type='torch') # PyTorch tensor
dataset.set_format(type='tensorflow') # TensorFlow tensor
dataset.set_format(type='jax') # JAX
dataset.set_format(type='numpy') # NumPy
dataset.set_format(type='pandas') # pandas DataFrame

https://huggingface.co/docs/datasets/v2.9.0/en/package_reference/main_classes#datasets.Dataset.set_format
https://pypi.org/project/datasets/

Membuat kelas DatasetDict dari file CSV

Kelas DatasetDict dapat dibuat dari file lokal atau pandas DataFrame.

Pertama, siapkan sebuah file CSV. Dapatkan dataset bernama glue dan simpan sebagai CSV.

from datasets import load_dataset
from pprint import pprint

dataset = load_dataset('glue', 'cola')
dataset
DatasetDict({
    train: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 8551
    })
    validation: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 1043
    })
    test: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 1063
    })
})

Simpan set data secara lokal sebagai CSV dengan metode to_csv.

dataset.set_format(type="pandas") # convert to pandas
dataset["train"][:].to_csv("train.csv", index=None) # save
dataset["validation"][:].to_csv("validation.csv", index=None) # save
dataset["test"][:].to_csv("test.csv", index=None) # save
dataset.reset_format() # reset format

train.csv memiliki data sebagai berikut.

$ !cat 'train.csv' | head -n 5

sentence,label,idx
"Our friends won't buy this analysis, let alone the next one we propose.",1,0
One more pseudo generalization and I'm giving up.,1,1
One more pseudo generalization or I'm giving up.,1,2
"The more we study verbs, the crazier they get.",1,3

File CSV

Untuk membuat kelas DatasetDict dari file CSV lokal, jalankan kode berikut.

dataset_files = {
    "train": ["train.csv"],
    "validation": ["validation.csv"],
    "test": ["test.csv"],
}
dataset_from_csv = load_dataset("csv", data_files=dataset_files)
print(dataset_from_csv)
DatasetDict({
    train: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 8551
    })
    validation: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 1043
    })
    test: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 1063
    })
})

pandas DataFrame

Untuk membuat kelas DatasetDict dari pandas, jalankan kode berikut.

import pandas as pd
from datasets import Dataset, DatasetDict

train_df = pd.read_csv("train.csv")
validation_df = pd.read_csv("validation.csv")
test_df = pd.read_csv("test.csv")

train_ds = Dataset.from_pandas(train_df)
validation_ds = Dataset.from_pandas(validation_df)

dataset_from_pandas = DatasetDict({
    "train": train_ds,
    "validation": validation_ds,
    "test": test_ds,
})
print(dataset_from_csv)
DatasetDict({
    train: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 8551
    })
    validation: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 1043
    })
    test: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 1063
    })
})

Mengubah kolom label menjadi ClassLabel

Label dari dataset yang dimuat dari dataset publik bertipe ClassLabel, sedangkan label dari dataset_from_pandas bertipe Value.

dataset['train'].features

{'sentence': Value(dtype='string', id=None),
 'label': ClassLabel(names=['unacceptable', 'acceptable'], id=None),
 'idx': Value(dtype='int32', id=None)}
dataset_from_pandas['train'].features

{'sentence': Value(dtype='string', id=None),
 'label': Value(dtype='int64', id=None),
 'idx': Value(dtype='int64', id=None)}

Anda dapat memberikan jenis kolom pada set data sebagai berikut.

from datasets import ClassLabel

# convert "label" to ClassLabel
class_label = ClassLabel(num_classes=2, names=['unacceptable', 'acceptable'])
dataset_from_pandas = dataset_from_pandas.cast_column("label", class_label)
dataset_from_pandas['train'].features

{'sentence': Value(dtype='string', id=None),
 'label': ClassLabel(names=['unacceptable', 'acceptable'], id=None),
 'idx': Value(dtype='int64', id=None)}

Memproses sebuah dataset

Dataset dapat diproses untuk seluruh dataset menggunakan metode map.

from datasets import load_dataset
from transformers import AutoTokenizer

dataset = load_dataset('glue', 'cola')

# add "length" column that is the length of "sentence"
dataset_with_length = dataset.map(lambda x: {"length": len(x["sentence"])})

# tokenize "sentence" column
tokenizer = AutoTokenizer.from_pretrained('bert-base-cased')
dataset_tokenized = dataset.map(lambda x: tokenizer(x['sentence']), batched=True)

Referensi

https://huggingface.co/docs/datasets/main/index
https://huggingface.co/datasets
https://huggingface.co/docs/datasets/v1.11.0/package_reference/loading_methods.html#datasets.load_dataset
https://huggingface.co/docs/datasets/package_reference/main_classes
https://huggingface.co/docs/datasets/about_dataset_features
https://pypi.org/project/datasets/
https://huggingface.co/docs/datasets/v1.1.1/add_dataset.html

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!