Konstruktorzy zestawów danych specyficznych dla formatu

Ten przewodnik dokumentuje wszystkie narzędzia do tworzenia zestawów danych specyficzne dla formatu, dostępne obecnie w TFDS.

Konstruktorzy zestawów danych specyficznych dla formatu są podklasami tfds.core.GeneratorBasedBuilder , które zajmują się większością przetwarzania danych dla określonego formatu danych.

Zbiory danych oparte na tf.data.Dataset

Jeśli chcesz utworzyć zbiór danych TFDS ze zbioru danych w formacie tf.data.Dataset ( odniesienie ), możesz użyć tfds.dataset_builders.TfDataBuilder (patrz dokumentacja API ).

Przewidujemy dwa typowe zastosowania tej klasy:

  • Tworzenie eksperymentalnych zbiorów danych w środowisku przypominającym notatnik
  • Definiowanie konstruktora zestawu danych w kodzie

Tworzenie nowego zestawu danych z notatnika

Załóżmy, że pracujesz w notatniku, załadowałeś pewne dane jako tf.data.Dataset , zastosowałeś różne transformacje (mapa, filtr itp.), A teraz chcesz przechowywać te dane i łatwo udostępniać je członkom zespołu lub załadować je do innych notatników. Zamiast definiować nową klasę konstruktora zestawu danych, możesz także utworzyć instancję tfds.dataset_builders.TfDataBuilder i wywołać download_and_prepare , aby zapisać zestaw danych jako zestaw danych TFDS.

Ponieważ jest to zbiór danych TFDS, możesz go wersjonować, używać konfiguracji, mieć różne podziały i dokumentować, aby ułatwić późniejsze wykorzystanie. Oznacza to, że musisz także poinformować TFDS, jakie funkcje znajdują się w Twoim zbiorze danych.

Oto fikcyjny przykład tego, jak możesz z niego skorzystać.

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()

Metoda download_and_prepare wykona iterację po wejściowym tf.data.Dataset s i zapisze odpowiedni zestaw danych TFDS w /my/folder/my_dataset/single_number/1.0.0 , który będzie zawierał zarówno podział pociągowy, jak i testowy.

Argument config jest opcjonalny i może być przydatny, jeśli chcesz przechowywać różne konfiguracje w tym samym zestawie danych.

Argumentu data_dir można użyć do przechowywania wygenerowanego zestawu danych TFDS w innym folderze, na przykład we własnym piaskownicy, jeśli nie chcesz (jeszcze) udostępniać go innym. Pamiętaj, że robiąc to, musisz także przekazać data_dir do tfds.load . Jeśli argument data_dir nie zostanie określony, zostanie użyty domyślny katalog danych TFDS.

Ładowanie zestawu danych

Po zapisaniu zbioru danych TFDS można go załadować z innych skryptów lub przez członków zespołu, jeśli mają oni dostęp do danych:

# 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)

Dodanie nowej wersji lub konfiguracji

Po dalszej iteracji zbioru danych mogłeś dodać lub zmienić niektóre transformacje danych źródłowych. Aby przechowywać i udostępniać ten zbiór danych, możesz łatwo zapisać go jako nową wersję.

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()

Definiowanie nowej klasy konstruktora zestawu danych

Można także zdefiniować nowy DatasetBuilder w oparciu o tę klasę.

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!",
        })

Konstruktor rogalików

Format

Croissant 🥐 to format wysokiego poziomu zbiorów danych uczenia maszynowego, który łączy metadane, opisy plików zasobów, strukturę danych i domyślną semantykę ML w jednym pliku; współpracuje z istniejącymi zbiorami danych, aby ułatwić ich wyszukiwanie, używanie i obsługę za pomocą narzędzi.

Croissant opiera się na schema.org i słownictwie sc:Dataset , szeroko używanym formacie do reprezentowania zbiorów danych w Internecie i umożliwiającym ich przeszukiwanie.

CroissantBuilder

CroissantBuilder definiuje zbiór danych TFDS w oparciu o plik metadanych Croissant 🥐; każdy z określonych record_set_ids spowoduje utworzenie osobnego ConfigBuilder .

Na przykład, aby zainicjować CroissantBuilder dla zbioru danych MNIST przy użyciu jego definicji 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])

KONLL

Format

CoNLL to popularny format używany do reprezentowania danych tekstowych z adnotacjami.

Dane w formacie CoNLL zwykle zawierają jeden token z adnotacjami językowymi w każdym wierszu; w tym samym wierszu adnotacje są zwykle oddzielone spacjami lub tabulatorami. Puste linie reprezentują granice zdań.

Rozważmy jako przykład następujące zdanie ze zbioru danych conll2003 , które jest zgodne z formatem adnotacji 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

Aby dodać nowy zestaw danych oparty na CoNLL do TFDS, możesz oprzeć klasę konstruktora zestawu danych na tfds.dataset_builders.ConllDatasetBuilder . Ta klasa bazowa zawiera wspólny kod do radzenia sobie ze specyfiką zestawów danych CoNLL (iterowanie po formacie opartym na kolumnach, wstępnie skompilowane listy funkcji i znaczników, ...).

