Pembuat Kumpulan Data khusus format

Panduan ini mendokumentasikan semua pembuat kumpulan data khusus format yang saat ini tersedia di TFDS.

Pembuat kumpulan data khusus format adalah subkelas dari tfds.core.GeneratorBasedBuilder yang menangani sebagian besar pemrosesan data untuk format data tertentu.

Kumpulan data berdasarkan tf.data.Dataset

Jika Anda ingin membuat kumpulan data TFDS dari kumpulan data dalam format tf.data.Dataset ( reference ), Anda dapat menggunakan tfds.dataset_builders.TfDataBuilder (lihat dokumen API ).

Kami membayangkan dua kegunaan umum kelas ini:

  • Membuat kumpulan data eksperimental di lingkungan seperti buku catatan
  • Mendefinisikan pembuat kumpulan data dalam kode

Membuat kumpulan data baru dari buku catatan

Misalkan Anda bekerja di buku catatan, memuat beberapa data sebagai tf.data.Dataset , menerapkan berbagai transformasi (peta, filter, dll) dan sekarang Anda ingin menyimpan data ini dan membagikannya dengan mudah kepada rekan satu tim atau memuatnya di buku catatan lain. Daripada harus menentukan kelas pembuat kumpulan data baru, Anda juga dapat membuat instance tfds.dataset_builders.TfDataBuilder dan memanggil download_and_prepare untuk menyimpan kumpulan data Anda sebagai kumpulan data TFDS.

Karena ini adalah kumpulan data TFDS, Anda dapat membuat versinya, menggunakan konfigurasi, membaginya berbeda-beda, dan mendokumentasikannya agar lebih mudah digunakan nanti. Artinya, Anda juga harus memberi tahu TFDS fitur apa saja yang ada di kumpulan data Anda.

Berikut ini contoh tiruan bagaimana Anda dapat menggunakannya.

import tensorflow as tf
import tensorflow_datasets as tfds

my_ds_train = tf.data.Dataset.from_tensor_slices({"number": [1, 2, 3]})
my_ds_test = tf.data.Dataset.from_tensor_slices({"number": [4, 5]})

# Optionally define a custom `data_dir`.
# If None, then the default data dir is used.
custom_data_dir = "/my/folder"

# Define the builder.
single_number_builder = tfds.dataset_builders.TfDataBuilder(
    name="my_dataset",
    config="single_number",
    version="1.0.0",
    data_dir=custom_data_dir,
    split_datasets={
        "train": my_ds_train,
        "test": my_ds_test,
    },
    features=tfds.features.FeaturesDict({
        "number": tfds.features.Scalar(dtype=tf.int64),
    }),
    description="My dataset with a single number.",
    release_notes={
        "1.0.0": "Initial release with numbers up to 5!",
    }
)

# Make the builder store the data as a TFDS dataset.
single_number_builder.download_and_prepare()

Metode download_and_prepare akan mengulangi input tf.data.Dataset s dan menyimpan dataset TFDS yang sesuai di /my/folder/my_dataset/single_number/1.0.0 , yang akan berisi pemisahan kereta dan pengujian.

Argumen config bersifat opsional dan dapat berguna jika Anda ingin menyimpan konfigurasi berbeda dalam kumpulan data yang sama.

Argumen data_dir dapat digunakan untuk menyimpan kumpulan data TFDS yang dihasilkan di folder lain, misalnya di kotak pasir Anda sendiri jika Anda (belum) ingin membaginya dengan orang lain. Perhatikan bahwa saat melakukan ini, Anda juga harus meneruskan data_dir ke tfds.load . Jika argumen data_dir tidak ditentukan, maka direktori data TFDS default akan digunakan.

Memuat kumpulan data Anda

Setelah kumpulan data TFDS disimpan, kumpulan data tersebut dapat dimuat dari skrip lain atau oleh rekan satu tim jika mereka memiliki akses ke data tersebut:

# If no custom data dir was specified:
ds_test = tfds.load("my_dataset/single_number", split="test")

