형식별 데이터 세트 빌더

이 가이드에는 현재 TFDS에서 사용할 수 있는 모든 형식별 데이터세트 빌더가 설명되어 있습니다.

형식별 데이터세트 빌더는 특정 데이터 형식에 대한 대부분의 데이터 처리를 관리하는 tfds.core.GeneratorBasedBuilder 의 하위 클래스입니다.

tf.data.Dataset 기반 데이터세트

tf.data.Dataset ( 참조 ) 형식의 데이터세트에서 TFDS 데이터세트를 생성하려면 tfds.dataset_builders.TfDataBuilder 사용할 수 있습니다( API 문서 참조).

우리는 이 클래스의 두 가지 일반적인 용도를 구상합니다.

  • 노트북과 같은 환경에서 실험 데이터세트 생성
  • 코드에서 데이터 세트 빌더 정의

노트북에서 새 데이터 세트 만들기

노트북에서 작업하고 일부 데이터를 tf.data.Dataset 으로 로드하고 다양한 변환(맵, 필터 등)을 적용한 후 이제 이 데이터를 저장하고 팀원과 쉽게 공유하거나 다른 노트북에 로드한다고 가정해 보겠습니다. 새 데이터세트 빌더 클래스를 정의할 필요 없이 tfds.dataset_builders.TfDataBuilder 를 인스턴스화하고 download_and_prepare 호출하여 데이터세트를 TFDS 데이터세트로 저장할 수도 있습니다.

TFDS 데이터 세트이기 때문에 버전을 지정하고, 구성을 사용하고, 다양한 분할을 갖고, 나중에 쉽게 사용할 수 있도록 문서화할 수 있습니다. 즉, 데이터세트에 어떤 기능이 있는지 TFDS에 알려주어야 합니다.

다음은 이를 사용하는 방법에 대한 더미 예입니다.

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

download_and_prepare 메소드는 입력 tf.data.Dataset 를 반복하고 해당 TFDS 데이터 세트를 /my/folder/my_dataset/single_number/1.0.0 에 저장합니다. 여기에는 열차 및 테스트 분할이 모두 포함됩니다.

config 인수는 선택 사항이며 동일한 데이터세트에 다른 구성을 저장하려는 경우 유용할 수 있습니다.

data_dir 인수를 사용하면 생성된 TFDS 데이터세트를 다른 폴더(예: 아직 다른 사람과 공유하고 싶지 않은 경우 자체 샌드박스)에 저장할 수 있습니다. 이 작업을 수행할 때 data_dirtfds.load 에 전달해야 합니다. data_dir 인수가 지정되지 않으면 기본 TFDS 데이터 디렉토리가 사용됩니다.

데이터 세트 로드

TFDS 데이터 세트가 저장되면 다른 스크립트에서 로드하거나 데이터에 액세스할 수 있는 팀원이 로드할 수 있습니다.

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

새 버전 또는 구성 추가

데이터 세트를 추가로 반복한 후 소스 데이터의 일부 변환을 추가하거나 변경했을 수 있습니다. 이 데이터세트를 저장하고 공유하려면 새 버전으로 쉽게 저장할 수 있습니다.

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

새로운 데이터 세트 빌더 클래스 정의

이 클래스를 기반으로 새 DatasetBuilder 정의할 수도 있습니다.

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

크로아상빌더

형식

Croissant 🥐는 메타데이터, 리소스 파일 설명, 데이터 구조 및 기본 ML 의미 체계를 단일 파일로 결합하는 기계 학습 데이터 세트를 위한 상위 수준 형식입니다. 기존 데이터 세트와 함께 작동하여 도구를 통해 더 쉽게 찾고, 사용하고, 지원할 수 있습니다.

Croissant는 웹에서 데이터 세트를 표현하고 검색 가능하게 만드는 데 널리 사용되는 형식인 sc:Dataset 어휘와 Schema.org를 기반으로 합니다.

CroissantBuilder

CroissantBuilder Croissant 🥐 메타데이터 파일을 기반으로 TFDS 데이터세트를 정의합니다. 지정된 각 record_set_ids 는 별도의 ConfigBuilder 생성합니다.

예를 들어 Croissant 🥐 정의를 사용하여 MNIST 데이터세트에 대한 CroissantBuilder 초기화하려면 다음을 수행합니다.

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

콘엘

형식

CoNLL은 주석이 달린 텍스트 데이터를 나타내는 데 사용되는 널리 사용되는 형식입니다.

CoNLL 형식의 데이터에는 일반적으로 한 줄에 언어 주석이 포함된 하나의 토큰이 포함됩니다. 같은 줄 내에서 주석은 일반적으로 공백이나 탭으로 구분됩니다. 빈 줄은 문장 경계를 나타냅니다.

CoNLL 주석 형식을 따르는 conll2003 데이터 세트의 다음 문장을 예로 들어 보겠습니다.

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

