منشئو مجموعات البيانات الخاصة بالتنسيق

يوثق هذا الدليل جميع منشئي مجموعات البيانات الخاصة بالتنسيق والمتوفرة حاليًا في TFDS.

أدوات إنشاء مجموعات البيانات الخاصة بالتنسيق هي فئات فرعية من tfds.core.GeneratorBasedBuilder والتي تهتم بمعظم معالجة البيانات لتنسيق بيانات محدد.

مجموعات البيانات على أساس tf.data.Dataset

إذا كنت تريد إنشاء مجموعة بيانات TFDS من مجموعة بيانات موجودة بتنسيق tf.data.Dataset ( مرجع )، فيمكنك استخدام 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 s ويخزن مجموعة بيانات TFDS المقابلة في /my/folder/my_dataset/single_number/1.0.0 ، والتي ستحتوي على كل من تقسيمات التدريب والاختبار.

تعتبر وسيطة config اختيارية ويمكن أن تكون مفيدة إذا كنت تريد تخزين تكوينات مختلفة ضمن نفس مجموعة البيانات.

يمكن استخدام الوسيطة data_dir لتخزين مجموعة بيانات TFDS التي تم إنشاؤها في مجلد مختلف، على سبيل المثال في وضع الحماية الخاص بك إذا كنت لا ترغب في مشاركة هذا مع الآخرين (حتى الآن). لاحظ أنه عند القيام بذلك، ستحتاج أيضًا إلى تمرير data_dir إلى tfds.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!",
        })

CroissantBuilder

التنسيق

Croissant 🥐 هو تنسيق عالي المستوى لمجموعات بيانات التعلم الآلي الذي يجمع البيانات التعريفية وأوصاف ملفات الموارد وبنية البيانات ودلالات تعلم الآلة الافتراضية في ملف واحد؛ فهو يعمل مع مجموعات البيانات الموجودة لتسهيل العثور عليها واستخدامها ودعمها بالأدوات.

يعتمد Croissant على schema.org ومفردات sc:Dataset ، وهو تنسيق يستخدم على نطاق واسع لتمثيل مجموعات البيانات على الويب، وجعلها قابلة للبحث.

CroissantBuilder

يحدد CroissantBuilder مجموعة بيانات TFDS استنادًا إلى ملف بيانات تعريف Croissant 🥐؛ سيؤدي كل من record_set_ids المحدد إلى ConfigBuilder منفصل.

على سبيل المثال، لتهيئة CroissantBuilder لمجموعة بيانات MNIST باستخدام تعريف 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])

كونلل

التنسيق

يعد CoNLL تنسيقًا شائعًا يستخدم لتمثيل البيانات النصية المشروحة.

عادةً ما تحتوي البيانات بتنسيق CoNLL على رمز مميز واحد مع التعليقات التوضيحية اللغوية الخاصة به في كل سطر؛ وفي نفس السطر، عادةً ما يتم فصل التعليقات التوضيحية بمسافات أو علامات تبويب. الخطوط الفارغة تمثل حدود الجملة.

لنأخذ على سبيل المثال الجملة التالية من مجموعة بيانات conll2003 ، والتي تتبع تنسيق التعليقات التوضيحية لـ 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

لإضافة مجموعة بيانات جديدة تعتمد على CoNLL إلى TFDS، يمكنك إنشاء فئة منشئ مجموعة البيانات الخاصة بك على tfds.dataset_builders.ConllDatasetBuilder . تحتوي هذه الفئة الأساسية على تعليمات برمجية مشتركة للتعامل مع خصوصيات مجموعات بيانات CoNLL (التكرار عبر التنسيق القائم على الأعمدة، وقوائم الميزات والعلامات المترجمة مسبقًا، ...).

يقوم tfds.dataset_builders.ConllDatasetBuilder بتنفيذ GeneratorBasedBuilder الخاص بـ CoNLL. ارجع إلى الفئة التالية كمثال بسيط لمنشئ مجموعة بيانات 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 المزيد من الكتابة الفوقية، إلا إذا كانت مجموعة البيانات الخاصة بك تحتاج إلى تنفيذ محدد.

أمثلة

خذ بعين الاعتبار conll2003 كمثال لمجموعة بيانات تم تنفيذها باستخدام منشئ مجموعة البيانات الخاصة بـ CoNLL.

سطر الأوامر

أسهل طريقة لكتابة مجموعة بيانات جديدة تعتمد على 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

كونلل-U

التنسيق

يعد CoNLL-U تنسيقًا شائعًا يستخدم لتمثيل البيانات النصية المشروحة.

يعمل CoNLL-U على تحسين تنسيق CoNLL عن طريق إضافة عدد من الميزات، مثل دعم الكلمات متعددة الرموز . عادةً ما تحتوي البيانات بتنسيق CoNLL-U على رمز مميز واحد مع التعليقات التوضيحية اللغوية الخاصة به في كل سطر؛ وفي نفس السطر، عادةً ما يتم فصل التعليقات التوضيحية بأحرف جدولة مفردة. الخطوط الفارغة تمثل حدود الجملة.

عادةً، يحتوي كل سطر كلمة مشروح في CoNLL-U على الحقول التالية، كما هو مذكور في الوثائق الرسمية :

  • المعرف: فهرس الكلمات، عدد صحيح يبدأ من 1 لكل جملة جديدة؛ قد يكون نطاقًا لرموز متعددة الكلمات؛ قد يكون رقمًا عشريًا للعقد الفارغة (يمكن أن تكون الأرقام العشرية أقل من 1 ولكن يجب أن تكون أكبر من 0).
  • النموذج: شكل الكلمة أو رمز علامات الترقيم.
  • LEMMA: Lemma أو جذع شكل الكلمة.
  • UPOS: علامة عالمية لجزء من الكلام.
  • XPOS: علامة جزء من الكلام خاصة باللغة؛ الشرطة السفلية إذا لم تكن متوفرة.
  • المميزات: قائمة السمات المورفولوجية من قائمة الميزات العالمية أو من امتداد محدد للغة محددة؛ الشرطة السفلية إذا لم تكن متوفرة.
  • HEAD: رأس الكلمة الحالية، وهي إما قيمة ID أو صفر (0).
  • DEPREL: علاقة التبعية العالمية بالـ HEAD (الجذر إذا كان 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 يطبق GeneratorBasedBuilder الخاص بـ CoNLL-U. ارجع إلى الفئة التالية كمثال بسيط لمنشئ مجموعة بيانات 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 المزيد من الكتابة الفوقية، إلا إذا كانت مجموعة البيانات الخاصة بك تحتاج إلى تنفيذ محدد. لاحظ أنه إذا كانت مجموعة البيانات الخاصة بك تتطلب معالجة مسبقة محددة - على سبيل المثال، إذا كانت تأخذ في الاعتبار ميزات التبعية العالمية غير الكلاسيكية - فقد تحتاج إلى تحديث سمة process_example_fn الخاصة بوظيفة generate_examples (راجع مجموعة xtreme_pos daset كمثال).

أمثلة

خذ بعين الاعتبار مجموعات البيانات التالية، التي تستخدم أداة إنشاء مجموعة البيانات المحددة لـ CoNNL-U، كأمثلة:

سطر الأوامر

أسهل طريقة لكتابة مجموعة بيانات جديدة تعتمد على 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