# When there are multiple versions, you can also specify the version.
ds_test = tfds.load("my_dataset/single_number:1.0.0", split="test")

# If the TFDS was stored in a custom folder, then it can be loaded as follows:
custom_data_dir = "/my/folder"
ds_test = tfds.load("my_dataset/single_number:1.0.0", split="test", data_dir=custom_data_dir)

Menambahkan versi atau konfigurasi baru

Setelah melakukan iterasi lebih jauh pada kumpulan data Anda, Anda mungkin telah menambahkan atau mengubah beberapa transformasi data sumber. Untuk menyimpan dan membagikan kumpulan data ini, Anda dapat dengan mudah menyimpannya sebagai versi baru.

def add_one(example):
  example["number"] = example["number"] + 1
  return example

my_ds_train_v2 = my_ds_train.map(add_one)
my_ds_test_v2 = my_ds_test.map(add_one)

single_number_builder_v2 = tfds.dataset_builders.TfDataBuilder(
    name="my_dataset",
    config="single_number",
    version="1.1.0",
    data_dir=custom_data_dir,
    split_datasets={
        "train": my_ds_train_v2,
        "test": my_ds_test_v2,
    },
    features=tfds.features.FeaturesDict({
        "number": tfds.features.Scalar(dtype=tf.int64, doc="Some number"),
    }),
    description="My dataset with a single number.",
    release_notes={
        "1.1.0": "Initial release with numbers up to 6!",
        "1.0.0": "Initial release with numbers up to 5!",
    }
)

# Make the builder store the data as a TFDS dataset.
single_number_builder_v2.download_and_prepare()

Mendefinisikan kelas pembuat kumpulan data baru

Anda juga dapat menentukan DatasetBuilder baru berdasarkan kelas ini.

import tensorflow as tf
import tensorflow_datasets as tfds

class MyDatasetBuilder(tfds.dataset_builders.TfDataBuilder):
  def __init__(self):
    ds_train = tf.data.Dataset.from_tensor_slices([1, 2, 3])
    ds_test = tf.data.Dataset.from_tensor_slices([4, 5])
    super().__init__(
        name="my_dataset",
        version="1.0.0",
        split_datasets={
            "train": ds_train,
            "test": ds_test,
        },
        features=tfds.features.FeaturesDict({
            "number": tfds.features.Scalar(dtype=tf.int64),
        }),
        config="single_number",
        description="My dataset with a single number.",
        release_notes={
            "1.0.0": "Initial release with numbers up to 5!",
        })

Pembuat Croissant

Format

Croissant 🥐 adalah format tingkat tinggi untuk kumpulan data pembelajaran mesin yang menggabungkan metadata, deskripsi file sumber daya, struktur data, dan semantik ML default ke dalam satu file; ini berfungsi dengan kumpulan data yang ada agar lebih mudah ditemukan, digunakan, dan didukung dengan alat.

Croissant dibangun di atas skema.org dan kosakata sc:Dataset nya, format yang banyak digunakan untuk mewakili kumpulan data di Web, dan membuatnya dapat dicari.

CroissantBuilder

CroissantBuilder mendefinisikan kumpulan data TFDS berdasarkan file metadata Croissant 🥐; masing-masing record_set_ids yang ditentukan akan menghasilkan ConfigBuilder terpisah.

Misalnya, untuk menginisialisasi CroissantBuilder untuk kumpulan data MNIST menggunakan definisi Croissant 🥐 :

import tensorflow_datasets as tfds
builder = tfds.dataset_builders.CroissantBuilder(
    jsonld="https://raw.githubusercontent.com/mlcommons/croissant/main/datasets/0.8/huggingface-mnist/metadata.json",
    file_format='array_record',
)
builder.download_and_prepare()
ds = builder.as_data_source()
print(ds['default'][0])

bersama

Format

CoNLL adalah format populer yang digunakan untuk mewakili data teks beranotasi.

