Datasets documentation
الخرائط الدفعية
الخرائط الدفعية
يُعدّ الجمع بين فائدة Dataset.map() ووضع الدُفعات (batch mode) أمرًا قويًا للغاية. فهو يتيح لك تسريع المعالجة، والتحكم بحرية في حجم مجموعة البيانات المولّدة.
الحاجة إلى السرعة
الهدف الرئيسي من خرائط الدفعات هو تسريع المعالجة. في كثير من الأحيان، يكون العمل مع دفعات من البيانات أسرع من التعامل مع أمثلة مفردة. وبطبيعة الحال، يناسب خرائط الدفعات عملية الترميز (Tokenization). على سبيل المثال، يعمل مكتبة 🤗 Tokenizers بشكل أسرع مع الدفعات لأنها تُوازٍ عملية ترميز جميع الأمثلة في الدفعة.
حجم الإدخال != حجم الإخراج
يمكن الاستفادة من القدرة على التحكم في حجم مجموعة البيانات المولّدة في العديد من حالات الاستخدام المثيرة للاهتمام. في قسم الخرائط، توجد أمثلة على استخدام خرائط الدفعات (batch mapping) لـ:
- قسّم الجمل الطويلة إلى مقاطع أقصر.
- توسيع مجموعة بيانات برموز إضافية.
من المفيد فهم آلية عمل هذه العملية، حتى تتمكن من ابتكار طرقك الخاصة لاستخدام خرائط الدفعات. في هذه المرحلة، قد تتساءل عن كيفية التحكم في حجم مجموعة البيانات المولّدة. الإجابة هي: لا يجب أن تُرجع الدالة المُخاطبة دفعة مخرجات بنفس الحجم.
بعبارة أخرى، يمكن أن يكون مدخل دالة التحويل لديك دفعة بحجم N وتعيد دفعة بحجم M. يمكن أن يكون المخرج M أكبر من N أو أصغر منه. وهذا يعني أنه يمكنك دمج أمثلتك، وتقسيمها، وحتى إضافة أمثلة إضافية!
ومع ذلك، تذكّر أن جميع القيم في قاموس المخرجات يجب أن تحتوي على عدد عناصر متساوٍ مع الحقول الأخرى في قاموس المخرجات. وإلا، لن يكون من الممكن تحديد عدد الأمثلة في المخرجات التي تُرجعها الدالة المُطبَّقة. قد يختلف هذا العدد بين الدفعات المتتالية التي تعالجها الدالة المُطبَّقة. لكن بالنسبة لدفعة واحدة، يجب أن تكون جميع قيم قاموس المخرجات بنفس الطول (أي، عدد العناصر).
على سبيل المثال، من مجموعة بيانات تحتوي على عمود واحد و3 صفوف، إذا استخدمت map لإرجاع عمود جديد بعدد صفوف مضاعف، فستظهر لك رسالة خطأ.
في هذه الحالة، ستحصل على عمود واحد يحتوي على 3 صفوف، وعمود آخر يحتوي على 6 صفوف. كما تلاحظ، لن تكون الجدول صالحًا:
>>> from datasets import Dataset
>>> dataset = Dataset.from_dict({"a": [0, 1, 2]})
>>> dataset.map(lambda batch: {"b": batch["a"] * 2}, batched=True) # new column with 6 elements: [0, 1, 2, 0, 1, 2]
'ArrowInvalid: Column 1 named b expected length 3 but got length 6'لجعلها صالحة، يجب عليك حذف إحدى الأعمدة:
>>> from datasets import Dataset
>>> dataset = Dataset.from_dict({"a": [0, 1, 2]})
>>> dataset_with_duplicates = dataset.map(lambda batch: {"b": batch["a"] * 2}, remove_columns=["a"], batched=True)
>>> len(dataset_with_duplicates)
6بديلًا عن ذلك، يمكنك تجاوز العمود الموجود لتحقيق النتيجة نفسها.
على سبيل المثال، إليك كيفية تكرار كل صف في مجموعة البيانات عن طريق تجاوز العمود "a":
>>> from datasets import Dataset
>>> dataset = Dataset.from_dict({"a": [0, 1, 2]})
# overwrites the existing "a" column with duplicated values
>>> duplicated_dataset = dataset.map(
... lambda batch: {"a": [x for x in batch["a"] for _ in range(2)]},
... batched=True
... )
>>> duplicated_dataset
Dataset({
features: ['a'],
num_rows: 6
})
>>> duplicated_dataset["a"]
[0, 0, 1, 1, 2, 2]