# Strukturkan repositori Anda

Untuk meng-host dan membagikan dataset Anda, buat repositori dataset di Hugging Face Hub dan unggah file data Anda.

Panduan ini akan menunjukkan cara menyusun repositori dataset Anda saat mengunggahnya. Dataset dengan struktur dan format file yang didukung (`.txt`, `.csv`, `.parquet`, `.jsonl`, `.mp3`, `.jpg`, `.zip` dll.) akan dimuat secara otomatis dengan [load_dataset()](/docs/datasets/v5.2.0/id/package_reference/loading_methods#datasets.load_dataset), dan akan memiliki dataset viewer di halaman datasetnya di Hub.

## Kasus penggunaan utama

Struktur dataset paling sederhana memiliki dua file: `train.csv` dan `test.csv` (ini berfungsi dengan format file apa pun yang didukung).

Repositori Anda juga akan berisi file `README.md`, yaitu [dataset card](dataset_card) yang ditampilkan di halaman dataset Anda.

```
my_dataset_repository/
├── README.md
├── train.csv
└── test.csv
```

Dalam kasus sederhana ini, Anda akan mendapatkan dataset dengan dua split: `train` (mengandung contoh dari `train.csv`) dan `test` (mengandung contoh dari `test.csv`).

## Definisikan split dan subset Anda dalam YAML

## Pembagian

Jika Anda memiliki beberapa file dan ingin menentukan file mana yang masuk ke split mana, Anda dapat menggunakan field `configs` YAML di bagian atas README.md Anda.

Sebagai contoh, diberikan sebuah repositori seperti ini:

```
my_dataset_repository/
├── README.md
├── data.csv
└── holdout.csv
```

Anda dapat mendefinisikan split Anda dengan menambahkan field `configs` di blok YAML di bagian atas README.md Anda:

```yaml
---
configs:
- config_name: default
  data_files:
  - split: train
    path: "data.csv"
  - split: test
    path: "holdout.csv"
---
```

Anda dapat memilih beberapa file per split menggunakan daftar path:

```
my_dataset_repository/
├── README.md
├── data/
│   ├── abc.csv
│   └── def.csv
└── holdout/
    └── ghi.csv
```

```yaml
---
configs:
- config_name: default
  data_files:
  - split: train
    path:
    - "data/abc.csv"
    - "data/def.csv"
  - split: test
    path: "holdout/ghi.csv"
---
```

Atau Anda dapat menggunakan pola glob untuk secara otomatis mendaftar semua file yang Anda butuhkan:

```yaml
---
configs:
- config_name: default
  data_files:
  - split: train
    path: "data/*.csv"
  - split: test
    path: "holdout/*.csv"
---
```

> [!WARNING]
> Perhatikan bahwa field `config_name` wajib diisi meskipun Anda hanya memiliki satu konfigurasi.

## Konfigurasi

Dataset Anda mungkin memiliki beberapa subset data yang ingin Anda muat secara terpisah. Dalam hal itu, Anda dapat mendefinisikan daftar konfigurasi di dalam field `configs` di YAML:

```
my_dataset_repository/
├── README.md
├── main_data.csv
└── additional_data.csv
```

```yaml
---
configs:
- config_name: main_data
  data_files: "main_data.csv"
- config_name: additional_data
  data_files: "additional_data.csv"
---
```

Setiap konfigurasi ditampilkan secara terpisah di Hugging Face Hub, dan dapat dimuat dengan melewatkan namanya sebagai parameter kedua:

```python
from datasets import load_dataset

main_data = load_dataset("my_dataset_repository", "main_data")
additional_data = load_dataset("my_dataset_repository", "additional_data")
```

## Parameter builder

Tidak hanya `data_files`, tetapi parameter spesifik builder lainnya juga dapat dikirimkan melalui YAML, sehingga memberikan fleksibilitas lebih dalam cara memuat data tanpa memerlukan kode khusus. Sebagai contoh, tentukan pemisah yang akan digunakan dalam konfigurasi mana untuk memuat file `csv` Anda:

```yaml
---
configs:
- config_name: tab
  data_files: "main_data.csv"
  sep: "\t"
- config_name: comma
  data_files: "additional_data.csv"
  sep: ","
---
```

Lihat [dokumentasi builder tertentu](./package_reference/builder_classes) untuk melihat parameter konfigurasi yang mereka miliki.

> [!TIP]
> Anda dapat mengatur konfigurasi default menggunakan `default: true`, misalnya Anda dapat menjalankan `main_data = load_dataset("my_dataset_repository")` jika Anda mengatur
>
> ```yaml
> - config_name: main_data
>   data_files: "main_data.csv"
>   default: true
> ```

## Deteksi split otomatis

Jika tidak ada YAML yang diberikan, 🤗 Datasets mencari pola tertentu di repositori dataset untuk secara otomatis menyimpulkan split dataset. Ada urutan pada pola-pola tersebut, dimulai dari format split nama file kustom hingga memperlakukan semua file sebagai satu split jika tidak ada pola yang ditemukan.

### Nama direktori

File data Anda juga dapat ditempatkan ke dalam direktori yang berbeda bernama `train`, `test`, dan `validation`, di mana setiap direktori berisi file data untuk split tersebut:

```
my_dataset_repository/
├── README.md
└── data/
    ├── train/
    │   └── bees.csv
    ├── test/
    │   └── more_bees.csv
    └── validation/
        └── even_more_bees.csv
```

### Pembagian nama file

Jika Anda tidak memiliki split non-tradisional, Anda dapat menempatkan nama split di mana saja dalam file data dan nama tersebut akan disimpulkan secara otomatis. Satu-satunya aturan adalah nama split harus dipisahkan oleh karakter non-kata, misalnya `test-file.csv` alih-alih `testfile.csv`. Pemisah yang didukung meliputi garis bawah, tanda hubung, spasi, titik, dan angka.

Sebagai contoh, nama-nama file berikut semuanya dapat diterima:

- bagian latih: `train.csv`, `my_train_file.csv`, `train1.csv`
- split validasi: `validation.csv`, `my_validation_file.csv`, `validation1.csv`
- bagian pengujian: `test.csv`, `my_test_file.csv`, `test1.csv`

Berikut adalah contoh di mana semua file ditempatkan ke dalam direktori bernama `data`:

```
my_dataset_repository/
├── README.md
└── data/
    ├── train.csv
    ├── test.csv
    └── validation.csv
```

### Pemisahan nama file kustom

Jika split dataset Anda memiliki nama kustom yang bukan `train`, `test`, atau `validation`, maka Anda dapat memberi nama file data Anda seperti `data/<split_name>-xxxxx-of-xxxxx.csv`.

Berikut adalah contoh dengan tiga split, `train`, `test`, dan `random`:

```
my_dataset_repository/
├── README.md
└── data/
    ├── train-00000-of-00003.csv
    ├── train-00001-of-00003.csv
    ├── train-00002-of-00003.csv
    ├── test-00000-of-00001.csv
    ├── random-00000-of-00003.csv
    ├── random-00001-of-00003.csv
    └── random-00002-of-00003.csv
```

### Satu pemisahan

Ketika 🤗 Datasets tidak dapat menemukan salah satu pola di atas, maka semua file akan dianggap sebagai satu split train. Jika split dataset Anda tidak dimuat seperti yang diharapkan, hal itu mungkin disebabkan oleh pola yang salah.

### Kata kunci nama Split

Ada beberapa cara untuk memberi nama split. Split validasi kadang disebut "dev", dan split uji dapat disebut "eval". Nama split lain ini juga didukung, dan kata kunci berikut setara:

- train, training
- validasi, valid, val, dev
- test, testing, eval, evaluation

Struktur di bawah ini adalah repositori yang valid:

```
my_dataset_repository/
├── README.md
└── data/
    ├── training.csv
    ├── eval.csv
    └── valid.csv
```

### Berkas yang banyak per split

Jika salah satu split Anda terdiri dari beberapa file, 🤗 Datasets masih dapat menginfer apakah itu split train, validation, dan test dari nama file. Misalnya, jika split train dan test Anda mencakup beberapa file:

```
my_dataset_repository/
├── README.md
├── train_0.csv
├── train_1.csv
├── train_2.csv
├── train_3.csv
├── test_0.csv
└── test_1.csv
```

Pastikan semua file dalam set `train` Anda memiliki *train* di namanya (hal yang sama berlaku untuk test dan validation). Bahkan jika Anda menambahkan prefiks atau sufiks pada `train` di nama file (misalnya `my_train_file_00001.csv`), 🤗 Datasets masih dapat menginfer split yang tepat.

Untuk kenyamanan, Anda juga dapat menempatkan file data Anda ke dalam direktori yang berbeda. Dalam kasus ini, nama split disimpulkan dari nama direktori.

```
my_dataset_repository/
├── README.md
└── data/
    ├── train/
    │   ├── shard_0.csv
    │   ├── shard_1.csv
    │   ├── shard_2.csv
    │   └── shard_3.csv
    └── test/
        ├── shard_0.csv
        └── shard_1.csv
```