새로운 CoNLL 기반 데이터 세트를 TFDS에 추가하려면 tfds.dataset_builders.ConllDatasetBuilder 기반으로 데이터 세트 빌더 클래스를 기반으로 하면 됩니다. 이 기본 클래스에는 CoNLL 데이터 세트의 특수성을 처리하기 위한 공통 코드가 포함되어 있습니다(열 기반 형식, 미리 컴파일된 기능 및 태그 목록 반복...).

tfds.dataset_builders.ConllDatasetBuilder 는 CoNLL 관련 GeneratorBasedBuilder 구현합니다. 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'),
    }

표준 데이터세트 빌더의 경우 _info_split_generators 클래스 메서드를 덮어써야 합니다. 데이터세트에 따라 데이터세트와 관련된 기능과 태그 목록을 포함하도록 conll_dataset_builder_utils.py 도 업데이트해야 할 수도 있습니다.

데이터 세트에 특정 구현이 필요한 경우를 제외하고 _generate_examples 메서드는 추가 덮어쓰기를 요구하지 않아야 합니다.

CoNLL 관련 데이터 세트 빌더를 사용하여 구현된 데이터 세트의 예로 conll2003을 고려하십시오.

CLI

새로운 CoNLL 기반 데이터 세트를 작성하는 가장 쉬운 방법은 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

형식

CoNLL-U는 주석이 달린 텍스트 데이터를 나타내는 데 사용되는 널리 사용되는 형식입니다.

CoNLL-U는 멀티 토큰 단어 지원과 같은 다양한 기능을 추가하여 CoNLL 형식을 향상시킵니다. CoNLL-U 형식의 데이터에는 일반적으로 한 줄에 언어 주석이 포함된 하나의 토큰이 포함됩니다. 같은 줄 내에서 주석은 일반적으로 단일 탭 문자로 구분됩니다. 빈 줄은 문장 경계를 나타냅니다.

일반적으로 각 CoNLL-U 주석이 달린 단어 줄에는 공식 문서 에 보고된 대로 다음 필드가 포함되어 있습니다.

  • ID: 단어 색인, 각 새 문장에 대해 1부터 시작하는 정수; 여러 단어 토큰의 범위일 수 있습니다. 빈 노드에 대한 십진수일 수 있습니다(십진수는 1보다 낮을 수 있지만 0보다 커야 합니다).
  • FORM: 단어 형식 또는 구두점 기호.
  • LEMMA: Lemma 또는 단어 형태의 어간입니다.
  • UPOS: 범용 품사 태그.
  • XPOS: 언어별 품사 태그; 사용할 수 없는 경우 밑줄을 긋습니다.
  • FEATS: 범용 기능 목록 또는 정의된 언어별 확장의 형태학적 기능 목록입니다. 사용할 수 없는 경우 밑줄을 긋습니다.
  • HEAD: 현재 단어의 머리 부분으로, ID 값 또는 0입니다.
  • DEPREL: HEAD(루트 iff HEAD = 0) 또는 정의된 언어별 하위 유형에 대한 범용 종속성 관계입니다.
  • DEPS: 헤드-디프렐 쌍 목록 형태의 향상된 종속성 그래프입니다.
  • MISC: 기타 주석입니다.

예를 들어 공식 문서 에 있는 다음 CoNLL-U 주석 문장을 고려해 보세요.

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

ConllUDatasetBuilder

새로운 CoNLL-U 기반 데이터 세트를 TFDS에 추가하려면 tfds.dataset_builders.ConllUDatasetBuilder 기반으로 데이터 세트 빌더 클래스를 기반으로 할 수 있습니다. 이 기본 클래스에는 CoNLL-U 데이터 세트의 특수성을 처리하기 위한 공통 코드가 포함되어 있습니다(열 기반 형식, 사전 컴파일된 기능 및 태그 목록 반복...).

tfds.dataset_builders.ConllUDatasetBuilder 는 CoNLL-U 특정 GeneratorBasedBuilder 구현합니다. 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=...,
            )
    }

표준 데이터세트 빌더의 경우 _info_split_generators 클래스 메서드를 덮어써야 합니다. 데이터세트에 따라 데이터세트와 관련된 기능과 태그 목록을 포함하도록 conllu_dataset_builder_utils.py 도 업데이트해야 할 수도 있습니다.

데이터세트에 특정 구현이 필요한 경우를 제외하고 _generate_examples 메서드는 추가 덮어쓰기를 요구하지 않아야 합니다. 데이터 세트에 특정 사전 처리가 필요한 경우(예: 비클래식 범용 종속성 기능을 고려하는 경우) generate_examples 함수의 process_example_fn 속성을 업데이트해야 할 수도 있습니다(예로 xtreme_pos 데이터 세트 참조).

예를 들어 CoNNL-U 특정 데이터 세트 빌더를 사용하는 다음 데이터 세트를 고려하십시오.

CLI

새로운 CoNLL-U 기반 데이터 세트를 작성하는 가장 쉬운 방법은 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