tfds.dataset_builders.ConllDatasetBuilder implementuje GeneratorBasedBuilder specyficzny dla CoNLL. Zapoznaj się z poniższą klasą jako minimalnym przykładem narzędzia do tworzenia zestawu danych 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'),
    }

Jeśli chodzi o standardowe narzędzia do tworzenia zestawów danych, wymaga to nadpisania metod klas _info i _split_generators . W zależności od zestawu danych może być konieczna aktualizacja pliku conll_dataset_builder_utils.py w celu uwzględnienia funkcji i listy tagów specyficznych dla Twojego zestawu danych.

Metoda _generate_examples nie powinna wymagać dalszego nadpisywania, chyba że Twój zbiór danych wymaga specjalnej implementacji.

Przykłady

Rozważ conll2003 jako przykład zestawu danych zaimplementowanego przy użyciu narzędzia do tworzenia zestawów danych specyficznego dla CoNLL.

interfejs wiersza polecenia

Najłatwiejszym sposobem napisania nowego zbioru danych opartego na CoNLL jest użycie interfejsu CLI TFDS :

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 to popularny format używany do reprezentowania danych tekstowych z adnotacjami.

CoNLL-U ulepsza format CoNLL, dodając szereg funkcji, takich jak obsługa słów zawierających wiele tokenów . Dane w formacie CoNLL-U zawierają zwykle jeden token z adnotacjami językowymi w każdym wierszu; w tym samym wierszu adnotacje są zwykle oddzielone pojedynczymi znakami tabulacji. Puste linie reprezentują granice zdań.

Zazwyczaj każda linia słów z adnotacjami CoNLL-U zawiera następujące pola, zgodnie z oficjalną dokumentacją :

  • ID: Indeks słów, liczba całkowita zaczynająca się od 1 dla każdego nowego zdania; może być zakresem dla tokenów wielowyrazowych; może być liczbą dziesiętną dla pustych węzłów (liczby dziesiętne mogą być mniejsze niż 1, ale muszą być większe niż 0).
  • FORMULARZ: Forma słowna lub symbol interpunkcyjny.
  • LEMAT: Lemat lub rdzeń formy wyrazowej.
  • UPOS: uniwersalny znacznik części mowy.
  • XPOS: znacznik części mowy specyficzny dla języka; podkreślenie, jeśli nie jest dostępne.
  • WYCZYNY: Lista cech morfologicznych z inwentarza cech uniwersalnych lub z określonego rozszerzenia specyficznego dla języka; podkreślenie, jeśli nie jest dostępne.
  • HEAD: Nagłówek bieżącego słowa, który jest albo wartością ID, albo zerem (0).
  • DEPREL: Uniwersalna relacja zależności do HEAD (rdzeń, jeśli HEAD = 0) lub zdefiniowany, specyficzny dla języka podtyp jednego.
  • DEPS: Ulepszony wykres zależności w postaci listy par głowa-deprel.
  • RÓŻNE: Dowolna inna adnotacja.

Rozważmy jako przykład następujące zdanie z adnotacjami CoNLL-U z oficjalnej dokumentacji :

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

ConllUDatasetBuilder

Aby dodać nowy zestaw danych oparty na CoNLL-U do TFDS, możesz oprzeć klasę konstruktora zestawu danych na tfds.dataset_builders.ConllUDatasetBuilder . Ta klasa bazowa zawiera wspólny kod do radzenia sobie ze specyfiką zestawów danych CoNLL-U (iterowanie po formacie opartym na kolumnach, wstępnie skompilowane listy funkcji i znaczników, ...).

tfds.dataset_builders.ConllUDatasetBuilder implementuje GeneratorBasedBuilder specyficzny dla CoNLL-U. Zapoznaj się z poniższą klasą jako minimalnym przykładem narzędzia do tworzenia zestawu danych 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=...,
            )
    }

Jeśli chodzi o standardowe narzędzia do tworzenia zestawów danych, wymaga to nadpisania metod klas _info i _split_generators . W zależności od zestawu danych może być konieczna aktualizacja pliku conllu_dataset_builder_utils.py w celu uwzględnienia funkcji i listy tagów specyficznych dla Twojego zestawu danych.

Metoda _generate_examples nie powinna wymagać dalszego nadpisywania, chyba że Twój zbiór danych wymaga specjalnej implementacji. Pamiętaj, że jeśli Twój zestaw danych wymaga specyficznego przetwarzania wstępnego — na przykład jeśli uwzględnia nieklasyczne uniwersalne funkcje zależności — może być konieczne zaktualizowanie atrybutu process_example_fn Twojej funkcji generate_examples (zobacz jako przykład daset xtreme_pos ).

Przykłady

Jako przykłady rozważ następujące zbiory danych, które korzystają z narzędzia do tworzenia zbiorów danych specyficznego dla CoNNL-U:

interfejs wiersza polecenia

Najłatwiejszym sposobem napisania nowego zbioru danych opartego na CoNLL-U jest użycie interfejsu CLI TFDS :

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