Data berformat CoNLL biasanya berisi satu token dengan anotasi linguistiknya per baris; dalam baris yang sama, anotasi biasanya dipisahkan dengan spasi atau tab. Garis kosong mewakili batas kalimat.

Perhatikan contoh kalimat berikut dari kumpulan data conll2003 , yang mengikuti format anotasi CoNLL:

U.N. NNP I-NP I-ORG official
NN I-NP O
Ekeus NNP I-NP I-PER
heads VBZ I-VP O
for IN I-PP O
Baghdad NNP I-NP
I-LOC . . O O

ConllDatasetBuilder

Untuk menambahkan kumpulan data berbasis CoNLL baru ke TFDS, Anda dapat mendasarkan kelas pembuat kumpulan data Anda pada tfds.dataset_builders.ConllDatasetBuilder . Kelas dasar ini berisi kode umum untuk menangani kekhususan kumpulan data CoNLL (mengulangi format berbasis kolom, daftar fitur dan tag yang telah dikompilasi, ...).

tfds.dataset_builders.ConllDatasetBuilder mengimplementasikan GeneratorBasedBuilder khusus CoNLL. Lihat kelas berikut sebagai contoh minimal pembuat himpunan data CoNLL:

from tensorflow_datasets.core.dataset_builders.conll import conll_dataset_builder_utils as conll_lib
import tensorflow_datasets.public_api as tfds

class MyCoNNLDataset(tfds.dataset_builders.ConllDatasetBuilder):
  VERSION = tfds.core.Version('1.0.0')
  RELEASE_NOTES = {'1.0.0': 'Initial release.'}

  # conllu_lib contains a set of ready-to-use CONLL-specific configs.
  BUILDER_CONFIGS = [conll_lib.CONLL_2003_CONFIG]

  def _info(self) -> tfds.core.DatasetInfo:
    return self.create_dataset_info(
        # ...
    )

  def _split_generators(self, dl_manager):
    path = dl_manager.download_and_extract('https://data-url')

    return {'train': self._generate_examples(path=path / 'train.txt'),
            'test': self._generate_examples(path=path / 'train.txt'),
    }

Sedangkan untuk pembuat kumpulan data standar, perlu menimpa metode kelas _info dan _split_generators . Bergantung pada kumpulan data, Anda mungkin juga perlu memperbarui conll_dataset_builder_utils.py untuk menyertakan fitur dan daftar tag khusus untuk kumpulan data Anda.

Metode _generate_examples tidak memerlukan penimpaan lebih lanjut, kecuali kumpulan data Anda memerlukan implementasi khusus.

Contoh

Pertimbangkan conll2003 sebagai contoh kumpulan data yang diimplementasikan menggunakan pembuat kumpulan data khusus CoNLL.

CLI

Cara termudah untuk menulis kumpulan data baru berbasis CoNLL adalah dengan menggunakan TFDS CLI :

cd path/to/my/project/datasets/
tfds new my_dataset --format=conll   # Create `my_dataset/my_dataset.py` CoNLL-specific template files

CoNLL-U

Format

CoNLL-U adalah format populer yang digunakan untuk mewakili data teks beranotasi.

CoNLL-U menyempurnakan format CoNLL dengan menambahkan sejumlah fitur, seperti dukungan untuk kata multi-token . Data berformat CoNLL-U biasanya berisi satu token dengan anotasi linguistiknya per baris; dalam baris yang sama, anotasi biasanya dipisahkan oleh karakter tab tunggal. Garis kosong mewakili batas kalimat.

Biasanya, setiap baris kata beranotasi CoNLL-U berisi bidang berikut, seperti yang dilaporkan dalam dokumentasi resmi :

  • ID: Indeks kata, bilangan bulat dimulai dari 1 untuk setiap kalimat baru; mungkin merupakan rentang untuk token multi-kata; mungkin berupa angka desimal untuk node kosong (angka desimal boleh lebih rendah dari 1 tetapi harus lebih besar dari 0).
  • BENTUK: Bentuk kata atau simbol tanda baca.
  • LEMMA: Lemma atau bentuk kata dasar.
  • UPOS: Tag bagian pidato universal.
  • XPOS: Tag part-of-speech khusus bahasa; garis bawah jika tidak tersedia.
  • FITUR: Daftar fitur morfologi dari inventaris fitur universal atau dari ekstensi khusus bahasa tertentu; garis bawah jika tidak tersedia.
  • HEAD: Kepala kata saat ini, yang dapat berupa nilai ID atau nol (0).
  • DEPREL: Hubungan ketergantungan universal dengan HEAD (root iff HEAD = 0) atau subtipe khusus bahasa yang ditentukan.
  • DEPS: Grafik ketergantungan yang ditingkatkan dalam bentuk daftar pasangan head-deprel.
  • MISC: Anotasi lainnya.

Pertimbangkan sebagai contoh kalimat beranotasi CoNLL-U berikut dari dokumentasi resmi :

1-2    vámonos   _
1      vamos     ir
2      nos       nosotros
3-4    al        _
3      a         a
4      el        el
5      mar       mar

ConllUDatasetBuilder

Untuk menambahkan kumpulan data berbasis CoNLL-U baru ke TFDS, Anda dapat mendasarkan kelas pembuat kumpulan data Anda pada tfds.dataset_builders.ConllUDatasetBuilder . Kelas dasar ini berisi kode umum untuk menangani kekhususan kumpulan data CoNLL-U (mengulangi format berbasis kolom, daftar fitur dan tag yang telah dikompilasi sebelumnya, ...).

tfds.dataset_builders.ConllUDatasetBuilder mengimplementasikan GeneratorBasedBuilder khusus CoNLL-U. Lihat kelas berikut sebagai contoh minimal pembuat himpunan data CoNLL-U:

from tensorflow_datasets.core.dataset_builders.conll import conllu_dataset_builder_utils as conllu_lib
import tensorflow_datasets.public_api as tfds

class MyCoNNLUDataset(tfds.dataset_builders.ConllUDatasetBuilder):
  VERSION = tfds.core.Version('1.0.0')
  RELEASE_NOTES = {'1.0.0': 'Initial release.'}

  # conllu_lib contains a set of ready-to-use features.
  BUILDER_CONFIGS = [
      conllu_lib.get_universal_morphology_config(
          language='en',
          features=conllu_lib.UNIVERSAL_DEPENDENCIES_FEATURES,
      )
  ]

  def _info(self) -> tfds.core.DatasetInfo:
    return self.create_dataset_info(
        # ...
    )

  def _split_generators(self, dl_manager):
    path = dl_manager.download_and_extract('https://data-url')

    return {
        'train':
            self._generate_examples(
                path=path / 'train.txt',
                # If necessary, add optional custom processing (see conllu_lib
                # for examples).
                # process_example_fn=...,
            )
    }

Sedangkan untuk pembuat kumpulan data standar, perlu menimpa metode kelas _info dan _split_generators . Bergantung pada kumpulan data, Anda mungkin juga perlu memperbarui conllu_dataset_builder_utils.py untuk menyertakan fitur dan daftar tag khusus untuk kumpulan data Anda.

Metode _generate_examples tidak memerlukan penimpaan lebih lanjut, kecuali kumpulan data Anda memerlukan implementasi khusus. Perhatikan bahwa, jika kumpulan data Anda memerlukan prapemrosesan tertentu - misalnya jika kumpulan data tersebut mempertimbangkan fitur ketergantungan universal non-klasik - Anda mungkin perlu memperbarui atribut process_example_fn dari fungsi generate_examples Anda (lihat daset xtreme_pos sebagai contoh).

Contoh

Pertimbangkan himpunan data berikut, yang menggunakan pembuat himpunan data khusus CoNNL-U, sebagai contoh:

CLI

Cara termudah untuk menulis kumpulan data baru berbasis CoNLL-U adalah dengan menggunakan TFDS CLI :

cd path/to/my/project/datasets/
tfds new my_dataset --format=conllu   # Create `my_dataset/my_dataset.py` CoNLL-U specific template files