diff --git a/docs/source/_redirects.yml b/docs/source/ar/_redirects.yml similarity index 100% rename from docs/source/_redirects.yml rename to docs/source/ar/_redirects.yml diff --git a/docs/source/ar/_toctree.yml b/docs/source/ar/_toctree.yml new file mode 100644 index 00000000000..bb80332eaaf --- /dev/null +++ b/docs/source/ar/_toctree.yml @@ -0,0 +1,124 @@ +- sections: + - local: index + title: 🤗 مجموعات البيانات + - local: quickstart + title: دليل سريع + - local: installation + title: التثبيت + title: البدء +- sections: + - local: tutorial + title: نظرة عامة + - local: load_hub + title: تحميل مجموعة بيانات من المركز + - local: access + title: تعرف على مجموعة البيانات الخاصة بك + - local: use_dataset + title: معالجة مسبقة + - local: create_dataset + title: إنشاء مجموعة بيانات + - local: upload_dataset + title: مشاركة مجموعة بيانات في المركز + title: "البرامج التعليمية" +- sections: + - local: how_to + title: نظرة عامة + - sections: + - local: loading + title: تحميل + - local: process + title: معالجة + - local: stream + title: تدفق + - local: use_with_tensorflow + title: استخدام مع TensorFlow + - local: use_with_pytorch + title: استخدام مع PyTorch + - local: use_with_jax + title: استخدام مع جاكس + - local: use_with_spark + title: استخدام مع شرارة + - local: cache + title: إدارة ذاكرة التخزين المؤقت + - local: filesystems + title: التخزين السحابي + - local: faiss_es + title: فهرس البحث + - local: cli + title: واجهة سطر الأوامر + - local: troubleshoot + title: استكشاف الأخطاء وإصلاحها + title: "الاستخدام العام" + - sections: + - local: audio_load + title: تحميل بيانات صوتية + - local: audio_process + title: معالجة البيانات الصوتية + - local: audio_dataset + title: إنشاء مجموعة بيانات صوتية + title: "صوتي" + - sections: + - local: image_load + title: تحميل بيانات الصورة + - local: image_process + title: معالجة بيانات الصورة + - local: image_dataset + title: إنشاء مجموعة بيانات الصور + - local: depth_estimation + title: تقدير العمق + - local: image_classification + title: تصنيف الصور + - local: semantic_segmentation + title: تجزئة الصورة الدلالية + - local: object_detection + title: اكتشاف الأشياء + title: "الرؤية" + - sections: + - local: nlp_load + title: تحميل بيانات النص + - local: nlp_process + title: معالجة بيانات النص + title: "نص" + - sections: + - local: tabular_load + title: تحميل البيانات الجدولية + title: "جدولي" + - sections: + - local: share + title: حصة + - local: dataset_card + title: إنشاء بطاقة مجموعة بيانات + - local: repository_structure + title: هيكل مستودعك + - local: dataset_script + title: إنشاء نص تحميل مجموعة بيانات + title: "مستودع مجموعة البيانات" + title: "أدلة كيفية الاستخدام" +- sections: + - local: about_arrow + title: مجموعات البيانات 🤝 السهم + - local: about_cache + title: ذاكرة التخزين المؤقت + - local: about_mapstyle_vs_iterable + title: مجموعة البيانات أو IterableDataset + - local: about_dataset_features + title: ميزات مجموعة البيانات + - local: about_dataset_load + title: إنشاء وتحميل + - local: about_map_batch + title: تعيين التخصيص + title: "أدلة مفاهيمية" +- sections: + - local: package_reference/main_classes + title: الفئات الرئيسية + - local: package_reference/builder_classes + title: فئات الباني + - local: package_reference/loading_methods + title: أساليب التحميل + - local: package_reference/table_classes + title: فئات الجدول + - local: package_reference/utilities + title: المرافق + - local: package_reference/task_templates + title: قوالب المهام + title: "مرجع" \ No newline at end of file diff --git a/docs/source/ar/about_arrow.md b/docs/source/ar/about_arrow.md new file mode 100644 index 00000000000..762c84fd568 --- /dev/null +++ b/docs/source/ar/about_arrow.md @@ -0,0 +1,48 @@ +# Datasets 🤝 Arrow + +## ما هو Arrow؟ + +[Arrow](https://arrow.apache.org/) يتيح معالجة ونقل كميات كبيرة من البيانات بسرعة. إنه تنسيق بيانات محدد يخزن البيانات في تخطيط ذاكرة عمودي. يوفر هذا العديد من المزايا الهامة: + +* التنسيق القياسي لـ Arrow يسمح [بالقراءة بدون نسخ](https://en.wikipedia.org/wiki/Zero-copy) والتي تزيل فعليًا جميع النفقات العامة للتسلسل. +* Arrow لا يعتمد على لغة برمجة معينة، لذلك فهو يدعم لغات برمجة مختلفة. +* Arrow موجه نحو الأعمدة، لذلك فهو أسرع في الاستعلام ومعالجة شرائح أو أعمدة من البيانات. +* يسمح Arrow بالتسليم بدون نسخ إلى أدوات التعلم الآلي القياسية مثل NumPy وPandas وPyTorch وTensorFlow. +* يدعم Arrow العديد من أنواع الأعمدة، والتي قد تكون متداخلة. + +## الذاكرة الخرائطية + +🤗 يستخدم Datasets Arrow لنظام التخزين المؤقت المحلي الخاص به. يسمح ذلك بدعم مجموعات البيانات بواسطة ذاكرة تخزين مؤقت على القرص، يتم تعيينها إلى الذاكرة للبحث السريع. تسمح هذه البنية باستخدام مجموعات بيانات كبيرة على أجهزة ذات ذاكرة جهاز صغيرة نسبيًا. + +على سبيل المثال، لا يستغرق تحميل مجموعة بيانات Wikipedia الإنجليزية الكاملة سوى بضعة ميغابايت من ذاكرة الوصول العشوائي (RAM): + +```python +>>> import os; import psutil; import timeit +>>> from datasets import load_dataset + +# Process.memory_info is expressed in bytes, so convert to megabytes +>>> mem_before = psutil.Process(os.getpid()).memory_info().rss / (1024 * 1024) +>>> wiki = load_dataset("wikipedia", "20220301.en", split="train") +>>> mem_after = psutil.Process(os.getpid()).memory_info().rss / (1024 * 1024) + +>>> print(f"RAM memory used: {(mem_after - mem_before)} MB") +RAM memory used: 50 MB +``` + +هذا ممكن لأن بيانات Arrow يتم تعيينها إلى الذاكرة فعليًا من القرص، وليس تحميلها في الذاكرة. تسمح الخرائط الذاكرية بالوصول إلى البيانات على القرص، وتستفيد من قدرات الذاكرة الظاهرية للبحث السريع. + +## الأداء + +إن التكرار فوق مجموعة بيانات ذات خريطة ذاكرة باستخدام Arrow سريع. إن التكرار فوق Wikipedia على جهاز كمبيوتر محمول يمنحك سرعات تتراوح بين 1-3 جيجابت/ثانية: + +```python +>>> s = """batch_size = 1000 +... for batch in wiki.iter(batch_size): +... ... +... """ + +>>> elapsed_time = timeit.timeit(stmt=s, number=1, globals=globals()) +>>> print(f"Time to iterate over the {wiki.dataset_size >> 30} GB dataset: {elapsed_time:.1f} sec, " +... f"ie. {float(wiki.dataset_size >> 27)/elapsed_time:.1f} Gb/s") +Time to iterate over the 18 GB dataset: 31.8 sec, ie. 4.8 Gb/s +``` \ No newline at end of file diff --git a/docs/source/ar/about_cache.mdx b/docs/source/ar/about_cache.mdx new file mode 100644 index 00000000000..8344d26ae97 --- /dev/null +++ b/docs/source/ar/about_cache.mdx @@ -0,0 +1,58 @@ +# ذاكرة التخزين المؤقت + +ذاكرة التخزين المؤقت هي أحد الأسباب التي تجعل 🤗 Datasets فعالًا للغاية. فهو يخزن مجموعات البيانات التي تم تنزيلها ومعالجتها مسبقًا، بحيث يتم إعادة تحميلها مباشرة من ذاكرة التخزين المؤقت عند الحاجة إلى استخدامها مرة أخرى. وهذا يجنبك الاضطرار إلى تنزيل مجموعة بيانات مرة أخرى، أو إعادة تطبيق وظائف المعالجة. حتى بعد إغلاق جلسة Python وبدء أخرى جديدة، سيقوم 🤗 Datasets بإعادة تحميل مجموعة البيانات الخاصة بك مباشرة من ذاكرة التخزين المؤقت! + +## البصمة + +كيف تتابع ذاكرة التخزين المؤقت التحويلات التي يتم تطبيقها على مجموعة بيانات؟ حسنًا، يقوم 🤗 Datasets بتعيين بصمة لملف ذاكرة التخزين المؤقت. تقوم البصمة بتتبع الحالة الحالية لمجموعة البيانات. يتم حساب البصمة الأولية باستخدام تجزئة من جدول Arrow، أو تجزئة من ملفات Arrow إذا كانت مجموعة البيانات على القرص. يتم حساب البصمات اللاحقة عن طريق دمج بصمة الحالة السابقة، وتجزئة أحدث تحويل تم تطبيقه. + + + +التحويلات هي أي من طرق المعالجة من أدلة [كيفية المعالجة](./process) مثل [`Dataset.map`] أو [`Dataset.shuffle`]. + + + +هذا ما تبدو عليه البصمات الفعلية: + +```py +>>> from datasets import Dataset +>>> dataset1 = Dataset.from_dict({"a": [0, 1, 2]}) +>>> dataset2 = dataset1.map(lambda x: {"a": x["a"] + 1}) +>>> print(dataset1._fingerprint, dataset2._fingerprint) +d19493523d95e2dc 5b86abacd4b42434 +``` + +لكي يكون التحويل قابلًا للتجزئة، يجب أن يكون قابلًا للتخليل بواسطة [dill](https://dill.readthedocs.io/en/latest/) أو [pickle](https://docs.python.org/3/library/pickle). + +عندما تستخدم تحويلًا غير قابل للتجزئة، يستخدم 🤗 Datasets بصمة عشوائية بدلاً من ذلك ويرفع تحذيرًا. ويعتبر التحويل غير القابل للتجزئة مختلفًا عن التحويلات السابقة. ونتيجة لذلك، سيعيد 🤗 Datasets حساب جميع التحويلات. تأكد من أن تحويلاتك قابلة للتسلسل باستخدام pickle أو dill لتجنب ذلك! + +مثال على عندما يعيد 🤗 Datasets حساب كل شيء هو عندما يتم تعطيل التخزين المؤقت. عندما يحدث هذا، يتم إنشاء ملفات ذاكرة التخزين المؤقت في كل مرة ويتم كتابتها في دليل مؤقت. بمجرد انتهاء جلسة Python الخاصة بك، يتم حذف ملفات ذاكرة التخزين المؤقت في الدليل المؤقت. يتم تعيين تجزئة عشوائية لملفات ذاكرة التخزين المؤقت هذه، بدلاً من بصمة. + + + +عندما يكون التخزين المؤقت معطلاً، استخدم [`Dataset.save_to_disk`] لحفظ مجموعة البيانات المحولة الخاصة بك، وإلا فسيتم حذفها بمجرد انتهاء الجلسة. + + + +## التجزئة + +يتم تحديث بصمة مجموعة البيانات عن طريق تجزئة الدالة التي تم تمريرها إلى `map` وكذلك معلمات `map` (`batch_size`، `remove_columns`، وما إلى ذلك). + +يمكنك التحقق من تجزئة أي كائن Python باستخدام [`fingerprint.Hasher`]: + +```py +>>> from datasets.fingerprint import Hasher +>>> my_func = lambda example: {"length": len(example["text"])} +>>> print(Hasher.hash(my_func)) +'3d35e2b3e94c81d6' +``` + +يتم حساب التجزئة عن طريق تفريغ الكائن باستخدام برنامج تفريغ `dill` وتجزئة البايتات المفروغة. + +يقوم برنامج التفريغ بتفريغ جميع المتغيرات المستخدمة في دالتك بشكل متكرر، لذلك سيؤدي أي تغيير تجريه على كائن يتم استخدامه في دالتك إلى تغيير التجزئة. + +إذا لم يكن لإحدى وظائفك نفس التجزئة عبر الجلسات، فهذا يعني أن أحد متغيراتها على الأقل يحتوي على كائن Python غير محدد. + +عندما يحدث هذا، لا تتردد في تجزئة أي كائن تجده مشبوهًا لمحاولة العثور على الكائن الذي تسبب في تغيير التجزئة. + +على سبيل المثال، إذا كنت تستخدم قائمة يكون ترتيب عناصرها غير محدد عبر الجلسات، فلن يكون التجزئة هو نفسه عبر الجلسات أيضًا. \ No newline at end of file diff --git a/docs/source/ar/about_dataset_features.mdx b/docs/source/ar/about_dataset_features.mdx new file mode 100644 index 00000000000..80bea9eb249 --- /dev/null +++ b/docs/source/ar/about_dataset_features.mdx @@ -0,0 +1,142 @@ +# خصائص مجموعة البيانات + +يحدد [`Features`] البنية الداخلية لمجموعة البيانات. ويُستخدم لتحديد تنسيق التسلسل الأساسي. والأهم من ذلك، أنه يحتوي على معلومات عالية المستوى حول كل شيء، بدءًا من أسماء الأعمدة وأنواعها، وصولاً إلى [`ClassLabel`]. يمكنك اعتبار [`Features`] العمود الفقري لمجموعة البيانات. + +تنسيق [`Features`] بسيط: `dict[column_name, column_type]`. إنه عبارة عن قاموس من أزواج اسم العمود ونوع العمود. يوفر نوع العمود مجموعة واسعة من الخيارات لوصف نوع البيانات التي لديك. + +لنلقِ نظرة على خصائص مجموعة بيانات MRPC من معيار GLUE: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('glue', 'mrpc', split='train') +>>> dataset.features +{'idx': Value(dtype='int32', id=None), +'label': ClassLabel(num_classes=2, names=['not_equivalent', 'equivalent'], names_file=None, id=None), +'sentence1': Value(dtype='string', id=None), +'sentence2': Value(dtype='string', id=None), +} +``` + +يخبر ميزة [`Value`] 🤗 Datasets بما يلي: + +- نوع بيانات `idx` هو `int32`. +- نوعا بيانات `sentence1` و`sentence2` هما `string`. + +يدعم 🤗 Datasets العديد من أنواع البيانات الأخرى مثل `bool` و`float32` و`binary`، على سبيل المثال لا الحصر. + + +راجع [`Value`] للحصول على قائمة كاملة بأنواع البيانات المدعومة. + + +تخبر ميزة [`ClassLabel`] 🤗 Datasets بأن عمود `label` يحتوي على فئتين. ويتم تصنيف الفئات على أنها `not_equivalent` و`equivalent`. يتم تخزين التصنيفات كأعداد صحيحة في مجموعة البيانات. وعند استرداد التصنيفات، يقوم [`ClassLabel.int2str`] و [`ClassLabel.str2int`] بتحويل القيمة العددية إلى اسم التصنيف، والعكس صحيح. + +إذا كان نوع بياناتك يحتوي على قائمة من الكائنات، فستحتاج إلى استخدام ميزة [`Sequence`]. هل تتذكر مجموعة بيانات SQuAD؟ + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('squad', split='train') +>>> dataset.features +{'answers': Sequence(feature={'text': Value(dtype='string', id=None), 'answer_start': Value(dtype='int32', id=None)}, length=-1, id=None), +'context': Value(dtype='string', id=None), +'id': Value(dtype='string', id=None), +'question': Value(dtype='string', id=None), +'title': Value(dtype='string', id=None)} +``` + +تم بناء حقل `answers` باستخدام ميزة [`Sequence`] لأنه يحتوي على حقليْن فرعييْن، `text` و`answer_start`، واللذان هما على التوالي قائمتان من نوعي `string` و`int32`. + + +راجع قسم [flatten](./process#flatten) لمعرفة كيفية استخراج الحقول الفرعية المضمنة كأعمدة مستقلة خاصة بها. + + +نوع ميزة المصفوفة مفيد لإنشاء مصفوفات بأحجام مختلفة. يمكنك إنشاء مصفوفات ذات بعدين باستخدام [`Array2D`]، وحتى مصفوفات ذات خمسة أبعاد باستخدام [`Array5D`]. + +```py +>>> features = Features({'a': Array2D(shape=(1, 3), dtype='int32')}) +``` + +يسمح نوع المصفوفة أيضًا بأن يكون البعد الأول للمصفوفة ديناميكيًا. وهذا مفيد لمعالجة التسلسلات ذات الأطوال المتغيرة مثل الجمل، دون الحاجة إلى إضافة وسائد أو تقليص الإدخال إلى شكل موحد. + +```py +>>> features = Features({'a': Array3D(shape=(None, 5, 2), dtype='int32')}) +``` + +## ميزة الصوت + +تحتوي مجموعات البيانات الصوتية على عمود من النوع [`Audio`]، والذي يحتوي على ثلاثة حقول مهمة: + +* `array`: بيانات الصوت المشفرة ممثلة كمصفوفة أحادية البعد. +* `path`: المسار إلى ملف الصوت الذي تم تنزيله. +* `sampling_rate`: معدل أخذ العينات لبيانات الصوت. + +عند تحميل مجموعة بيانات صوتية واستدعاء العمود الصوتي، تقوم ميزة [`Audio`] تلقائيًا بفك تشفير ملف الصوت وإعادة أخذ العينات منه: + +```py +>>> from datasets import load_dataset, Audio + +>>> dataset = load_dataset("PolyAI/minds14", "en-US", split="train") +>>> dataset[0]["audio"] +{'array': array([ 0. , 0.00024414, -0.00024414, ..., -0.00024414, +0. , 0. ], dtype=float32), +'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav', +'sampling_rate': 8000} +``` + + +قم بالوصول إلى فهرس مجموعة البيانات الصوتية باستخدام فهرس الصف أولاً، ثم عمود "الصوت" - `dataset[0]["audio"]` - لتجنب فك تشفير جميع ملفات الصوت وإعادة أخذ العينات منها في مجموعة البيانات. وإلا، فقد تكون هذه عملية بطيئة ومستهلكة للوقت إذا كانت لديك مجموعة بيانات كبيرة. + + +مع `decode=False`، فإن نوع [`Audio`] يعطيك ببساطة المسار أو البايتات لملف الصوت، دون فك تشفيره إلى `array`، + +```py +>>> dataset = load_dataset("PolyAI/minds14", "en-US", split="train").cast_column("audio", Audio(decode=False)) +>>> dataset[0] +{'audio': {'bytes': None, +'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav'}, +'english_transcription': 'I would like to set up a joint account with my partner', +'intent_class': 11, +'lang_id': 4, +'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav', +'transcription': 'I would like to set up a joint account with my partner'} +``` + +## ميزة الصورة + +تحتوي مجموعات البيانات الصورية على عمود من النوع [`Image`]، والذي يقوم بتحميل كائنات `PIL.Image` من الصور المخزنة كبايتات: + +عند تحميل مجموعة بيانات صورية واستدعاء العمود الصوري، تقوم ميزة [`Image`] تلقائيًا بفك تشفير ملف الصورة: + +```py +>>> from datasets import load_dataset, Image + +>>> dataset = load_dataset("beans", split="train") +>>> dataset[0]["image"] + +``` + + +قم بالوصول إلى فهرس مجموعة البيانات الصورية باستخدام فهرس الصف أولاً، ثم عمود "الصورة" - `dataset[0]["image"]` - لتجنب فك تشفير جميع ملفات الصور في مجموعة البيانات. وإلا، فقد تكون هذه عملية بطيئة ومستهلكة للوقت إذا كانت لديك مجموعة بيانات كبيرة. + + +مع `decode=False`، فإن نوع [`Image`] يعطيك ببساطة المسار أو البايتات لملف الصورة، دون فك تشفيره إلى `PIL.Image`، + +```py +>>> dataset = load_dataset("beans", split="train").cast_column("image", Image(decode=False)) +>>> dataset[0]["image"] +{'bytes': None, +'path': '/Users/username/.cache/huggingface/datasets/downloads/extracted/772e7c1fba622cff102b85dd74bcce46e8168634df4eaade7bedd3b8d91d3cd7/train/healthy/healthy_train.265.jpg'} +``` + +اعتمادًا على مجموعة البيانات، قد تحصل على المسار إلى الصورة المحلية التي تم تنزيلها، أو محتوى الصورة كبايتات إذا لم تكن مجموعة البيانات مكونة من ملفات فردية. + +يمكنك أيضًا تحديد مجموعة بيانات من الصور من المصفوفات العددية: + +```python +>>> ds = Dataset.from_dict({"i": [np.zeros(shape=(16, 16, 3), dtype=np.uint8)]}, features=Features({"i": Image()})) +``` + +وفي هذه الحالة، يتم ترميز المصفوفات العددية إلى PNG (أو TIFF إذا كانت دقة بكسل القيمة مهمة). + +بالنسبة للمصفوفات متعددة القنوات مثل RGB أو RGBA، يتم دعم uint8 فقط. إذا كنت تستخدم دقة أكبر، فستحصل على تحذير وسيتم تقليل دقة المصفوفة إلى uint8. + +بالنسبة للصور أحادية اللون، يمكنك استخدام الدقة الصحيحة أو العشرية التي تريدها طالما أنها متوافقة مع `Pillow`. سيتم عرض تحذير إذا كانت دقة الصورة الصحيحة أو العشرية عالية جدًا، وفي هذه الحالة يتم تقليل دقة المصفوفة: يتم تقليل مصفوفة int64 إلى int32، ويتم تقليل مصفوفة float64 إلى float32. \ No newline at end of file diff --git a/docs/source/ar/about_dataset_load.mdx b/docs/source/ar/about_dataset_load.mdx new file mode 100644 index 00000000000..7e08d60d9c8 --- /dev/null +++ b/docs/source/ar/about_dataset_load.mdx @@ -0,0 +1,126 @@ +# البناء والتحميل + +تبدأ معظم تدفقات العمل الخاصة بالتعلم العميق بتحميل مجموعة بيانات، مما يجعلها واحدة من أهم الخطوات. مع 🤗 Datasets، هناك أكثر من 900 مجموعة بيانات متاحة لمساعدتك في البدء في مهمة معالجة اللغات الطبيعية الخاصة بك. كل ما عليك فعله هو استدعاء: [`load_dataset`] لاتخاذ خطوتك الأولى. هذه الوظيفة هي حصان عمل حقيقي بكل معنى الكلمة لأنها تبني وتحمّل كل مجموعة بيانات تستخدمها. + +## ELI5: `load_dataset` + +دعونا نبدأ بشرح أساسي كما لو كنت في الخامسة من عمري. + +مجموعة البيانات هي دليل يحتوي على: + +- بعض ملفات البيانات بتنسيقات عامة (JSON، CSV، Parquet، نص، إلخ) +- بطاقة مجموعة بيانات تسمى `README.md` تحتوي على وثائق حول مجموعة البيانات بالإضافة إلى رأس YAML لتحديد علامات وتكوينات مجموعة البيانات +- نص برمجي اختياري لمجموعة البيانات إذا كان يتطلب بعض التعليمات البرمجية لقراءة ملفات البيانات. ويستخدم هذا في بعض الأحيان لتحميل ملفات بتنسيقات وبنيات محددة. + +تسترد وظيفة [`load_dataset`] مجموعة البيانات المطلوبة محليًا أو من Hugging Face Hub. + +Hub هو مستودع مركزي يتم فيه تخزين جميع مجموعات البيانات ونماذج Hugging Face. + +إذا كانت مجموعة البيانات تحتوي فقط على ملفات البيانات، فإن [`load_dataset`] يستنتج تلقائيًا كيفية تحميل ملفات البيانات من ملحقاتها (json، csv، parquet، txt، إلخ). + +تحت الغطاء، سوف تستخدم 🤗 Datasets [`DatasetBuilder`] المناسب بناءً على تنسيق ملفات البيانات. هناك برنامج بناء واحد لكل تنسيق ملف بيانات في 🤗 Datasets: + +- [`datasets.packaged_modules.text.Text`] للنص +- [`datasets.packaged_modules.csv.Csv`] لـ CSV و TSV +- [`datasets.packaged_modules.json.Json`] لـ JSON و JSONL +- [`datasets.packaged_modules.parquet.Parquet`] لـ Parquet +- [`datasets.packaged_modules.arrow.Arrow`] لـ Arrow (تنسيق ملف دفقي) +- [`datasets.packaged_modules.sql.Sql`] لقواعد البيانات SQL +- [`datasets.packaged_modules.imagefolder.ImageFolder`] لمجلدات الصور +- [`datasets.packaged_modules.audiofolder.AudioFolder`] لمجلدات الصوت + +إذا كانت لمجموعة البيانات نص برمجي لمجموعة بيانات، فسيتم تنزيله واستيراده من Hugging Face Hub. + +يحدد الكود في نص برمجية مجموعة البيانات [`DatasetBuilder`] مخصصًا ومعلومات مجموعة البيانات (الوصف، والميزات، وعنوان URL للملفات الأصلية، إلخ)، ويخبر 🤗 Datasets بكيفية إنشاء وعرض أمثلة منها. + + + +اقرأ قسم [Share](./upload_dataset) لمعرفة المزيد حول كيفية مشاركة مجموعة بيانات. يوفر هذا القسم أيضًا دليلًا خطوة بخطوة حول كيفية كتابة نص برمجي لتحميل مجموعة البيانات الخاصة بك! + + + +يقوم 🤗 Datasets بتنزيل ملفات مجموعة البيانات من عنوان URL الأصلي، وينشئ مجموعة البيانات ويخزنها في جدول Arrow على محرك الأقراص الخاص بك. + +إذا قمت بتنزيل مجموعة البيانات من قبل، فسيقوم 🤗 Datasets بإعادة تحميلها من الذاكرة المؤقتة لتوفير عناء تنزيلها مرة أخرى. + +الآن بعد أن حصلت على فهم عالي المستوى حول كيفية بناء مجموعات البيانات، دعنا نلقي نظرة فاحصة على كيفية عمل كل هذا. + +## بناء مجموعة بيانات + +عندما تقوم بتحميل مجموعة بيانات للمرة الأولى، فإن 🤗 Datasets يأخذ ملف البيانات الخام ويبنيه في جدول من الصفوف والأعمدة ذات الأنواع. هناك فئتان رئيسيتان مسؤولتان عن بناء مجموعة البيانات: [`BuilderConfig`] و [`DatasetBuilder`]. + +
+ +
+ +### BuilderConfig[[datasets-builderconfig]] + +[`BuilderConfig`] هي فئة تكوين [`DatasetBuilder`]. يحتوي [`BuilderConfig`] على السمات الأساسية التالية حول مجموعة البيانات: + +| السمة | الوصف | +|---------------|--------------------------------------------------------------| +| `name` | الاسم المختصر لمجموعة البيانات. | +| `version` | محدد إصدار مجموعة البيانات. | +| `data_dir` | يقوم بتخزين المسار إلى مجلد محلي يحتوي على ملفات البيانات. | +| `data_files` | يقوم بتخزين المسارات إلى ملفات البيانات المحلية. | +| `description` | وصف مجموعة البيانات. | + +إذا كنت تريد إضافة سمات إضافية إلى مجموعة البيانات الخاصة بك مثل تسميات الفئات، فيمكنك إنشاء فئة فرعية من فئة [`BuilderConfig`] الأساسية. هناك طريقتان لملء سمات فئة [`BuilderConfig`] أو الفئة الفرعية: + +- تقديم قائمة من مثيلات فئة [`BuilderConfig`] المحددة مسبقًا (أو الفئة الفرعية) في سمة [`DatasetBuilder.BUILDER_CONFIGS`] لمجموعات البيانات. +- عندما تستدعي [`load_dataset`]`load_dataset`، فإن أي وسيطات كلمات رئيسية ليست خاصة بالطريقة ستستخدم لتعيين السمات المرتبطة لفئة [`BuilderConfig`]. سيؤدي هذا إلى تجاوز السمات المحددة مسبقًا إذا تم تحديد تكوين معين. + +يمكنك أيضًا تعيين [`DatasetBuilder.BUILDER_CONFIG_CLASS`] إلى أي فئة فرعية مخصصة من [`BuilderConfig`]. + +### DatasetBuilder[[datasets-datasetbuilder]] + +يصل [`DatasetBuilder`] إلى جميع السمات داخل [`BuilderConfig`] لبناء مجموعة البيانات الفعلية. + +
+ +
+ +هناك ثلاث طرق رئيسية في [`DatasetBuilder`]: + +1. [`DatasetBuilder._info`] مسؤول عن تحديد سمات مجموعة البيانات. عندما تستدعي `dataset.info`، فإن 🤗 Datasets يعيد المعلومات المخزنة هنا. وبالمثل، يتم أيضًا تحديد [`Features`] هنا. تذكر، [`Features`] هي مثل الهيكل العظمي لمجموعة البيانات. فهو يوفر أسماء وأنواع كل عمود. + +2. [`DatasetBuilder._split_generator`] يقوم بتنزيل ملفات البيانات المطلوبة أو استردادها، وتنظيمها في تقسيمات، وتحديد الحجج المحددة لعملية التوليد. تحتوي هذه الطريقة على [`DownloadManager`] يقوم بتنزيل الملفات أو استردادها من نظام الملفات المحلي. داخل [`DownloadManager`]، توجد طريقة [`DownloadManager.download_and_extract`] تقبل قاموسًا من عناوين URL لملفات البيانات الأصلية، وتقوم بتنزيل الملفات المطلوبة. تتضمن المدخلات المقبولة: عنوان URL أو مسار واحد، أو قائمة/قاموس من عناوين URL أو المسارات. سيتم استخراج أي أنواع ملفات مضغوطة مثل أرشيفات TAR و GZIP و ZIP تلقائيًا. + +بمجرد تنزيل الملفات، يقوم [`SplitGenerator`] بتنظيمها في تقسيمات. يحتوي [`SplitGenerator`] على اسم التقسيم، وأي وسيطات كلمات رئيسية يتم توفيرها لطريقة [`DatasetBuilder._generate_examples`]. يمكن أن تكون وسيطات الكلمات الرئيسية محددة لكل تقسيم، وعادة ما تتكون على الأقل من المسار المحلي لملفات البيانات لكل تقسيم. + +3. يقوم [`DatasetBuilder._generate_examples`] بقراءة ملفات البيانات لتقسيمها وتحليلها. ثم يقوم بإنتاج أمثلة مجموعة البيانات وفقًا للتنسيق المحدد في `features` من [`DatasetBuilder._info`]. في الواقع، فإن إدخال [`DatasetBuilder._generate_examples`] هو `filepath` المقدم في وسيطات الكلمات الرئيسية للطريقة الأخيرة. + +تتم توليد مجموعة البيانات باستخدام مولد Python، والذي لا يحمّل جميع البيانات في الذاكرة. ونتيجة لذلك، يمكن للمولد التعامل مع مجموعات البيانات الكبيرة. ومع ذلك، قبل مسح العينات المولدة إلى ملف مجموعة البيانات على القرص، يتم تخزينها في مؤشر ترابط `ArrowWriter`. وهذا يعني أن العينات المولدة يتم كتابتها على دفعات. إذا كانت عينات مجموعة البيانات تستهلك الكثير من الذاكرة (الصور أو مقاطع الفيديو)، فتأكد من تحديد قيمة منخفضة لسمة `DEFAULT_WRITER_BATCH_SIZE` في [`DatasetBuilder`]. نوصي بعدم تجاوز حجم 200 ميجابايت. + +## الحفاظ على السلامة + +لضمان اكتمال مجموعة البيانات، سيقوم [`load_dataset`] بإجراء سلسلة من الاختبارات على الملفات التي تم تنزيلها للتأكد من وجود كل شيء. بهذه الطريقة، لن تواجه أي مفاجآت عندما لا يتم إنشاء مجموعة البيانات المطلوبة كما هو متوقع. يتحقق [`load_dataset`] مما يلي: + +- عدد التقسيمات في `DatasetDict` المولدة. +- عدد العينات في كل تقسيم من `DatasetDict` المولدة. +- قائمة الملفات التي تم تنزيلها. +- اختبارات SHA256 للملفات التي تم تنزيلها (معطلة افتراضيًا). + +إذا لم تمر مجموعة البيانات بالتحقق، فمن المحتمل أن يكون المضيف الأصلي لمجموعة البيانات قد أجرى بعض التغييرات في ملفات البيانات. + + + +إذا كانت مجموعة البيانات الخاصة بك، فستحتاج إلى إعادة حساب المعلومات أعلاه وتحديث ملف `README.md` في مستودع مجموعة البيانات الخاصة بك. الق نظرة على هذا [القسم](dataset_script#optional-generate-dataset-metadata) لمعرفة كيفية إنشاء وتحديث هذه البيانات الوصفية. + + + +في هذه الحالة، يتم إثارة خطأ للتنبيه إلى أن مجموعة البيانات قد تغيرت. + +لتجاهل الخطأ، يجب تحديد `verification_mode="no_checks"` في [`load_dataset`]. + +عندما ترى خطأ في التحقق، لا تتردد في فتح مناقشة أو طلب سحب في علامة التبويب "Community" المقابلة لمجموعة البيانات، بحيث يتم تحديث فحوصات السلامة لتلك المجموعة. + +## الأمان + +يتم فحص مستودعات مجموعات البيانات على Hub بحثًا عن البرامج الضارة، راجع المزيد من المعلومات [هنا](https://huggingface.co/docs/hub/security#malware-scanning). + +علاوة على ذلك، تمت مراجعة جميع مجموعات البيانات التي لا تحتوي على مساحة أسماء (المساهم بها في الأصل في مستودع GitHub الخاص بنا) بواسطة مشرفينا. + +يُعتبر كود هذه المجموعات من البيانات **آمنًا**. + +وينطبق هذا على مجموعات البيانات التي لا تحتوي على مساحة أسماء، مثل "squad" أو "glue"، على عكس مجموعات البيانات الأخرى التي تحمل اسم "username/dataset_name" أو "org/dataset_name". \ No newline at end of file diff --git a/docs/source/ar/about_map_batch.mdx b/docs/source/ar/about_map_batch.mdx new file mode 100644 index 00000000000..7102c1249d5 --- /dev/null +++ b/docs/source/ar/about_map_batch.mdx @@ -0,0 +1,41 @@ +# الترميز الدفعي + +إن الجمع بين فائدة [`Dataset.map`] ووضع الدفعات أمر قوي للغاية. فهو يسمح لك بزيادة سرعة المعالجة، والتحكم بحرية في حجم المجموعة الناتجة. + +## الحاجة إلى السرعة + +الهدف الأساسي من الترميز الدفعي هو تسريع المعالجة. غالبًا ما يكون العمل على دفعات من البيانات أسرع من العمل على أمثلة فردية. وبشكل طبيعي، يناسب الترميز الدفعي عملية التجزئة إلى رموز. على سبيل المثال، تعمل مكتبة 🤗 [Tokenizers](https://huggingface.co/docs/tokenizers/python/latest/) بشكل أسرع مع الدفعات لأنها توازي عملية التجزئة إلى رموز لجميع الأمثلة في الدفعة. + +## حجم الإدخال != حجم الإخراج (Input size != output size) + +يمكن الاستفادة من القدرة على التحكم في حجم المجموعة الناتجة في العديد من حالات الاستخدام المثيرة للاهتمام. في قسم كيفية [الرسم](#map)، هناك أمثلة على استخدام الترميز الدفعي للقيام بما يلي: + +- تقسيم الجمل الطويلة إلى مقاطع أقصر. +- زيادة مجموعة من البيانات باستخدام رموز إضافية. + +من المفيد فهم كيفية عمل ذلك، حتى تتمكن من ابتكار طرقك الخاصة لاستخدام الترميز الدفعي. في هذه المرحلة، قد تتساءل عن كيفية التحكم في حجم المجموعة الناتجة. الإجابة هي: **لا يلزم أن تعيد الدالة المرسومة إخراج دفعة بنفس الحجم**. + +بمعنى آخر، يمكن أن يكون إدخال الدالة المرسومة دفعة بحجم `N` وتعيد دفعة بحجم `M`. يمكن أن يكون الإخراج `M` أكبر أو أقل من `N`. وهذا يعني أنه يمكنك دمج أمثلك، وتقسيمها، وحتى إضافة المزيد من الأمثلة! + +ومع ذلك، تذكر أن جميع القيم في قاموس الإخراج يجب أن تحتوي على **نفس عدد العناصر** مثل الحقول الأخرى في قاموس الإخراج. وإلا، لن يكون من الممكن تحديد عدد الأمثلة في الإخراج الذي تعيده الدالة المرسومة. يمكن أن يختلف العدد بين الدفعات المتتالية التي تعالجها الدالة المرسومة. ولكن بالنسبة لدفعة واحدة، يجب أن يكون لجميع قيم قاموس الإخراج نفس الطول (أي عدد العناصر). + +على سبيل المثال، بالنسبة لمجموعة بيانات مكونة من عمود واحد و3 صفوف، إذا استخدمت `map` لإرجاع عمود جديد يحتوي على ضعف عدد الصفوف، فستحصل على خطأ. + +في هذه الحالة، ستحصل على عمود واحد يحتوي على 3 صفوف، وعمود آخر يحتوي على 6 صفوف. كما ترى، لن يكون الجدول صالحًا: + +```py +>>> 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' +``` + +لجعله صالحًا، يجب عليك إسقاط أحد العمودين: + +```py +>>> 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 +``` \ No newline at end of file diff --git a/docs/source/ar/about_mapstyle_vs_iterable.mdx b/docs/source/ar/about_mapstyle_vs_iterable.mdx new file mode 100644 index 00000000000..9a6ee679aa7 --- /dev/null +++ b/docs/source/ar/about_mapstyle_vs_iterable.mdx @@ -0,0 +1,217 @@ +# الفروق بين Dataset و IterableDataset + +هناك نوعان من كائنات مجموعة البيانات، [`Dataset`] و [`IterableDataset`]. يعتمد نوع مجموعة البيانات التي تختار استخدامها أو إنشائها على حجم مجموعة البيانات. بشكل عام، يعد [`IterableDataset`] مثاليًا لمجموعات البيانات الكبيرة (مئات غيغابايت!) بسبب سلوكه "الكَسول" ومزايا السرعة، في حين أن [`Dataset`] رائع لكل شيء آخر. ستعمل هذه الصفحة على مقارنة الاختلافات بين [`Dataset`] و [`IterableDataset`] لمساعدتك في اختيار كائن مجموعة البيانات المناسب لك. + +## التنزيل والبث + +عند استخدام [`Dataset`] عادي، يمكنك الوصول إليه باستخدام `my_dataset[0]`. يوفر هذا الوصول العشوائي إلى الصفوف. تسمى مجموعات البيانات هذه أيضًا مجموعات بيانات "على الطراز الخرائطي". على سبيل المثال، يمكنك تنزيل ImageNet-1k والوصول إلى أي صف على النحو التالي: + +```python +from datasets import load_dataset + +imagenet = load_dataset("imagenet-1k", split="train") # يقوم بتنزيل مجموعة البيانات الكاملة +print(imagenet[0]) +``` + +ولكن أحد التحذيرات هو أنه يجب عليك تخزين مجموعة البيانات بالكامل على القرص الخاص بك أو في الذاكرة، مما يمنعك من الوصول إلى مجموعات البيانات الأكبر من القرص. نظرًا لأنه قد يصبح غير مريح لمجموعات البيانات الكبيرة، هناك نوع آخر من مجموعات البيانات، وهو [`IterableDataset`]. + +عند استخدام `IterableDataset`، يمكنك الوصول إليها باستخدام حلقة `for` لتحميل البيانات تدريجيًا أثناء التنقل خلال مجموعة البيانات. بهذه الطريقة، يتم تحميل جزء صغير فقط من الأمثلة في الذاكرة، ولا تقوم بكتابة أي شيء على القرص. على سبيل المثال، يمكنك بث مجموعة بيانات ImageNet-1k دون تنزيلها على القرص على النحو التالي: + +```python +from datasets import load_dataset + +imagenet = load_dataset("imagenet-1k", split="train", streaming=True) # سيبدأ تحميل البيانات عند التنقل خلال مجموعة البيانات +for example in imagenet: + print(example) + break +``` + +يمكن للبث قراءة البيانات عبر الإنترنت دون كتابة أي ملف على القرص. على سبيل المثال، يمكنك بث مجموعات البيانات المصنوعة من شظايا متعددة، يبلغ حجم كل منها مئات الغيغابايت مثل [C4](https://huggingface.co/datasets/c4) أو [OSCAR](https://huggingface.co/datasets/oscar) أو [LAION-2B](https://huggingface.co/datasets/laion/laion2B-en). تعرف على المزيد حول كيفية بث مجموعة بيانات في [دليل بث مجموعة البيانات](./stream). + +ولكن هذا ليس هو الاختلاف الوحيد، لأن السلوك "الكَسول" لـ `IterableDataset` موجود أيضًا عند إنشاء مجموعة البيانات ومعالجتها. + +## إنشاء مجموعات بيانات على الطراز الخرائطي ومجموعات البيانات القابلة للتنقل + +يمكنك إنشاء [`Dataset`] باستخدام القوائم أو القواميس، ويتم تحويل البيانات بالكامل إلى Arrow بحيث يمكنك الوصول إلى أي صف بسهولة: + +```python +my_dataset = Dataset.from_dict({"col_1": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}) +print(my_dataset[0]) +``` + +ومن ناحية أخرى، لإنشاء `IterableDataset`، يجب عليك توفير طريقة "كسولة" لتحميل البيانات. في Python، نستخدم بشكل عام وظائف المولدات. تقوم هذه الوظائف `yield` بمثال واحد في كل مرة، مما يعني أنه لا يمكنك الوصول إلى صف عن طريق تقطيعه مثل [`Dataset`] عادي: + +```python +def my_generator(n): + for i in range(n): + yield {"col_1": i} + +my_iterable_dataset = IterableDataset.from_generator(my_generator, gen_kwargs={"n": 10}) +for example in my_iterable_dataset: + print(example) + break +``` + +## تحميل الملفات المحلية بالكامل والتدريجي + +من الممكن تحويل ملفات البيانات المحلية أو البعيدة إلى [`Dataset`] Arrow باستخدام [`load_dataset`]: + +```python +data_files = {"train": ["path/to/data.csv"]} +my_dataset = load_dataset("csv", data_files=data_files, split="train") +print(my_dataset[0]) +``` + +ومع ذلك، يتطلب ذلك خطوة تحويل من تنسيق CSV إلى تنسيق Arrow، والتي تستغرق وقتًا ومساحة على القرص إذا كانت مجموعة البيانات كبيرة. لتوفير مساحة على القرص وتخطي خطوة التحويل، يمكنك تحديد `IterableDataset` عن طريق البث من الملفات المحلية مباشرة. بهذه الطريقة، يتم قراءة البيانات تدريجيًا من الملفات المحلية أثناء التنقل خلال مجموعة البيانات: + +```python +data_files = {"train": ["path/to/data.csv"]} +my_iterable_dataset = load_dataset("csv", data_files=data_files, split="train", streaming=True) +for example in my_iterable_dataset: # يقرأ هذا الملف CSV تدريجيًا أثناء التنقل خلال مجموعة البيانات + print(example) + break +``` + +يتم دعم العديد من تنسيقات الملفات، مثل CSV وJSONL وParquet، بالإضافة إلى ملفات الصور والصوت. يمكنك العثور على مزيد من المعلومات في الأدلة المقابلة لتحميل مجموعات البيانات [الجدولية](./tabular_load) و [النصية](./nlp_load) و [الرؤية](./image_load)، و [الصوتية](./audio_load]). + +## معالجة البيانات المتحمسة ومعالجة البيانات الكسولة + +عند معالجة كائن [`Dataset`] باستخدام [`Dataset.map`]`، تتم معالجة مجموعة البيانات بالكامل على الفور وإعادتها. هذا مشابه لكيفية عمل `pandas` على سبيل المثال. + +```python +my_dataset = my_dataset.map(process_fn) # يتم تطبيق `process_fn` على جميع الأمثلة في مجموعة البيانات +print(my_dataset[0]) +``` + +ومن ناحية أخرى، نظرًا للطابع "الكسول" لـ `IterableDataset`، فإن استدعاء [`IterableDataset.map`] لا يطبق دالة `map` على مجموعة البيانات بالكامل. بدلاً من ذلك، يتم تطبيق دالة `map` الخاصة بك أثناء التنقل. بسبب ذلك، يمكنك تسلسل خطوات المعالجة المتعددة وسيتم تشغيلها جميعًا مرة واحدة عند بدء التنقل خلال مجموعة البيانات: + +```python +my_iterable_dataset = my_iterable_dataset.map(process_fn_1) +my_iterable_dataset = my_iterable_dataset.filter(filter_fn) +my_iterable_dataset = my_iterable_dataset.map(process_fn_2) + +# يتم تطبيق `process_fn_1` و `filter_fn` و `process_fn_2` أثناء التنقل خلال مجموعة البيانات +for example in my_iterable_dataset: + print(example) + break +``` + +## الخلط الدقيق والتقريبي السريع + +عند خلط [`Dataset`] باستخدام [`Dataset.shuffle`]`، فإنك تطبق خلطًا دقيقًا لمجموعة البيانات. تعمل هذه الطريقة عن طريق أخذ قائمة من المؤشرات `[0، 1، 2، ... len (my_dataset) - 1]` وخلط هذه القائمة. بعد ذلك، يعيد الوصول إلى `my_dataset[0]` الصف والمؤشر المحدد بواسطة العنصر الأول من تعيين المؤشرات الذي تم خلطه: + +```python +my_dataset = my_dataset.shuffle(seed=42) +print(my_dataset[0]) +``` + +نظرًا لأنه لا يمكننا الوصول العشوائي إلى الصفوف في حالة `IterableDataset`، لا يمكننا استخدام قائمة مؤشرات مختلطة والوصول إلى صف في موضع عشوائي. يمنع ذلك استخدام الخلط الدقيق. بدلاً من ذلك، يتم استخدام خلط تقريبي سريع في [`IterableDataset.shuffle`]. يستخدم هذا الخلط مخزن مؤقت لاختيار أمثلة عشوائية بشكل تكراري من مجموعة البيانات. نظرًا لأنه لا يزال يتم قراءة مجموعة البيانات بشكل تكراري، فإنها توفر أداء سرعة ممتاز: + +```python +my_iterable_dataset = my_iterable_dataset.shuffle(seed=42, buffer_size=100) +for example in my_iterable_dataset: + print(example) + break +``` + +ولكن استخدام مخزن مؤقت للخلط ليس كافيًا لتوفير خلط مرضٍ لتدريب نموذج التعلم الآلي. لذلك، فإن [`IterableDataset.shuffle`] يقوم أيضًا بخلط شظايا مجموعة البيانات إذا كانت مجموعة البيانات الخاصة بك تتكون من ملفات أو مصادر متعددة: + +```python +# Stream from the internet +my_iterable_dataset = load_dataset("deepmind/code_contests", split="train", streaming=True) +my_iterable_dataset.n_shards # 39 + +# Stream from local files +data_files = {"train": [f"path/to/data_{i}.csv" for i in range(1024)]} +my_iterable_dataset = load_dataset("csv", data_files=data_files, split="train", streaming=True) +my_iterable_dataset.n_shards # 1024 + +# From a generator function +def my_generator(n, sources): + for source in sources: + for example_id_for_current_source in range(n): + yield {"example_id": f"{source}_{example_id_for_current_source}"} + +gen_kwargs = {"n": 10, "sources": [f"path/to/data_{i}" for i in range(1024)]} +my_iterable_dataset = IterableDataset.from_generator(my_generator, gen_kwargs=gen_kwargs) +my_iterable_dataset.n_shards # 1024 +``` + +## اختلافات السرعة + +تعتمد كائنات [`Dataset`] العادية على Arrow الذي يوفر وصولًا عشوائيًا سريعًا إلى الصفوف. بفضل تعيين الذاكرة وحقيقة أن Arrow هو تنسيق في الذاكرة، فإن قراءة البيانات من القرص لا تقوم بمكالمات النظام الباهظة وإلغاء التسلسل. يوفر تحميل البيانات بشكل أسرع عند التنقل باستخدام حلقة `for` عن طريق التنقل خلال دفعات سجلات Arrow المتجاورة. + +ومع ذلك، بمجرد أن يكون لديك [`Dataset`] يحتوي على تعيين مؤشرات (عبر [`Dataset.shuffle`] على سبيل المثال)، يمكن أن تصبح السرعة أبطأ بعشر مرات. يرجع ذلك إلى وجود خطوة إضافية للحصول على مؤشر الصف الذي سيتم قراءته باستخدام تعيين المؤشرات، والأهم من ذلك، أنك لم تعد تقرأ قطعًا متجاورة من البيانات. لاستعادة السرعة، ستحتاج إلى إعادة كتابة مجموعة البيانات بالكامل على القرص الخاص بك مرة أخرى باستخدام [`Dataset.flatten_indices`]`، والذي يزيل تعيين المؤشرات. ومع ذلك، فقد يستغرق ذلك الكثير من الوقت اعتمادًا على حجم مجموعة البيانات الخاصة بك: + +```python +my_dataset[0] # سريع +my_dataset = my_dataset.shuffle(seed=42) +my_dataset[0] # أبطأ بعشر مرات +my_dataset = my_dataset.flatten_indices() # إعادة كتابة مجموعة البيانات المخلوطة على القرص كقطع متجاورة من البيانات +my_dataset[0] # سريع مرة أخرى +``` + +في هذه الحالة، نوصي بالتبديل إلى [`IterableDataset`] والاستفادة من طريقة الخلط التقريبي السريع [`IterableDataset.shuffle`]. يقوم هذا الخلط بخلط ترتيب الشظايا فقط وإضافة مخزن مؤقت للخلط إلى مجموعة البيانات الخاصة بك، مما يحافظ على سرعة مجموعة البيانات المثالية. يمكنك أيضًا إعادة خلط مجموعة البيانات بسهولة: + +```python +for example in enumerate(my_iterable_dataset): # سريع + pass + +shuffled_iterable_dataset = my_iterable_dataset.shuffle(seed=42, buffer_size=100) + +for example in enumerate(shuffled_iterable_dataset): # سريع مثل السابق + pass + +shuffled_iterable_dataset = my_iterable_dataset.shuffle(seed=1337, buffer_size=100) # إعادة الخلط باستخدام بذرة أخرى فوري + +for example in enumerate(shuffled_iterable_dataset): # لا يزال سريعًا مثل السابق + pass +``` + +إذا كنت تستخدم مجموعة البيانات الخاصة بك على عدة عصور، فإن البذرة الفعالة لخلط ترتيب الشظايا في مخزن الخلط هي `seed + epoch`. يجعل هذا من السهل إعادة خلط مجموعة البيانات بين العصور: + +```python +for epoch in range(n_epochs): + my_iterable_dataset.set_epoch(epoch) + for example in my_iterable_dataset: # سريع + إعادة الخلط في كل عصر باستخدام `effective_seed = seed + epoch` + pass +``` + +## الاختلافات بين نقاط التفتيش والاستئناف + +إذا توقفت حلقة التدريب الخاصة بك، فقد ترغب في إعادة تشغيل التدريب من حيث توقفت. للقيام بذلك، يمكنك حفظ نقطة تفتيش لنموذجك ومؤشرات الأداء، بالإضافة إلى برنامج تحميل البيانات الخاص بك. + +لاستئناف التنقل خلال مجموعة بيانات على الطراز الخرائطي، يمكنك ببساطة تخطي الأمثلة الأولى: + +```python +my_dataset = my_dataset.select(range(start_index, len(dataset))) +``` + +ولكن إذا كنت تستخدم `DataLoader` مع `Sampler`، فيجب عليك بدلاً من ذلك حفظ حالة برنامج العينات الخاص بك (قد تحتاج إلى كتابة برنامج عينات مخصص يسمح بالاستئناف). من ناحية أخرى، لا توفر مجموعات البيانات القابلة للتنقل الوصول العشوائي إلى مثال محدد لاستئنافه. ولكن يمكنك استخدام [`IterableDataset.state_dict`] و [`IterableDataset.load_state_dict`] لاستئناف العمل من نقطة تفتيش، على غرار ما يمكنك القيام به للنماذج ومؤشرات الأداء: + +```python +>>> iterable_dataset = Dataset.from_dict({"a": range(6)}).to_iterable_dataset(num_shards=3) +>>> # الحفظ في منتصف التدريب +>>> state_dict = iterable_dataset.state_dict() +>>> # والاستئناف لاحقًا +>>> iterable_dataset.load_state_dict(state_dict) +``` + +تحت الغطاء، تحتفظ مجموعة البيانات القابلة للتنقل بتتبع الشظية الحالية التي تتم قراءتها ومؤشر المثال في الشظية الحالية ويتم تخزين هذه المعلومات في `state_dict`. لاستئناف العمل من نقطة تفتيش، تقوم مجموعة البيانات بتخطي جميع الشظايا التي تم قراءتها سابقًا لإعادة التشغيل من الشظية الحالية. ثم يقوم بقراءة الشظية ويجري تخطي الأمثلة حتى يصل إلى المثال الدقيق من نقطة التفتيش. لذلك، فإن إعادة تشغيل مجموعة البيانات سريعة للغاية، حيث لن تقوم بإعادة قراءة الشظايا التي تم التنقل خلالها بالفعل. ومع ذلك، فإن استئناف مجموعة البيانات ليس فوريًا بشكل عام، حيث يتعين عليه إعادة تشغيل القراءة من بداية الشظية الحالية ويجري تخطي الأمثلة حتى يصل إلى موقع نقطة التفتيش. + +يمكن استخدام هذا مع `StatefulDataLoader` من `torchdata`، راجع [البث مع برنامج تحميل بيانات PyTorch](./use_with_pytorch#stream-data). + +## التبديل من الطراز الخرائطي إلى القابل للتنقل + +إذا كنت تريد الاستفادة من السلوك "الكسول" لـ [`IterableDataset`] أو مزايا السرعة الخاصة به، فيمكنك التبديل من [`Dataset`] على الطراز الخرائطي إلى [`IterableDataset`]: + +```python +my_iterable_dataset = my_dataset.to_iterable_dataset() +``` + +إذا كنت تريد خلط مجموعة البيانات الخاصة بك أو [استخدامها مع برنامج تحميل بيانات PyTorch](./use_with_pytorch#stream-data)، فإننا نوصي بإنشاء [`IterableDataset`] مجزأ: + +```python +my_iterable_dataset = my_dataset.to_iterable_dataset(num_shards=1024) +my_iterable_dataset.n_shards # 1024 +``` diff --git a/docs/source/ar/access.mdx b/docs/source/ar/access.mdx new file mode 100644 index 00000000000..c11ba60b0ab --- /dev/null +++ b/docs/source/ar/access.mdx @@ -0,0 +1,151 @@ +# تعرف على مجموعة بياناتك + +هناك نوعان من كائنات مجموعة البيانات، [`Dataset`] العادية، ثم [`IterableDataset`] ✨. يوفر [`Dataset`] وصولاً عشوائياً سريعاً إلى الصفوف، وخرائط الذاكرة بحيث لا يستخدم تحميل مجموعات البيانات الكبيرة سوى كمية صغيرة نسبيًا من ذاكرة الجهاز. ولكن بالنسبة لمجموعات البيانات الكبيرة حقًا، والتي لن تناسب القرص أو الذاكرة، يسمح لك [`IterableDataset`] بالوصول إلى مجموعة البيانات واستخدامها دون انتظار تنزيلها بالكامل! + +سيوضح هذا البرنامج التعليمي كيفية تحميل والوصول إلى [`Dataset`] و [`IterableDataset`]. + +## مجموعة البيانات + +عند تحميل تقسيم مجموعة البيانات، ستحصل على كائن [`Dataset`]. يمكنك القيام بالعديد من الأشياء باستخدام كائن [`Dataset`]. ولهذا من المهم معرفة كيفية معالجة البيانات المخزنة داخله والتفاعل معها. + +يستخدم هذا البرنامج التعليمي مجموعة بيانات [rotten_tomatoes](https://huggingface.co/datasets/rotten_tomatoes)، ولكن يمكنك تحميل أي مجموعة بيانات تريدها ومتابعة ذلك! + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("rotten_tomatoes", split="train") +``` + +### الفهرسة + +يحتوي [`Dataset`] على أعمدة من البيانات، ويمكن أن يكون لكل عمود نوع مختلف من البيانات. يستخدم *الفهرس*، أو تسمية المحور، للوصول إلى الأمثلة من مجموعة البيانات. على سبيل المثال، يعيد الفهرسة حسب الصف قاموسًا بمثال من مجموعة البيانات: + +```py +# احصل على الصف الأول في مجموعة البيانات +>>> dataset[0] +{'label': 1, +'text': 'the rock is destined to be the 21st century\'s new "conan" and that he\'s going to make a splash even greater than arnold schwarzenegger, jean-claud van damme or steven segal.'} +``` + +استخدم عامل `-` لبدء الفهرسة من نهاية مجموعة البيانات: + +```py +# احصل على الصف الأخير في مجموعة البيانات +>>> dataset[-1] +{'label': 0, +'text': 'things really get weird, though not particularly scary: the movie is all portent and no content.'} +``` + +تعيد الفهرسة حسب اسم العمود قائمة بجميع القيم في العمود: + +```py +>>> dataset["text"] +['the rock is destined to be the 21st century\'s new "conan" and that he\'s going to make a splash even greater than arnold schwarzenegger, jean-claud van damme or steven segal.', +'the gorgeously elaborate continuation of "the lord of the rings" trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson\'s expanded vision of j. r. r. tolkien\'s middle-earth.', +'effective but too-tepid biopic', +..., +'things really get weird, though not particularly scary: the movie is all portent and no content.'] +``` + +يمكنك الجمع بين فهرسة الصفوف وأسماء الأعمدة لإرجاع قيمة محددة في موضع ما: + +```py +>>> dataset[0]["text"] +'the rock is destined to be the 21st century\'s new "conan" and that he\'s going to make a splash even greater than arnold schwarzenegger, jean-claud van damme or stevin segal.' +``` + +ولكن من المهم أن تتذكر أن ترتيب الفهرسة مهم، خاصة عند العمل مع مجموعات بيانات الصوت والصورة الكبيرة. تعيد الفهرسة حسب اسم العمود جميع القيم في العمود أولاً، ثم تحمّل القيمة في ذلك الموضع. بالنسبة لمجموعات البيانات الكبيرة، قد يكون الفهرسة حسب اسم العمود أولاً أبطأ. + +```py +>>> import time + +>>> start_time = time.time() +>>> text = dataset[0]["text"] +>>> end_time = time.time() +>>> print(f"Elapsed time: {end_time - start_time:.4f} seconds") +Elapsed time: 0.0031 seconds + +>>> start_time = time.time() +>>> text = dataset["text"][0] +>>> end_time = time.time() +>>> print(f"Elapsed time: {end_time - start_time:.4f} seconds") +Elapsed time: 0.0094 seconds +``` + +### الشرائح + +يعيد التقطيع شريحة - أو جزء فرعي - من مجموعة البيانات، وهو أمر مفيد لعرض عدة صفوف في نفس الوقت. لتقطيع مجموعة بيانات، استخدم عامل `:` لتحديد نطاق المواضع. + +```py +# احصل على أول ثلاثة صفوف +>>> dataset[:3] +{'label': [1, 1, 1], +'text': ['the rock is destined to be the 21st century\'s new "conan" and that he\'s going to make a splash even greater than arnold schwarzenegger, jean-claud van damme or steven segal.', +'the gorgeously elaborate continuation of "the lord of the rings" trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson\'s expanded vision of j. r. r. tolkien\'s middle-earth.', +'effective but too-tepid biopic']} + +# احصل على الصفوف بين ثلاثة وستة +>>> dataset[3:6] +{'label': [1, 1, 1], +'text': ['if you sometimes like to go to the movies to have fun, wasabi is a good place to start.', +"emerges as something rare, an issue movie that's so honest and keenly observed that it doesn't feel like one.", +'the film provides some great insight into the neurotic mindset of all comics -- even those who have reached the absolute top of the game.']} +``` + +## مجموعة البيانات القابلة للتحديد + +يتم تحميل [`IterableDataset`] عند تعيين معلمة `streaming` إلى `True` في [`~datasets.load_dataset`]: + +```py +>>> from datasets import load_dataset + +>>> iterable_dataset = load_dataset("food101", split="train", streaming=True) +>>> for example in iterable_dataset: +... print(example) +... break +{'image': , 'label': 6} +``` + +يمكنك أيضًا إنشاء [`IterableDataset`] من [`Dataset`] *قائمة*، ولكنه أسرع من وضع البث لأن مجموعة البيانات يتم بثها من ملفات محلية: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("rotten_tomatoes", split="train") +>>> iterable_dataset = dataset.to_iterable_dataset() +``` + +يقوم [`IterableDataset`] بالتقدم بشكل تدريجي عبر مجموعة البيانات مثالًا واحدًا في كل مرة، لذلك لا يتعين عليك الانتظار حتى يتم تنزيل مجموعة البيانات بالكامل قبل أن تتمكن من استخدامها. كما يمكنك أن تتخيل، هذا مفيد جدًا لمجموعات البيانات الكبيرة التي تريد استخدامها على الفور! + +ومع ذلك، هذا يعني أن سلوك [`IterableDataset`] يختلف عن [`Dataset`] العادي. لا تحصل على وصول عشوائي إلى الأمثلة في [`IterableDataset`]. بدلاً من ذلك، يجب عليك التكرار خلال عناصره، على سبيل المثال، عن طريق استدعاء `next(iter())` أو باستخدام حلقة `for` لإرجاع العنصر التالي من [`IterableDataset`]: + +```py +>>> next(iter(iterable_dataset)) +{'image': , 'label': 6} + +>>> for example in iterable_dataset: +... print(example) +... break +{'image': , 'label': 6} +``` + +يمكنك إرجاع جزء فرعي من مجموعة البيانات مع عدد محدد من الأمثلة فيه باستخدام [`IterableDataset.take`]: + +```py +# احصل على أول ثلاثة أمثلة +>>> list(iterable_dataset.take(3)) +[{'image': , +'label': 6}, +{'image': , +'label': 6}, +{'image': , +'label': 6}] +``` + +ولكن على عكس [الشرائح](access/#slicing)، يقوم [`IterableDataset.take`] بإنشاء [`IterableDataset`] جديدة. + +## الخطوات التالية + +هل أنت مهتم بمعرفة المزيد عن الاختلافات بين هذين النوعين من مجموعات البيانات؟ تعرف على المزيد حولها في الدليل المفاهيمي [الاختلافات بين `Dataset` و`IterableDataset`](about_mapstyle_vs_iterable). + +للحصول على مزيد من التمارين العملية مع أنواع مجموعات البيانات هذه، راجع دليل [Process](process) لمعرفة كيفية معالجة مجموعة بيانات [`Dataset`] أو دليل [Stream](stream) لمعرفة كيفية معالجة مجموعة بيانات [`IterableDataset`]. \ No newline at end of file diff --git a/docs/source/ar/audio_dataset.mdx b/docs/source/ar/audio_dataset.mdx new file mode 100644 index 00000000000..9abdc58063d --- /dev/null +++ b/docs/source/ar/audio_dataset.mdx @@ -0,0 +1,601 @@ +# إنشاء مجموعة بيانات صوتية + +يمكنك مشاركة مجموعة بيانات مع فريقك أو مع أي شخص في المجتمع من خلال إنشاء مستودع لمجموعة البيانات على Hugging Face Hub: + +هناك عدة طرق لإنشاء ومشاركة مجموعة بيانات صوتية: + +- إنشاء مجموعة بيانات صوتية من ملفات محلية في بايثون باستخدام [Dataset.push_to_hub]. هذه طريقة سهلة تتطلب فقط بضع خطوات في بايثون. + +- إنشاء مستودع لمجموعة بيانات صوتية باستخدام أداة إنشاء AudioFolder. هذا حل بدون كود لإنشاء مجموعة بيانات صوتية بسرعة مع عدة آلاف من ملفات الصوت. + + + +يمكنك التحكم في الوصول إلى مجموعة البيانات الخاصة بك من خلال مطالبة المستخدمين بمشاركة معلومات الاتصال الخاصة بهم أولاً. راجع دليل [مجموعات البيانات المحمية](https://huggingface.co/docs/hub/datasets-gated) لمزيد من المعلومات حول كيفية تمكين هذه الميزة على Hub. + + + +## الملفات المحلية + +يمكنك تحميل مجموعة البيانات الخاصة بك باستخدام مسارات ملفات الصوت الخاصة بك. استخدم دالة [~Dataset.cast_column] لأخذ عمود من مسارات ملفات الصوت، وتحويله إلى ميزة [Audio]. + +```py +>>> audio_dataset = Dataset.from_dict({"audio": ["path/to/audio_1", "path/to/audio_2", ..., "path/to/audio_n"]}).cast_column("audio", Audio()) +>>> audio_dataset[0]["audio"] +{'array': array([ 0. , 0.00024414, -0.00024414, ..., -0.00024414, +0. , 0. ], dtype=float32), +'path': 'path/to/audio_1', +'sampling_rate': 16000} +``` + +ثم قم بتحميل مجموعة البيانات إلى Hugging Face Hub باستخدام [Dataset.push_to_hub]: + +```py +audio_dataset.push_to_hub("/my_dataset") +``` + +سيؤدي هذا إلى إنشاء مستودع لمجموعة بيانات يحتوي على مجموعة البيانات الصوتية الخاصة بك: + +``` +my_dataset/ +├── README.md +└── data/ + └── train-00000-of-00001.parquet +``` + +## AudioFolder + +AudioFolder هي أداة لإنشاء مجموعات بيانات مصممة لتحميل مجموعة بيانات صوتية تحتوي على عدة آلاف من ملفات الصوت دون الحاجة إلى كتابة أي كود. + +يتم تحميل أي معلومات إضافية حول مجموعة البيانات الخاصة بك - مثل النص المكتوب، أو لهجة المتحدث، أو نية المتحدث - تلقائيًا بواسطة AudioFolder طالما أنك تدرج هذه المعلومات في ملف بيانات وصفية (`metadata.csv` / `metadata.jsonl`). + + + +💡 اطلع على [تسلسل هرمي لأنماط التقسيم](repository_structure#split-pattern-hierarchy) لمعرفة المزيد حول كيفية إنشاء AudioFolder لتقسيمات مجموعة البيانات بناءً على هيكل مستودع مجموعة البيانات الخاصة بك. + + + +قم بإنشاء مستودع لمجموعة بيانات على Hugging Face Hub وتحميل دليل مجموعة البيانات الخاصة بك باتباع هيكل AudioFolder: + +``` +my_dataset/ +├── README.md +├── metadata.csv +└── data/ +``` + +يمكن أن يكون اسم مجلد `data` أي اسم تريده. + + + +قد يكون من المفيد تخزين البيانات الوصفية الخاصة بك على أنها ملف `jsonl` إذا كانت أعمدة البيانات تحتوي على تنسيق أكثر تعقيدًا (مثل قائمة من الأرقام العائمة) لتجنب أخطاء التحليل أو قراءة القيم المعقدة كسلاسل. + + + +يجب أن يتضمن ملف البيانات الوصفية عمود `file_name` لربط ملف صوتي بالبيانات الوصفية الخاصة به: + +```csv +file_name,transcription +data/first_audio_file.mp3,znowu się duch z ciałem zrośnie w młodocianej wstaniesz wiosnie i możesz skutkiem tych leków umierać wstawać wiek wieków dalej tam były przestrogi jak siekać głowę jak nogi +data/second_audio_file.mpmp3,już u źwierzyńca podwojów król zasiada przy nim książęta i panowie rada a gdzie wzniosły krążył ganek rycerze obok kochanek król skinął palcem zaczęto igrzysko +data/third_audio_file.mp3,pewnie kędyś w obłędzie ubite minęły szlaki zaczekajmy dzień jaki poślemy szukać wszędzie dziś jutro pewnie będzie posłali wszędzie sługi czekali dzień i drugi gdy nic nie doczekali z płaczem chcą jechać dali +``` + +بعد ذلك، يمكنك تخزين مجموعة البيانات الخاصة بك في هيكل دليل مثل هذا: + +``` +metadata.csv +data/first_audio_file.mp3 +data/second_audio_file.mp3 +data/third_audio_file.mp3 +``` + +يمكن للمستخدمين الآن تحميل مجموعة البيانات الخاصة بك والبيانات الوصفية المرتبطة بها من خلال تحديد `audiofolder` في [load_dataset] ومجلد مجموعة البيانات في `data_dir`: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("audiofolder", data_dir="/path/to/data") +>>> dataset["train"][0] +{'audio': + {'path': '/path/to/extracted/audio/first_audio_file.mp3', + 'array': array([ 0.00088501, 0.0012207 , 0.00131226, ..., -0.00045776, -0.00054932, -0.00054932], dtype=float32), + 'sampling_rate': 16000}, + 'transcription': 'znowu się duch z ciałem zrośnie w młodocianej wstaniesz wiosnie i możesz skutkiem tych leków umierać wstawać wiek wieków dalej tam były przestrogi jak siekać głowę jak nogi' +} +``` + +يمكنك أيضًا استخدام `audiofolder` لتحميل مجموعات البيانات التي تنطوي على تقسيمات متعددة. للقيام بذلك، قد يكون هيكل دليل مجموعة البيانات الخاصة بك على النحو التالي: + +``` +data/train/first_train_audio_file.mp3 +data/train/second_train_audio_file.mp3 + +data/test/first_test_audio_file.mp3 +data/test/second_test_audio_file.mp3 +``` + + + +لاحظ أنه إذا لم تكن ملفات الصوت موجودة بجوار ملف البيانات الوصفية، فيجب أن يكون عمود `file_name` مسارًا نسبيًا كاملًا إلى ملف صوتي، وليس مجرد اسم الملف. + + + +بالنسبة لمجموعات البيانات الصوتية التي لا تحتوي على بيانات وصفية مرتبطة بها، يستنتج AudioFolder تلقائيًا تسميات الفئات لمجموعة البيانات بناءً على اسم الدليل. قد يكون هذا مفيدًا لمهام تصنيف الصوت. قد يبدو هيكل دليل مجموعة البيانات الخاصة بك كما يلي: + +``` +data/train/electronic/01.mp3 +data/train/punk/01.mp3 + +data/test/electronic/09.mp3 +data/test/punk/09.mp3 +``` + +قم بتحميل مجموعة البيانات باستخدام AudioFolder، وسيقوم بإنشاء عمود `label` من اسم الدليل (معرف اللغة): + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("audiofolder", data_dir="/path/to/data") +>>> dataset["train"][0] +{'audio': + {'path': '/path/to/electronic/01.mp3', + 'array': array([ 3.9714024e-07, 7.3031038e-07, 7.5640685e-07, ..., + -1.1963668e-01, -1.1681189e-01, -1.1244172e-01], dtype=float32), + 'sampling_rate': 44100}, + 'label': 0 # "electronic" +} +>>> dataset["train"][-1] +{'audio': + {'path': '/path/to/punk/01.mp3', + 'array': array([0.15237972, 0.13222949, 0.10627693, ..., 0.41940814, 0.37578005, + 0.33717662], dtype=float32), + 'sampling_rate': 44100}, + 'label': 1 # "punk" +} +``` + + + +إذا كانت جميع ملفات الصوت موجودة في مجلد واحد أو إذا لم تكن على نفس مستوى هيكل الدليل، فلن يتم إضافة عمود `label` تلقائيًا. إذا كنت بحاجة إليه، فقم بتعيين `drop_labels=False` بشكل صريح. + + + + + +تتوفر بعض مجموعات البيانات الصوتية، مثل تلك الموجودة في [مسابقات Kaggle](https://www.kaggle.com/competitions/kaggle-pog-series-s01e02/overview)، على ملفات بيانات وصفية منفصلة لكل تقسيم. شريطة أن تكون ميزات البيانات الوصفية هي نفسها لكل تقسيم، يمكن استخدام audiofolder لتحميل جميع التقسيمات مرة واحدة. إذا اختلفت ميزات البيانات الوصفية عبر كل تقسيم، فيجب تحميلها باستخدام مكالمات `load_dataset()` منفصلة. + + + +## (قديم) نص البرنامج النصي للتحميل + +اكتب نص برنامج تحميل مجموعة البيانات لإنشاء مجموعة بيانات يدويًا. + +يحدد نص البرنامج النصي تقسيمات مجموعة البيانات وتكويناتها، ويتعامل مع تنزيل وتوليد أمثلة مجموعة البيانات. + +يجب أن يكون لنص البرنامج النصي نفس اسم مجلد مجموعة البيانات أو المستودع الخاص بك: + +``` +my_dataset/ +├── README.md +├── my_dataset.py +└── data/ +``` + +يمكن أن يكون اسم مجلد `data` أي اسم تريده، ولا يجب أن يكون `data`. هذا المجلد اختياري، ما لم تكن تستضيف مجموعة البيانات الخاصة بك على Hub. + +يسمح هيكل الدليل هذا بتحميل مجموعة البيانات الخاصة بك في سطر واحد: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("path/to/my_dataset") +``` + +سيوضح هذا الدليل كيفية إنشاء نص برنامج نصي لمجموعة بيانات صوتية، وهو مختلف قليلاً عن إنشاء نص برنامج نصي لمجموعات البيانات النصية. + +تُخزن مجموعات البيانات الصوتية عادةً في أرشيفات `tar.gz` والتي تتطلب نهجًا خاصًا لدعم وضع التدفق. في حين أن التدفق غير مطلوب، فإننا نشجع بشدة على تنفيذ دعم التدفق في مجموعة البيانات الصوتية الخاصة بك حتى يتمكن المستخدمون الذين ليس لديهم الكثير من مساحة القرص من استخدام مجموعة البيانات الخاصة بك دون تنزيلها. تعرف على المزيد حول التدفق في دليل [Stream](./stream)! + +فيما يلي مثال باستخدام أرشيفات TAR: + +``` +my_dataset/ +├── README.md +├── my_dataset.py +└── data/ + ├── train.tar.gz + ├── test.tar.gz + └── metadata.csv +``` + +بالإضافة إلى تعلم كيفية إنشاء مجموعة بيانات قابلة للتدفق، ستتعلم أيضًا كيفية: + +- إنشاء فئة منشئ مجموعة بيانات. +- إنشاء تكوينات مجموعة البيانات. +- إضافة البيانات الوصفية لمجموعة البيانات. +- تنزيل وتحديد تقسيمات مجموعة البيانات. +- إنشاء مجموعة البيانات. +- تحميل مجموعة البيانات إلى Hub. + +أفضل طريقة للتعلم هي فتح نص برنامج نصي لمجموعة بيانات صوتية موجودة، مثل [Vivos](https://huggingface.co/datasets/vivos/blob/main/vivos.py)، واتباع التعليمات! + + + +يوضح هذا الدليل كيفية معالجة بيانات الصوت المخزنة في أرشيفات TAR - وهي الحالة الأكثر شيوعًا لمجموعات البيانات الصوتية. راجع مجموعة بيانات [minds14](https://huggingface.co/datasets/PolyAI/minds14/blob/main/minds14.py) للحصول على مثال لنص برنامج نصي صوتي يستخدم أرشيفات ZIP. + + + + + +لمساعدتك على البدء، قمنا بإنشاء قالب [نص برنامج نصي](https://github.com/huggingface/datasets/blob/main/templates/new_dataset_script.py) يمكنك نسخه واستخدامه كنقطة بداية! + + + +### إنشاء فئة منشئ مجموعة بيانات + +[GeneratorBasedBuilder] هي الفئة الأساسية لمجموعات البيانات التي تم إنشاؤها من مولد قاموس. داخل هذه الفئة، هناك ثلاث طرق للمساعدة في إنشاء مجموعة البيانات الخاصة بك: + +- `_info` تخزن معلومات حول مجموعة البيانات الخاصة بك مثل الوصف والترخيص والميزات. +- `_split_generators` يقوم بتنزيل مجموعة البيانات وتحديد تقسيماتها. +- `_generate_examples` يقوم بتوليد عينات مجموعة البيانات التي تحتوي على بيانات الصوت والميزات الأخرى المحددة في `info` لكل تقسيم. + +ابدأ بإنشاء فئة مجموعة البيانات الخاصة بك كفئة فرعية من [GeneratorBasedBuilder] وأضف الطرق الثلاث. لا تقلق بشأن ملء كل من هذه الطرق بعد، ستطورها على مدار الأقسام القليلة التالية: + +```py +class VivosDataset(datasets.GeneratorBasedBuilder): + """VIVOS is a free Vietnamese speech corpus consisting of 15 hours of recording speech prepared for + Vietnamese Automatic Speech Recognition task.""" + + def _info(self): + + def _split_generators(self, dl_manager): + + def _generate_examples(self, prompts_path, path_to_clips, audio_files): + +``` + +#### تكوينات متعددة + +في بعض الحالات، قد يكون لمجموعة البيانات أكثر من تكوين واحد. على سبيل المثال، تحتوي مجموعة بيانات [LibriVox Indonesia](https://huggingface.co/datasets/indonesian-nlp/librivox-indonesia) على عدة تكوينات تتوافق مع لغات مختلفة. + +لإنشاء تكوينات مختلفة، استخدم فئة [BuilderConfig] لإنشاء فئة فرعية لمجموعة البيانات الخاصة بك. المعلمة الوحيدة المطلوبة هي `name` للتكوين، والتي يجب تمريرها إلى مولد التكوين الفائق `__init__()`. وإلا، فيمكنك تحديد أي معلمات مخصصة تريدها في فئة التكوين الخاصة بك. + +```py +class LibriVoxIndonesiaConfig(datasets.BuilderConfig): + """BuilderConfig for LibriVoxIndonesia.""" + + def __init__(self, name, version, **kwargs): + self.language = kwargs.pop("language", None) + self.release_date = kwargs.pop("release_date", None) + self.num_clips = kwargs.pop("num_clips", None) + self.num_speakers = kwargs.pop("num_speakers", None) + self.validated_hr = kwargs.pop("validated_hr", None) + self.total_hr = kwargs.pop("total_hr", None) + self.size_bytes = kwargs.pop("size_bytes", None) + self.size_human = size_str(self.size_bytes) + description = ( + f"LibriVox-Indonesia speech to text dataset in {self.language} released on {self.release_date}. " + f"The dataset comprises {self.validated_hr} hours of transcribed speech data" + ) + super(LibriVoxIndonesiaConfig, self).__init__( + name=name, + version=datasets.Version(version), + description=description, + **kwargs, + ) +``` + +قم بتعريف تكويناتك في متغير الفئة `BUILDER_CONFIGS` داخل [GeneratorBasedBuilder]. في هذا المثال، يقوم المؤلف باستيراد اللغات من ملف [release_stats.py] منفصل [file](https://huggingface.co/datasets/indonesian-nlp/librivox-indonesia/blob/main/release_stats.py) من مستودعهم، ثم يقوم بالحلقة عبر كل لغة لإنشاء تكوين: + +```py +class LibriVoxIndonesia(datasets.GeneratorBasedBuilder): + DEFAULT_CONFIG_NAME = "all" + + BUILDER_CONFIGS = [ + LibriVoxIndonesiaConfig( + name=lang, + version=STATS["version"], + language=LANGUAGES[lang], + release_date=STATS["date"], + num_clips=lang_stats["clips"], + num_speakers=lang_stats["users"], + total_hr=float(lang_stats["totalHrs"]) if lang_stats["totalHrs"] else None, + size_bytes=int(lang_stats["size"]) if lang_stats["size"] else None, + ) + for lang, lang_stats in STATS["locales"].items() + ] +``` +عادةً، يحتاج المستخدمون إلى تحديد تكوين للتحميل في [load_dataset]، وإلا فسيتم ظهور خطأ ValueError. يمكنك تجنب ذلك عن طريق تعيين تكوين مجموعة البيانات الافتراضية للتحميل في DEFAULT_CONFIG_NAME. + +الآن إذا أراد المستخدمون تحميل التكوين البالي ( bal ) ، فيمكنهم استخدام اسم التكوين: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("indonesian-nlp/librivox-indonesia", "bal", split="train") +``` + +## إضافة بيانات وصفية للمجموعة البيانات + +إن إضافة معلومات حول مجموعة البيانات الخاصة بك تساعد المستخدمين على معرفة المزيد عنها. يتم تخزين هذه المعلومات في فئة [DatasetInfo] التي يتم إرجاعها بواسطة طريقة "info". يمكن للمستخدمين الوصول إلى هذه المعلومات عن طريق: + +```py +>>> from datasets import load_dataset_builder +>>> ds_builder = load_dataset_builder("vivos") +>>> ds_builder.info +``` + +هناك الكثير من المعلومات التي يمكنك تضمينها حول مجموعة البيانات الخاصة بك، ولكن بعض العناصر المهمة هي: + +1. `description` يقدم وصفًا موجزًا لمجموعة البيانات. +2. `features` تحدد أنواع أعمدة مجموعة البيانات. نظرًا لأنك تقوم بإنشاء برنامج تحميل صوتي، فستحتاج إلى تضمين ميزة [Audio] ومعدل أخذ العينات لمجموعة البيانات. +3. `homepage` يقدم رابطًا إلى الصفحة الرئيسية لمجموعة البيانات. +4. `license` تحدد الأذونات لاستخدام مجموعة البيانات كما هو محدد في نوع الترخيص. +5. `citation` هو اقتباس BibTeX لمجموعة البيانات. + + +ستلاحظ أن الكثير من معلومات مجموعة البيانات محددة مسبقًا في برنامج التحميل، مما يجعله أسهل في القراءة. هناك أيضًا ميزات [~Dataset.Features] أخرى يمكنك إدخالها، لذا تأكد من الاطلاع على القائمة الكاملة و[دليل الميزات](./about_dataset_features) لمزيد من التفاصيل. + + +```py +def _info(self): + return datasets.DatasetInfo( + description=_DESCRIPTION, + features=datasets.Features( + { + "speaker_id": datasets.Value("string"), + "path": datasets.Value("string"), + "audio": datasets.Audio(sampling_rate=16_000), + "sentence": datasets.Value("string"), + } + ), + supervised_keys=None, + homepage=_HOMEPAGE, + license=_LICENSE, + citation=_CITATION, + ) +``` + +## تنزيل مجموعة البيانات وتحديد التقسيمات + +الآن بعد أن أضفت بعض المعلومات حول مجموعة البيانات الخاصة بك، فإن الخطوة التالية هي تنزيل مجموعة البيانات وتحديد التقسيمات. + +1. استخدم طريقة [~DownloadManager.download] لتنزيل ملف البيانات الوصفية في _PROMPTS_URLS وأرشيف TAR الصوتي في _DATA_URL. تعيد هذه الطريقة مسار الملف/الأرشيف المحلي. في وضع البث، لا يقوم بتنزيل الملف (الملفات) ويعيد فقط عنوان URL للبث منه. تقبل هذه الطريقة ما يلي: + +* مسار نسبي لملف داخل مستودع مجموعة بيانات Hub (على سبيل المثال، في مجلد "data/") +* عنوان URL لملف مستضاف في مكان آخر +* قائمة (مُعشَّشة) أو قاموس بأسماء الملفات أو عناوين URL + +2. بعد تنزيل مجموعة البيانات، استخدم [SplitGenerator] لتنظيم ملفات الصوت وعبارات المطالبة في كل تقسيم. قم بتسمية كل تقسيم باسم قياسي مثل: `Split.TRAIN`، `Split.TEST`، و`SPLIT.Validation`. + +في معلمة `gen_kwargs`، حدد مسار الملف إلى `prompts_path` و`path_to_clips`. بالنسبة إلى `audio_files`، ستحتاج إلى استخدام [~DownloadManager.iter_archive] للتنقل خلال ملفات الصوت في أرشيف TAR. يمكّن هذا البث لمجموعة البيانات الخاصة بك. يتم تمرير جميع مسارات الملفات هذه إلى الخطوة التالية حيث تقوم فعليًا بإنشاء مجموعة البيانات. + +```py +def _split_generators(self, dl_manager): + """Returns SplitGenerators.""" + prompts_paths = dl_manager.download(_PROMPTS_URLS) + archive = dl_manager.download(_DATA_URL) + train_dir = "vivos/train" + test_dir = "vivos/test" + + return [ + datasets.SplitGenerator( + name=datasets.Split.TRAIN, + gen_kwargs={ + "prompts_path": prompts_paths["train"], + "path_to_clips": train_dir + "/waves", + "audio_files": dl_manager.iter_archive(archive), + }, + ), + datasets.SplitGenerator( + name=datasets.Split.TEST, + gen_kwargs={ + "prompts_path": prompts_paths["test"], + "path_to_clips": test_dir + "/waves", + "audio_files": dl_manager.iter_archive(archive), + }, + ), + ] +``` + + +لا يقوم هذا التنفيذ باستخراج الأرشيفات التي تم تنزيلها. إذا كنت تريد استخراج الملفات بعد التنزيل، فيجب عليك أيضًا استخدام [~DownloadManager.extract]، راجع قسم [(Advanced) Extract TAR archives](#advanced-extract-tar-archives-locally). + + +## إنشاء مجموعة البيانات + +تعد طريقة [GeneratorBasedBuilder] الأخيرة في الفئة هي التي تقوم بالفعل بتوليد العينات في مجموعة البيانات. يقوم بإنتاج مجموعة بيانات وفقًا للهيكل المحدد في `features` من طريقة "info". كما ترى، تقبل `generate_examples` `prompts_path`، و`path_to_clips`، و`audio_files` من الطريقة السابقة كحجج. + +يتم الوصول إلى الملفات داخل أرشيفات TAR وإنتاجها بالتتابع. وهذا يعني أنك تحتاج إلى الحصول على البيانات الوصفية المرتبطة بملفات الصوت في ملف TAR في متناول اليد أولاً حتى تتمكن من إنتاجها مع ملف الصوت المقابل لها. + +```py +examples = {} +with open(prompts_path, encoding="utf-8") as f: + for row in f: + data = row.strip().split(" ", 1) + speaker_id = data[0].split("_")[0] + audio_path = "/".join([path_to_clips, speaker_id, data[0] + ".wav"]) + examples[audio_path] = { + "speaker_id": speaker_id, + "path": audio_path, + "sentence": data[1], + } +``` + +أخيرًا، قم بالتنقل خلال الملفات في `audio_files` وإنتاجها مع البيانات الوصفية المقابلة. يعيد [~DownloadManager.iter_archive] زوجًا من (`path`، `f`) حيث `path` هو مسار **نسبي** إلى ملف داخل أرشيف TAR و`f` هو كائن الملف نفسه. + +```py +inside_clips_dir = False +id_ = 0 +for path, f in audio_files: + if path.startswith(path_to_clips): + inside_clips_dir = True + if path in examples: + audio = {"path": path, "bytes": f.read()} + yield id_, {**examples[path], "audio": audio} + id_ += 1 + elif inside_clips_dir: + break +``` + +ضع هاتين الخطوتين معًا، ويجب أن تبدو طريقة `_generate_examples` الكاملة كما يلي: + +```py +def _generate_examples(self, prompts_path, path_to_clips, audio_files): + """Yields examples as (key, example) tuples.""" + examples = {} + with open(prompts_path, encoding="utf-8") as f: + for row in f: + data = row.strip().split(" ", 1) + speaker_id = data[0].split("_")[0] + audio_path = "/".join([path_to_clips, speaker_id, data[0] + ".wav"]) + examples[audio_path] = { + "speaker_id": speaker_id, + "path": audio_path, + "sentence": data[1], + } + inside_clips_dir = False + id_ = 0 + for path, f in audio_files: + if path.startswith(path_to_clips): + inside_clips_dir = True + if path in examples: + audio = {"path": path, "bytes": f.read()} + yield id_, {**examples[path], "audio": audio} + id_ += 1 + elif inside_clips_dir: + break +``` + +## تحميل مجموعة البيانات إلى Hub + +بمجرد أن يكون برنامجك جاهزًا، [أنشئ بطاقة مجموعة بيانات](./dataset_card) و[حمّلها إلى Hub](./share). + +تهانينا، يمكنك الآن تحميل مجموعة البيانات الخاصة بك من Hub! 🥳 + +```py +>>> from datasets import load_dataset +>>> load_dataset("/my_dataset") +``` + +## (متقدم) استخراج أرشيفات TAR محليًا + +في المثال أعلاه، لا يتم استخراج الأرشيفات التي تم تنزيلها وبالتالي لا تحتوي العينات على معلومات حول مكان تخزينها محليًا. + +لشرح كيفية إجراء الاستخراج بطريقة تدعم البث أيضًا، سنلقي نظرة سريعة على برنامج تحميل [LibriVox Indonesia](https://huggingface.co/datasets/indonesian-nlp/librivox-indonesia/blob/main/librivox-indonesia.py) النصي. + +#### تنزيل مجموعة البيانات وتحديد التقسيمات + +1. استخدم طريقة [~DownloadManager.download] لتنزيل بيانات الصوت في _AUDIO_URL. + +2. لاستخراج أرشيف الصوت TAR محليًا، استخدم [~DownloadManager.extract]. يمكنك استخدام هذه الطريقة فقط في وضع عدم البث (عندما `dl_manager.is_streaming=False`). يعيد هذا مسارًا محليًا إلى دليل الأرشيف المستخرج: + +```py +local_extracted_archive = dl_manager.extract(audio_path) if not dl_manager.is_streaming else None +``` + +3. استخدم طريقة [~DownloadManager.iter_archive] للتنقل خلال الأرشيف في `audio_path`، تمامًا كما في مثال Vivos أعلاه. لا يوفر [~DownloadManager.iter_archive] أي معلومات حول المسارات الكاملة للملفات من الأرشيف، حتى إذا تم استخراجه. ونتيجة لذلك، تحتاج إلى تمرير مسار `local_extracted_archive` إلى الخطوة التالية في `gen_kwargs`، من أجل الحفاظ على المعلومات حول المكان الذي تم استخراج الأرشيف إليه. هذا مطلوب لبناء المسارات الصحيحة إلى الملفات المحلية عند إنشاء العينات. + + +السبب في حاجتك إلى استخدام مزيج من [~DownloadManager.download] و[~DownloadManager.iter_archive] هو أنه لا يمكن الوصول إلى الملفات في أرشيفات TAR مباشرة من خلال مساراتها. بدلاً من ذلك، ستحتاج إلى التنقل خلال الملفات داخل الأرشيف! يمكنك استخدام [~DownloadManager.download_and_extract] و[~DownloadManager.extract] مع أرشيفات TAR في وضع عدم البث فقط، وإلا فسيتم إلقاء خطأ. + + +4. استخدم طريقة [~DownloadManager.download_and_extract] لتنزيل ملف البيانات الوصفية المحدد في _METADATA_URL. تعيد هذه الطريقة مسارًا إلى ملف محلي في وضع عدم البث. في وضع البث، لا يقوم بتنزيل الملف محليًا ويعيد نفس عنوان URL. + +5. الآن استخدم [SplitGenerator] لتنظيم ملفات الصوت والبيانات الوصفية في كل تقسيم. قم بتسمية كل تقسيم باسم قياسي مثل: `Split.TRAIN`، `Split.TEST`، و`SPLIT.Validation`. + +في معلمة `gen_kwargs`، حدد مسارات الملفات إلى `local_extracted_archive`، و`audio_files`، و`metadata_path`، و`path_to_clips`. تذكر، بالنسبة إلى `audio_files`، فأنت بحاجة إلى استخدام [~DownloadManager.iter_archive] للتنقل خلال ملفات الصوت في أرشيفات TAR. يمكّن هذا البث لمجموعة البيانات الخاصة بك! يتم تمرير جميع مسارات الملفات هذه إلى الخطوة التالية حيث يتم إنشاء عينات مجموعة البيانات. + +```py +def _split_generators(self, dl_manager): + """Returns SplitGenerators.""" + dl_manager.download_config.ignore_url_params = True + + audio_path = dl_manager.download(_AUDIO_URL) + local_extracted_archive = dl_manager.extract(audio_path) if not dl_manager.is_streaming else None + path_to_clips = "librivox-indonesia" + + return [ + datasets.SplitGenerator( + name=datasets.Split.TRAIN, + gen_kwargs={ + "local_extracted_archive": local_extracted_archive, + "audio_files": dl_manager.iter_archive(audio_path), + "metadata_path": dl_manager.download_and_extract(_METADATA_URL + "/metadata_train.csv.gz"), + "path_to_clips": path_to_clips, + }, + ), + datasets.SplitGenerator( + name=datasets.Split.TEST, + gen_kwargs={ + "local_extracted_archive": local_extracted_archive, + "audio_files": dl_manager.iter_archive(audio_path), + "metadata_path": dl_manager.download_and_extract(_METADATA_URL + "/metadata_test.csv.gz"), + "path_to_clips": path_to_clips, + }, + ), + ] +``` + +#### إنشاء مجموعة البيانات + +هنا، تقبل `_generate_examples` `local_extracted_archive`، و`audio_files`، و`metadata_path`، و`path_to_clips` من الطريقة السابقة كحجج. + +1. يتم الوصول إلى ملفات TAR وإنتاجها بالتتابع. وهذا يعني أنك تحتاج إلى الحصول على البيانات الوصفية في `metadata_path` المرتبطة بملفات الصوت في ملف TAR في متناول اليد أولاً حتى تتمكن من إنتاجها مع ملف الصوت المقابل لها لاحقًا: + +```py +with open(metadata_path, "r", encoding="utf-8") as f: + reader = csv.DictReader(f) + for row in reader: + if self.config.name == "all" or self.config.name == row["language"]: + row["path"] = os.path.join(path_to_clips, row["path"]) + # if data is incomplete, fill with empty values + for field in data_fields: + if field not in row: + row[field] = "" + metadata[row["path"]] = row +``` + +2. الآن يمكنك إنتاج الملفات في أرشيف `audio_files`. عندما تستخدم [~DownloadManager.iter_archive]، فإنه ينتج زوجًا من (`path`، `f`) حيث `path` هو مسار **نسبي** إلى ملف داخل الأرشيف، و`f` هو كائن الملف نفسه. للحصول على المسار **الكامل** إلى الملف المستخرج محليًا، قم بدمج مسار الدليل (`local_extracted_path`) الذي تم استخراج الأرشيف إليه ومسار ملف الصوت النسبي (`path`): + +```py +for path, f in audio_files: + if path in metadata: + result = dict(metadata[path]) + # set the audio feature and the path to the extracted file + path = os.path.join(local_extracted_archive, path) if local_extracted_archive else path + result["audio"] = {"path": path, "bytes": f.read()} + result["path"] = path + yield id_, result + id_ += 1 +```` + +ضع هاتين الخطوتين معًا، ويجب أن تبدو طريقة `_generate_examples` الكاملة كما يلي: + +```py +def _generate_examples( + self, + local_extracted_archive, + audio_files, + metadata_path, + path_to_clips, + ): + """Yields examples.""" + data_fields = list(self._info().features.keys()) + metadata = {} + with open(metadata_path, "r", encoding="utf-8") as f: + reader = csv.DictReader(f) + for row in reader: + if self.config.name == "all" or self.config.name == row["language"]: + row["path"] = os.path.join(path_to_clips, row["path"]) + # if data is incomplete, fill with empty values + for field in data_fields: + if field not in row: + row[field] = "" + metadata[row["path"]] = row + id_ = 0 + for path, f in audio_files: + if path in metadata: + result = dict(metadata[path]) + # set the audio feature and the path to the extracted file + path = os.path.join(local_extracted_archive, path) if local_extracted_archive else path + result["audio"] = {"path": path, "bytes": f.read()} + result["path"] = path + yield id_, result + id_ += 1 +``` \ No newline at end of file diff --git a/docs/source/ar/audio_load.mdx b/docs/source/ar/audio_load.mdx new file mode 100644 index 00000000000..36f7a40b0f6 --- /dev/null +++ b/docs/source/ar/audio_load.mdx @@ -0,0 +1,92 @@ +# تحميل بيانات الصوت + +يمكنك تحميل مجموعة بيانات صوتية باستخدام ميزة [`Audio`] التي تقوم تلقائيًا بفك ترميز ملفات الصوت وإعادة أخذ العينات عند الوصول إلى الأمثلة. يعتمد فك ترميز الصوت على حزمة [`soundfile`](https://github.com/bastibe/python-soundfile) Python، والتي تستخدم مكتبة [`libsndfile`](https://github.com/libsndfile/libsndfile) C تحت الغطاء. + +## التثبيت + +للعمل مع مجموعات البيانات الصوتية، يجب أن يكون لديك تبعيات `audio` المثبتة. راجع دليل [التثبيت](./installation#audio) لمعرفة كيفية تثبيته. + +## الملفات المحلية + +يمكنك تحميل مجموعة البيانات الخاصة بك باستخدام مسارات ملفات الصوت الخاصة بك. استخدم دالة [`~Dataset.cast_column`] لأخذ عمود من مسارات ملفات الصوت، وتحويله إلى ميزة [`Audio`]: + +```py +>>> audio_dataset = Dataset.from_dict({"audio": ["path/to/audio_1", "path/to/audio_2", ..., "path/to/audio_n"]}).cast_column("audio", Audio()) +>>> audio_dataset[0]["audio"] +{'array': array([ 0. , 0.00024414, -0.00024414, ..., -0.00024414, +0. , 0. ], dtype=float32), +'path': 'path/to/audio_1', +'sampling_rate': 16000} +``` + +## AudioFolder + +يمكنك أيضًا تحميل مجموعة بيانات باستخدام برنامج بناء مجموعة بيانات `AudioFolder`. لا يتطلب كتابة برنامج تحميل بيانات مخصص، مما يجعله مفيدًا لإنشاء مجموعات بيانات صوتية وتحميلها بسرعة مع عدة آلاف من ملفات الصوت. + +## AudioFolder مع البيانات الوصفية + +لربط ملفات الصوت الخاصة بك بمعلومات البيانات الوصفية، تأكد من احتواء مجموعة البيانات الخاصة بك على ملف `metadata.csv`. قد يبدو هيكل مجموعة البيانات الخاصة بك كما يلي: + +``` +folder/train/metadata.csv +folder/train/first_audio_file.mp3 +folder/train/second_audio_file.mp3 +folder/train/third_audio_file.mp3 +``` + +يجب أن يحتوي ملف `metadata.csv` الخاص بك على عمود `file_name` يربط ملفات الصوت بالبيانات الوصفية الخاصة بها. قد يبدو ملف `metadata.csv` المثال كما يلي: + +```text +file_name,transcription +first_audio_file.mp3,znowu się duch z ciałem zrośnie w młodocianej wstaniesz wiosnie i możesz skutkiem tych leków umierać wstawać wiek wieków dalej tam były przestrogi jak siekać głowę jak nogi +second_audio_file.mp3,już u źwierzyńca podwojów król zasiada przy nim książęta i panowie rada a gdzie wzniosły krążył ganek rycerze obok kochanek król skinął palcem zaczęto igrzysko +third_audio_file.mp3,pewnie kędyś w obłędzie ubite minęły szlaki zaczekajmy dzień jaki poślemy szukać wszędzie dziś jutro pewnie będzie posłali wszędzie sługi czekali dzień i drugi gdy nic nie doczekali z płaczem chcą jechać dali +``` + +سيقوم `AudioFolder` بتحميل بيانات الصوت وإنشاء عمود `transcription` يحتوي على نصوص من `metadata.csv`: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("audiofolder", data_dir="/path/to/folder") +>>> # OR by specifying the list of files +>>> dataset = load_dataset("audiofolder", data_files=["path/to/audio_1", "path/to/audio_2", ..., "path/to/audio_n"]) +``` + +يمكنك تحميل مجموعات البيانات البعيدة من عناوين URL الخاصة بها باستخدام معلمة data_files: + +```py +>>> dataset = load_dataset("audiofolder", data_files=["https://foo.bar/audio_1", "https://foo.bar/audio_2", ..., "https://foo.bar/audio_n"]) +>>> # for example, pass SpeechCommands archive: +>>> dataset = load_dataset("audiofolder", data_files="https://s3.amazonaws.com/datasets.huggingface.co/SpeechCommands/v0.01/v0.01_test.tar.gz") +``` + +يمكن أيضًا تحديد البيانات الوصفية بتنسيق JSON Lines، وفي هذه الحالة استخدم `metadata.jsonl` كاسم لملف البيانات الوصفية. هذا التنسيق مفيد في السيناريوهات التي يكون فيها أحد الأعمدة معقدًا، مثل قائمة من الأرقام العائمة، لتجنب أخطاء التحليل أو قراءة القيم المعقدة كسلاسل. + +لتجاهل المعلومات الموجودة في ملف البيانات الوصفية، قم بتعيين `drop_metadata=True` في [`load_dataset`]: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("audiofolder", data_dir="/path/to/folder", drop_metadata=True) +``` + +إذا لم يكن لديك ملف بيانات وصفية، يستنتج `AudioFolder` تلقائيًا اسم التسمية التوضيحية من اسم الدليل. + +إذا كنت تريد إسقاط التسميات التوضيحية التي تم إنشاؤها تلقائيًا، فقم بتعيين `drop_labels=True`. + +في هذه الحالة، ستتضمن مجموعة البيانات الخاصة بك عمود صوت فقط: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("audiofolder", data_dir="/path/to/folder_without_metadata", drop_labels=True) +``` + + + +للحصول على مزيد من المعلومات حول إنشاء مجموعة بيانات `AudioFolder` الخاصة بك، راجع دليل [إنشاء مجموعة بيانات صوتية](./audio_dataset). + + + +للاطلاع على دليل حول كيفية تحميل أي نوع من مجموعات البيانات، راجع دليل التحميل العام. \ No newline at end of file diff --git a/docs/source/ar/audio_process.mdx b/docs/source/ar/audio_process.mdx new file mode 100644 index 00000000000..102e4b1fb9e --- /dev/null +++ b/docs/source/ar/audio_process.mdx @@ -0,0 +1,71 @@ +# معالجة البيانات الصوتية + +يُظهر هذا الدليل طرقًا محددة لمعالجة مجموعات البيانات الصوتية. تعلم كيفية: + +- إعادة أخذ عينات من معدل العينات. +- استخدام [`~Dataset.map`] مع مجموعات البيانات الصوتية. + +للحصول على دليل حول كيفية معالجة أي نوع من مجموعات البيانات، راجع دليل العملية العامة. + +## الصب + +تُستخدم دالة [`~Dataset.cast_column`] لصب عمود إلى ميزة أخرى ليتم فك تشفيرها. عندما تستخدم هذه الدالة مع ميزة [`Audio`]`Audio`، يمكنك إعادة أخذ عينات من معدل العينات: + +```py +>>> from datasets import load_dataset, Audio + +>>> dataset = load_dataset("PolyAI/minds14", "en-US", split="train") +>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16000)) +``` + +يتم فك تشفير ملفات الصوت وإعادة أخذ العينات أثناء التنقل، لذلك في المرة التالية التي تصل فيها إلى مثال، يتم إعادة أخذ عينات من ملف الصوت إلى 16 كيلو هرتز: + +```py +>>> dataset[0]["audio"] +{'array': array([ 2.3443763e-05, 2.1729663e-04, 2.2145823e-04, ..., +3.8356509e-05, -7.3497440e-06, -2.1754686e-05], dtype=float32), +'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav', +'sampling_rate': 16000} +``` + +
+ + +
+ +## خريطة + +تساعد دالة [`~Dataset.map`] في معالجة مجموعة البيانات بأكملها مرة واحدة. اعتمادًا على نوع النموذج الذي تعمل عليه، ستحتاج إلى تحميل إما [مستخرج الميزات](https://huggingface.co/docs/transformers/model_doc/auto#transformers.AutoFeatureExtractor) أو [معالج](https://huggingface.co/docs/transformers/model_doc/auto#transformers.AutoProcessor). + +- بالنسبة لنماذج التعرف على الكلام المُدربة مسبقًا، قم بتحميل مستخرج ميزات ومُعلم رموز ودمجهما في معالج: + +```py +>>> from transformers import AutoTokenizer, AutoFeatureExtractor, AutoProcessor + +>>> model_checkpoint = "facebook/wav2vec2-large-xlsr-53" +# بعد تحديد ملف vocab.json، يمكنك إنشاء كائن tokenizer: +>>> tokenizer = AutoTokenizer("./vocab.json", unk_token="[UNK]", pad_token="[PAD]", word_delimiter_token="|") +>>> feature_extractor = AutoFeatureExtractor.from_pretrained(model_checkpoint) +>>> processor = AutoProcessor.from_pretrained(feature_extractor=feature_extractor, tokenizer=tokenizer) +``` + +- بالنسبة لنماذج التعرف على الكلام الدقيقة، فأنت بحاجة فقط إلى تحميل معالج: + +```py +>>> from transformers import AutoProcessor + +>>> processor = AutoProcessor.from_pretrained("facebook/wav2vec2-base-960h") +``` + +عندما تستخدم [`~Dataset.map`] مع دالة المعالجة المسبقة، قم بتضمين عمود "الصوت" للتأكد من إعادة أخذ عينات بيانات الصوت بالفعل: + +```py +>>> def prepare_dataset(batch): +... audio = batch["audio"] +... batch["input_values"] = processor(audio["array"], sampling_rate=audio["sampling_rate"]).input_values[0] +... batch["input_length"] = len(batch["input_values"]) +... with processor.as_target_processor(): +... batch["labels"] = processor(batch["sentence"]).input_ids +... return batch +>>> dataset = dataset.map(prepare_dataset, remove_columns=dataset.column_names) +``` diff --git a/docs/source/ar/cache.mdx b/docs/source/ar/cache.mdx new file mode 100644 index 00000000000..f9f4d5a4481 --- /dev/null +++ b/docs/source/ar/cache.mdx @@ -0,0 +1,80 @@ +# إدارة الذاكرة المؤقتة + +عند تنزيل مجموعة بيانات، يتم تخزين بيانات البرنامج النصي للمعالجة والبيانات محليًا على جهاز الكمبيوتر الخاص بك. تسمح الذاكرة المؤقتة لـ 🤗 Datasets بتجنب إعادة تنزيل مجموعة البيانات أو معالجتها كل مرة تستخدمها فيها. + +سيوضح هذا الدليل كيفية: + +- تغيير دليل الذاكرة المؤقتة. +- التحكم في كيفية تحميل مجموعة البيانات من الذاكرة المؤقتة. +- تنظيف ملفات الذاكرة المؤقتة في الدليل. +- تمكين أو تعطيل التخزين المؤقت. + +## دليل الذاكرة المؤقتة + +دليل الذاكرة المؤقتة الافتراضي هو `~/.cache/huggingface/datasets`. لتغيير موقع الذاكرة المؤقتة، قم بتعيين متغير البيئة الخاص بـ shell، `HF_DATASETS_CACHE` إلى دليل آخر: + +``` +$ export HF_DATASETS_CACHE="/path/to/another/directory" +``` + +عند تحميل مجموعة بيانات، لديك أيضًا خيار تغيير المكان الذي يتم فيه تخزين البيانات مؤقتًا. قم بتغيير `cache_dir` المعلمة إلى المسار الذي تريده: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('LOADING_SCRIPT', cache_dir="PATH/TO/MY/CACHE/DIR") +``` + +## وضع التنزيل + +بعد تنزيل مجموعة بيانات، يمكنك التحكم في كيفية تحميلها بواسطة [`load_dataset`] مع `download_mode` المعلمة. بشكل افتراضي، سيقوم 🤗 Datasets بإعادة استخدام مجموعة بيانات إذا كانت موجودة. ولكن إذا كنت بحاجة إلى مجموعة البيانات الأصلية دون تطبيق أي وظائف معالجة، فأعد تنزيل الملفات كما هو موضح أدناه: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('squad', download_mode='force_redownload') +``` + +راجع [`DownloadMode`] للحصول على قائمة كاملة بوضعيات التنزيل. + +## ملفات ذاكرة التخزين المؤقت + +قم بتنظيف ملفات ذاكرة التخزين المؤقت في الدليل باستخدام [`Dataset.cleanup_cache_files`]: + +```py +# Returns the number of removed cache files +>>> dataset.cleanup_cache_files() +2 +``` + +## تمكين أو تعطيل التخزين المؤقت + +إذا كنت تستخدم ملف ذاكرة التخزين المؤقت محليًا، فسيتم تلقائيًا إعادة تحميل مجموعة البيانات مع أي تحويلات سابقة قمت بتطبيقها على مجموعة البيانات. قم بتعطيل هذا السلوك عن طريق تعيين الحجة `load_from_cache_file=False` في [`Dataset.map`]: + +```py +>>> updated_dataset = small_dataset.map(add_prefix, load_from_cache_file=False) +``` + +في المثال أعلاه، سيقوم 🤗 Datasets بتنفيذ الدالة `add_prefix` على مجموعة البيانات بالكامل مرة أخرى بدلاً من تحميل مجموعة البيانات من حالتها السابقة. + +قم بتعطيل التخزين المؤقت على نطاق عالمي باستخدام [`disable_caching`]: + +```py +>>> from datasets import disable_caching +>>> disable_caching() +``` + +عندما تقوم بتعطيل التخزين المؤقت، لن يقوم 🤗 Datasets بإعادة تحميل ملفات ذاكرة التخزين المؤقت عند تطبيق التحويلات على مجموعات البيانات. يجب إعادة تطبيق أي تحويل تقوم بتطبيقه على مجموعة البيانات الخاصة بك. + + + +إذا كنت تريد إعادة استخدام مجموعة بيانات من الصفر، فحاول تعيين `download_mode` المعلمة في [`load_dataset`] بدلا من ذلك. + + + + + +## تحسين الأداء + +سيؤدي تعطيل الذاكرة المؤقتة ونسخ مجموعة البيانات في الذاكرة إلى تسريع عمليات مجموعة البيانات. هناك خياران لنسخ مجموعة البيانات في الذاكرة: + +1. قم بتعيين `datasets.config.IN_MEMORY_MAX_SIZE` إلى قيمة غير صفرية (بالبايت) والتي تناسب ذاكرة الوصول العشوائي (RAM). +2. قم بتعيين متغير البيئة `HF_DATASETS_IN_MEMORY_MAX_SIZE` إلى قيمة غير صفرية. لاحظ أن الطريقة الأولى لها الأسبقية. \ No newline at end of file diff --git a/docs/source/ar/cli.mdx b/docs/source/ar/cli.mdx new file mode 100644 index 00000000000..32850e71dc7 --- /dev/null +++ b/docs/source/ar/cli.mdx @@ -0,0 +1,102 @@ +لم يتم العثور على أي نص باللغة العربية في النص الأصلي، وبالتالي لا يلزم إجراء أي ترجمة للنص العربي. + +# واجهة سطر الأوامر (CLI) + +🤗 يوفر Datasets واجهة سطر أوامر (CLI) مع أوامر Shell مفيدة للتفاعل مع مجموعة البيانات الخاصة بك. + +يمكنك التحقق من الأوامر المتاحة: + +```bash +>>> datasets-cli --help +usage: datasets-cli [] + +الحجج الموضعية: +{convert, env, test, dummy_data, convert_to_parquet} +مساعدات أوامر datasets-cli +convert تحويل مجموعة بيانات TensorFlow Datasets إلى مجموعة بيانات HuggingFace Datasets. +env طباعة معلومات بيئة النظام ذات الصلة. +test اختبار تنفيذ مجموعة البيانات. +dummy_data إنشاء بيانات وهمية. +convert_to_parquet تحويل مجموعة البيانات إلى Parquet +delete_from_hub حذف تكوين مجموعة البيانات من Hub + +الحجج الاختيارية: +-h، --help إظهار رسالة المساعدة والخروج +``` + +## التحويل إلى Parquet + +قم بسهولة بتحويل مجموعة بيانات [script-based dataset](dataset_script) الخاصة بـ Hub إلى [data-only dataset](repository_structure) بتنسيق Parquet، بحيث يتم دعم عارض مجموعة البيانات. + +```bash +>>> datasets-cli convert_to_parquet --help +usage: datasets-cli [] convert_to_parquet [-h] [--token TOKEN] [--revision REVISION] [--trust_remote_code] dataset_id + +الحجج الموضعية: +dataset_id معرف مجموعة البيانات المصدر، على سبيل المثال USERNAME/DATASET_NAME أو ORGANIZATION/DATASET_NAME + +الحجج الاختيارية: +-h، --help إظهار رسالة المساعدة والخروج +--token TOKEN رمز الوصول إلى Hub Hugging Face (افتراضيًا رمز مستخدم المستخدم المسجل دخوله) +--revision REVISION المراجعة المصدر +--trust_remote_code ما إذا كان سيتم الوثوق بتنفيذ التعليمات البرمجية البعيدة لبرنامج التحميل +``` + +يقوم هذا الأمر بما يلي: + +- إنشاء نسخة من البرنامج النصي في فرع "main" في فرع مخصص يسمى "script" (إذا لم يكن موجودًا بالفعل) +- إنشاء طلب سحب إلى مجموعة بيانات Hub لتحويلها إلى ملفات Parquet (وحذف البرنامج النصي من الفرع الرئيسي) + +إذا كنت بحاجة إلى إعادة إنشاء ملفات Parquet من فرع "script" في المستقبل، قم بتمرير وسيط `--revision script`. + +لاحظ أنه يجب تمرير وسيط `--trust_remote_code` فقط إذا كنت تثق في تنفيذ التعليمات البرمجية عن بُعد على جهازك المحلي. + +على سبيل المثال: + +```bash +>>> datasets-cli convert_to_parquet USERNAME/DATASET_NAME +``` + + + +لا تنس أنه يلزمك تسجيل الدخول أولاً إلى حساب Hugging Face الخاص بك: + +```bash +>>> huggingface-cli login +``` + + + +## الحذف من Hub + +احذف تكوين مجموعة البيانات من [data-only dataset](repository_structure) على Hub. + +```bash +>>> datasets-cli delete_from_hub --help +usage: datasets-cli [] delete_from_hub [-h] [--token TOKEN] [--revision REVISION] dataset_id config_name + +الحجج الموضعية: +dataset_id معرف مجموعة البيانات المصدر، على سبيل المثال USERNAME/DATASET_NAME أو ORGANIZATION/DATASET_NAME +config_name اسم التكوين الذي سيتم حذفه + +الحجج الاختيارية: +-h، --help إظهار رسالة المساعدة والخروج +--token TOKEN رمز الوصول إلى Hub Hugging Face +--revision REVISION مراجعة المصدر +``` + +على سبيل المثال: + +```bash +>>> datasets-cli delete_from_hub USERNAME/DATASET_NAME CONFIG_NAME +``` + + + +لا تنس أنه يلزمك تسجيل الدخول أولاً إلى حساب Hugging Face الخاص بك: + +```bash +>>> huggingface-cli login +``` + + \ No newline at end of file diff --git a/docs/source/ar/create_dataset.mdx b/docs/source/ar/create_dataset.mdx new file mode 100644 index 00000000000..9095b696f2f --- /dev/null +++ b/docs/source/ar/create_dataset.mdx @@ -0,0 +1,133 @@ +?????????????????????? +لم ترغب في إنشاء مجموعة بيانات خاصة بك، فاتبع هذا البرنامج التعليمي لمعرفة كيفية القيام بذلك باستخدام الأساليب منخفضة الكود في مكتبة Datasets. + +## بناة يعتمدون على المجلدات + +هناك طريقتان منخفضتا الكود لإنشاء مجموعة بيانات بسرعة اعتمادًا على بنية المجلدات: + +- [`ImageFolder`] : لإنشاء مجموعة بيانات للصور. +- [`AudioFolder`] : لإنشاء مجموعة بيانات للكلام والصوت. + +تعد هذه الأساليب رائعة لنماذج النماذج الأولية السريعة قبل الانتقال إلى مجموعة بيانات أكبر. كل ما عليك هو تنظيم بياناتك في بنية المجلدات الصحيحة، وسيقوم الباني المعتمد على المجلدات بالباقي! + +### ImageFolder + +إذا كانت لديك صور منظمة في مجلدات، فيمكنك استخدام [`ImageFolder`] لإنشاء مجموعة بيانات بسرعة. يجب أن يكون لكل فئة مجلدها الخاص، ويجب أن تحتوي الصور على ملحقات صور مدعومة مثل jpg أو png. + +على سبيل المثال، إذا كان لديك مجموعة بيانات من صور بوكيمون، فقد يتم تنظيمها على النحو التالي: + +pokemon/train/grass/bulbasaur.png +pokemon/train/fire/charmander.png +pokemon/train/water/squirtle.png + +pokemon/test/grass/ivysaur.png +pokemon/test/fire/charmeleon.png +pokemon/test/water/wartortle.png + +سيقوم [`ImageFolder`] بإنشاء ميزات مجموعة البيانات والانقسامات والعلامات تلقائيًا بناءً على بنية المجلد. يستخدم [`ImageFolder`] [`~datasets.Image`] لترميز ملفات الصور، والتي تدعم العديد من تنسيقات ملفات الصور. يمكنك التحقق من [قائمة] (https://github.com/huggingface/datasets/blob/b5672a956d5de864e6f5550e493527d962d6ae55/src/datasets/packaged_modules/imagefolder/imagefolder.py#L39) من ملحقات الصور المدعومة. + +### AudioFolder + +بالنسبة لبيانات الصوت، يمكنك استخدام [`AudioFolder`] بالطريقة نفسها [`ImageFolder`] . يجب أن يكون لكل فئة مجلد خاص بها، ويجب أن تحتوي ملفات الصوت على ملحقات صوت مدعومة مثل wav أو mp3. + +على سبيل المثال، قد تبدو مجموعة بيانات الكلام على النحو التالي: + +
+ +
+ + +[`AudioFolder`] يستخدم [`~datasets.Audio`] لترميز ملفات الصوت، والتي تدعم العديد من تنسيقات ملفات الصوت. يمكنك التحقق من [قائمة] (https://github.com/huggingface/datasets/blob/b5672a956d5de864e6f5550e493527d962d6ae55/src/datasets/packaged_modules/audiofolder/audiofolder.py#L39) من ملحقات الصوت المدعومة. + +مثل [`ImageFolder`] ، [`AudioFolder`] سيقوم تلقائيًا بإنشاء ميزات مجموعة البيانات والانقسامات والعلامات بناءً على بنية المجلد. + +### إنشاء مجموعة بيانات + +لإنشاء مجموعة بيانات باستخدام أي من هذه الأساليب، ما عليك سوى تحديد المسار إلى المجلد الذي يحتوي على بياناتك. + +على سبيل المثال، لإنشاء مجموعة بيانات صورة، يمكنك استخدام [`load_dataset`] مع الحجة `imagefolder` : + +```بيثون +>>> من مجموعات البيانات استيراد load_dataset + +>>> dataset = load_dataset ("imagefolder"، data_dir = "/ path / to / pokemon") +``` + +بالنسبة لمجموعة بيانات الصوت، استخدم `audiofolder` بدلاً من ذلك: + +```بيثون +>>> من مجموعات البيانات استيراد load_dataset + +>>> dataset = load_dataset ("audiofolder"، data_dir = "/ path / to / folder") +``` + +سيؤدي ذلك إلى تحميل مجموعة البيانات الخاصة بك في [`Dataset`] الكائن، والذي يمكنك بعد ذلك استخدامه للتدريب أو المعالجة أو أي شيء آخر! + +يمكنك تضمين أي معلومات إضافية حول بياناتك، مثل التعليقات التوضيحية أو النسخ النصية، في ملف `metadata.csv` في المجلد الذي يحتوي على بياناتك. يجب أن يحتوي ملف التعريف على عمود `file_name` يربط ملف الصورة أو الصوت بالبيانات الوصفية المقابلة. + +على سبيل المثال، قد يبدو ملف التعريف لمجموعة بيانات بوكيمون على النحو التالي: + +``` +file_name، text +bulbasaur.png، هناك بذرة نبات على ظهره الأيمن منذ اليوم الذي ولد فيه هذا بوكيمون. +charmander.png، إنه يفضل الأشياء الساخنة. +سكويرتل. png، عندما يسحب رقبته الطويلة إلى قوقعته، فإنه يرش الماء بقوة شديدة. +``` + +لمعرفة المزيد حول [`ImageFolder`] و [`AudioFolder`] ، تحقق من أدلة [ImageFolder] (https://huggingface.co/docs/datasets/image_dataset#imagefolder) و [AudioFolder] (https://huggingface.co/docs/datasets/audio_dataset#audiofolder). + +## من ملفات محلية + +يمكنك أيضًا إنشاء مجموعة بيانات عن طريق تحديد المسار إلى ملفات البيانات المحلية الخاصة بك مباشرة. هناك طريقتان للقيام بذلك: [`~Dataset.from_generator`] و [`~Dataset.from_dict`] . + +### من مولد + +إذا كانت لديك وظيفة مولد، فيمكنك استخدام [`~Dataset.from_generator`] لإنشاء مجموعة بيانات. هذا مفيد بشكل خاص لمجموعات البيانات الكبيرة جدًا التي قد لا تناسب الذاكرة، لأن مجموعة البيانات يتم إنشاؤها تدريجيًا على القرص ثم يتم رسمها في الذاكرة. + +على سبيل المثال، يمكنك إنشاء مجموعة بيانات بوكيمون على النحو التالي: + +```بيثون +>>> من مجموعات البيانات استيراد Dataset +>>> ديف gen (): +... عائد {"بوكيمون": "بلباسور"، "نوع": "عشب"} +... عائد {"بوكيمون": "سكويرتل"، "نوع": "ماء"} +>>> ds = Dataset.from_generator (gen) +>>> ds [0] +{"بوكيمون": "بلباسور"، "نوع": "عشب"} +``` + +إذا كنت تريد استخدام مجموعة بيانات قابلة للتحديد، فيمكنك استخدام [`IterableDataset.from_generator`] بدلاً من ذلك: + +```بيثون +>>> من مجموعات البيانات استيراد IterableDataset +>>> ds = IterableDataset.from_generator (gen) +>>> ل example في ds: +... طباعة (مثال) +{"بوكيمون": "بلباسور"، "نوع": "عشب"} +{"بوكيمون": "سكويرتل"، "نوع": "ماء"} +``` + +### من القاموس + +إذا كانت لديك بياناتك في قاموس، فيمكنك استخدام [`~Dataset.from_dict`] لإنشاء مجموعة بيانات. ببساطة تمرير قاموسك إلى الأسلوب، وسيتم إنشاء مجموعة البيانات الخاصة بك! + +على سبيل المثال: + +```بيثون +>>> من مجموعات البيانات استيراد Dataset +>>> ds = Dataset.from_dict ({'بوكيمون': ['بلباسور'، 'سكويرتل']، 'نوع': ['عشب'، 'ماء']}) +>>> ds [0] +{"بوكيمون": "بلباسور"، "نوع": "عشب"} +``` + +لإنشاء مجموعة بيانات صورة أو صوت، يمكنك ربط [`~Dataset.cast_column`] الأسلوب [`~Dataset.from_dict`] . على سبيل المثال، لإنشاء مجموعة بيانات صوت، حدد العمود والنوع [`Audio`] : + +```بيثون +>>> audio_dataset = Dataset.from_dict ({'audio': ['path / to / audio_1'،... 'path / to / audio_n']}). cast_column ('audio', Audio ()) +``` + +## الخطوات التالية + +لم نذكر ذلك في البرنامج التعليمي، ولكن يمكنك أيضًا إنشاء مجموعة بيانات باستخدام نص برمجي تحميل. يعد هذا خيارًا أكثر كثافة في التعليمات البرمجية، ولكنه قد يكون مفيدًا في بعض الحالات النادرة. لمعرفة المزيد، راجع أدلة نص البرنامج النصي لتحميل [الصورة] (https://huggingface.co/docs/datasets/main/en/image_dataset#loading-script) و [الصوت] (https://huggingface.co/docs/datasets/main/en/audio_dataset) و [النص] (https://huggingface.co/docs/datasets/main/en/dataset_script). + +الآن بعد أن عرفت كيفية إنشاء مجموعة بيانات، فكر في مشاركتها على Hub حتى يتمكن المجتمع أيضًا من الاستفادة من عملك! انتقل إلى القسم التالي لمعرفة كيفية مشاركة مجموعة البيانات الخاصة بك. \ No newline at end of file diff --git a/docs/source/ar/dataset_card.mdx b/docs/source/ar/dataset_card.mdx new file mode 100644 index 00000000000..40b30f47e6f --- /dev/null +++ b/docs/source/ar/dataset_card.mdx @@ -0,0 +1,28 @@ +# إنشاء بطاقة مجموعة بيانات + +يجب أن تحتوي كل مجموعة بيانات على بطاقة مجموعة بيانات لتعزيز الاستخدام المسؤول وإعلام المستخدمين بأي تحيزات محتملة داخل مجموعة البيانات. استلهمت هذه الفكرة من بطاقات النموذج التي اقترحتها [Mitchell, 2018](https://arxiv.org/abs/1810.03993). + +تساعد بطاقات مجموعة البيانات المستخدمين على فهم محتويات مجموعة البيانات وسياق استخدامها وكيفية إنشائها وأي اعتبارات أخرى يجب أن يكون المستخدم على دراية بها. + +من السهل إنشاء بطاقة مجموعة بيانات ويمكن القيام بذلك في بضع خطوات فقط: + +1. انتقل إلى مستودع مجموعة البيانات الخاصة بك على [Hub](https://hf.co/new-dataset) وانقر على **إنشاء بطاقة مجموعة بيانات** لإنشاء ملف `README.md` جديد في مستودعك. + +2. استخدم واجهة مستخدم **Metadata** لتحديد العلامات التي تصف مجموعة البيانات الخاصة بك. يمكنك إضافة ترخيص ولغة وpretty_name وtask_categories وsize_categories وأي علامات أخرى تعتقد أنها ذات صلة. تساعد هذه العلامات المستخدمين على اكتشاف والعثور على مجموعة البيانات الخاصة بك على Hub. + +
+ + +
+ + + للحصول على مجموعة كاملة، ولكن غير مطلوبة، من خيارات العلامات، يمكنك أيضًا الاطلاع على [مواصفات بطاقة مجموعة البيانات](https://github.com/huggingface/hub-docs/blob/main/datasetcard.md?plain=1). سيكون لديك بعض خيارات العلامات الإضافية مثل `multilinguality` و`language_creators` والتي تكون مفيدة ولكنها غير ضرورية تمامًا. + + +3. انقر فوق رابط **استيراد قالب بطاقة مجموعة البيانات** لإنشاء قالب تلقائيًا بجميع الحقول ذات الصلة لإكمالها. قم بملء أقسام القالب على أفضل وجه ممكن. راجع [دليل إنشاء بطاقة مجموعة البيانات](https://github.com/huggingface/datasets/blob/main/templates/README_guide.md) للحصول على معلومات أكثر تفصيلاً حول ما يجب تضمينه في كل قسم من أقسام البطاقة. بالنسبة للحقول التي لا يمكنك إكمالها، يمكنك كتابة **[More Information Needed]**. + +4. بمجرد الانتهاء، قم بالالتزام بالتغييرات في ملف `README.md` وستشاهد بطاقة مجموعة البيانات المكتملة في مستودعك. + +يتيح YAML أيضًا تخصيص طريقة تحميل مجموعة البيانات الخاصة بك من خلال [تحديد التقسيمات و/أو التكوينات](./repository_structure#define-your-splits-and-subsets-in-yaml) دون الحاجة إلى كتابة أي رمز. + +لا تتردد في إلقاء نظرة على بطاقات مجموعة بيانات [SNLI](https://huggingface.co/datasets/snli) و[CNN/DailyMail](https://huggingface.co/datasets/cnn_dailymail) و[Allociné](https://huggingface.co/datasets/allocine) كمثال لمساعدتك في البدء. \ No newline at end of file diff --git a/docs/source/ar/dataset_script.mdx b/docs/source/ar/dataset_script.mdx new file mode 100644 index 00000000000..8d68e9c2bb6 --- /dev/null +++ b/docs/source/ar/dataset_script.mdx @@ -0,0 +1,144 @@ +# إنشاء نص برمجي لتحميل مجموعة بيانات + + + +من المحتمل ألا تكون هناك حاجة إلى النص البرمجي لتحميل مجموعة البيانات إذا كانت مجموعة البيانات الخاصة بك بإحدى الصيغ التالية: CSV أو JSON أو أسطر JSON أو نص أو صور أو صوت أو Parquet. + +مع هذه الصيغ، يجب أن تتمكن من تحميل مجموعة البيانات الخاصة بك تلقائيًا باستخدام [`~datasets.load_dataset`]، طالما أن مستودع مجموعة البيانات لديك يحتوي على [هيكل مطلوب](./repository_structure). + + + + + +لأسباب أمنية، لا تسمح مجموعات البيانات 🤗 بتشغيل نصوص تحميل مجموعة البيانات بشكل افتراضي، ويجب عليك تمرير `trust_remote_code=True` لتحميل مجموعات البيانات التي تتطلب تشغيل نص مجموعة بيانات. + + + +اكتب نص مجموعة بيانات لتحميل ومشاركة مجموعات البيانات التي تتكون من ملفات بيانات بتنسيقات غير مدعومة أو تتطلب إعداد بيانات أكثر تعقيدًا. + +هذه طريقة أكثر تقدمًا لتحديد مجموعة بيانات من استخدام [بيانات التعريف YAML في بطاقة مجموعة البيانات](./repository_structure#define-your-splits-in-yaml). + +نص مجموعة البيانات هو ملف Python يحدد التكوينات والتقسيمات المختلفة لمجموعة البيانات الخاصة بك، بالإضافة إلى كيفية تنزيل البيانات ومعالجتها. + +يمكن للنص البرمجي تنزيل ملفات البيانات من أي موقع ويب، أو من مستودع مجموعة البيانات نفسه. + +يجب أن يحمل نص تحميل مجموعة البيانات نفس اسم مستودع مجموعة البيانات أو الدليل. على سبيل المثال، يجب أن يحتوي المستودع المسمى "my_dataset" على نص برمجي يسمى "my_dataset.py". بهذه الطريقة يمكن تحميله باستخدام: + +``` +my_dataset/ +├── README.md +└── my_dataset.py +``` + +```py +>>> from datasets import load_dataset +>>> load_dataset("path/to/my_dataset") +``` + +تشمل الإرشادات التالية تعليمات لنصوص مجموعة البيانات حول كيفية: + +- إضافة بيانات التعريف الخاصة بمجموعة البيانات. +- تنزيل ملفات البيانات. +- إنشاء عينات. +- إنشاء بيانات التعريف لمجموعة البيانات. +- تحميل مجموعة بيانات إلى Hub. + +افتح قالب نص تحميل مجموعة بيانات SQuAD [https://huggingface.co/datasets/squad/blob/main/squad.py] لمتابعة كيفية مشاركة مجموعة بيانات. + + + +للمساعدة في البدء، جرّب البدء بقالب نص تحميل مجموعة البيانات [https://github.com/huggingface/datasets/blob/main/templates/new_dataset_script.py]! + + + +## إضافة سمات مجموعة البيانات + +الخطوة الأولى هي إضافة بعض المعلومات، أو السمات، حول مجموعة البيانات الخاصة بك في [`DatasetBuilder._info`]. أهم السمات التي يجب عليك تحديدها هي: + +1. `DatasetInfo.description` يوفر وصفًا موجزًا لمجموعة البيانات الخاصة بك. يُعلم الوصف المستخدم بما يوجد في مجموعة البيانات، وكيف تم جمعها، وكيف يمكن استخدامها لمهمة NLP. + +2. `DatasetInfo.features` يحدد اسم ونوع كل عمود في مجموعة البيانات الخاصة بك. سيوفر هذا أيضًا الهيكل لكل مثال، لذلك من الممكن إنشاء حقول فرعية متداخلة في عمود إذا أردت. راجع [`Features`] للحصول على قائمة كاملة بأنواع الميزات التي يمكنك استخدامها. + +```py +datasets.Features( +{ +"id": datasets.Value("string"), +"title": datasets.Value("string"), +"context": datasets.Value("string"), +"question": datasets.Value("string"), +"answers": datasets.Sequence( +{ +"text": datasets.Value("string"), +"answer_start": datasets.Value("int32"), +} +), +} +) +``` + +3. `DatasetInfo.homepage` يحتوي على عنوان URL لصفحة مجموعة البيانات الرئيسية حتى يتمكن المستخدمون من العثور على مزيد من التفاصيل حول مجموعة البيانات. + +4. `DatasetInfo.citation` يحتوي على اقتباس BibTeX لمجموعة البيانات. + +بعد ملء جميع هذه الحقول في القالب، يجب أن يبدو مثل المثال التالي من نص تحميل SQuAD: + +```py +def _info(self): +return datasets.DatasetInfo( +description=_DESCRIPTION, +features=datasets.Features( +{ +"id": datasets.Value("string"), +"title": datasets.Value("string"), +````` +## الميزات المتقدمة + +### التجزئة + +إذا كانت مجموعة بياناتك تتكون من العديد من الملفات الكبيرة، فإن مكتبة 🤗 Datasets تشغل سكربت الخاص بشكل متوازٍ تلقائيًا لجعله سريعًا للغاية! +يمكن أن يكون هذا مفيدًا إذا كان لديك مئات أو آلاف من أرشيفات TAR، أو ملفات JSONL مثل [oscar](https://huggingface.co/datasets/oscar/blob/main/oscar.py) على سبيل المثال. + +ولجعلها تعمل، نعتبر قوائم الملفات في `gen_kwargs` على أنها شظايا. +لذلك يمكن لـ 🤗 Datasets أن تنشئ تلقائيًا عدة وحدات عمل لتشغيل `_generate_examples` بشكل متوازٍ، ويتم منح كل وحدة عمل مجموعة فرعية من الشظايا لتجهيزها. + +```python +class MyShardedDataset(datasets.GeneratorBasedBuilder): + def _split_generators(self, dl_manager: datasets.DownloadManager) -> List[datasets.SplitGenerator]: + downloaded_files = dl_manager.download([f"data/shard_{i}.jsonl" for i in range(1024)]) + return [ + datasets.SplitGenerator(name=datasets.Split.TRAIN, gen_kwargs={"filepaths": downloaded_files}), + ] + + def _generate_examples(self, filepaths): + # يمكن منح كل وحدة عمل شريحة من قائمة 'filepaths' الأصلية المحددة في 'gen_kwargs' + # بحيث يمكن تشغيل هذا الكود بشكل متوازٍ على عدة شظايا في نفس الوقت + for filepath in filepaths: + ... +``` + +يمكن للمستخدمين أيضًا تحديد `num_proc=` في `load_dataset()` لتحديد عدد العمليات التي سيتم استخدامها كوحدات عمل. + +### ArrowBasedBuilder + +بالنسبة لبعض مجموعات البيانات، قد يكون من الأسرع بكثير إنتاج دفعات من البيانات بدلاً من الأمثلة واحدًا تلو الآخر. +يمكنك تسريع إنشاء مجموعة البيانات عن طريق إنتاج جداول Arrow مباشرةً، بدلاً من الأمثلة. +وهذا مفيد بشكل خاص إذا كانت بياناتك تأتي من Pandas DataFrames على سبيل المثال، حيث أن التحويل من Pandas إلى Arrow بسيط مثل: + +```python +import pyarrow as pa +pa_table = pa.Table.from_pandas(df) +``` + +لإنتاج جداول Arrow بدلاً من الأمثلة الفردية، قم بجعل برنامج إنشاء مجموعة البيانات الخاصة بك يرث من [`ArrowBasedBuilder`] بدلاً من [`GeneratorBasedBuilder`]. واستخدم `_generate_tables` بدلاً من `_generate_examples`: + +```python +class MySuperFastDataset(datasets.ArrowBasedBuilder): + def _generate_tables(self, filepaths): + idx = 0 + for filepath in filepaths: + ... + yield idx, pa_table + idx += 1 +``` + +لا تنس أن تجعل سكربت الخاص بك فعالاً من حيث الذاكرة، في حالة تشغيل المستخدمين لها على أجهزة ذات كمية منخفضة من ذاكرة الوصول العشوائي. \ No newline at end of file diff --git a/docs/source/ar/depth_estimation.mdx b/docs/source/ar/depth_estimation.mdx new file mode 100644 index 00000000000..e2608d04742 --- /dev/null +++ b/docs/source/ar/depth_estimation.mdx @@ -0,0 +1,216 @@ +# تقدير العمق + +تُستخدم مجموعات بيانات تقدير العمق لتدريب نموذج على تقدير المسافة النسبية لكل بكسل في صورة من الكاميرا، والتي يُطلق عليها أيضًا العمق. وتتركز التطبيقات التي تمكّنها هذه المجموعات من البيانات بشكل أساسي في مجالات مثل الإدراك البصري للآلات والإدراك في الروبوتات. وتشمل التطبيقات مثال رسم خرائط الشوارع للسيارات ذاتية القيادة. وسيوضح هذا الدليل كيفية تطبيق التحولات على مجموعة بيانات تقدير العمق. + +قبل البدء، تأكد من أن لديك الإصدارات الأحدث من albumentations مثبتة: + +```bash +pip install -U albumentations +``` + +[Albumentations](https://albumentations.ai/) هي مكتبة بايثون للقيام بزيادة البيانات للرؤية الحاسوبية. وهي تدعم العديد من مهام الرؤية الحاسوبية مثل تصنيف الصور، وكشف الأشياء، والتجزئة، وتقدير النقاط الرئيسية. + +يستخدم هذا الدليل [NYU Depth V2](https://huggingface.co/datasets/sayakpaul/nyu_depth_v2) dataset التي تتكون من تسلسلات فيديو من مشاهد داخلية مختلفة، تم تسجيلها بواسطة كاميرات RGB وعمق. وتتكون مجموعة البيانات من مشاهد من 3 مدن وتقدم صورًا جنبًا إلى جنب مع خرائط العمق الخاصة بها على شكل تسميات. + +قم بتحميل قسم "التدريب" من مجموعة البيانات وانظر إلى مثال: + +```py +>>> from datasets import load_dataset + +>>> train_dataset = load_dataset("sayakpaul/nyu_depth_v2", split="train") +>>> index = 17 +>>> example = train_dataset[index] +>>> example +{'image': , +'depth_map': } +``` + +تحتوي مجموعة البيانات على حقلين: + +* `image`: كائن صورة PNG PIL مع نوع بيانات `uint8`. +* `depth_map`: كائن صورة TIFF PIL مع نوع بيانات `float32` وهو خريطة العمق للصورة. + +ومن الجدير بالذكر أن تنسيق JPEG/PNG لا يمكنه سوى تخزين بيانات `uint8` أو `uint16`. وبما أن خريطة العمق هي بيانات `float32`، فلا يمكن تخزينها باستخدام PNG/JPEG. ومع ذلك، يمكننا حفظ خريطة العمق باستخدام تنسيق TIFF لأنه يدعم مجموعة أوسع من أنواع البيانات، بما في ذلك بيانات `float32`. + +بعد ذلك، تحقق من صورة باستخدام: + +```py +>>> example["image"] +``` + +
+ +
+ +قبل أن نلقي نظرة على خريطة العمق، يجب علينا أولاً تحويل نوع البيانات الخاص بها إلى `uint8` باستخدام `.convert('RGB')` لأن PIL لا يمكنه عرض صور `float32`. الآن، الق نظرة على خريطة العمق المقابلة: + +```py +>>> example["depth_map"].convert("RGB") +``` + +
+ +
+ +إنها سوداء تمامًا! ستحتاج إلى إضافة بعض الألوان إلى خريطة العمق لتصورها بشكل صحيح. للقيام بذلك، يمكننا إما تطبيق الألوان تلقائيًا أثناء العرض باستخدام `plt.imshow()` أو إنشاء خريطة عمق ملونة باستخدام `plt.cm` ثم عرضها. في هذا المثال، استخدمنا الأخيرة، حيث يمكننا حفظ/كتابة خريطة العمق الملونة لاحقًا. (تم أخذ الأداة المساعدة أدناه من [مستودع FastDepth](https://github.com/dwofk/fast-depth/blob/master/utils.py)). + +```py +>>> import numpy as np +>>> import matplotlib.pyplot as plt + +>>> cmap = plt.cm.viridis + +>>> def colored_depthmap(depth, d_min=None, d_max=None): +... if d_min is None: +... d_min = np.min(depth) +... if d_max is None: +... d_max = np.max(depth) +... depth_relative = (depth - d_min) / (d_max - d_min) +... return 255 * cmap(depth_relative)[:,:,:3] + +>>> def show_depthmap(depth_map): +... if not isinstance(depth_map, np.ndarray): +... depth_map = np.array(depth_map) +... if depth_map.ndim == 3: +... depth_map = depth_map.squeeze() + +... d_min = np.min(depth_map) +... d_max = np.max(depth_map) +... depth_map = colored_depthmap(depth_map, d_min, d_max) + +... plt.imshow(depth_map.astype("uint8")) +... pltMultiplier +... plt.axis("off") +... plt.show() + +>>> show_depthmap(example["depth_map"]) +``` + +
+ +
+ +يمكنك أيضًا تصور العديد من الصور المختلفة وخرائط العمق المقابلة لها. + +```py +>>> def merge_into_row(input_image, depth_target): +... if not isinstance(input_image, np.ndarray): +... input_image = np.array(input_image) +... +... d_min = np.min(depth_target) +... d_max = np.max(depth_target) +... depth_target_col = colored_depthmap(depth_target, d_min, d_max) +... img_merge = np.hstack([input_image, depth_target_col]) +... +... return img_merge + +>>> random_indices = np.random.choice(len(train_dataset), 9).tolist() +>>> plt.figure(figsize=(15, 6)) +>>> for i, idx in enumerate(random_indices): +... example = train_dataset[idx] +... ax = plt.subplot(3, 3, i + 1) +... image_viz = merge_into_row( +... example["image"], example["depth_map"] +... ) +... plt.imshow(image_viz.astype("uint8")) +... plt.axis("off") +``` + +
+ +
+ +الآن، قم بتطبيق بعض التحسينات باستخدام `albumentations`. تتضمن تحولات التعزيز ما يلي: + +* الانعكاس الأفقي العشوائي +* القص العشوائي +* السطوع العشوائي والتباين +* تصحيح غاما العشوائي +* التشبع العشوائي للصبغة + +```py +>>> import albumentations as A + +>>> crop_size = (448, 576) +>>> transforms = [ +... A.HorizontalFlip(p=0.5), +... A.RandomCrop(crop_size[0], crop_size[1]), +... A.RandomBrightnessContrast(), +... A.RandomGamma(), +... A.HueSaturationValue() +... ] +``` + +بالإضافة إلى ذلك، حدد خريطة إلى الاسم المستهدف بشكل أفضل. + +```py +>>> additional_targets = {"depth": "mask"} +>>> aug = A.Compose(transforms=transforms, additional_targets=additional_targets) +``` + +مع `additional_targets` المحددة، يمكنك تمرير خرائط العمق المستهدفة إلى وسيط `depth` من `aug` بدلاً من `mask`. ستلاحظ هذا التغيير في دالة `apply_transforms()` المحددة أدناه. + +قم بإنشاء دالة لتطبيق التحول على الصور وكذلك خرائط العمق الخاصة بها: + +```py +>>> def apply_transforms(examples): +... transformed_images, transformed_maps = [], [] +... for image, depth_map in zip(examples["image"], examples["depth_map"]): +... image, depth_map = np.array(image), np.array(depth_map) +... transformed = aug(image=image, depth=depth_map) +... transformed_images.append(transformed["image"]) +... transformed_maps.append(transformed["depth"]) +... +... examples["pixel_values"] = transformed_images +... examples["labels"] = transformed_maps +... return examples +``` + +استخدم وظيفة [`~Dataset.set_transform`] لتطبيق التحول أثناء التنقل على دفعات من مجموعة البيانات لتقليل استخدام مساحة القرص: + +```py +>>> train_dataset.set_transform(apply_transforms) +``` + +يمكنك التحقق من أن التحول قد عمل عن طريق الفهرسة في `pixel_values` و`labels` لصورة مثال: + +```py +>>> example = train_dataset[index] + +>>> plt.imshow(example["pixel_values"]) +>>> plt.axis("off") +>>> plt.show() +``` + +
+ +
+ +قم بتصور نفس التحول على خريطة العمق المقابلة للصورة: + +```py +>>> show_depthmap(example["labels"]) +``` + +
+ +
+ +يمكنك أيضًا تصور عدة عينات تدريبية عن طريق إعادة استخدام `random_indices` السابقة: + +```py +>>> plt.figure(figsize=(15, 6)) + +>>> for i, idx in enumerate(random_indices): +... ax = plt.subplot(3, 3, i + 1) +... example = train_dataset[idx] +... image_viz = merge_into_row( +... example["pixel_values"], example["labels"] +... ) +... plt.imshow(image_viz.astype("uint8")) +... plt.axis("off") +``` + +
+ +
\ No newline at end of file diff --git a/docs/source/ar/faiss_es.mdx b/docs/source/ar/faiss_es.mdx new file mode 100644 index 00000000000..01146751497 --- /dev/null +++ b/docs/source/ar/faiss_es.mdx @@ -0,0 +1,133 @@ +# فهرس البحث + +[FAISS](https://github.com/facebookresearch/faiss) و [Elasticsearch](https://www.elastic.co/elasticsearch/) يتيحان إمكانية البحث عن أمثلة في مجموعة بيانات. يمكن أن يكون هذا مفيدًا عندما تريد استرداد أمثلة محددة من مجموعة بيانات ذات صلة بمهمة معالجة اللغات الطبيعية الخاصة بك. على سبيل المثال، إذا كنت تعمل على مهمة "الأسئلة والأجوبة المفتوحة المجال"، فقد ترغب في إرجاع الأمثلة ذات الصلة فقط بالإجابة على سؤالك. + +سيوضح هذا الدليل كيفية إنشاء فهرس لمجموعة البيانات الخاصة بك يسمح بالبحث فيها. + +## FAISS + +يسترد FAISS المستندات بناءً على تشابه تمثيلاتها المتجهية. في هذا المثال، ستقوم بتوليد التمثيلات المتجهية باستخدام نموذج [DPR](https://huggingface.co/transformers/model_doc/dpr.html). + +1. قم بتنزيل نموذج DPR من 🤗 Transformers: + + ```py + >>> from transformers import DPRContextEncoder, DPRContextEncoderTokenizer + >>> import torch + >>> torch.set_grad_enabled(False) + >>> ctx_encoder = DPRContextEncoder.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base") + >>> ctx_tokenizer = DPRContextEncoderTokenizer.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base") + ``` + +2. قم بتحميل مجموعة البيانات واحسب التمثيلات المتجهية: + + ```py + >>> from datasets import load_dataset + >>> ds = load_dataset('crime_and_punish', split='train[:100]') + >>> ds_with_embeddings = ds.map(lambda example: {'embeddings': ctx_encoder(**ctx_tokenizer(example["line"], return_tensors="pt"))[0][0].numpy()}) + ``` + +3. قم بإنشاء الفهرس باستخدام [`Dataset.add_faiss_index`]: + + ```py + >>> ds_with_embeddings.add_faiss_index(column='embeddings') + ``` + +4. الآن يمكنك استعلام مجموعة البيانات الخاصة بك باستخدام فهرس `embeddings`. قم بتحميل نموذج DPR Question Encoder، وابحث عن سؤال باستخدام [`Dataset.get_nearest_examples`]: + + ```py + >>> from transformers import DPRQuestionEncoder, DPRQuestionEncoderTokenizer + >>> q_encoder = DPRQuestionEncoder.from_pretrained("facebook/dpr-question_encoder-single-nq-base") + >>> q_tokenizer = DPRQuestionEncoderTokenizer.from_pretrained("facebook/dpr-question_encoder-single-nq-base") + + >>> question = "Is it serious ?" + >>> question_embedding = q_encoder(**q_tokenizer(question, return_tensors="pt"))[0][0].numpy() + >>> scores, retrieved_examples = ds_with_embeddings.get_nearest_examples('embeddings', question_embedding, k=10) + >>> retrieved_examples["line"][0] + '_that_ serious? It is not serious at all. It’s simply a fantasy to amuse\r\n' + ``` + +5. يمكنك الوصول إلى الفهرس باستخدام [`Dataset.get_index`] واستخدامه لعمليات خاصة، على سبيل المثال، استعلامه باستخدام `range_search`: + + ```py + >>> faiss_index = ds_with_embeddings.get_index('embeddings').faiss_index + >>> limits, distances, indices = faiss_index.range_search(x=question_embedding.reshape(1, -1), thresh=0.95) + ``` + +6. عندما تنتهي من الاستعلام، احفظ الفهرس على القرص باستخدام [`Dataset.save_faiss_index`]: + + ```py + >>> ds_with_embeddings.save_faiss_index('embeddings', 'my_index.faiss') + ``` + +7. أعد تحميله لاحقًا باستخدام [`Dataset.load_faiss_index`]: + + ```py + >>> ds = load_dataset('crime_and_punish', split='train[:100]') + >>> ds.load_faiss_index('embeddings', 'my_index.faiss') + ``` + +## Elasticsearch + +على عكس FAISS، يسترد Elasticsearch المستندات بناءً على تطابقات دقيقة. + +ابدأ تشغيل Elasticsearch على جهازك، أو راجع [دليل تثبيت Elasticsearch](https://www.elastic.co/guide/en/elasticsearch/reference/current/setup.html) إذا لم يكن لديك بالفعل. + +1. قم بتحميل مجموعة البيانات التي تريد إنشاء فهرس لها: + + ```py + >>> from datasets import load_dataset + >>> squad = load_dataset('squad', split='validation') + ``` + +2. قم ببناء الفهرس باستخدام [`Dataset.add_elasticsearch_index`]: + + ```py + >>> squad.add_elasticsearch_index("context", host="localhost", port="9200") + ``` + +3. بعد ذلك، يمكنك استعلام فهرس `context` باستخدام [`Dataset.get_nearest_examples`]: + + ```py + >>> query = "machine" + >>> scores, retrieved_examples = squad.get_nearest_examples("context", query, k=10) + >>> retrieved_examples["title"][0] + 'Computational_complexity_theory' + ``` + +4. إذا كنت تريد إعادة استخدام الفهرس، فقم بتعريف معلمة `es_index_name` عند بناء الفهرس: + + ```py + >>> from datasets import load_dataset + >>> squad = load_dataset('squad', split='validation') + >>> squad.add_elasticsearch_index("context", host="localhost", port="9200", es_index_name="hf_squad_val_context") + >>> squad.get_index("context").es_index_name + hf_squad_val_context + ``` + +5. أعد تحميله لاحقًا باستخدام اسم الفهرس عند استدعاء [`Dataset.load_elasticsearch_index`]: + + ```py + >>> from datasets import load_dataset + >>> squad = load_dataset('squad', split='validation') + >>> squad.load_elasticsearch_index("context", host="localhost", port="9200", es_index_name="hf_squad_val_context") + >>> query = "machine" + >>> scores, retrieved_examples = squad.get_nearest_examples("context", query, k=10) + ``` + +لاستخدامات Elasticsearch المتقدمة، يمكنك تحديد تكوينك الخاص باستخدام إعدادات مخصصة: + + ```py + >>> import elasticsearch as es + >>> import elasticsearch.helpers + >>> from elasticsearch import Elasticsearch + >>> es_client = Elasticsearch([{"host": "localhost", "port": "9200"}]) # العميل الافتراضي + >>> es_config = { + ... "settings": { + ... "number_of_shards": 1, + ... "analysis": {"analyzer": {"stop_standard": {"type": "standard", "stopwords": "_english_"}}}, + ... }, + ... "mappings": {"properties": {"text": {"type": "text", "analyzer": "standard", "similarity": "BM25"}}}, + ... } # التهيئة الافتراضية + >>> es_index_name = "hf_squad_context" # اسم الفهرس في Elasticsearch + >>> squad.add_elasticsearch_index("context", es_client=es_client, es_config=es_config, es_index_name=es_index_name) + ``` \ No newline at end of file diff --git a/docs/source/ar/filesystems.mdx b/docs/source/ar/filesystems.mdx new file mode 100644 index 00000000000..feb90656fc5 --- /dev/null +++ b/docs/source/ar/filesystems.mdx @@ -0,0 +1,221 @@ +# التخزين السحابي +🤗 Datasets تدعم الوصول إلى مزودي التخزين السحابي من خلال تطبيقات FileSystem الخاصة بـ `fsspec`. +يمكنك حفظ وتحميل مجموعات البيانات من أي تخزين سحابي بطريقة Pythonic. +الق نظرة على الجدول التالي لبعض أمثلة مزودي التخزين السحابي المدعومين: + +| مزود التخزين | تطبيق نظام الملفات | +| ------------ | ------------------- | +| Amazon S3 | [s3fs](https://s3fs.readthedocs.io/en/latest/) | +| Google Cloud Storage | [gcsfs](https://gcsfs.readthedocs.io/en/latest/) | +| Azure Blob/DataLake | [adlfs](https://github.com/fsspec/adlfs) | +| Dropbox | [dropboxdrivefs](https://github.com/MarineChap/dropboxdrivefs) | +| Google Drive | [gdrivefs](https://github.com/intake/gdrivefs) | +| Oracle Cloud Storage | [ocifs](https://ocifs.readthedocs.io/en/latest/) | + +سيوضح لك هذا الدليل كيفية حفظ وتحميل مجموعات البيانات باستخدام أي تخزين سحابي. +فيما يلي أمثلة على S3 و Google Cloud Storage و Azure Blob Storage و Oracle Cloud Object Storage. + +## قم بإعداد نظام ملفات التخزين السحابي الخاص بك + +### Amazon S3 + +1. قم بتثبيت تطبيق نظام ملفات S3: + +``` +>>> pip install s3fs +``` + +2. حدد بيانات اعتمادك + +لاستخدام اتصال مجهول، استخدم `anon=True`. +وإلا، قم بتضمين `aws_access_key_id` و `aws_secret_access_key` كلما تفاعلت مع دلو S3 خاص. + +```py +>>> storage_options = {"anon": True} # للاتصال المجهول +# أو استخدم بيانات اعتمادك +>>> storage_options = {"key": aws_access_key_id, "secret": aws_secret_access_key} # للدلوات الخاصة +# أو استخدم جلسة botocore +>>> import aiobotocore.session +>>> s3_session = aiobotocore.session.AioSession(profile="my_profile_name") +>>> storage_options = {"session": s3_session} +``` + +3. قم بإنشاء مثيل نظام الملفات الخاص بك + +```py +>>> import s3fs +>>> fs = s3fs.S3FileSystem(**storage_options) +``` + +### Google Cloud Storage + +1. قم بتثبيت تطبيق Google Cloud Storage: + +``` +>>> conda install -c conda-forge gcsfs +# أو قم بالتثبيت باستخدام pip +>>> pip install gcsfs +``` + +2. حدد بيانات اعتمادك + +```py +>>> storage_options={"token": "anon"} # للاتصال المجهول +# أو استخدم بيانات اعتمادك الافتراضية لـ gcloud أو من خدمة بيانات Google +>>> storage_options={"project": "my-google-project"} +# أو استخدم بيانات اعتمادك من مكان آخر، راجع الوثائق على https://gcsfs.readthedocs.io/ +>>> storage_options={"project": "my-google-project", "token": TOKEN} +``` + +3. قم بإنشاء مثيل نظام الملفات الخاص بك + +```py +>>> import gcsfs +>>> fs = gcsfs.GCSFileSystem(**storage_options) +``` + +### Azure Blob Storage + +1. قم بتثبيت تطبيق Azure Blob Storage: + +``` +>>> conda install -c conda-forge adlfs +# أو قم بالتثبيت باستخدام pip +>>> pip install adlfs +``` + +2. حدد بيانات اعتمادك + +```py +>>> storage_options = {"anon": True} # للاتصال المجهول +# أو استخدم بيانات اعتمادك +>>> storage_options = {"account_name": ACCOUNT_NAME, "account_key": ACCOUNT_KEY} # لنظام الملفات من الجيل الثاني +# أو استخدم بيانات اعتمادك مع نظام الملفات من الجيل الأول +>>> storage_options={"tenant_id": TENANT_ID, "client_id": CLIENT_ID, "client_secret": CLIENT_SECRET} +``` + +3. قم بإنشاء مثيل نظام الملفات الخاص بك + +```py +>>> import adlfs +>>> fs = adlfs.AzureBlobFileSystem(**storage_options) +``` + +### Oracle Cloud Object Storage + +1. قم بتثبيت تطبيق نظام ملفات OCI: + +``` +>>> pip install ocifs +``` + +2. حدد بيانات اعتمادك + +```py +>>> storage_options = {"config": "~/.oci/config", "region": "us-ashburn-1"} +``` + +3. قم بإنشاء مثيل نظام الملفات الخاص بك + +```py +>>> import ocifs +>>> fs = ocifs.OCIFileSystem(**storage_options) +``` + +## قم بتحميل وحفظ مجموعات البيانات الخاصة بك باستخدام نظام ملفات التخزين السحابي الخاص بك + +### قم بتنزيل وإعداد مجموعة بيانات في التخزين السحابي + +يمكنك تنزيل وإعداد مجموعة بيانات في التخزين السحابي الخاص بك من خلال تحديد `output_dir` عن بعد في `download_and_prepare`. +لا تنس استخدام `storage_options` المحددة مسبقًا والتي تحتوي على بيانات اعتمادك للكتابة في تخزين سحابي خاص. + +تعمل طريقة `download_and_prepare` في خطوتين: + +1. أولاً، يقوم بتنزيل ملفات البيانات الخام (إن وجدت) في ذاكرة التخزين المؤقت المحلية الخاصة بك. يمكنك تعيين دليل ذاكرة التخزين المؤقت الخاصة بك من خلال تمرير `cache_dir` إلى [`load_dataset_builder`] + +2. ثم يقوم بتوليد مجموعة البيانات بتنسيق Arrow أو Parquet في التخزين السحابي الخاص بك من خلال التكرار فوق ملفات البيانات الخام. + +قم بتحميل برنامج بناء مجموعة بيانات من Hugging Face Hub (راجع [كيفية التحميل من Hugging Face Hub](./loading#hugging-face-hub)): + +```py +>>> output_dir = "s3://my-bucket/imdb" +>>> builder = load_dataset_builder("imdb") +>>> builder.download_and_prepare(output_dir, storage_options=storage_options, file_format="parquet") +``` + +استخدم ملفات البيانات الخاصة بك (راجع [كيفية تحميل الملفات المحلية والبعيدة](./loading#local-and-remote-files)): + +```py +>>> data_files = {"train": ["path/to/train.csv"]} +>>> output_dir = "s3://my-bucket/imdb" +>>> builder = load_dataset_builder("csv", data_files=data_files) +>>> builder.download_and_prepare(output_dir, storage_options=storage_options, file_format="parquet") +``` + +من المستحسن بشدة حفظ الملفات بتنسيق Parquet المضغوط لتحسين عمليات الإدخال/الإخراج من خلال تحديد `file_format="parquet"`. +وإلا، يتم حفظ مجموعة البيانات كملف Arrow غير مضغوط. + +يمكنك أيضًا تحديد حجم الشرائح باستخدام `max_shard_size` (الحجم الافتراضي هو 500 ميجابايت): + +```py +>>> builder.download_and_prepare(output_dir, storage_options=storage_options, file_format="parquet", max_shard_size="1GB") +``` + +#### Dask + +Dask هي مكتبة حوسبة متوازية ولديها واجهة برمجة تطبيقات تشبه pandas للعمل مع مجموعات بيانات Parquet الأكبر من ذاكرة الوصول العشوائي بشكل متوازي. +يمكن لـ Dask استخدام عدة خيوط أو عمليات على جهاز واحد، أو مجموعة من الأجهزة لمعالجة البيانات بشكل متواز. +يدعم Dask البيانات المحلية ولكن أيضًا البيانات من التخزين السحابي. + +لذلك، يمكنك تحميل مجموعة بيانات محفوظة كملفات Parquet مجزأة في Dask باستخدام: + +```py +import dask.dataframe as dd + +df = dd.read_parquet(output_dir, storage_options=storage_options) + +# أو إذا كانت مجموعة البيانات الخاصة بك مقسمة إلى train/valid/test +df_train = dd.read_parquet(output_dir + f"/{builder.name}-train-*.parquet", storage_options=storage_options) +df_valid = dd.read_parquet(output_dir + f"/{builder.name}-validation-*.parquet", storage_options=storage_options) +df_test = dd.read_parquet(output_dir + f"/{builder.name}-test-*.parquet", storage_options=storage_options) +``` + +يمكنك معرفة المزيد حول أطر بيانات dask في [وثائقهم](https://docs.dask.org/en/stable/dataframe.html). + +## حفظ مجموعات البيانات المسلسلة + +بعد معالجة مجموعة البيانات الخاصة بك، يمكنك حفظها في التخزين السحابي الخاص بك باستخدام [`Dataset.save_to_disk`]: + +```py +# حفظ encoded_dataset إلى Amazon S3 +>>> encoded_dataset.save_to_disk("s3://my-private-datasets/imdb/train", storage_options=storage_options) +# حفظ encoded_dataset إلى Google Cloud Storage +>>> encoded_dataset.save_to_disk("gcs://my-private-datasets/imdb/train", storage_options=storage_options) +# حفظ encoded_dataset إلى Microsoft Azure Blob/DataLake +>>> encoded_dataset.save_to_disk("adl://my-private-datasets/imdb/train", storage_options=storage_options) +``` + + +تذكر تحديد بيانات اعتمادك في مثيل [نظام الملفات](#set-up-your-cloud-storage-filesystem) `fs` كلما تفاعلت مع تخزين سحابي خاص. + + +## إدراج مجموعات البيانات المسلسلة + +قم بإدراج الملفات من التخزين السحابي باستخدام مثيل نظام الملفات `fs` الخاص بك، باستخدام `fs.ls`: + +```py +>>> fs.ls("my-private-datasets/imdb/train", detail=False) +["dataset_info.json.json","dataset.arrow","state.json"] +``` + +### تحميل مجموعات البيانات المسلسلة + +عندما تكون مستعدًا لاستخدام مجموعة البيانات الخاصة بك مرة أخرى، قم بتحميلها مرة أخرى باستخدام [`Dataset.load_from_disk`]: + +```py +>>> from datasets import load_from_disk +# تحميل encoded_dataset من التخزين السحابي +>>> dataset = load_from_disk("s3://a-public-datasets/imdb/train", storage_options=storage_options) +>>> print(len(dataset)) +25000 +``` \ No newline at end of file diff --git a/docs/source/ar/how_to.md b/docs/source/ar/how_to.md new file mode 100644 index 00000000000..790b3aaab40 --- /dev/null +++ b/docs/source/ar/how_to.md @@ -0,0 +1,24 @@ +# نظرة عامة +تقدم أدلة "كيفية الاستخدام" نظرة شاملة أكثر شمولاً على جميع الأدوات التي تقدمها 🤗 Datasets وكيفية استخدامها. سيساعدك هذا في التعامل مع مجموعات البيانات الواقعية الأكثر تعقيدًا، حيث قد تحتاج إلى معالجة بنية مجموعة البيانات أو محتواها لإعدادها للتدريب. + +يفترض الدليل أنك على دراية ومرتاح لمبادئ 🤗 Datasets الأساسية. نوصي المستخدمين الجدد بالاطلاع على [الدروس التعليمية](tutorial) الخاصة بنا أولاً. + + +إذا كنت ترغب في تعلم المزيد، يمكنك الاطلاع على [الفصل الخامس](https://huggingface.co/course/chapter5/1?fw=pt) من دورة Hugging Face! + + +تم تنظيم الأدلة في ستة أقسام: + +- **الاستخدام العام**: وظائف لتحميل مجموعة البيانات ومعالجتها بشكل عام. تنطبق الوظائف الموضحة في هذا القسم على جميع أنماط مجموعات البيانات. + +- **الصوت**: كيفية تحميل مجموعات البيانات الصوتية ومعالجتها ومشاركتها. + +- **الرؤية**: كيفية تحميل مجموعات البيانات الصورية ومعالجتها ومشاركتها. + +- **النص**: كيفية تحميل مجموعات البيانات النصية ومعالجتها ومشاركتها. + +- **الجدولي**: كيفية تحميل مجموعات البيانات الجدولية ومعالجتها ومشاركتها. + +- **مستودع مجموعة البيانات**: كيفية مشاركة وتحميل مجموعة بيانات إلى Hub. + +إذا كان لديك أي أسئلة حول 🤗 Datasets، لا تتردد في الانضمام إلى مجتمعنا وطرح أسئلتك على [المنتدى](https://discuss.huggingface.co/c/datasets/10). \ No newline at end of file diff --git a/docs/source/ar/image_classification.mdx b/docs/source/ar/image_classification.mdx new file mode 100644 index 00000000000..e36703c038e --- /dev/null +++ b/docs/source/ar/image_classification.mdx @@ -0,0 +1,91 @@ +لم يتم ترجمة الأجزاء المطلوبة: + +# تصنيف الصور + +تُستخدم مجموعات بيانات تصنيف الصور لتدريب نموذج على تصنيف صورة كاملة. وهناك مجموعة واسعة من التطبيقات التي تمكّنها هذه المجموعات من البيانات، مثل تحديد أنواع الحيوانات البرية المهددة بالانقراض أو الكشف عن الأمراض في الصور الطبية. سيوضح هذا الدليل كيفية تطبيق التحويلات على مجموعة بيانات لتصنيف الصور. + +قبل البدء، تأكد من تثبيت أحدث إصدارات `albumentations` و`cv2`: + +```bash +pip install -U albumentations opencv-python +``` + +يستخدم هذا الدليل مجموعة بيانات [Beans](https://huggingface.co/datasets/beans) لتحديد نوع مرض نبات الفاصوليا بناءً على صورة لورقته. + +قم بتحميل مجموعة البيانات والاطلاع على مثال: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("beans") +>>> dataset["train"][10] +{'image': , +'image_file_path': '/root/.cache/huggingface/datasets/downloads/extracted/b0a21163f78769a2cf11f58dfc767fb458fc7cea5c05dccc0144a2c0f0bc1292/train/angular_leaf_spot/angular_leaf_spot_train.204.jpg', +'labels': 0} +``` + +تحتوي مجموعة البيانات على ثلاثة حقول: + +* `image`: كائن صورة PIL. +* `image_file_path`: المسار إلى ملف الصورة. +* `labels`: التصنيف أو فئة الصورة. + +بعد ذلك، تحقق من صورة: + +
+ +
+ +الآن قم بتطبيق بعض التحسينات باستخدام `albumentations`. ستقوم بقص الصورة بشكل عشوائي، وقلبها أفقيًا، وتعديل سطوعها. + +```py +>>> import cv2 +>>> import albumentations +>>> import numpy as np + +>>> transform = albumentations.Compose([ +... albumentations.RandomCrop(width=256, height=256), +... albumentpartum.HorizontalFlip(p=0.5), +... albumentations.RandomBrightnessContrast(p=0.2), +... ]) +``` + +قم بإنشاء دالة لتطبيق التحويل على الصور: + +```py +>>> def transforms(examples): +... examples["pixel_values"] = [ +... transform(image=np.array(image))["image"] for image in examples["image"] +... ] +... +... return examples +``` + +استخدم وظيفة [`~Dataset.set_transform`] لتطبيق التحويل أثناء التنقل على دفعات من مجموعة البيانات لتقليل مساحة القرص المستخدمة: + +```py +>>> dataset.set_transform(transforms) +``` + +يمكنك التحقق من نجاح التحويل عن طريق الفهرسة في `pixel_values` للمثال الأول: + +```py +>>> import numpy as np +>>> import matplotlib.pyplot as plt + +>>> img = dataset["train"][0]["pixel_values"] +>>> plt.imshow(img) +``` + +
+ + +
+ + + +الآن بعد أن تعرفت على كيفية معالجة مجموعة بيانات لتصنيف الصور، تعلم +[كيفية تدريب نموذج تصنيف الصور](https://colab.research.google.com/github/huggingface/notebooks/blob/main/examples/image_classification.ipynb) +واستخدامه للاستنتاج. + + \ No newline at end of file diff --git a/docs/source/ar/image_dataset.mdx b/docs/source/ar/image_dataset.mdx new file mode 100644 index 00000000000..c81cb61badb --- /dev/null +++ b/docs/source/ar/image_dataset.mdx @@ -0,0 +1,432 @@ +# إنشاء مجموعة بيانات للصور + +هناك طريقتان لإنشاء ومشاركة مجموعة بيانات للصور. سيوضح هذا الدليل كيفية: + +- إنشاء مجموعة بيانات صوتية من ملفات محلية في بايثون باستخدام [Dataset.push_to_hub]. هذه طريقة سهلة تتطلب فقط بضع خطوات في بايثون. + +- إنشاء مجموعة بيانات للصور باستخدام `ImageFolder` وبعض البيانات الوصفية. هذا حل بدون كود لإنشاء مجموعة بيانات للصور بسرعة تحتوي على عدة آلاف من الصور. + + + +يمكنك التحكم في الوصول إلى مجموعة البيانات الخاصة بك عن طريق مطالبة المستخدمين بمشاركة معلومات الاتصال الخاصة بهم أولاً. راجع دليل [مجموعات البيانات المحمية](https://huggingface.co/docs/hub/datasets-gated) لمزيد من المعلومات حول كيفية تمكين هذه الميزة على Hub. + + + +## ImageFolder + +`ImageFolder` هو أداة إنشاء مجموعة بيانات مصممة لتحميل مجموعة بيانات للصور تحتوي على عدة آلاف من الصور دون الحاجة إلى كتابة أي كود. + + + +💡 اطلع على [تسلسل هرمي لأنماط التقسيم](repository_structure#split-pattern-hierarchy) لمعرفة المزيد حول كيفية إنشاء `ImageFolder` لتقسيمات مجموعة البيانات بناءً على هيكل مستودع مجموعة البيانات الخاصة بك. + + + +يستنتج `ImageFolder` تلقائيًا تسميات الفئات الخاصة بمجموعة البيانات الخاصة بك بناءً على اسم المجلد. قم بتخزين مجموعة البيانات الخاصة بك في هيكل مجلدات مثل: + +``` +folder/train/dog/golden_retriever.png +folder/train/dog/german_shepherd.png +folder/train/dog/chihuahua.png + +folder/train/cat/maine_coon.png +folder/train/cat/bengal.png +folder/train/cat/birman.png +``` + +بعد ذلك، يمكن للمستخدمين تحميل مجموعة البيانات الخاصة بك عن طريق تحديد `imagefolder` في [`load_dataset`] ومجلد في `data_dir`: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder") +``` + +يمكنك أيضًا استخدام `imagefolder` لتحميل مجموعات البيانات التي تنطوي على تقسيمات متعددة. للقيام بذلك، يجب أن يكون لمجلد مجموعة البيانات الخاصة بك الهيكل التالي: + +``` +folder/train/dog/golden_retriever.png +folder/train/cat/maine_coon.png +folder/test/dog/german_shepherd.png +folder/test/cat/bengal.png +``` + + + +إذا كانت جميع ملفات الصور موجودة في مجلد واحد أو إذا لم تكن على نفس مستوى هيكل المجلد، فلن يتم إضافة عمود `label` تلقائيًا. إذا كنت بحاجة إليه، فقم بتعيين `drop_labels=False` بشكل صريح. + + + +إذا كانت هناك معلومات إضافية تريد تضمينها حول مجموعة البيانات الخاصة بك، مثل التعليقات النصية أو صناديق الحدود، فأضفها كملف `metadata.csv` في مجلدك. يتيح لك ذلك إنشاء مجموعات بيانات لمهمات رؤية الكمبيوتر المختلفة مثل التعليق على الصور أو اكتشاف الأشياء. يمكنك أيضًا استخدام ملف JSONL `metadata.jsonl`. + +``` +folder/train/metadata.csv +folder/train/0001.png +folder/train/0002.png +folder/train/0003.png +``` + +يمكنك أيضًا ضغط صورك: + +``` +folder/metadata.csv +folder/train.zip +folder/test.zip +folder/valid.zip +``` + +يجب أن يحتوي ملف `metadata.csv` الخاص بك على عمود `file_name` الذي يربط ملفات الصور ببياناتها الوصفية: + +```csv +file_name,additional_feature +0001.png,This is a first value of a text feature you added to your images +0002.png,This is a second value of a text feature you added to your images +0003.png,This is a third value of a text feature you added to your images +``` + +أو باستخدام `metadata.jsonl`: + +```jsonl +{"file_name": "0001.png", "additional_feature": "This is a first value of a text feature you added to your images"} +{"file_name": "0002.png", "additional_feature": "This is a second value of a text feature you added to your images"} +{"file_name": "0003.png", "additional_feature": "This is a third value of a text feature you added to your images"} +``` + + + +إذا كانت هناك ملفات بيانات وصفية، يتم إسقاط التسميات المستنتجة بناءً على اسم المجلد بشكل افتراضي. لتضمين تلك التسميات، قم بتعيين `drop_labels=False` في `load_dataset`. + + + +### التعليق على الصور + +تحتوي مجموعات بيانات التعليق على الصور على نص يصف صورة. قد يبدو مثال `metadata.csv` كما يلي: + +```csv +file_name,text +0001.png,This is a golden retriever playing with a ball +0002.png,A german shepherd +0003.png,One chihuahua +``` + +قم بتحميل مجموعة البيانات باستخدام `ImageFolder`، وسينشئ عمود `text` للتعليقات على الصور: + +```py +>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder", split="train") +>>> dataset[0]["text"] +"This is a golden retriever playing with a ball" +``` + +### اكتشاف الأشياء + +تحتوي مجموعات بيانات اكتشاف الأشياء على صناديق حدود وفئات لتحديد الأشياء الموجودة في الصورة. قد يبدو مثال `metadata.jsonl` كما يلي: + +```jsonl +{"file_name": "0001.png", "objects": {"bbox": [[302.0, 109.0, 73.0, 52.0]], "categories": [0]}} +{"file_Multiplier: 2.0 +"file_name": "0002.png" +"objects": { +"bbox": [[810.0, 100.0, 57.0, 28.0]], +"categories": [1] +} +} +{"file_name": "0003.png", "objects": {"bbox": [[160.0, 31.0, 248.0, 616.0], [741.0, 68.0, 202.0, 401.0]], "categories": [2, 2]}} +``` + +قم بتحميل مجموعة البيانات باستخدام `ImageFolder`، وسينشئ عمود `objects` بصناديق الحدود والفئات: + +```py +>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder", split="train") +>>> dataset[0]["objects"] +{"bbox": [[302.0, 109.0, 73.0, 52.0]], "categories": [0]} +``` + +### تحميل مجموعة البيانات إلى Hub + +بمجرد إنشاء مجموعة البيانات، يمكنك مشاركتها على Hub باستخدام طريقة [`~datasets.DatasetDict.push_to_hub`]. تأكد من تثبيت مكتبة [huggingface_hub](https://huggingface.co/docs/huggingface_hub/index) وتسجيل الدخول إلى حساب Hugging Face الخاص بك (راجع [الدليل التعليمي للتحميل باستخدام بايثون](upload_dataset#upload-with-python) لمزيد من التفاصيل). + +قم بتحميل مجموعة البيانات الخاصة بك باستخدام [`~datasets.DatasetDict.push_to_hub`]: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder", split="train") +>>> dataset.push_to_hub("stevhliu/my-image-captioning-dataset") +``` + +## WebDataset + +تعتمد صيغة [WebDataset](https://github.com/webdataset/webdataset) على أرشيفات TAR وهي مناسبة لمجموعات البيانات الكبيرة للصور. + +في الواقع، يمكنك تجميع صورك في أرشيفات TAR (على سبيل المثال، 1 جيجابايت من الصور لكل أرشيف TAR) وامتلاك آلاف من أرشيفات TAR: + +``` +folder/train/00000.tar +folder/train/00001.tar +folder/train/00002.tar +... +``` + +في الأرشيفات، يتم تشكيل كل مثال من ملفات تشترك في نفس البادئة: + +``` +e39871fd9fd74f55.jpg +e39871fd9fd74f55.json +f18b91585c4d3f3e.jpg +f18b91585c4d3f3e.json +ede6e66b2fb59aab.jpg +ede6e66b2fb59aab.json +ed600d57fcee4f94.jpg +ed600d57fcee4f94.json +... +``` + +يمكنك وضع تسميات/تعليقات/صناديق حدود الصور الخاصة بك باستخدام ملفات JSON أو نصية، على سبيل المثال. + +للحصول على مزيد من التفاصيل حول صيغة WebDataset ومكتبة بايثون، يرجى الاطلاع على [وثائق WebDataset](https://webdataset.github.io/webdataset). + +قم بتحميل WebDataset الخاص بك، وسينشئ عمودًا واحدًا لكل لاحقة ملف (هنا "jpg" و"json"): + +```python +>>> from datasets import load_dataset + +>>> dataset = load_dataset("webdataset", data_dir="/path/to/folder", split="train") +>>> dataset[0]["json"] +{"bbox": [[302.0, 109.0, 73.0, 52.0]], "categories": [0]} +``` + +## (إرث) نص البرنامج النصي للتحميل + +اكتب نص برنامج تحميل مجموعة البيانات لمشاركة مجموعة بيانات. فهو يحدد تقسيمات مجموعة البيانات وتكويناتها، ويتعامل مع تنزيل مجموعة البيانات وإنشائها. يوجد النص البرمجي في نفس المجلد أو المستودع مثل مجموعة البيانات ويجب أن يحمل نفس الاسم. + +``` +my_dataset/ +├── README.md +├── my_dataset.py +└── data/ # اختياري، قد يحتوي على صورك أو أرشيفات TAR +``` + +يسمح هذا الهيكل بتحميل مجموعة البيانات الخاصة بك في سطر واحد: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("path/to/my_dataset") +``` + +سيوضح هذا الدليل كيفية إنشاء نص برنامج تحميل مجموعة بيانات للصور، وهو مختلف قليلاً عن إنشاء نص برنامج لتحميل مجموعة بيانات نصية. ستتعلم كيفية: + +- إنشاء فئة أداة إنشاء مجموعة البيانات. + +- إنشاء تكوينات مجموعة البيانات. + +- إضافة البيانات الوصفية لمجموعة البيانات. + +- تنزيل مجموعة البيانات وتحديد تقسيماتها. + +- إنشاء مجموعة البيانات. + +- إنشاء البيانات الوصفية لمجموعة البيانات (اختياري). + +- تحميل مجموعة البيانات إلى Hub. + +أفضل طريقة للتعلم هي فتح نص برنامج تحميل مجموعة بيانات للصور موجود مسبقًا، مثل [Food-101](https://huggingface.co/datasets/food101/blob/main/food101.py)، واتباعه! + + + +لمساعدتك في البدء، قمنا بإنشاء [قالب](https://github.com/huggingface/datasets/blob/main/templates/new_dataset_script.py) لنص البرنامج يمكنك نسخه واستخدامه كنقطة بداية! + + + +### إنشاء فئة أداة إنشاء مجموعة البيانات + +[`GeneratorBasedBuilder`] هي الفئة الأساسية لمجموعات البيانات التي تم إنشاؤها من مولد القاموس. داخل هذه الفئة، هناك ثلاث طرق للمساعدة في إنشاء مجموعة البيانات الخاصة بك: + +- `info` تخزن معلومات حول مجموعة البيانات الخاصة بك مثل الوصف والترخيص والميزات. + +- `split_generators` يقوم بتنزيل مجموعة البيانات وتحديد تقسيماتها. + +- `generate_examples` يقوم بإنشاء الصور والتسميات لكل تقسيم. + +ابدأ بإنشاء فئة مجموعة البيانات الخاصة بك كفئة فرعية من [`GeneratorBasedBuilder`] وأضف الطرق الثلاث. لا تقلق بشأن ملء كل من هذه الطرق بعد، فستقوم بتطويرها في الأقسام التالية: + +```py +class Food101(datasets.GeneratorBasedBuilder): +"""Food-101 Images dataset""" + +def _info(self): + +def _split_generators(self, dl_manager): + +def _generate_examples(self, images, metadata_path): +``` + +#### تكوينات متعددة + +في بعض الحالات، قد تحتوي مجموعة البيانات على أكثر من تكوين واحد. على سبيل المثال، إذا قمت بفحص [مجموعة بيانات Imagenette](https://huggingface.co/datasets/frgfm/imagenette)، فستلاحظ وجود ثلاث مجموعات فرعية. + +لإنشاء تكوينات مختلفة، استخدم فئة [`BuilderConfig`] لإنشاء فئة فرعية لمجموعة البيانات الخاصة بك. قم بتوفير الروابط لتنزيل الصور والتسميات في `data_url` و`metadata_urls`: + +```py +class Food101Config(datasets.BuilderConfig): +"""Builder Config for Food-101""" + +def __init__(self, data_url, metadata_urls, **kwargs): +"""BuilderConfig for Food-101. +Args: +data_url: `string`, url to download the zip file from. +metadata_urls: dictionary with keys 'train' and 'validation' containing the archive metadata URLs +**kwargs: keyword arguments forwarded to super. +""" +super(Food101Config, self).__init__(version=datasets.Version("1.0.0"), **kwargs) +self.data_url = data_url +self.metadata_urls = metadata_urls +``` + +الآن يمكنك تحديد مجموعاتك الفرعية في أعلى [`GeneratorBasedBuilder`]. تخيل أنك تريد إنشاء مجموعتين فرعيتين في مجموعة بيانات Food-101 بناءً على ما إذا كان الطعام من وجبة الإفطار أو العشاء. + +1. حدد مجموعاتك الفرعية باستخدام `Food101Config` في قائمة في `BUILDER_CONFIGS`. + +2. لكل تكوين، قم بتوفير اسم ووصف ومكان تنزيل الصور والتسميات منه. + +```py +class Food101(datasets.GeneratorBasedBuilder): +"""Food-101 Images dataset""" + +BUILDER_CONFIGS = [ +Food101Config( +name="breakfast", +description="Food types commonly eaten during breakfast.", +data_url="https://link-to-breakfast-foods.zip", +metadata_urls={ +"train": "https://link-to-breakfast-foods-train.txt", +"validation": "https://link-to-breakfast-foods-validation.txt" +}, +, +Food101Config( +name="dinner", +description="Food types commonly eaten during dinner.", +data_url="https://link-to-dinner-foods.zip", +metadata_urls={ +"train": "https://link-to-dinner-foods-train.txt", +"validation": "https://link-to-dinner-foods-validation.txt" +}, +)... +] +``` + +الآن إذا أراد المستخدمون تحميل تكوين "الإفطار"، فيمكنهم استخدام اسم التكوين: + +```py +>>> from datasets import load_dataset +>>> ds = load_dataset("food101", "breakfast", split="train") +``` + +### إضافة البيانات الوصفية لمجموعة البيانات + +إن إضافة معلومات حول مجموعة البيانات الخاصة بك مفيد للمستخدمين لمعرفة المزيد عنها. يتم تخزين هذه المعلومات في فئة [`DatasetInfo`] والتي يتم إرجاعها بواسطة طريقة `info`. يمكن للمستخدمين الوصول إلى هذه المعلومات عن طريق: + +```py +>>> from datasets import load_dataset_builder +>>> ds_builder = load_dataset_builder("food101") +>>> ds_builder.info +``` + +هناك الكثير من المعلومات التي يمكنك تحديدها حول مجموعة البيانات الخاصة بك، ولكن بعض المعلومات المهمة التي يجب تضمينها هي: + +1 +لمحة عامة + +في هذا الدليل، ستتعلم كيفية تحميل مجموعة بيانات الصور الخاصة بك إلى مركز Hugging Face ومشاركتها مع المجتمع. ستتعرف على كيفية إنشاء نص برمجي لتحميل مجموعة البيانات الخاصة بك، وتنظيمها في أقسام، وتوليد البيانات الوصفية، وتحميلها في النهاية إلى المركز. + +### تنزيل مجموعة البيانات وتعريف التقسيمات + +الآن بعد أن أضفت بعض المعلومات حول مجموعة البيانات الخاصة بك، فإن الخطوة التالية هي تنزيل مجموعة البيانات وإنشاء التقسيمات. + +1. استخدم طريقة [`DownloadManager.download`] لتنزيل مجموعة البيانات وأي بيانات وصفية أخرى تريد ربطها بها. تقبل هذه الطريقة: + - اسم ملف داخل مستودع مجموعة بيانات المركز (بمعنى آخر، مجلد `data/`) + - عنوان URL لملف مستضاف في مكان آخر + - قائمة أو قاموس من أسماء الملفات أو عناوين URL + + في نص تحميل Food-101، ستلاحظ مرة أخرى أن عناوين URL محددة مسبقًا في النص البرمجي. + +2. بعد تنزيل مجموعة البيانات، استخدم [`SplitGenerator`] لتنظيم الصور والعلامات في كل تقسيم. قم بتسمية كل قسم باسم قياسي مثل: `Split.TRAIN`، `Split.TEST`، و`Split.VALIDATION`. + + في معلمة `gen_kwargs`، حدد مسارات الملف إلى `images` للتنقل خلالها وتحميلها. إذا لزم الأمر، يمكنك استخدام [`DownloadManager.iter_archive`] للتنقل بين الصور في أرشيفات TAR. يمكنك أيضًا تحديد العلامات المقابلة في `metadata_path`. في الواقع، يتم تمرير `images` و`metadata_path` إلى الخطوة التالية حيث ستقوم فعليًا بتوليد مجموعة البيانات. + + + + لاستخدام تدفق أرشيف TAR، يجب استخدام [`DownloadManager.iter_archive`]! لا تدعم وظيفة [`DownloadManager.download_and_extract`] أرشيفات TAR في وضع التدفق. + + + + ```py + def _split_generators(self, dl_manager): + archive_path = dl_manager.download(_BASE_URL) + split_metadata_paths = dl_manager.download(_METADATA_URLS) + return [ + datasets.SplitGenerator( + name=datasets.Split.TRAIN, + gen_kwargs={ + "images": dl_manager.iter_archive(archive_path), + "metadata_path": split_metadata_paths["train"], + }, + ), + datasets.SplitGenerator( + name=datasets.Split.VALIDATION, + gen_kwargs={ + "images": dl_manager.iter_archive(archive_path), + "metadata_path": split_metadata_paths["validation"], + }, + ), + ] + ``` + +### توليد مجموعة البيانات + +تتولى الطريقة الأخيرة في فئة [`GeneratorBasedBuilder`] في الواقع توليد الصور والعلامات في مجموعة البيانات. إنه ينتج مجموعة بيانات وفقًا للهيكل المحدد في `features` من طريقة `info`. كما ترون، تقبل `generate_examples` `images` و`metadata_path` من الطريقة السابقة كوسيطين. + + + +لفتح تدفق أرشيف TAR، يجب فتح `metadata_path` وقراءته أولاً. يتم الوصول إلى ملفات TAR وإنتاجها بالتتابع. وهذا يعني أنك تحتاج إلى الحصول على معلومات البيانات الوصفية أولاً حتى تتمكن من إنتاجها مع الصورة المقابلة لها. + + + +الآن يمكنك كتابة دالة لفتح وتحميل الأمثلة من مجموعة البيانات: + +```py +def _generate_examples(self, images, metadata_path): + """Generate images and labels for splits.""" + with open(metadata_path, encoding="utf-8") as f: + files_to_keep = set(f.read().split("\n")) + for file_path, file_obj in images: + if file_path.startswith(_IMAGES_DIR): + if file_path[len(_IMAGES_DIR) : -len(".jpg")] in files_to_keep: + label = file_path.split("/")[2] + yield file_path, { + "image": {"path": file_path, "bytes": file_obj.read()}, + "label": label, + } +``` + +### توليد البيانات الوصفية لمجموعة البيانات (اختياري) + +يمكن إنشاء البيانات الوصفية لمجموعة البيانات وتخزينها في بطاقة مجموعة البيانات (`README.md` file). + +قم بتشغيل الأمر التالي لتوليد البيانات الوصفية لمجموعة البيانات في `README.md` والتأكد من عمل نص تحميل مجموعة البيانات الجديدة بشكل صحيح: + +```bash +datasets-cli test path/to/ --save_info --all_configs +``` + +إذا اجتاز نص تحميل مجموعة البيانات الاختبار، فيجب أن تكون لديك الآن حقول YAML للمعلومات الخاصة بمجموعة البيانات في رأس ملف `README.md` في مجلد مجموعة البيانات الخاصة بك. + +### تحميل مجموعة البيانات إلى المركز + +بمجرد أن يصبح نصك جاهزًا، [أنشئ بطاقة مجموعة بيانات](./dataset_card) و[حمّلها إلى المركز](./share). + +تهانينا، يمكنك الآن تحميل مجموعة البيانات الخاصة بك من المركز! 🥳 + +```py +>>> from datasets import load_dataset +>>> load_dataset("/my_dataset") +``` \ No newline at end of file diff --git a/docs/source/ar/image_load.mdx b/docs/source/ar/image_load.mdx new file mode 100644 index 00000000000..f39b9a66fe7 --- /dev/null +++ b/docs/source/ar/image_load.mdx @@ -0,0 +1,81 @@ +# تحميل بيانات الصور + +لتحميل بيانات مجموعات الصور، اتبع ما يلي: + +## الملفات المحلية + +يمكنك تحميل مجموعة بيانات من مسار الصورة. استخدم دالة [`~Dataset.cast_column`] لقبول عمود من مسارات ملفات الصور، وفك ترميزها إلى صورة PIL باستخدام ميزة [`Image`]: + +```py +>>> from datasets import Dataset, Image + +>>> dataset = Dataset.from_dict({"image": ["path/to/image_1", "path/to/image_2", ..., "path/to/image_n"]}).cast_column("image", Image()) +>>> dataset[0]["image"] +] +``` + +إذا كنت تريد فقط تحميل المسار الأساسي لمجموعة بيانات الصور دون فك ترميز كائن الصورة، قم بتعيين `decode=False` في ميزة [`Image`]: + +```py +>>> dataset = load_dataset("beans", split="train").cast_column("image", Image(decode=False)) +>>> dataset[0]["image"] +{'bytes': None, +'path': '/root/.cache/huggingface/datasets/downloads/extracted/b0a21163f78769a2cf11f58dfc767fb458fc7cea5c05dccc0144a2c0f0bc1292/train/bean_rust/bean_rust_train.29.jpg'} +``` + +## ImageFolder + +يمكنك أيضًا تحميل مجموعة بيانات باستخدام منشئ مجموعة بيانات `ImageFolder` والذي لا يتطلب كتابة برنامج تحميل بيانات مخصص. وهذا يجعل `ImageFolder` مثاليًا لإنشاء وتحميل مجموعات بيانات الصور بسرعة والتي تحتوي على عدة آلاف من الصور لمختلف مهام الرؤية الحاسوبية. يجب أن يبدو هيكل مجموعة بيانات الصور على النحو التالي: + +``` +folder/train/dog/golden_retriever.png +folder/train/dog/german_shepherd.png +folder/train/dog/chihuahua.png + +folder/train/cat/maine_coon.png +folder/train/cat/bengal.png +folder/train/cat/birman.png +``` + +قم بتحميل مجموعة البيانات عن طريق تحديد `imagefolder` ودليل مجموعة البيانات الخاصة بك في `data_dir`: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder") +>>> dataset["train"][0] +{"image": , "label": 0} + +>>> dataset["train"][-1] +{"image": , "label": 1} +``` + +لتحميل مجموعات البيانات البعيدة من عناوين URL الخاصة بها، استخدم معلمة `data_files`: + +```py +>>> dataset = load_dataset("imagefolder", data_files="https://download.microsoft.com/download/3/E/1/3E1C3F21-ECDB-4869-8368-6DEBA77B919F/kagglecatsanddogs_5340.zip", split="train") +``` + +تأتي بعض مجموعات البيانات بملف بيانات وصفية (`metadata.csv` أو `metadata.jsonl`) يحتوي على معلومات أخرى حول البيانات مثل صناديق الحدود والنصوص التوضيحية والتصنيفات. يتم تحميل البيانات الوصفية تلقائيًا عند استدعاء [`load_dataset`] وتحديد `imagefolder`. + +لتجاهل المعلومات الموجودة في ملف البيانات الوصفية، قم بتعيين `drop_labels=False` في [`load_dataset`]`، واسمح لـ `ImageFolder` باستنتاج اسم التصنيف تلقائيًا من اسم الدليل: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder", drop_labels=False) +``` + +## WebDataset + +تعتمد صيغة [WebDataset](https://github.com/webdataset/webdataset) على مجلد من أرشيفات TAR وهي مناسبة لمجموعات بيانات الصور الكبيرة. + +بسبب حجمها، يتم تحميل WebDatasets عادةً في وضع البث المباشر (باستخدام `streaming=True`). + +يمكنك تحميل WebDataset على النحو التالي: + +```python +>>> from datasets import load_dataset + +>>> dataset = load_dataset("webdataset", data_dir="/path/to/folder", streaming=True) +``` \ No newline at end of file diff --git a/docs/source/ar/image_process.mdx b/docs/source/ar/image_process.mdx new file mode 100644 index 00000000000..319ae10b709 --- /dev/null +++ b/docs/source/ar/image_process.mdx @@ -0,0 +1,73 @@ +# معالجة بيانات الصور + +يوضح هذا الدليل طرقًا محددة لمعالجة مجموعات بيانات الصور. تعلم كيفية: + +- استخدام [`~Dataset.map`] مع مجموعة بيانات الصور. +- تطبيق عمليات تعزيز البيانات على مجموعة بيانات باستخدام [`~Dataset.set_transform`]. + +للاطلاع على دليل حول كيفية معالجة أي نوع من مجموعات البيانات، راجع الدليل العام للمعالجة. + +## Map + +يمكن لدوال [`~Dataset.map`] تطبيق التحولات على مجموعة البيانات بأكملها. + +على سبيل المثال، قم بإنشاء دالة [`Resize`](https://pytorch.org/vision/stable/generated/torchvision.transforms.Resize.html) أساسية: + +```py +>>> def transforms(examples): +... examples["pixel_values"] = [image.convert("RGB").resize((100, 100)) for image in examples["image"]] +... return examples +``` + +الآن، استخدم دالة [`~Dataset.map`] لإعادة تحجيم مجموعة البيانات بالكامل، وقم بتعيين `batched=True` لتسريع العملية عن طريق قبول دفعات من الأمثلة. تقوم دالة التحول بإرجاع `pixel_values` ككائن `PIL.Image` قابل للتخزين المؤقت: + +```py +>>> dataset = dataset.map(transforms, remove_columns=["image"], batched=True) +>>> dataset[0] +{'label': 6, +'pixel_values': } +``` + +يوفر ملف التخزين المؤقت الوقت لأنك لست مضطرًا لتنفيذ نفس التحويل مرتين. وتعد دالة [`~Dataset.map`] الأفضل للعمليات التي يتم تشغيلها مرة واحدة فقط لكل عملية تدريب - مثل تغيير حجم الصورة - بدلاً من استخدامها للعمليات التي يتم تنفيذها لكل حقبة، مثل تعزيزات البيانات. + +تستهلك [`~Dataset.map`] بعض الذاكرة، ولكن يمكنك تقليل متطلبات الذاكرة الخاصة بها باستخدام المعلمات التالية: + +- [`batch_size`](./package_reference/main_classes#datasets.DatasetDict.map.batch_size) يحدد عدد الأمثلة التي تتم معالجتها في مكالمة واحدة لدالة التحول. +- [`writer_batch_size`](./package_reference/main_classes#datasets.DatasetDict.map.writer_batch_size) يحدد عدد الأمثلة المعالجة التي يتم الاحتفاظ بها في الذاكرة قبل تخزينها. + +تكون قيم المعلمات الافتراضية لكل من 1000، والتي يمكن أن تكون مكلفة إذا كنت تقوم بتخزين الصور. قم بتخفيض هذه القيم لاستخدام ذاكرة أقل عند استخدام [`~Dataset.map`]. + +## تطبيق التحولات + +تطبق مكتبة 🤗 Datasets عمليات تعزيز البيانات من أي مكتبة أو حزمة على مجموعة البيانات الخاصة بك. يمكن تطبيق التحولات أثناء التنقل على دفعات من البيانات باستخدام [`~Dataset.set_transform`]، والتي تستهلك مساحة أقل على القرص. + + +يستخدم المثال التالي [torchvision](https://pytorch.org/vision/stable/index.html)، ولكن يمكنك استخدام مكتبات تعزيز بيانات أخرى مثل [Albumentations](https://albumentations.ai/docs/)، [Kornia](https://kornia.readthedocs.io/en/latest/)، و [imgaug](https://imgaug.readthedocs.io/en/latest/). + + +على سبيل المثال، إذا كنت تريد تغيير خصائص اللون لصورة بشكل عشوائي: + +```py +>>> from torchvision.transforms import Compose, ColorJitter, ToTensor + +>>> jitter = Compose( +... [ +... ColorJitter(brightness=0.25, contrast=0.25, saturation=0.25, hue=0.7), +... ToTensor(), +... ] +... ) +``` + +قم بإنشاء دالة لتطبيق تحويل `ColorJitter`: + +```py +>>> def transforms(examples): +... examples["pixel_values"] = [jitter(image.convert("RGB")) for image in examples["image"]] +... return examples +``` + +طبق التحويل باستخدام دالة [`~Dataset.set_transform`]: + +```py +>>> dataset.set_transform(transforms) +``` \ No newline at end of file diff --git a/docs/source/imgs/course_banner.png b/docs/source/ar/imgs/course_banner.png similarity index 100% rename from docs/source/imgs/course_banner.png rename to docs/source/ar/imgs/course_banner.png diff --git a/docs/source/imgs/datasets_logo_name.jpg b/docs/source/ar/imgs/datasets_logo_name.jpg similarity index 100% rename from docs/source/imgs/datasets_logo_name.jpg rename to docs/source/ar/imgs/datasets_logo_name.jpg diff --git a/docs/source/ar/index.mdx b/docs/source/ar/index.mdx new file mode 100644 index 00000000000..ed6f303b282 --- /dev/null +++ b/docs/source/ar/index.mdx @@ -0,0 +1,28 @@ +# Datasets + +🤗 Datasets هي مكتبة للوصول إلى مجموعات البيانات ومشاركتها بسهولة لمهام الصوت والرؤية الحاسوبية ومعالجة اللغات الطبيعية. + +قم بتحميل مجموعة البيانات في سطر واحد من التعليمات البرمجية، واستخدم طرق معالجة البيانات القوية الخاصة بنا للبدء بسرعة في إعداد مجموعة البيانات للتدريب في نموذج تعلم عميق. بدعم من تنسيق Apache Arrow، يمكنك معالجة مجموعات البيانات الكبيرة مع عمليات القراءة بدون نسخ بدون أي قيود على الذاكرة للحصول على السرعة والكفاءة المثلى. كما أننا نقدم تكاملًا عميقًا مع [Hugging Face Hub](https://huggingface.co/datasets)، مما يتيح لك تحميل مجموعة البيانات ومشاركتها بسهولة مع مجتمع التعلم الآلي الأوسع. + +ابحث عن مجموعة البيانات الخاصة بك اليوم على [Hugging Face Hub](https://huggingface.co/datasets)، وألق نظرة متعمقة عليها باستخدام المشاهد المباشر. + + \ No newline at end of file diff --git a/docs/source/ar/installation.md b/docs/source/ar/installation.md new file mode 100644 index 00000000000..690877fa7ed --- /dev/null +++ b/docs/source/ar/installation.md @@ -0,0 +1,110 @@ +## التثبيت + +قبل البدء، ستحتاج إلى إعداد بيئة العمل الخاصة بك وتثبيت الحزم المناسبة. تم اختبار 🤗 Datasets على **Python 3.7+**. + + + +إذا كنت تريد استخدام 🤗 Datasets مع TensorFlow أو PyTorch، ستحتاج إلى تثبيتهما بشكل منفصل. راجع صفحة تثبيت TensorFlow](https://www.tensorflow.org/install/pip#tensorflow-2-packages-are-available) أو صفحة تثبيت PyTorch](https://pytorch.org/get-started/locally/#start-locally) للاطلاع على أمر التثبيت المحدد لإطار العمل الخاص بك. + + + +## البيئة الافتراضية + +يجب تثبيت 🤗 Datasets في [بيئة افتراضية](https://docs.python.org/3/library/venv.html) للحفاظ على التنظيم وتجنب تعارضات الاعتمادات. + +1. قم بإنشاء دليل المشروع الخاص بك والانتقال إليه: + +```bash +mkdir ~/my-project +cd ~/my-project +``` + +2. ابدأ بيئة افتراضية داخل دليلك: + +```bash +python -m venv .env +``` + +3. قم بتنشيط وتعطيل البيئة الافتراضية باستخدام الأوامر التالية: + +```bash +# تنشيط البيئة الافتراضية +source .env/bin/activate + +# إلغاء تنشيط البيئة الافتراضية +source .env/bin/deactivate +``` + +بمجرد إنشاء بيئتك الافتراضية، يمكنك تثبيت 🤗 Datasets فيها. + +## pip + +أسهل طريقة لتثبيت 🤗 Datasets هي باستخدام pip: + +```bash +pip install datasets +``` + +قم بتشغيل الأمر التالي للتحقق مما إذا كان 🤗 Datasets قد تم تثبيته بشكل صحيح: + +```bash +python -c "from datasets import load_dataset; print(load_dataset('squad', split='train')[0])" +``` + +يقوم هذا الأمر بتنزيل الإصدار 1 من [مجموعة بيانات Stanford Question Answering Dataset (SQuAD)](https://rajpurkar.github.io/SQuAD-explorer/)، وتحميل قسم التدريب، وطباعة أول مثال تدريبي. يجب أن ترى ما يلي: + +```python +{'answers': {'answer_start': [515], 'text': ['Saint Bernadette Soubirous']}, 'context': 'Architecturally, the school has a Catholic character. Atop the Main Building\'s gold dome is a golden statue of the Virgin Mary. Immediately in front of the Main Building and facing it, is a copper statue of Christ with arms upraised with the legend "Venite Ad Me Omnes". Next to the Main Building is the Basilica of the Sacred Heart. Immediately behind the basilica is the Grotto, a Marian place of prayer and reflection. It is a replica of the grotto at Lourdes, France where the Virgin Mary reputedly appeared to Saint Bernadette Soubirous in 1858. At the end of the main drive (and in a direct line that connects through 3 statues and the Gold Dome), is a simple, modern stone statue of Mary.', 'id': '5733be284776f41900661182', 'question': 'To whom did the Virgin Mary allegedly appear in 1858 in Lourdes France?', 'title': 'University_of_Notre_Dame'} +``` + +## الصوت + +للعمل مع مجموعات البيانات الصوتية، تحتاج إلى تثبيت ميزة [`Audio`] كاعتماد إضافي: + +```bash +pip install datasets[audio] +``` + + + +لفك تشفير ملفات mp3، تحتاج إلى وجود إصدار 1.1.0 على الأقل من مكتبة النظام `libsndfile`. عادة ما يتم تضمينه مع حزمة بايثون [`soundfile`](https://github.com/bastibe/python-soundfile)، والتي يتم تثبيتها كاعتماد صوتي إضافي لـ 🤗 Datasets. + +بالنسبة لنظام Linux، يتم حزم الإصدار المطلوب من `libsndfile` مع `soundfile` بدءًا من الإصدار 0.12.0. يمكنك تشغيل الأمر التالي لتحديد إصدار `libsndfile` الذي يستخدمه `soundfile`: + +```bash +python -c "import soundfile; print(soundfile.__libsndfile_version__)" +``` + + + +## الرؤية + +للعمل مع مجموعات البيانات الصورية، تحتاج إلى تثبيت ميزة [`Image`] كاعتماد إضافي: + +```bash +pip install datasets[vision] +``` + +## المصدر + +يتيح بناء 🤗 Datasets من المصدر إجراء تغييرات على قاعدة التعليمات البرمجية. لتثبيته من المصدر، استنسخ المستودع وقم بالتثبيت باستخدام الأوامر التالية: + +```bash +git clone https://github.com/huggingface/datasets.git +cd datasets +pip install -e . +``` + +مرة أخرى، يمكنك التحقق مما إذا كان 🤗 Datasets قد تم تثبيته بشكل صحيح باستخدام الأمر التالي: + +```bash +python -c "from datasets import load_dataset; print(load_dataset('squad', split='train')[0])" +``` + +## كوندا + +يمكن أيضًا تثبيت 🤗 Datasets من كوندا، وهو نظام إدارة الحزم: + +```bash +conda install -c huggingface -c conda-forge datasets +``` \ No newline at end of file diff --git a/docs/source/ar/load_hub.mdx b/docs/source/ar/load_hub.mdx new file mode 100644 index 00000000000..5317cf52dfc --- /dev/null +++ b/docs/source/ar/load_hub.mdx @@ -0,0 +1,3 @@ +لم يتم العثور على أي نص باللغة العربية في النص المقدم، وبالتالي لا توجد حاجة للترجمة. يبدو أن النص يتعلق بتحميل مجموعة بيانات من "Hub" واستكشاف مختلف الوظائف والخيارات المتاحة للعمل مع مجموعات البيانات هذه. + +هل هناك أي شيء آخر يمكنني المساعدة به؟ \ No newline at end of file diff --git a/docs/source/ar/loading.mdx b/docs/source/ar/loading.mdx new file mode 100644 index 00000000000..05efd84c0ea --- /dev/null +++ b/docs/source/ar/loading.mdx @@ -0,0 +1,430 @@ +## التحميل +يمكن تخزين بياناتك في أماكن مختلفة؛ يمكن أن تكون على القرص الموجود على جهازك المحلي، أو في مستودع GitHub، أو في هياكل بيانات في الذاكرة مثل القواميس و DataFrames الخاصة بـ Python. أينما تم تخزين مجموعة البيانات، يمكن لـ 🤗 Datasets مساعدتك في تحميلها. + +سيوضح لك هذا الدليل كيفية تحميل مجموعة بيانات من: + +- Hub Hugging Face +- ملفات محلية +- بيانات في الذاكرة +- غير متصل +- شريحة محددة من تقسيم +- نص برمجي محلي للتحميل (قديم) + +للحصول على مزيد من التفاصيل المحددة حول تحميل طرائق بيانات أخرى، اطلع على دليل تحميل مجموعة بيانات الصوت، أو دليل تحميل مجموعة بيانات الصور، أو دليل تحميل مجموعة بيانات NLP. + +## Hub Hugging Face + +يتم تحميل مجموعات البيانات من نص برمجي لتحميل مجموعة البيانات يقوم بتنزيل مجموعة البيانات وإنشائها. ومع ذلك، يمكنك أيضًا تحميل مجموعة بيانات من أي مستودع لمجموعة بيانات على Hub دون نص برمجي للتحميل! ابدأ بـ [إنشاء مستودع مجموعة بيانات](share#create-the-repository) وقم بتحميل ملفات البيانات الخاصة بك. الآن يمكنك استخدام وظيفة [`load_dataset`] لتحميل مجموعة البيانات. + +على سبيل المثال، جرّب تحميل الملفات من هذا [مستودع العرض التوضيحي](https://huggingface.co/datasets/lhoestq/demo1) عن طريق توفير مساحة اسم المستودع واسم مجموعة البيانات. يحتوي مستودع مجموعة البيانات هذا على ملفات CSV، ويقوم الكود أدناه بتحميل مجموعة البيانات من ملفات CSV: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("lhoestq/demo1") +``` + +قد تحتوي بعض مجموعات البيانات على أكثر من إصدار واحد بناءً على علامات Git أو الفروع أو الالتزامات. استخدم معلمة `revision` لتحديد إصدار مجموعة البيانات الذي تريد تحميله: + +```py +>>> dataset = load_dataset( +... "lhoestq/custom_squad", +... revision="main" # اسم العلامة، أو اسم الفرع، أو التجزئة +... ) +``` + +راجع البرنامج التعليمي [تحميل مجموعة بيانات إلى Hub](./upload_dataset) لمزيد من التفاصيل حول كيفية إنشاء مستودع مجموعة بيانات على Hub، وكيفية تحميل ملفات البيانات الخاصة بك. + +تُحمِّل مجموعة البيانات بدون نص برمجي للتحميل بشكل افتراضي جميع البيانات في تقسيم `train`. استخدم معلمة `data_files` لتعيين ملفات البيانات إلى تقسيمات مثل `train` و`validation` و`test`: + +```py +>>> data_files = {"train": "train.csv", "test": "test.csv"} +>>> dataset = load_dataset("namespace/your_dataset_name", data_files=data_files) +``` + +إذا لم تحدد ملفات البيانات التي سيتم استخدامها، فسيتم [`load_dataset`] إرجاع جميع ملفات البيانات. قد يستغرق هذا وقتًا طويلاً إذا قمت بتحميل مجموعة بيانات كبيرة مثل C4، والتي تبلغ حوالي 13 تيرابايت من البيانات. + +يمكنك أيضًا تحميل جزء فرعي محدد من الملفات باستخدام معلمة `data_files` أو `data_dir`. يمكن لهذه المعلمات قبول مسار نسبي يحل محل مسار الأساس المقابل للمكان الذي يتم تحميل مجموعة البيانات منه. + +```py +>>> from datasets import load_dataset + +# تحميل الملفات التي تتطابق مع نمط grep +>>> c4_subset = load_dataset("allenai/c4", data_files="en/c4-train.0000*-of-01024.json.gz") + +# تحميل مجموعة البيانات من دليل en على Hub +>>> c4_subset = load_dataset("allenai/c4", data_dir="en") +``` + +يمكن أيضًا لمعلمة `split` تعيين ملف بيانات إلى تقسيم محدد: + +```py +>>> data_files = {"validation": "en/c4-validation.*.json.gz"} +>>> c4_validation = load_dataset("allenai/c4", data_files=data_files, split="validation") +``` + +## الملفات المحلية والبعيدة + +يمكن تحميل مجموعات البيانات من الملفات المحلية المخزنة على جهاز الكمبيوتر الخاص بك ومن الملفات البعيدة. من المحتمل أن تكون مجموعات البيانات مخزنة بتنسيق `csv` أو `json` أو `txt` أو `parquet`. يمكن لوظيفة [`load_dataset`] تحميل كل نوع من هذه الأنواع من الملفات. + +### CSV + +يمكن لـ 🤗 Datasets قراءة مجموعة بيانات تتكون من ملف CSV واحد أو أكثر (في هذه الحالة، قم بتمرير ملفات CSV الخاصة بك كقائمة): + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("csv", data_files="my_file.csv") +``` + +للحصول على مزيد من التفاصيل، راجع الدليل [كيفية تحميل مجموعات البيانات الجدولية من ملفات CSV](tabular_load#csv-files). + +### JSON + +يتم تحميل ملفات JSON مباشرة باستخدام [`load_dataset`] كما هو موضح أدناه: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("json", data_files="my_file.json") +``` + +تتنوع تنسيقات JSON، ولكننا نعتقد أن أكثر التنسيقات كفاءة هو وجود عدة كائنات JSON؛ يمثل كل سطر صفًا فرديًا من البيانات. على سبيل المثال: + +```json +{"a": 1, "b": 2.0, "c": "foo", "d": false} +{"a": 4, "b": -5.5, "c": null, "d": true} +``` + +تنسيق JSON آخر قد تصادفه هو حقل متداخل، وفي هذه الحالة ستحتاج إلى تحديد حجة `field` كما هو موضح فيما يلي: + +```py +{"version": "0.1.0", +"data": [{"a": 1, "b": 2.0, "c": "foo", "d": false}, +{"a": 4, "b": -5.5, "c": null, "d": true}] +} + +>>> from datasets import load_dataset +>>> dataset = load_dataset("json", data_files="my_file.json", field="data") +``` + +لتحميل ملفات JSON البعيدة عبر HTTP، مرر عناوين URL بدلاً من ذلك: + +```py +>>> base_url = "https://rajpurkar.github.io/SQuAD-explorer/dataset/" +>>> dataset = load_dataset("json", data_files={"train": base_url + "train-v1.1.json", "validation": base_url + "dev-v1.1.json"}, field="data") +``` + +بينما هذه هي تنسيقات JSON الأكثر شيوعًا، فستشاهد مجموعات بيانات أخرى بتنسيق مختلف. يتعرف 🤗 Datasets على هذه التنسيقات الأخرى وسيتم التراجع وفقًا لذلك على أساليب تحميل JSON في Python للتعامل معها. + +### Parquet + +تُخزَّن ملفات Parquet بتنسيق عمودي، على عكس الملفات المستندة إلى الصف مثل CSV. قد يتم تخزين مجموعات البيانات الكبيرة في ملف Parquet لأنه أكثر كفاءة وأسرع في إرجاع استعلامك. + +لتحميل ملف Parquet: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("parquet", data_files={'train': 'train.parquet', 'test': 'test.parquet'}) +``` + +لتحميل ملفات Parquet البعيدة عبر HTTP، مرر عناوين URL بدلاً من ذلك: + +```py +>>> base_url = "https://storage.googleapis.com/huggingface-nlp/cache/datasets/wikipedia/20200501.en/1.0.0/" +>>> data_files = {"train": base_url + "wikipedia-train.parquet"} +>>> wiki = load_dataset("parquet", data_files=data_files, split="train") +``` + +### Arrow + +تُخزَّن ملفات Arrow بتنسيق عمودي في الذاكرة، على عكس التنسيقات المستندة إلى الصف مثل CSV والتنسيقات غير المضغوطة مثل Parquet. + +لتحميل ملف Arrow: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("arrow", data_files={'train': 'train.arrow', 'test': 'test.arrow'}) +``` + +لتحميل ملفات Arrow البعيدة عبر HTTP، مرر عناوين URL بدلاً من ذلك: + +```py +>>> base_url = "https://storage.googleapis.com/huggingface-nlp/cache/datasets/wikipedia/2Multiplier0200501.en/1.0.0/" +>>> data_files = {"train": base_url + "wikipedia-train.arrow"} +>>> wiki = load_dataset("arrow", data_files=data_files, split="train") +``` + +Arrow هو تنسيق الملف الذي يستخدمه 🤗 Datasets تحت الغطاء، لذلك يمكنك تحميل ملف Arrow محلي باستخدام [`Dataset.from_file`] مباشرة: + +```py +>>> from datasets import Dataset +>>> dataset = Dataset.from_file("data.arrow") +``` + +على عكس [`load_dataset`]`[Dataset.from_file`]، يقوم بتعيين ملف Arrow في الذاكرة دون إعداد مجموعة البيانات في الذاكرة المؤقتة، مما يوفر لك مساحة على القرص. + +سيكون دليل الذاكرة المؤقتة لتخزين نتائج المعالجة المتوسطة هو دليل ملف Arrow في هذه الحالة. + +يتم دعم تنسيق Arrow للبث فقط في الوقت الحالي. تنسيق IPC Arrow (المعروف أيضًا باسم Feather V2) غير مدعوم. + +### SQL + +اقرأ محتويات قاعدة البيانات باستخدام [`~datasets.Dataset.from_sql`] عن طريق تحديد عنوان URL للاتصال بقاعدة البيانات الخاصة بك. يمكنك قراءة أسماء الجداول والاستعلامات: + +```py +>>> from datasets import Dataset +# تحميل الجدول بالكامل +>>> dataset = Dataset.from_sql("data_table_name", con="sqlite:///sqlite_file.db") +# التحميل من الاستعلام +>>> dataset = Dataset.from_sql("SELECT text FROM table WHERE length(text) > 100 LIMIT 10", con="sqlite:///sqlite_file.db") +``` + +للحصول على مزيد من التفاصيل، راجع الدليل [كيفية تحميل مجموعات البيانات الجدولية من قواعد بيانات SQL](tabular_load#databases). + +### WebDataset + +يستند تنسيق [WebDataset](https://github.com/webdataset/webdataset) إلى أرشيفات TAR وهو مناسب لمجموعات البيانات الصورية الكبيرة. + +بسبب حجمها، يتم تحميل WebDatasets بشكل عام في وضع البث (باستخدام `streaming=True`). + +يمكنك تحميل WebDataset على النحو التالي: + +```python +>>> from datasets import load_dataset +>>> +>>> path = "path/to/train/*.tar" +>>> dataset = load_dataset("webdataset", data_files={"train": path}, split="train", streaming=True) +``` + +لتحميل WebDatasets البعيدة عبر HTTP، مرر عناوين URL بدلاً من ذلك: + +```python +>>> from datasets import load_dataset +>>> +>>> base_url = "https://huggingface.co/datasets/lhoestq/small-publaynet-wds/resolve/main/publaynet-train-{i:06d}.tar" +>>> urls = [base_url.format(i=i) for i in range(4)] +>>> dataset = load_dataset("webdataset", data_files={"train": urls}, split="train", streaming=True) +``` + +## تعدد المعالجة + +عندما تتكون مجموعة البيانات من عدة ملفات (والتي نسميها "الشظايا")، يمكن تسريع خطوة تنزيل مجموعة البيانات وإعدادها بشكل كبير. + +يمكنك اختيار عدد العمليات التي تريد استخدامها لإعداد مجموعة بيانات بالتوازي باستخدام `num_proc`. + +في هذه الحالة، يتم منح كل عملية مجموعة فرعية من الشظايا لإعدادها: + +```python +from datasets import load_dataset + +imagenet = load_dataset("imagenet-1k", num_proc=8) +ml_librispeech_spanish = load_dataset("facebook/multilingual_librispeech", "spanish", num_proc=8) +``` + +## بيانات في الذاكرة + +سيُتيح لك 🤗 Datasets أيضًا إنشاء [`Dataset`] مباشرةً من هياكل البيانات في الذاكرة مثل القواميس وDataFrames الخاصة بـ Python. + +### قاموس Python + +قم بتحميل القواميس الخاصة بـ Python باستخدام [`~Dataset.from_dict`]: + +```py +>>> from datasets import Dataset +>>> my_dict = {"a": [1, 2, 3]} +>>> dataset = Dataset.from_dict(my_dict) +``` + +### قائمة Python من القواميس + +قم بتحميل قائمة من القواميس الخاصة بـ Python باستخدام [`~Dataset.from_list`]: + +```py +>>> from datasets import Dataset +>>> my_list = [{"a": 1}, {"a": 2}, {"a": 3}] +>>> dataset = Dataset.from_list(my_list) +``` + +### مولد Python + +قم بإنشاء مجموعة بيانات من مولد Python باستخدام [`~Dataset.from_generator`]: + +```py +>>> from datasets import Dataset +>>> def my_gen(): +... for i in range(1, 4): +... yield {"a": i} +... +>>> dataset = Dataset.from_generator(my_gen) +``` + +يدعم هذا النهج تحميل البيانات الأكبر من الذاكرة المتوفرة. + +يمكنك أيضًا تحديد مجموعة بيانات مجزأة عن طريق تمرير القوائم إلى `gen_kwargs`: + +```py +>>> def gen(shards): +... for shard in shards: +... with open(shard) as f: +... for line in f: +... yield {"line": line} +... +>>> shards = [f"data{i}.txt" for i in range(32)] +>>> ds = IterableDataset.from_generator(gen, gen_kwargs={"shards": shards}) +>>> ds = ds.shuffle(seed=42, buffer_size=10_000) # ترتيب الشظايا + استخدام مخزن مؤقت للخلط +>>> from torch.utils.data import DataLoader +>>> dataloader = DataLoader(ds.with_format("torch"), num_workers=4) # إعطاء كل عامل مجموعة فرعية من الشظايا 32/4=8 +``` + +### Pandas DataFrame + +قم بتحميل Pandas DataFrames باستخدام [`~Dataset.from_pandas`]: + +```py +>>> from datasets import Dataset +>>> import pandas as pd +>>> df = pd.DataFrame({"a": [1, 2, 3]}) +>>> dataset = Dataset.from_pandas(df) +``` + +للحصول على مزيد من التفاصيل، راجع الدليل [كيفية تحميل مجموعات البيانات الجدولية من Pandas DataFrames](tabular_load#pandas-dataframes). + +## غير متصل + +حتى إذا لم يكن لديك اتصال بالإنترنت، فلا يزال من الممكن تحميل مجموعة بيانات. طالما قمت بتنزيل مجموعة بيانات من مستودع Hub من قبل، يجب أن تكون مخزنة مؤقتًا. وهذا يعني أنه يمكنك إعادة تحميل مجموعة البيانات من الذاكرة المؤقتة واستخدامها دون اتصال. + +إذا كنت تعلم أنك لن يكون لديك اتصال بالإنترنت، فيمكنك تشغيل 🤗 Datasets في وضع عدم الاتصال الكامل. يوفر هذا الوقت لأنه بدلاً من انتظار انتهاء صلاحية تنزيل برنامج بناء مجموعة البيانات، سينظر 🤗 Datasets مباشرة في الذاكرة المؤقتة. قم بتعيين متغير البيئة `HF_HUB_OFFLINE` إلى `1` لتمكين وضع عدم الاتصال الكامل. +## تقسيم الشرائح + +يمكنك أيضًا اختيار تحميل شرائح محددة فقط من تقسيم. هناك خياران لتقسيم الشريحة: باستخدام السلاسل أو واجهة برمجة تطبيقات [`ReadInstruction`]. السلاسل أكثر إحكاما وقابلية للقراءة للحالات البسيطة، في حين أن [`ReadInstruction`] أسهل في الاستخدام مع معلمات تقسيم الشرائح المتغيرة. + +قم بدمج تقسيم `train` و`test` بالطريقة التالية: + +```py +>>> train_test_ds = datasets.load_dataset("bookcorpus", split="train+test") +===STRINGAPI-READINSTRUCTION-SPLIT=== +>>> ri = datasets.ReadInstruction("train") + datasets.ReadInstruction("test") +>>> train_test_ds = datasets.load_dataset("bookcorpus", split=ri) +``` + +حدد صفوفًا محددة من تقسيم "التدريب": + +```py +>>> train_10_20_ds = datasets.load_dataset("bookcorpus", split="train[10:20]") +===STRINGAPI-READINSTRUCTION-SPLIT=== +>>> train_10_20_ds = datasets.load_dataset("bookcorpu"، split=datasets.ReadInstruction("train"، from_=10، to=20، unit="abs")) +``` + +أو حدد نسبة مئوية من التقسيم باستخدام: + +```py +>>> train_10pct_ds = datasets.load_dataset("bookcorpus", split="train[:10%]") +===STRINGAPI-READINSTRUCTION-SPLIT=== +>>> train_10_20_ds = datasets.load_dataset("bookcorpus"، split=datasets.ReadInstruction("train"، to=10، unit="٪")) +``` + +حدد مجموعة من النسب المئوية من كل تقسيم: + +```py +>>> train_10_80pct_ds = datasets.load_dataset("bookcorpus", split="train[:10%]+train[-80%:]") +===STRINGAPI-READINSTRUCTION-SPLIT=== +>>> ri = (datasets.ReadInstruction("train"، to=10، unit="٪") + datasets.ReadInstruction("train"، from_=-80، unit="٪")) +>>> train_10_80pct_ds = datasets.load_dataset("bookcorpus"، split=ri) +``` + +أخيرًا، يمكنك حتى إنشاء تقسيمات مصدقة. يقوم المثال أدناه بإنشاء تقسيمات مصدقة 10 أضعاف. تحتوي كل مجموعة بيانات تحقق من الصحة على جزء 10٪، وتشكل مجموعة بيانات التدريب الجزء التكميلي المتبقي بنسبة 90٪: + +```py +>>> val_ds = datasets.load_dataset("bookcorpus", split=[f"train[{k}%:{k+10}%]" for k in range(0, 100, 10)]) +>>> train_ds = datasets.load_dataset("bookcorpus", split=[f"train[:{k}%]+train[{k+10}%:]" for k in range(0, 100, 10)]) +===STRINGAPI-READINSTRUCTION-SPLIT=== +>>> val_ds = datasets.load_dataset("bookcorpus"، [datasets.ReadInstruction("train"، from_=k، to=k+10، unit="٪") for k in range(0، 100، 10)]) +>>> train_ds = datasets.load_dataset("bookcorpus"، [(datasets.ReadInstruction("train"، to=k، unit="٪") + datasets.ReadInstruction("train"، from_=k+10، unit="٪")) for k in range(0، 100، 10)]) +``` + +### تقسيم النسب المئوية والتقريب + +السلوك الافتراضي هو تقريب الحدود إلى أقرب رقم صحيح لمجموعات البيانات التي لا تقسم فيها حدود الشرائح المطلوبة بالتساوي عن طريق 100. كما هو موضح أدناه، قد تحتوي بعض الشرائح على أمثلة أكثر من غيرها. على سبيل المثال، إذا كان تقسيم التدريب التالي يحتوي على 999 سجل، ثم: + +```py +# 19 سجلًا، من 500 (مضمن) إلى 519 (مستبعد). +>>> train_50_52_ds = datasets.load_dataset("bookcorpus"، split="train[50%:52%]") +# 20 سجلًا، من 519 (مضمن) إلى 539 (مستبعد). +>>> train_52_54_ds = datasets.load_dataset("bookcorpus"، split="train[52%:54%]") +``` + +إذا كنت تريد تقسيمات ذات حجم متساوٍ، فاستخدم تقريب `pct1_dropremainder` بدلاً من ذلك. تعامل هذه الطريقة حدود النسب المئوية المحددة كأضعاف 1٪. + +```py +# 18 سجلًا، من 450 (مضمن) إلى 468 (مستبعد). +>>> train_50_52pct1_ds = datasets.load_dataset("bookcorpus"، split=datasets.ReadInstruction("train"، from_=50، to=52، unit="٪"، rounding="pct1_dropremainder")) +# 18 سجلًا، من 468 (مضمن) إلى 486 (مستبعد). +>>> train_52_54pct1_ds = datasets.load_dataset("bookcorpus"، split=datasets.ReadInstruction("train"، from_=52، to=54، unit="٪"، rounding="pct1_dropremainder")) +# أو ما يعادلها: +>>> train_50_52pct1_ds = datasets.load_dataset("bookcorpus"، split="train[50%:52%](pct1_dropremainder)") +>>> train_52_54pct1_ds = datasets.load_dataset("bookcorpus"، split="train[52%:54%](pct1_dropremainder)") +``` + + +قد يؤدي تقريب `pct1_dropremainder` إلى اقتطاع الأمثلة الأخيرة في مجموعة البيانات إذا لم يكن عدد الأمثلة في مجموعة البيانات مقسومًا بالتساوي على 100. + + + + +## استكشاف الأخطاء وإصلاحها + +في بعض الأحيان، قد تحصل على نتائج غير متوقعة عند تحميل مجموعة بيانات. اثنان من أكثر القضايا شيوعًا التي قد تواجهها هما تنزيل مجموعة البيانات يدويًا وتحديد ميزات مجموعة البيانات. + +### التنزيل اليدوي + +تتطلب بعض مجموعات البيانات منك تنزيل ملفات مجموعة البيانات يدويًا بسبب عدم توافق الترخيص أو إذا كانت الملفات مخفية خلف صفحة تسجيل الدخول. يتسبب هذا في قيام [`load_dataset`] بإلقاء `AssertionError`. ولكن يوفر 🤗 Datasets تعليمات مفصلة لتنزيل الملفات المفقودة. بعد تنزيل الملفات، استخدم وسيط `data_dir` لتحديد المسار إلى الملفات التي قمت بتنزيلها للتو. + +على سبيل المثال، إذا حاولت تنزيل تكوين من مجموعة بيانات [MATINF](https://huggingface.co/datasets/matinf): + +```py +>>> dataset = load_dataset("matinf", "summarization") +تنزيل وإعداد مجموعة البيانات matinf/summarization (التنزيل: الحجم غير معروف، المُنشأ: 246.89 ميغابايت، ما بعد المعالجة: الحجم غير معروف، الإجمالي: 246.89 ميغابايت) إلى /root/.cache/huggingface/datasets/matinf/summarization/1.0.0/82eee5e71c3ceaf20d909bca36ff237452b4e4ab195d3be7ee1c78b53e6f540e... +AssertionError: تتطلب مجموعة البيانات matinf بالتكوين تلخيص تنزيل البيانات يدويًا. +يرجى اتباع تعليمات التنزيل اليدوي: لاستخدام MATINF، يجب تنزيله يدويًا. يرجى ملء نموذج Google هذا (https://forms.gle/nkH4LVE4iNQeDzsc9). ستتلقى رابط تنزيل وكلمة مرور بمجرد إكمال النموذج. يرجى استخراج جميع الملفات في مجلد واحد وتحميل مجموعة البيانات باستخدام: *datasets.load_dataset('matinf'، data_dir='path/to/folder/folder_name')*. +يمكن تحميل البيانات اليدوية باستخدام `datasets.load_dataset(matinf، data_dir='') +``` + +إذا قمت بالفعل بتنزيل مجموعة بيانات من *Hub باستخدام نص برمجي للتحميل* إلى جهاز الكمبيوتر الخاص بك، فيجب عليك تمرير مسار مطلق إلى معلمة `data_dir` أو `data_files` لتحميل مجموعة البيانات تلك. وإلا، إذا قمت بتمرير مسار نسبي، فسيقوم [`load_dataset`] بتحميل الدليل من المستودع على Hub بدلاً من الدليل المحلي. + +### تحديد الميزات + +عندما تقوم بإنشاء مجموعة بيانات من ملفات محلية، يتم استنتاج [`Features`] تلقائيًا بواسطة [Apache Arrow](https://arrow.apache.org/docs/). ومع ذلك، قد لا تتوافق ميزات مجموعة البيانات دائمًا مع توقعاتك، أو قد ترغب في تحديد الميزات بنفسك. يوضح المثال التالي كيفية إضافة تسميات مخصصة باستخدام ميزة [`ClassLabel`]. + +ابدأ بتحديد التسميات الخاصة بك باستخدام فئة [`Features`]: + +```py + +>>> class_names = ["sadness", "joy", "love", "anger", "fear", "surprise"] +>>> emotion_features = Features({'text': Value('string'), 'label': ClassLabel(names=class_names)}) +``` + +بعد ذلك، حدد معلمة `features` في [`load_dataset`] بالميزات التي قمت بإنشائها للتو: + +```py +>>> dataset = load_dataset('csv'، data_files=file_dict، delimiter=';'، column_names=['text'، 'label']، features=emotion_features) +``` + +الآن عند النظر إلى ميزات مجموعة البيانات الخاصة بك، يمكنك رؤية استخدامه تسميات مخصصة التي قمت بتحديدها: + +```py +>>> dataset['train'].features +{'text': Value(dtype='string', id=None), +'label': ClassLabel(num_classes=6, names=['sadness', 'joy', 'love', 'anger', 'fear', 'surprise'], names_file=None, id=None)} +``` + +## (قديم) نص برمجي محلي للتحميل + +قد يكون لديك نص برمجي لتحميل مجموعة بيانات 🤗 محليًا على جهاز الكمبيوتر الخاص بك. في هذه الحالة، قم بتحميل مجموعة البيانات عن طريق تمرير أحد المسارات التالية إلى [`load_dataset`]: + +- المسار المحلي إلى ملف نص برمجي للتحميل. +- المسار المحلي إلى الدليل الذي يحتوي على ملف نص برمجي للتحميل (فقط إذا كان اسم الملف مطابقًا لاسم الدليل). + +مرر `trust_remote_code=True` للسماح لـ 🤗 Datasets بتنفيذ نص البرمجة: + +```py +>>> dataset = load_dataset("path/to/local/loading_script/loading_script.py"، split="train"، trust_remote_code=True) +>>> dataset = load_dataset("path/to/local/loading_script"، split="train"، trust_remote_code=True) # مكافئ لأن اسم الملف مطابق لاسم الدليل +``` \ No newline at end of file diff --git a/docs/source/ar/nlp_load.mdx b/docs/source/ar/nlp_load.mdx new file mode 100644 index 00000000000..79ae662aa31 --- /dev/null +++ b/docs/source/ar/nlp_load.mdx @@ -0,0 +1,36 @@ +# تحميل بيانات النص + +يوضح هذا الدليل كيفية تحميل مجموعات بيانات النص. لمعرفة كيفية تحميل أي نوع من أنواع مجموعات البيانات، راجع [دليل التحميل العام](./loading). + +تعد ملفات النص أحد أكثر أنواع الملفات شيوعًا لتخزين مجموعة بيانات. بشكل افتراضي، يقوم 🤗 Datasets بتقسيم ملف النص سطرًا بسطر لبناء مجموعة البيانات. + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("text", data_files={"train": ["my_text_1.txt", "my_text_2.txt"], "test": "my_test_file.txt"}) + +# التحميل من دليل +>>> dataset = load_dataset("text", data_dir="path/to/text/dataset") +``` + +لتحميل ملف نصي فقرة بفقرة أو حتى مستندًا كاملاً، استخدم معلمة `sample_by`: + +```py +# العينة حسب الفقرة +>>> dataset = load_dataset("text", data_files={"train": "my_train_file.txt", "test": "my_test_file.txt"}, sample_by="paragraph") + +# العينة حسب المستند +>>> dataset = load_dataset("text", data_files={"train": "my_train_file.txt", "test": "my_test_file.txt"}, sample_by="document") +``` + +يمكنك أيضًا استخدام أنماط grep لتحميل ملفات محددة: + +```py +>>> from datasets import load_dataset +>>> c4_subset = load_dataset("allenai/c4", data_files="en/c4-train.0000*-of-01024.json.gz") +``` + +لتحميل ملفات نصية عن بُعد عبر HTTP، قم بتمرير عناوين URL بدلاً من ذلك: + +```py +>>> dataset = load_dataset("text", data_files="https://huggingface.co/datasets/lhoestq/test/resolve/main/some_text.txt") +``` \ No newline at end of file diff --git a/docs/source/ar/nlp_process.mdx b/docs/source/ar/nlp_process.mdx new file mode 100644 index 00000000000..2a831de5e15 --- /dev/null +++ b/docs/source/ar/nlp_process.mdx @@ -0,0 +1,63 @@ +# معالجة بيانات النصوص + +يوضح هذا الدليل طرقًا محددة لمعالجة مجموعات بيانات النصوص. تعلم كيفية: + +- تقسيم مجموعة بيانات باستخدام [`~Dataset.map`]. +- محاذاة تسميات مجموعة البيانات مع معرفات التسميات لمجموعات بيانات NLI. + +للاطلاع على دليل حول كيفية معالجة أي نوع من مجموعات البيانات، راجع دليل عملية المعالجة العامة. + +## Map + +تدعم دالة [`~Dataset.map`] معالجة دفعات من الأمثلة في نفس الوقت، مما يسرع من عملية التقسيم إلى رموز. + +قم بتحميل أداة التقسيم إلى رموز من 🤗 [Transformers](https://huggingface.co/transformers/): + +```py +>>> from transformers import AutoTokenizer + +>>> tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") +``` + +اضبط معلمة `batched` على `True` في دالة [`~Dataset.map`] لتطبيق أداة التقسيم إلى رموز على دفعات من الأمثلة: + +```py +>>> dataset = dataset.map(lambda examples: tokenizer(examples["text"]), batched=True) +>>> dataset[0] +{'text': 'the rock is destined to be the 21st century\'s new "conan" and that he\'s going to make a splash even greater than arnold schwarzenegger, jean-claud van damme or steven segal.', +'label': 1, +'input_ids': [101, 1996, 2600, 2003, 16036, 2000, 2022, 1996, 7398, 2301, 1005, 1055, 2047, 1000, 16608, 1000, 1998, 2008, 2002, 1005, 1055, 2183, 2000, 2191, 1037, 17624, 2130, 3618, 2084, 7779, 29058, 8625, 13327, 1010, 3744, 1011, 18856, 19513, 3158, 5477, 4168, 2030, 7112, 16562, 2140, 1012, 102], +'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +``` + +تقوم دالة [`~Dataset.map`] بتحويل القيم المعادة إلى تنسيق مدعوم من PyArrow. ولكن إعادة المصفوفات كـ NumPy بشكل صريح أسرع لأنها تنسيق مدعوم بشكل أصلي من PyArrow. قم بضبط `return_tensors="np"` عند تقسيم نصك إلى رموز: + +```py +>>> dataset = dataset.map(lambda examples: tokenizer(examples["text"], return_tensors="np"), batched=True) +``` + +## Align + +تقوم دالة [`~Dataset.align_labels_with_mapping`] بمحاذاة معرف تسمية مجموعة البيانات مع اسم التسمية. ولا تتبع جميع نماذج 🤗 Transformers مخطط تعيين التسميات الموصى به لمجموعة البيانات الأصلية، خاصة بالنسبة لمجموعات بيانات NLI. على سبيل المثال، يستخدم مجموعة بيانات [MNLI](https://huggingface.co/datasets/glue) مخطط التعيين التالي: + +```py +>>> label2id = {"entailment": 0, "neutral": 1, "contradiction": 2} +``` + +لتحقيق محاذاة مخطط تعيين التسميات لمجموعة البيانات مع المخطط المستخدم من قبل نموذج، قم بإنشاء قاموس لاسم التسمية ومعرفها لتحقيق المحاذاة عليه: + +```py +>>> label2id = {"contradiction": 0, "neutral": 1, "entailment": 2} +``` + +مرر قاموس مخططات تعيين التسميات إلى دالة [`~Dataset.align_labels_with_mapping`]، والعمود الذي سيتم تحقيق المحاذاة عليه: + +```py +>>> from datasets import load_dataset + +>>> mnli = load_dataset("glue", "mnli", split="train") +>>> mnli_aligned = mnli.align_labels_with_mapping(label2id, "label") +``` + +يمكنك أيضًا استخدام هذه الدالة لتعيين مخطط مخصص لتعيين التسميات إلى معرفات. \ No newline at end of file diff --git a/docs/source/ar/object_detection.mdx b/docs/source/ar/object_detection.mdx new file mode 100644 index 00000000000..0849ec435e0 --- /dev/null +++ b/docs/source/ar/object_detection.mdx @@ -0,0 +1,160 @@ +# الكشف عن الكائنات + +تُستخدم نماذج الكشف عن الكائنات لتحديد شيء ما في صورة، وتُستخدم مجموعات بيانات الكشف عن الكائنات في تطبيقات مثل القيادة الذاتية والكشف عن المخاطر الطبيعية مثل حرائق الغابات. سيوضح هذا الدليل كيفية تطبيق التحولات على مجموعة بيانات الكشف عن الكائنات باتباع [البرنامج التعليمي](https://albumentations.ai/docs/examples/example_bboxes/) من [Albumentations](https://albumentations.ai/docs/). + +لتشغيل هذه الأمثلة، تأكد من تثبيت الإصدارات المحدثة من `albumentations` و`cv2`: + +``` +pip install -U albumentations opencv-python +``` + +في هذا المثال، سوف تستخدم مجموعة بيانات [`cppe-5`](https://huggingface.co/datasets/cppe-5) لتحديد معدات الوقاية الشخصية الطبية (PPE) في سياق جائحة COVID-19. + +قم بتحميل مجموعة البيانات والاطلاع على مثال: + +```py +>>> from datasets import load_dataset + +>>> ds = load_dataset("cppe-5") +>>> example = ds['train'][0] +>>> example +{'height': 663, +'image': , +'image_id': 15, +'objects': {'area': [3796, 1596, 152768, 81002], +'bbox': [[302.0, 109.0, 73.0, 52.0], +[810.0, 100.0, 57.0, 28.0], +[160.0, 31.0, 248.0, 616.0], +[741.0, 68.0, 202.0, 401.0]], +'category': [4, 4, 0, 0], +'id': [114, 115, 116, 117]}, +'width': 943} +``` + +تحتوي مجموعة البيانات على الحقول التالية: + +- `image`: كائن PIL.Image.Image الذي يحتوي على الصورة. +- `image_id`: معرف الصورة. +- `height`: ارتفاع الصورة. +- `width`: عرض الصورة. +- `objects`: قاموس يحتوي على بيانات حدود الصندوق للكائنات في الصورة: + - `id`: معرف التعليق التوضيحي. + - `area`: مساحة حدود الصندوق. + - `bbox`: حدود الصندوق الخاصة بالكائن (بتنسيق [coco](https://albumentations.ai/docs/getting_started/bounding_boxes_augmentation/#coco)). + - `category`: فئة الكائن، مع القيم المحتملة بما في ذلك `Coverall (0)`، `Face_Shield (1)`، `Gloves (2)`، `Goggles (3)`، و`Mask (4)`. + +يمكنك تصور `bboxes` على الصورة باستخدام بعض المرافق الداخلية لـ Torch. للقيام بذلك، ستحتاج إلى الإشارة إلى ميزة [`~datasets.ClassLabel`] المرتبطة بمعرفات الفئة حتى تتمكن من البحث عن تسميات السلسلة: + +```py +>>> import torch +>>> from torchvision.ops import box_convert +>>> from torchvision.utils import draw_bounding_boxes +>>> from torchvision.transforms.functional import pil_to_tensor, to_pil_image + +>>> categories = ds['train'].features['objects'].feature['category'] + +>>> boxes_xywh = torch.tensor(example['objects']['bbox']) +>>> boxes_xyxy = box_convert(boxes_xywh, 'xywh', 'xyxy') +>>> labels = [categories.int2str(x) for x in example['objects']['category']] +>>> to_pil_image( +... draw_bounding_boxes( +... pil_to_tensor(example['image']), +... boxes_xyxy, +... colors="red", +... labels=labels, +... ) +... ) +``` + +
+ +
+ +مع `albumentations`، يمكنك تطبيق تحولات تؤثر على الصورة مع تحديث `bboxes` وفقًا لذلك. في هذه الحالة، تتم إعادة تحجيم الصورة إلى (480، 480)، والانعكاس الأفقي، وزيادة السطوع. + +```py +>>> import albumentations +>>> import numpy as np + +>>> transform = albumentations.Compose([ +... albumentations.Resize(480, 480), +... albument太阳公ipations.HorizontalFlip(p=1.0), +... albumentations.RandomBrightnessContrast(p=1.0), +... ], bbox_params=albumentations.BboxParams(format='coco', label_fields=['category'])) + +>>> image = np.array(example['image']) +>>> out = transform( +... image=image, +... bboxes=example['objects']['bbox'], +... category=example['objects']['category'], +... ) +``` + +الآن، عند تصور النتيجة، يجب أن تكون الصورة معكوسة، ولكن يجب أن تكون `bboxes` في الأماكن الصحيحة. + +```py +>>> image = torch.tensor(out['image']).permute(2, 0, 1) +>>> boxes_xywh = torch.stack([torch.tensor(x) for x in out['bboxes']]) +>>> boxes_xyxy = box_convert(boxes_xywh, 'xywh', 'xyxy') +>>> labels = [categories.int2str(x) for x in out['category']] +>>> to_pil_image( +... draw_bounding_boxes( +... image, +... boxes_xyxy, +... colors='red', +... labels=labels +... ) +... ) +``` + +
+ +
+ +قم بإنشاء دالة لتطبيق التحويل على دفعة من الأمثلة: + +```py +>>> def transforms(examples): +... images, bboxes, categories = [], [], [] +... for image, objects in zip(examples['image'], examples['objects']): +... image = np.array(image.convert("RGB")) +... out = transform( +... image=image, +... bboxes=objects['bbox'], +... category=objects['category'] +... ) +... images.append(torch.tensor(out['image']).permute(2, 0, 1)) +... bboxes.append(torch.tensor(out['bboxes'])) +... categories.append(out['category']) +... return {'image': images, 'bbox': bboxes, 'category': categories} +``` + +استخدم وظيفة [`~Dataset.set_transform`] لتطبيق التحويل أثناء التنقل، والذي يستهلك مساحة أقل على القرص. قد تعيد عشوائية زيادة البيانات صورة مختلفة إذا قمت بالوصول إلى نفس المثال مرتين. إنه مفيد بشكل خاص عند تدريب نموذج لعدة حقبات. + +```py +>>> ds['train'].set_transform(transforms) +``` + +يمكنك التحقق من عمل التحويل عن طريق تصور المثال العاشر: + +```py +>>> example = ds['train'][10] +>>> to_pil_image( +... draw_bounding_boxes( +... example['image'], +... box_convert(example['bbox'], 'xywh', 'xyxy'), +... colors='red', +... labels=[categories.int2str(x) for x in example['category']] +... ) +... ) +``` + +
+ +
+ + + +الآن بعد أن تعرفت على كيفية معالجة مجموعة بيانات للكشف عن الأشياء، تعرف على [كيفية تدريب نموذج الكشف عن الأشياء](https://colab.research.google.com/github/NielsRogge/Transformers-Tutorials/blob/master/YOLOS/Fine_tuning_YOLOS_for_object_detection_on_custom_dataset_(balloon).ipynb) واستخدامه للاستدلال. + + \ No newline at end of file diff --git a/docs/source/ar/package_reference/builder_classes.mdx b/docs/source/ar/package_reference/builder_classes.mdx new file mode 100644 index 00000000000..6ef289a9167 --- /dev/null +++ b/docs/source/ar/package_reference/builder_classes.mdx @@ -0,0 +1,65 @@ +# فئات البناء Builder Classes + +## البناة Builders + +🤗 Datasets يعتمد على فئتين رئيسيتين خلال عملية بناء مجموعة البيانات: [`DatasetBuilder`] و [`BuilderConfig`]. + +[[autodoc]] datasets.DatasetBuilder + +الوصف: الفئة الأساسية لجميع بناة مجموعات البيانات. يجب أن يرثها جميع بناة مجموعات البيانات. + +الوسائل: + +- `__init__` (*args، **kwargs): إنشاء مثيل جديد من DatasetBuilder. +- `تنزيل` و `تحضير` : تنزيل البيانات ومعالجتها لإنشاء مجموعة البيانات. +- `load_dataset` (مقطع، *الأشكال، **kwargs): تحميل مجموعة البيانات المقابلة للجزء المحدد. +- `load_dataset_dict` (self، *args، **kwargs): تحميل جميع الأقسام في قاموس. +- `load_metadata` (self، ref_version=None): تحميل البيانات الوصفية لمجموعة البيانات. + +[[autodoc]] datasets.GeneratorBasedBuilder + +الوصف: فئة أساسية لبناة مجموعات البيانات التي تقوم بتوليد البيانات. + +الأساليب: + +- `__init__` (*args، **kwargs): إنشاء مثيل جديد من GeneratorBasedBuilder. +- `تنزيل` و `تحضير` : إعادة تنفيذها من DatasetBuilder. +- `_generate_examples` (self، *args، **kwargs): الأسلوب الذي يجب أن ينفذه المستخدم لتوليد الأمثلة. + +[[autodoc]] datasets.ArrowBasedBuilder + +الوصف: فئة أساسية لبناة مجموعات البيانات التي تعتمد على Arrow. + +[[autodoc]] datasets.BuilderConfig + +الوصف: تكوين مشترك لجميع بناة مجموعات البيانات. + +## تنزيل Download + +[[autodoc]] datasets.DownloadManager + +[[autodoc]] datasets.StreamingDownloadManager + +[[autodoc]] datasets.DownloadConfig + +[[autodoc]] datasets.DownloadMode + +## التحقق Verification + +[[autodoc]] datasets.VerificationMode + +## الانقسامات + +[[autodoc]] datasets.SplitGenerator + +[[autodoc]] datasets.Split + +[[autodoc]] datasets.NamedSplit + +[[autodoc]] datasets.NamedSplitAll + +[[autodoc]] datasets.ReadInstruction + +## الإصدار Version + +[[autodoc]] datasets.utils.Version \ No newline at end of file diff --git a/docs/source/ar/package_reference/loading_methods.mdx b/docs/source/ar/package_reference/loading_methods.mdx new file mode 100644 index 00000000000..2ce9181695b --- /dev/null +++ b/docs/source/ar/package_reference/loading_methods.mdx @@ -0,0 +1,86 @@ +# طرق التحميل + +طرق لعرض وتحميل مجموعات البيانات: + +## مجموعات البيانات + +[[autodoc]] datasets.list_datasets + +[[autodoc]] datasets.load_dataset + +[[autodoc]] datasets.load_from_disk + +[[autodoc]] datasets.load_dataset_builder + +[[autodoc]] datasets.get_dataset_config_names + +[[autodoc]] datasets.get_dataset_infos + +[[autodoc]] datasets.get_dataset_split_names + +[[autodoc]] datasets.inspect_dataset + +## من الملفات + +تستخدم التكوينات لتحميل ملفات البيانات. ويتم استخدامها عند تحميل الملفات المحلية أو مستودع مجموعة البيانات: + +- الملفات المحلية: `load_dataset("parquet", data_dir="path/to/data/dir")` +- مستودع مجموعة البيانات: `load_dataset("allenai/c4")` + +يمكنك تمرير وسيطات إلى `load_dataset` لتكوين تحميل البيانات. على سبيل المثال، يمكنك تحديد معلمة `sep` لتعريف [`~datasets.packaged_modules.csv.CsvConfig`] التي تستخدم لتحميل البيانات: + +```python +load_dataset("csv", data_dir="path/to/data/dir", sep="\t") +``` + +### نص + +[[autodoc]] datasets.packaged_modules.text.TextConfig + +[[autodoc]] datasets.packaged_modules.text.Text + +### CSV + +[[autodoc]] datasets.packaged_modules.csv.CsvConfig + +[[autodoc]] datasets.packaged_modules.csv.Csv + +### JSON + +[[autodoc]] datasets.packaged_modules.json.JsonConfig + +[[autodoc]] datasets.packaged_modules.json.Json + +### Parquet + +[[autodoc]] datasets.packaged_modules.parquet.ParquetConfig + +[[autodoc]] datasets.packaged_modules.parquet.Parquet + +### Arrow + +[[autodoc]] datasets.packaged_modules.arrow.ArrowConfig + +[[autodoc]] datasets.packaged_modules.arrow.Arrow + +### SQL + +[[autodoc]] datasets.packaged_modules.sql.SqlConfig + +[[autodoc]] datasets.packaged_modules.sql.Sql + +### صور + +[[autodoc]] datasets.packaged_modules.imagefolder.ImageFolderConfig + +[[autodoc]] datasets.packaged_modules.imagefolder.ImageFolder + +### صوت + +[[autodoc]] datasets.packaged_modules.audiofolder.AudioFolderConfig + +[[autodoc]] datasets.packaged_modules.audiofolder.AudioFolder + +### WebDataset + +[[autodoc]] datasets.packaged_modules.webdataset.WebDataset \ No newline at end of file diff --git a/docs/source/ar/package_reference/main_classes.mdx b/docs/source/ar/package_reference/main_classes.mdx new file mode 100644 index 00000000000..6ed4b7319a6 --- /dev/null +++ b/docs/source/ar/package_reference/main_classes.mdx @@ -0,0 +1,246 @@ +# Main classes + + +## DatasetInfo + +[[autodoc]] datasets.DatasetInfo + +## Dataset + +The base class [`Dataset`] implements a Dataset backed by an Apache Arrow table. + +[[autodoc]] datasets.Dataset + - add_column + - add_item + - from_file + - from_buffer + - from_pandas + - from_dict + - from_generator + - data + - cache_files + - num_columns + - num_rows + - column_names + - shape + - unique + - flatten + - cast + - cast_column + - remove_columns + - rename_column + - rename_columns + - select_columns + - class_encode_column + - __len__ + - __iter__ + - iter + - formatted_as + - set_format + - set_transform + - reset_format + - with_format + - with_transform + - __getitem__ + - cleanup_cache_files + - map + - filter + - select + - sort + - shuffle + - skip + - take + - train_test_split + - shard + - to_tf_dataset + - push_to_hub + - save_to_disk + - load_from_disk + - flatten_indices + - to_csv + - to_pandas + - to_dict + - to_json + - to_parquet + - to_sql + - to_iterable_dataset + - add_faiss_index + - add_faiss_index_from_external_arrays + - save_faiss_index + - load_faiss_index + - add_elasticsearch_index + - load_elasticsearch_index + - list_indexes + - get_index + - drop_index + - search + - search_batch + - get_nearest_examples + - get_nearest_examples_batch + - info + - split + - builder_name + - citation + - config_name + - dataset_size + - description + - download_checksums + - download_size + - features + - homepage + - license + - size_in_bytes + - supervised_keys + - version + - from_csv + - from_json + - from_parquet + - from_text + - from_sql + - prepare_for_task + - align_labels_with_mapping + +[[autodoc]] datasets.concatenate_datasets + +[[autodoc]] datasets.interleave_datasets + +[[autodoc]] datasets.distributed.split_dataset_by_node + +[[autodoc]] datasets.enable_caching + +[[autodoc]] datasets.disable_caching + +[[autodoc]] datasets.is_caching_enabled + +## DatasetDict + +Dictionary with split names as keys ('train', 'test' for example), and `Dataset` objects as values. +It also has dataset transform methods like map or filter, to process all the splits at once. + +[[autodoc]] datasets.DatasetDict + - data + - cache_files + - num_columns + - num_rows + - column_names + - shape + - unique + - cleanup_cache_files + - map + - filter + - sort + - shuffle + - set_format + - reset_format + - formatted_as + - with_format + - with_transform + - flatten + - cast + - cast_column + - remove_columns + - rename_column + - rename_columns + - select_columns + - class_encode_column + - push_to_hub + - save_to_disk + - load_from_disk + - from_csv + - from_json + - from_parquet + - from_text + - prepare_for_task + + + +## IterableDataset + +The base class [`IterableDataset`] implements an iterable Dataset backed by python generators. + +[[autodoc]] datasets.IterableDataset + - from_generator + - remove_columns + - select_columns + - cast_column + - cast + - __iter__ + - iter + - map + - rename_column + - filter + - shuffle + - skip + - take + - load_state_dict + - state_dict + - info + - split + - builder_name + - citation + - config_name + - dataset_size + - description + - download_checksums + - download_size + - features + - homepage + - license + - size_in_bytes + - supervised_keys + - version + +## IterableDatasetDict + +Dictionary with split names as keys ('train', 'test' for example), and `IterableDataset` objects as values. + +[[autodoc]] datasets.IterableDatasetDict + - map + - filter + - shuffle + - with_format + - cast + - cast_column + - remove_columns + - rename_column + - rename_columns + - select_columns + +## Features + +[[autodoc]] datasets.Features + +[[autodoc]] datasets.Sequence + +[[autodoc]] datasets.ClassLabel + +[[autodoc]] datasets.Value + +[[autodoc]] datasets.Translation + +[[autodoc]] datasets.TranslationVariableLanguages + +[[autodoc]] datasets.Array2D + +[[autodoc]] datasets.Array3D + +[[autodoc]] datasets.Array4D + +[[autodoc]] datasets.Array5D + +[[autodoc]] datasets.Audio + +[[autodoc]] datasets.Image + +## Filesystems + + +[[autodoc]] datasets.filesystems.S3FileSystem + +[[autodoc]] datasets.filesystems.extract_path_from_uri + +[[autodoc]] datasets.filesystems.is_remote_filesystem + +## Fingerprint + +[[autodoc]] datasets.fingerprint.Hasher \ No newline at end of file diff --git a/docs/source/ar/package_reference/table_classes.mdx b/docs/source/ar/package_reference/table_classes.mdx new file mode 100644 index 00000000000..d22964f7894 --- /dev/null +++ b/docs/source/ar/package_reference/table_classes.mdx @@ -0,0 +1,136 @@ +# فئات الجداول + +يتم دعم كل كائن `Dataset` بواسطة جدول PyArrow. يمكن تحميل جدول من القرص (مُخزن في الذاكرة) أو في الذاكرة. هناك عدة أنواع من الجداول المتاحة، وكلها موروثة من [`table.Table`]. + +## Table + +[[autodoc]] datasets.table.Table + - validate + - equals + - to_batches + - to_pydict + - to_pandas + - to_string + - field + - column + - itercolumns + - schema + - columns + - num_columns + - num_rows + - shape + - nbytes + +## InMemoryTable + +[[autodoc]] datasets.table.InMemoryTable + - validate + - equals + - to_batches + - to_pydict + - to_pandas + - to_string + - field + - column + - itercolumns + - schema + - columns + - num_columns + - num_rows + - shape + - nbytes + - column_names + - slice + - filter + - flatten + - combine_chunks + - cast + - replace_schema_metadata + - add_column + - append_column + - remove_column + - set_column + - rename_columns + - select + - drop + - from_file + - from_buffer + - from_pandas + - from_arrays + - from_pydict + - from_batches + +## MemoryMappedTable + +[[autodoc]] datasets.table.MemoryMappedTable + - validate + - equals + - to_batches + - to_pydict + - to_pandas + - to_string + - field + - column + - itercolumns + - schema + - columns + - num_columns + - num_rows + - shape + - nbytes + - column_names + - slice + - filter + - flatten + - combine_chunks + - cast + - replace_schema_metadata + - add_column + - append_column + - remove_column + - set_column + - rename_columns + - select + - drop + - from_file + +## ConcatenationTable + +[[autodoc]] datasets.table.ConcatenationTable + - validate + - equals + - to_batches + - to_pydict + - to_pandas + - to_string + - field + - column + - itercolumns + - schema + - columns + - num_columns + - num_rows + - shape + - nbytes + - column_names + - slice + - filter + - flatten + - combine_chunks + - cast + - replace_schema_metadata + - add_column + - append_column + - remove_column + - set_column + - rename_columns + - select + - drop + - from_blocks + - from_tables + +## Utils + +[[autodoc]] datasets.table.concat_tables + +[[autodoc]] datasets.table.list_table_cache_files \ No newline at end of file diff --git a/docs/source/ar/package_reference/task_templates.mdx b/docs/source/ar/package_reference/task_templates.mdx new file mode 100644 index 00000000000..9ce804afc4c --- /dev/null +++ b/docs/source/ar/package_reference/task_templates.mdx @@ -0,0 +1,72 @@ +# قوالب المهام + +> +> تم استبدال واجهة برمجة تطبيقات المهام (Task API) بـ [`train-eval-index`] (https://github.com/huggingface/hub-docs/blob/9ab2555e1c146122056aba6f89af404a8bc9a6f1/datasetcard.md?plain=1#L90-L106) وسيتم إزالتها في الإصدار الرئيسي التالي. +> + +المهام المدعومة من قبل [`Dataset.prepare_for_task`] و [`DatasetDict.prepare_for_task`]. + +[[autodoc]] datasets.tasks.AutomaticSpeechRecognition + +الوصف: التعرف التلقائي على الكلام (ASR) هو تحويل الكلام المنطوق إلى نص مكتوب. + +الحالات الاستخدامية: +- نسخ نصوص من محادثات أو محاضرات أو أي مصدر صوتي آخر. +- إنشاء نصوص مكتوبة من محتوى صوتي مثل الكتب الصوتية أو البودكاست. +- تمكين التفاعل الصوتي مع الأنظمة مثل المساعدين الرقميين أو أنظمة التعرف على الأوامر الصوتية. + +[[autodoc]] datasets.tasks.AudioClassification + +الوصف: تصنيف الصوت هو مهمة تعيين تسميات أو فئات للملفات الصوتية بناءً على محتواها. + +الحالات الاستخدامية: +- تصنيف أنواع الموسيقى أو المؤثرات الصوتية. +- التعرف على الأصوات أو الأحداث في البيئة المحيطة. +- اكتشاف الكلمات الرئيسية أو العواطف في الملفات الصوتية. + +[[autodoc]] datasets.tasks.ImageClassification + +الوصف: تصنيف الصور هو مهمة تعيين تسميات أو فئات للصور بناءً على محتواها المرئي. + +الحالات الاستخدامية: +- تصنيف الصور الطبية أو صور الأقمار الصناعية. +- التعرف على الأشياء أو الكائنات ضمن الصور. +- فرز الصور حسب المحتوى لأغراض الأرشفة أو التنظيم. + +- align_with_features + +[[autodoc]] datasets.tasks.LanguageModeling + +الوصف: نمذجة اللغة هي مهمة تعليم نموذج لفهم بنية اللغة وقواعدها. + +الحالات الاستخدامية: +- توليد نص متماسك وذو سياق مثل إنشاء محتوى أو ترجمة اللغات. +- تصحيح الأخطاء النحوية والإملائية في النصوص. +- فهم النصوص المعقدة واستخراج المعلومات منها. + +[[autodoc]] datasets.tasks.QuestionAnsweringExtractive + +الوصف: الإجابة على الأسئلة الاستخراجية هي مهمة العثور على الإجابة الصحيحة على سؤال ما ضمن نص معين. + +الحالات الاستخدامية: +- أنظمة الأسئلة والأجوبة للعملاء أو الموظفين. +- استخراج المعلومات من النصوص مثل الوثائق أو التقارير. +- إنشاء ملخصات أو إجابات تلخيصية بناءً على محتوى النص. + +[[autodoc]] datasets.tasks.Summarization + +الوصف: الملخص هو إنشاء ملخص أو تمثيل مختصر لنص أطول مع الحفاظ على الأفكار الرئيسية. + +الحالات الاستخدامية: +- توفير ملخصات الأخبار أو المقالات الطويلة للمستخدمين ذوي الوقت المحدود. +- إنشاء ملخصات للكتب أو الأفلام أو العروض التقديمية. +- تلخيص المحادثات أو الاجتماعات الطويلة. + +[[autodoc]] datasets.tasks.TextClassification + +الوصف: تصنيف النصوص هو مهمة تعيين تسميات أو فئات للنصوص المكتوبة بناءً على محتواها. + +الحالات الاستخدامية: +- تصنيف نية العملاء في مراكز الاتصال أو الدردشات. +- فرز النصوص حسب الموضوع أو العاطفة أو أي فئة أخرى ذات صلة. +- اكتشاف اللغة أو اللهجة المستخدمة في النص. \ No newline at end of file diff --git a/docs/source/ar/package_reference/utilities.mdx b/docs/source/ar/package_reference/utilities.mdx new file mode 100644 index 00000000000..0237fe9ab91 --- /dev/null +++ b/docs/source/ar/package_reference/utilities.mdx @@ -0,0 +1,48 @@ +# الأدوات المساعدة + +## تكوين السجلات + +يسعى 🤗 Datasets إلى أن يكون شفافًا وواضحًا بشأن طريقة عمله، ولكن هذا قد يكون طويلاً جدًا في بعض الأحيان. لقد أدرجنا سلسلة من طرق التسجيل التي تتيح لك ضبط مستوى الإسهاب في المكتبة بأكملها بسهولة. حاليًا، تم تعيين مستوى الإسهاب الافتراضي للمكتبة على "تحذير". + +لتغيير مستوى الإسهاب، استخدم إحدى الدالات المخصصة. على سبيل المثال، هذه هي الطريقة لتغيير مستوى الإسهاب إلى مستوى "معلومات": + +```py +import datasets +datasets.logging.set_verbosity_info() +``` + +يمكنك أيضًا استخدام متغير البيئة `DATASETS_VERBOSITY` لتجاوز مستوى الإسهاب الافتراضي، وتعيينه على واحد مما يلي: `debug`، `info`، `warning`، `error`، `critical`: + +```bash +DATASETS_VERBOSITY=error ./myprogram.py +``` + +جميع طرق وحدة التسجيل هذه موثقة أدناه. فيما يلي الطرق الرئيسية: + +- [`logging.get_verbosity`] للحصول على مستوى الإسهاب الحالي في المسجل +- [`logging.set_verbosity`] لتعيين مستوى الإسهاب إلى المستوى الذي تختاره + +بالترتيب من الأقل إلى الأكثر إسهابًا (مع قيمها المقابلة من النوع `int`): + +1. `logging.CRITICAL` أو `logging.FATAL` (القيمة العددية، 50): الإبلاغ فقط عن الأخطاء الأكثر حرجًا. +2. `logging.ERROR` (القيمة العددية، 40): الإبلاغ عن الأخطاء فقط. +3. `logging.WARNING` أو `logging.WARN` (القيمة العددية، 30): الإبلاغ عن الأخطاء والتحذيرات فقط. هذا هو المستوى الافتراضي الذي تستخدمه المكتبة. +4. `logging.INFO` (القيمة العددية، 20): الإبلاغ عن الأخطاء والتحذيرات والمعلومات الأساسية. +5. `logging.DEBUG` (القيمة العددية، 10): الإبلاغ عن جميع المعلومات. + +[[autodoc]] datasets.logging.get_verbosity +[[autodoc]] datasets.logging.set_verbosity +[[autodoc]] datasets.logging.set_verbosity_info +[[autodoc]] datasets.logging.set_verbosity_warning +[[autodoc]] datasets.logging.set_verbosity_debug +[[autodoc]] datasets.logging.set_verbosity_error +[[autodoc]] datasets.logging.disable_propagation +[[autodoc]] datasets.logging.enable_propagation + +## تكوين أشرطة التقدم + +بشكل افتراضي، سيتم عرض أشرطة تقدم `tqdm` أثناء تنزيل مجموعة البيانات ومعالجتها مسبقًا. يمكنك تعطيلها بشكل شامل عن طريق تعيين متغير البيئة `HF_DATASETS_DISABLE_PROGRESS_BARS`. يمكنك أيضًا تمكينها/تعطيلها باستخدام [`~utils.enable_progress_bars`] و [`~utils.disable_progress_bars`]. إذا تم تعيين متغير البيئة، فستكون له الأولوية على المساعدين. + +[[autodoc]] datasets.utils.enable_progress_bars +[[autodoc]] datasets.utils.disable_progress_bars +[[autodoc]] datasets.utils.are_progress_bars_disabled \ No newline at end of file diff --git a/docs/source/ar/process.mdx b/docs/source/ar/process.mdx new file mode 100644 index 00000000000..931bf3102d5 --- /dev/null +++ b/docs/source/ar/process.mdx @@ -0,0 +1,712 @@ +# المعالجة + +يوفر 🤗 Datasets العديد من الأدوات لتعديل بنية ومحتوى مجموعة البيانات. وتعد هذه الأدوات مهمة لتنظيم مجموعة البيانات، وإنشاء أعمدة إضافية، والتحويل بين الميزات والتنسيقات، والمزيد. + +سيوضح هذا الدليل كيفية: + +- إعادة ترتيب الصفوف وتقسيم مجموعة البيانات. +- إعادة تسمية الأعمدة وإزالتها، وعمليات العمود الشائعة الأخرى. +- تطبيق دالات المعالجة على كل مثال في مجموعة البيانات. +- دمج مجموعات البيانات. +- تطبيق تحويل تنسيق مخصص. +- حفظ مجموعات البيانات المعالجة وتصديرها. + +للحصول على مزيد من التفاصيل المحددة حول معالجة طرائق أخرى لمجموعة البيانات، راجع دليل معالجة مجموعة بيانات الصوت، أو دليل معالجة مجموعة بيانات الصور، أو دليل معالجة مجموعة بيانات NLP. + +تستخدم الأمثلة في هذا الدليل مجموعة بيانات MRPC، ولكن يمكنك تحميل أي مجموعة بيانات من اختيارك ومتابعة ذلك! + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("glue", "mrpc", split="train") +``` + +> تُرجع جميع طرق المعالجة في هذا الدليل كائن [`Dataset`] جديد. لا يتم التعديل في الموقع. كن حذرًا بشأن تجاوز مجموعة البيانات السابقة الخاصة بك! + +## الترتيب والخلط والتحديد والتقسيم والتجزئة + +هناك عدة وظائف لإعادة ترتيب بنية مجموعة البيانات. + +هذه الوظائف مفيدة لاختيار الصفوف التي تريدها فقط، وإنشاء تقسيمات التدريب والاختبار، وتقسيم مجموعات البيانات الكبيرة جدًا إلى قطع أصغر. + +### الترتيب + +استخدم [`~Dataset.sort`] لفرز قيم العمود وفقًا لقيمها العددية. يجب أن يكون العمود المقدم متوافقًا مع NumPy. + +```py +>>> dataset["label"][:10] +[1, 0, 1, 0, 1, 1, 0, 1, 0, 0] +>>> sorted_dataset = dataset.sort("label") +>>> sorted_dataset["label"][:10] +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +>>> sorted_dataset["label"][-10:] +[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +``` + +تحت الغطاء، يقوم هذا بإنشاء قائمة من المؤشرات التي يتم فرزها وفقًا لقيم العمود. + +يتم بعد ذلك استخدام خريطة المؤشرات هذه للوصول إلى الصفوف الصحيحة في جدول Arrow الأساسي. + +### الخلط + +تقوم وظيفة [`~Dataset.shuffle`] بإعادة ترتيب قيم العمود بشكل عشوائي. يمكنك تحديد معلمة `generator` في هذه الوظيفة لاستخدام `numpy.random.Generator` مختلفة إذا كنت تريد مزيدًا من التحكم في الخوارزمية المستخدمة لخلط مجموعة البيانات. + +```py +>>> shuffled_dataset = sorted_dataset.shuffle(seed=42) +>>> shuffled_dataset["label"][:10] +[1, 1, 1, 0, 1, 1, 1, 1, 1, 0] +``` + +يأخذ الخلط قائمة المؤشرات `[0:len(my_dataset)]` ويخلطها لإنشاء خريطة مؤشرات. + +ومع ذلك، بمجرد أن تحتوي مجموعة البيانات الخاصة بك على خريطة مؤشرات، يمكن أن تصبح السرعة أبطأ 10 مرة. + +ويرجع ذلك إلى وجود خطوة إضافية للحصول على مؤشر الصف لقراءة باستخدام خريطة المؤشرات، والأهم من ذلك، أنك لم تعد تقرأ قطعًا متجاورة من البيانات. + +لاستعادة السرعة، ستحتاج إلى إعادة كتابة مجموعة البيانات بأكملها على القرص مرة أخرى باستخدام [`Dataset.flatten_indices`]، والذي يزيل خريطة المؤشرات. + +أو، يمكنك التبديل إلى [`IterableDataset`] والاستفادة من الخلط التقريبي السريع [`IterableDataset.shuffle`]: + +```py +>>> iterable_dataset = dataset.to_iterable_dataset(num_shards=128) +>>> shuffled_iterable_dataset = iterable_dataset.shuffle(seed=42, buffer_size=1000) +``` + +### التحديد والتصفية + +هناك خياران لتصفية الصفوف في مجموعة البيانات: [`~Dataset.select`] و [`~Dataset.filter`]. + +- يعيد [`~Dataset.select`] الصفوف وفقًا لقائمة المؤشرات: + +```py +>>> small_dataset = dataset.select([0, 10, 20, 30, 40, 50]) +>>> len(small_dataset) +6 +``` + +- يعيد [`~Dataset.filter`] الصفوف التي تتطابق مع شرط محدد: + +```py +>>> start_with_ar = dataset.filter(lambda example: example["sentence1"].startswith("Ar")) +>>> len(start_with_ar) +6 +>>> start_with_ar["sentence1"] +['Around 0335 GMT , Tab shares were up 19 cents , or 4.4 % , at A $ 4.56 , having earlier set a record high of A $ 4.57 .', +'Arison said Mann may have been one of the pioneers of the world music movement and he had a deep love of Brazilian music .', +'Arts helped coach the youth on an eighth-grade football team at Lombardi Middle School in Green Bay .', +'Around 9 : 00 a.m. EDT ( 1300 GMT ) , the euro was at $ 1.1566 against the dollar , up 0.07 percent on the day .', +"Arguing that the case was an isolated example , Canada has threatened a trade backlash if Tokyo 's ban is not justified on scientific grounds .", +'Artists are worried the plan would harm those who need help most - performers who have a difficult time lining up shows .' +] +``` + +يمكن أيضًا أن يقوم [`~Dataset.filter`] بالتصفية حسب المؤشرات إذا قمت بتعيين `with_indices=True`: + +```py +>>> even_dataset = dataset.filter(lambda example, idx: idx % 2 == 0, with_indices=True) +>>> len(even_dataset) +1834 +>>> len(dataset) / 2 +1834.0 +``` + +ما لم تكن قائمة المؤشرات التي سيتم الاحتفاظ بها متجاورة، فإن هذه الطرق تخلق أيضًا خريطة مؤشرات تحت الغطاء. + +### التقسيم + +تقوم وظيفة [`~Dataset.train_test_split`] بإنشاء تقسيمات التدريب والاختبار إذا لم يكن لدى مجموعة البيانات الخاصة بك بالفعل. يسمح لك ذلك بتعديل النسب النسبية أو العدد المطلق للعينات في كل تقسيم. في المثال أدناه، استخدم معلمة `test_size` لإنشاء تقسيم اختبار يكون 10% من مجموعة البيانات الأصلية: + +```py +>>> dataset.train_test_split(test_size=0.1) +{'train': Dataset(schema: {'sentence1': 'string', 'sentence2': 'string', 'label': 'int64', 'idx': 'int32'}, num_rows: 3301), +'test': Dataset(schema: {'sentence1': 'string', 'sentence2': 'string', 'label': 'int64', 'idx': 'int32'}, num_rows: 367)} +>>> 0.1 * len(dataset) +366.8 +``` + +يتم خلط التقسيمات بشكل افتراضي، ولكن يمكنك تعيين `shuffle=False` لمنع الخلط. + +### التجزئة + +يدعم 🤗 Datasets التجزئة لتقسيم مجموعة بيانات كبيرة جدًا إلى عدد محدد مسبقًا من القطع. حدد معلمة `num_shards` في [`~Dataset.shard`] لتحديد عدد القطع التي سيتم تقسيم مجموعة البيانات إليها. ستحتاج أيضًا إلى توفير القطعة التي تريد إرجاعها باستخدام معلمة `index`. + +على سبيل المثال، تحتوي مجموعة بيانات [imdb](https://huggingface.co/datasets/imdb) على 25000 مثال: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("imdb", split="train") +>>> print(dataset) +Dataset({ + features: ['text', 'label'], + num_rows: 25000 +}) +``` + +بعد تقسيم مجموعة البيانات إلى أربع قطع، لن تحتوي القطعة الأولى سوى على 6250 مثالًا: + +```py +>>> dataset.shard(num_shards=4, index=0) +Dataset({ + features: ['text', 'label'], + num_rows: 6250 +}) +>>> print(25000/4) +6250.0 +``` + +## إعادة التسمية والإزالة والصب والتبسيط + +تسمح الوظائف التالية بتعديل أعمدة مجموعة البيانات. هذه الوظائف مفيدة لإعادة تسمية الأعمدة أو إزالتها، وتغيير الأعمدة إلى مجموعة جديدة من الميزات، وتبسيط هياكل الأعمدة المضمنة. + +### إعادة التسمية + +استخدم [`~Dataset.rename_column`] عند الحاجة إلى إعادة تسمية عمود في مجموعة البيانات الخاصة بك. يتم نقل الميزات المرتبطة بالعمود الأصلي فعليًا تحت اسم العمود الجديد، بدلاً من مجرد استبدال العمود الأصلي في مكانه. + +قم بتزويد [`~Dataset.rename_column`] باسم العمود الأصلي، واسم العمود الجديد: + +```py +>>> dataset +Dataset({ + features: ['sentence1', 'sentence2', 'label', 'idx'], + num_rows: 3668 +}) +>>> dataset = dataset.rename_column("sentence1", "sentenceA") +>>> dataset = dataset.rename_column("sentence2", "sentenceB") +>>> dataset +Dataset({ + features: ['sentenceA', 'sentenceB', 'label', 'idx'], + num_rows: 3668 +}) +``` + +### إزالة + +عندما تحتاج إلى إزالة عمود أو أكثر، قم بتوفير اسم العمود الذي سيتم إزالته إلى وظيفة [`~Dataset.remove_columns`]. قم بإزالة أكثر من عمود واحد عن طريق توفير قائمة بأسماء الأعمدة: + +```py +>>> dataset = dataset.remove_columns("label") +>>> dataset +Dataset({ + features: ['sentence1', 'sentence2', 'idx'], + num_rows: 3668 +}) +>>> dataset = dataset.remove_columns(["sentence1", "sentence2"]) +>>> dataset +Dataset({ + features: ['idx'], + num_rows: 3668 +}) +``` + +على العكس من ذلك، يقوم [`~Dataset.select_columns`] بتحديد عمود أو أكثر للاحتفاظ به وإزالة الباقي. تأخذ هذه الوظيفة إما عمودًا واحدًا أو قائمة بأسماء الأعمدة: + +```py +>>> dataset +Dataset({ + features: ['sentence1', 'sentence2', 'label', 'idx'], + num_rows: 3668 +}) +>>> dataset = dataset.select_columns(['sentence1', 'sentence2', 'idx']) +>>> dataset +Dataset({ + features: ['sentence1', 'sentence2', 'idx'], + num_rows: 3668 +}) +>>> dataset = dataset.select_columns('idx') +>>> dataset +Dataset({ + features: ['idx'], + num_rows: 3668 +}) +``` + +### Cast + +تقوم وظيفة [`~Dataset.cast`] بتحويل نوع الميزة لعمود أو أكثر. تقبل هذه الوظيفة [`Features`] الجديد الخاص بك كحجتها. يوضح المثال أدناه كيفية تغيير ميزات [`ClassLabel`] و [`Value`]: + +```py +>>> dataset.features +{'sentence1': Value(dtype='string', id=None), +'sentence2': Value(dtype='string', id=None), +'label': ClassLabel(num_classes=2, names=['not_equivalent', 'equivalent'], names_file=None, id=None), +'idx': Value(dtype='int32', id=None)} + +>>> from datasets import ClassLabel, Value +>>> new_features = dataset.features.copy() +>>> new_features["label"] = ClassLabel(names=["negative", "positive"]) +>>> new_features["idx"] = Value("int64") +>>> dataset = dataset.cast(new_features) +>>> dataset.features +{'sentence1': Value(dtype='string', id=None), +'sentence2': Value(dtype='string', id=None), +'label': ClassLabel(num_classes=2, names=['negative', 'positive'], names_file=None, id=None), +'idx': Value(dtype='int64', id=None)} +``` + +> تلميح: + +يعمل الصب فقط إذا كان نوع الميزة الأصلية ونوع الميزة الجديدة متوافقين. على سبيل المثال، يمكنك صب عمود بنوع الميزة `Value("int32")` إلى `Value("bool")` إذا كان العمود الأصلي يحتوي فقط على أحاد وصفار. + +استخدم وظيفة [`~Dataset.cast_column`] لتغيير نوع ميزة عمود واحد. قم بتمرير اسم العمود ونوع ميزته الجديدة كحجج: + +```py +>>> dataset.features +{'audio': Audio(sampling_rate=44100, mono=True, id=None)} + +>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16000)) +>>> dataset.features +{'audio': Audio(sampling_rate=16000, mono=True, id=None)} +``` + +### التسطيح + +في بعض الأحيان، يمكن أن يكون العمود هيكلًا متداخلاً من عدة أنواع. الق نظرة على البنية المتداخلة أدناه من مجموعة بيانات SQuAD: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("squad", split="train") +>>> dataset.features +{'answers': Sequence(feature={'text': Value(dtype='string', id=None), 'answer_start': Value(dtype='int32', id=None)}, length=-1, id=None), +'context': Value(dtype='string', id=None), +'id': Value(dtype='string', id=None), +'question': Value(dtype='string', id=None), +'title': Value(dtype='string', id=None)} +``` + +يحتوي حقل `answers` على حقلين فرعيين: `text` و`answer_start`. استخدم وظيفة [`~Dataset.flatten`] لاستخراج الحقول الفرعية إلى أعمدة خاصة بها: + +```py +>>> flat_dataset = dataset.flatten() +>>> flat_dataset +Dataset({ + features: ['id', 'title', 'context', 'question', 'answers.text', 'answers.answer_start'], + num_rows: 87599 +}) +``` + +لاحظ كيف أصبحت الحقول الفرعية الآن أعمدة مستقلة: `answers.text` و`answers.answer_start`. + +## Map + +تأتي بعض تطبيقات 🤗 Datasets الأكثر قوة من استخدام دالة [`~Dataset.map`]. الغرض الأساسي من [`~Dataset.map`] هو تسريع وظائف المعالجة. فهو يسمح لك بتطبيق دالة معالجة على كل مثال في مجموعة البيانات، بشكل مستقل أو في مجموعات. يمكن لهذه الدالة حتى إنشاء صفوف وأعمدة جديدة. + +في المثال التالي، أضف بادئة "My sentence: " إلى كل قيمة `sentence1` في مجموعة البيانات. + +ابدأ بإنشاء دالة تضيف "My sentence: " إلى بداية كل جملة. يجب أن تقبل الدالة كائنًا من النوع dict وتُخرج كائنًا من نفس النوع: + +```py +>>> def add_prefix(example): +... example["sentence1"] = 'My sentence: ' + example["sentence1"] +... return example +``` + +الآن استخدم [`~Dataset.map`] لتطبيق دالة `add_prefix` على مجموعة البيانات بأكملها: + +```py +>>> updated_dataset = small_dataset.map(add_prefix) +>>> updated_dataset["sentence1"][:5] +['My sentence: Amrozi accused his brother , whom he called " the witness " , of deliberately distorting his evidence .', +"My sentence: Yucaipa owned Dominick 's before selling the chain to Safeway in 1998 for $ 2.5 billion .", +'My sentence: They had published an advertisement on the Internet on June 10 , offering the cargo for sale , he added .', +'My sentence: Around 0335 GMT , Tab shares were up 19 cents , or 4.4 % , at A $ 4.56 , having earlier set a record high of A $ 4.57 .', +] +``` + +دعونا نلقي نظرة على مثال آخر، ولكن هذه المرة، سوف تزيل عمودًا باستخدام [`~Dataset.map`]. عندما تقوم بإزالة عمود، فإنه لا يتم إزالته إلا بعد توفير المثال للدالة المحددة. يسمح هذا للدالة المحددة باستخدام محتوى الأعمدة قبل إزالتها. + +حدد العمود الذي تريد إزالته باستخدام معلمة `remove_columns` في [`~Dataset.map`]: + +```py +>>> updated_dataset = dataset.map(lambda example: {"new_sentence": example["sentence1"]}, remove_columns=["sentence1"]) +>>> updated_dataset.column_names +['sentence2', 'label', 'idx', 'new_sentence'] +``` + + + +يحتوي 🤗 Datasets أيضًا على دالة [`~Dataset.remove_columns`] والتي تكون أسرع لأنها لا تقوم بنسخ بيانات الأعمدة المتبقية. + + + +يمكنك أيضًا استخدام [`~Dataset.map`] مع المؤشرات إذا قمت بتعيين `with_indices=True`. يضيف المثال أدناه الفهرس إلى بداية كل جملة: + +```py +>>> updated_dataset = dataset.map(lambda example, idx: {"sentence2": f"{idx}: " + example["sentence2"]}, with_indices=True) +>>> updated_dataset["sentence2"][:5] +['0: Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .', +"1: Yucaipa bought Dominick 's in 1995 for $ 693 million and sold it to Safeway for $ 1.8 billion in 1998 .", +"2: On June 10 , the ship 's owners had published an advertisement on the Internet , offering the explosives for sale .", +'3: Tab shares jumped 20 cents , or 4.6 % , to set a record closing high at A $ 4.57 .', +'4: PG & E Corp. shares jumped $ 1.63 or 8 percent to $ 21.03 on the New York Stock Exchange on Friday .' +] +``` + +### معالجة متعددة + +تسرع المعالجة المتعددة بشكل كبير من المعالجة من خلال موازاة العمليات على وحدة المعالجة المركزية. قم بتعيين معلمة `num_proc` في [`~Dataset.map`] لتحديد عدد العمليات التي سيتم استخدامها: + +```py +>>> updated_dataset = dataset.map(lambda example, idx: {"sentence2": f"{idx}: " + example["sentence2"]}, with_indices=True, num_proc=4) +``` + +يعمل [`~Dataset.map`] أيضًا مع ترتيب العملية إذا قمت بتعيين `with_rank=True`. هذا مشابه لمعلمة `with_indices`. يتم وضع معلمة `with_rank` في الدالة المحددة بعد معلمة `index` إذا كانت موجودة بالفعل. + +```py +>>> import torch +>>> from multiprocess import set_start_method +>>> from transformers import AutoTokenizer, AutoModelForCausalLM +>>> from datasets import load_dataset +>>> +>>> # Get an example dataset +>>> dataset = load_dataset("fka/awesome-chatgpt-prompts", split="train") +>>> +>>> # Get an example model and its tokenizer +>>> model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen1.5-0.5B-Chat").eval() +>>> tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen1.5-0.5B-Chat") +>>> +>>> def gpu_computation(batch, rank): +... # Move the model on the right GPU if it's not there already +... device = f"cuda:{(rank or 0) % torch.cuda.device_count()}" +... model.to(device) +... +... # Your big GPU call goes here, for example: +... chats = [[ +... {"role": "system", "content": "You are a helpful assistant."}, +... {"role": "user", "content": prompt} +... ] for prompt in batch["prompt"]] +... texts = [tokenizer.apply_chat_template( +... chat, +... tokenize=False, +... add_generation_prompt=True +... ) for chat in chats] +... model_inputs = tokenizer(texts, padding=True, return_tensors="pt").to(device) +... with torch.no_grad(): +... outputs = model.generate(**model_inputs, max_new_tokens=512) +... batch["output"] = tokenizer.batch_decode(outputs, skip_special_tokens=True) +... return batch +>>> +>>> if __name__ == "__main__": +... set_start_method("spawn") +... updated_dataset = dataset.map( +... gpu_computation, +... batched=True, +... batch_size=16, +... with_rank=True, +... num_proc=torch.cuda.device_count(), # one process per GPU +... ) +``` + +تتمثل الحالة الاستخدامية الرئيسية للترتيب في موازاة الحساب عبر عدة وحدات معالجة رسومية (GPU). يتطلب ذلك تعيين `multiprocess.set_start_method("spawn")`. إذا لم تقم بذلك، فستتلقى خطأ CUDA التالي: + +```bash +RuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you must use the 'spawn' start method. +``` + +### معالجة الدفعات + +تدعم دالة [`~Dataset.map`] العمل مع دفعات من الأمثلة. يمكنك العمل على الدفعات عن طريق تعيين `batched=True`. حجم الدفعة الافتراضي هو 1000، ولكن يمكنك ضبطه باستخدام معلمة `batch_size`. تمكن المعالجة الدفعية تطبيقات مثيرة للاهتمام مثل تقسيم الجمل الطويلة إلى أجزاء أقصر وزيادة البيانات. + +#### تقسيم الأمثلة الطويلة + +عندما تكون الأمثلة طويلة جدًا، فقد ترغب في تقسيمها إلى عدة أجزاء أصغر. ابدأ بإنشاء دالة: + +1. تقسيم حقل `sentence1` إلى أجزاء من 50 حرف. +2. قم بتكديس جميع الأجزاء معًا لإنشاء مجموعة البيانات الجديدة. + +```py +>>> def chunk_examples(examples): +... chunks = [] +... for sentence in examples["sentence1"]: +... chunks += [sentence[i:i + 50] for i in range(0, len(sentence), 50)] +... return {"chunks": chunks} +``` + +قم بتطبيق الدالة باستخدام [`~Dataset.map`]: + +```py +>>> chunked_dataset = dataset.map(chunk_examples, batched=True, remove_columns=dataset.column_names) +>>> chunked_dataset[:10] +{'chunks': ['Amrozi accused his brother , whom he called " the ', + 'witness " , of deliberately distorting his evidenc', + 'e .', + "Yucaipa owned Dominick 's before selling the chain", + ' to Safeway in 1998 for $ 2.5 billion .', + 'They had published an advertisement on the Interne', + 't on June 10 , offering the cargo for sale , he ad', + 'ded .', + 'Around 0335 GMT , Tab shares were up 19 cents , or', + ' 4.4 % , at A $ 4.56 , having earlier set a record']} +``` + +لاحظ كيف تم تقسيم الجمل الآن إلى أجزاء أقصر، وهناك المزيد من الصفوف في مجموعة البيانات. + +```py +>>> dataset +Dataset({ + features: ['sentence1', 'sentence2', 'label', 'idx'], + num_rows: 3668 +}) +>>> chunked_dataset +Dataset({ + features: ['chunks'], + num_rows: 10470 +}) +``` + +#### زيادة البيانات + +يمكن أيضًا استخدام دالة [`~Dataset.map`] لزيادة البيانات. يقوم المثال التالي بتوليد كلمات إضافية لرموز مميزة محجوبة في جملة. + +قم بتحميل واستخدام نموذج [RoBERTA](https://huggingface.co/roberta-base) في [FillMaskPipeline](https://huggingface.co/transformers/main_classes/pipelines#transformers.FillMaskPipeline) من 🤗 Transformers: + +```py +>>> from random import randint +>>> from transformers import pipeline + +>>> fillmask = pipeline("fill-mask", model="roberta-base") +>>> mask_token = fillmask.tokenizer.mask_token +>>> smaller_dataset = dataset.filter(lambda e, i: i<100, with_indices=True) +``` + +قم بإنشاء دالة لاختيار كلمة عشوائية لإخفائها في الجملة. يجب أن تقوم الدالة أيضًا بإرجاع الجملة الأصلية وأفضل استبدالين تم توليدهما بواسطة RoBERTA. + +```py +>>> def augment_data(examples): +... outputs = [] +... for sentence in examples["sentence1"]: +... words = sentence.split(' ') +... K = randint(1, len(words)-1) +... masked_sentence = " ".join(words[:K] + [mask_token] + words[K+1:]) +... predictions = fillmask(masked_sentence) +... augmented_sequences = [predictions[i]["sequence"] for i in range(3)] +... outputs += [sentence] + augmented_sequences +... +... return {"data": outputs} +``` + +استخدم [`~Dataset.map`] لتطبيق الدالة على مجموعة البيانات بأكملها: + +```py +>>> augmented_dataset = smaller_dataset.map(augment_data, batched=True, remove_columns=dataset.column_names, batch_size=8) +>>> augmented_dataset[:9]["data"] +['Amrozi accused his brother , whom he called " the witness " , of deliberately distorting his evidence .', +'Amrozi accused his brother, whom he called " the witness ", of deliberately withholding his evidence.', +'Amrozi accused his brother, whom he called " the witness ", of deliberately suppressing his evidence.', +'Amrozi accused his brother, whom he called " the witness ", of deliberately destroying his evidence.', +"Yucaipa owned Dominick 's before selling the chain to Safeway in 1998 for $ 2.5 billion .", +'Yucaipa owned Dominick Stores before selling the chain to Safeway in 1998 for $ 2.5 billion.', +"Yucaipa owned Dominick's before selling the chain to Safeway in 1998 for $ 2.5 billion.", +'Yucaipa owned Dominick Pizza before selling the chain to Safeway in 1998 for $ 2.5 billion.' +] +``` + +بالنسبة لكل جملة أصلية، قامت RoBERTA بزيادة كلمة عشوائية بثلاثة بدائل. تمت إضافة الكلمة الأصلية "distorting" بكلمات "withholding" و"suppressing" و"destroying". + +### معالجة عدة انقسامات + +تحتوي العديد من مجموعات البيانات على انقسامات يمكن معالجتها في نفس الوقت باستخدام [`DatasetDict.map`]. على سبيل المثال، يمكنك إجراء عملية تمييز للجزء `sentence1` في الانقسام التدريبي والاختباري عن طريق: + +```py +>>> from datasets import load_dataset + +# تحميل جميع الانقسامات +>>> dataset = load_dataset('glue', 'mrpc') +>>> encoded_dataset = dataset.map(lambda examples: tokenizer(examples["sentence1"]), batched=True) +>>> encoded_dataset["train"][0] +{'sentence1': 'Amrozi accused his brother , whom he called " the witness " , of deliberately distorting his evidence .', +'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .', +'label': 1, +'idx': 0, +'input_ids': [ 101, 7277, 2180, 5303, 4806, 1117, 1711, 117, 2292, 1119, 1270, 107, 1103, 7737, 107, 117, 1104, 9938, 4267, 12223, 21811, 1117, 2554, 119, 102], +'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +} +``` + +### الاستخدام الموزع + +عند استخدام [`~Dataset.map`] في إعداد موزع، يجب عليك أيضًا استخدام [torch.distributed.barrier](https://pytorch.org/docs/stable/distributed?highlight=barrier#torch.distributed.barrier). يضمن هذا قيام العملية الرئيسية بأداء عملية التخطيط، في حين تقوم العمليات الأخرى بتحميل النتائج، وبالتالي تجنب العمل المكرر. + +يوضح المثال التالي كيفية استخدام `torch.distributed.barrier` لمزامنة العمليات: + +```py +>>> from datasets import Dataset +>>> import torch.distributed + +>>> dataset1 = Dataset.from_dict({"a": [0, 1, 2]}) + +>>> if training_args.local_rank > 0: +... print("Waiting for main process to perform the mapping") +... torch.distributed.barrier() + +>>> dataset2 = dataset1.map(lambda x: {"a": x["a"] + 1}) + +>>> if training_args.local_rank == 0: +... print("Loading results from main process") +... torch Mieczyslaw +``` + +## دمج + +يمكن دمج مجموعات بيانات منفصلة إذا كانت تشترك في نفس أنواع الأعمدة. دمج مجموعات البيانات باستخدام [`concatenate_datasets`]: + +```py +>>> from datasets import concatenate_datasets, load_dataset + +>>> bookcorpus = load_dataset("bookcorpus", split="train") +>>> wiki = load_dataset("wikipedia", "20220301.en", split="train") +>>> wiki = wiki.remove_columns([col for col in wiki.column_names if col != "text"]) # احتفظ بعمود "النص" فقط + +>>> assert bookcorpus.features.type == wiki.features.type +>>> bert_dataset = concatenate_datasets([bookcorpus, wiki]) +``` + +يمكنك أيضًا دمج مجموعتين من البيانات أفقيًا عن طريق تعيين `axis=1` طالما أن لدى مجموعات البيانات نفس عدد الصفوف: + +```py +>>> from datasets import Dataset +>>> bookcorpus_ids = Dataset.from_dict({"ids": list(range(len(bookcorpus)))}) +>>> bookcorpus_with_ids = concatenate_datasets([bookcorpus, bookcorpus_ids], axis=1) +``` +### Interleave +يمكنك أيضًا خلط عدة مجموعات بيانات معًا عن طريق أخذ أمثلة متناوبة من كل منها لإنشاء مجموعة بيانات جديدة. يُعرف هذا باسم *التداخل*، والذي يتم تمكينه بواسطة دالة [`interleave_datasets`]. يعمل كل من [`interleave_datasets`] و [`concatenate_datasets`] مع كائنات [`Dataset`] و [`IterableDataset`] العادية. + +راجع دليل [Stream](./stream#interleave) للحصول على مثال حول كيفية تداخل كائنات [`IterableDataset`]. + +يمكنك تحديد احتمالات المعاينة لكل مجموعة من مجموعات البيانات الأصلية لتحديد كيفية تداخل مجموعات البيانات. + +في هذه الحالة، يتم بناء مجموعة البيانات الجديدة عن طريق الحصول على أمثلة واحدة تلو الأخرى من مجموعة بيانات عشوائية حتى تنفد إحدى مجموعات البيانات من العينات. + +```py +>>> from datasets import Dataset, interleave_datasets +>>> seed = 42 +>>> probabilities = [0.3, 0.5, 0.2] +>>> d1 = Dataset.from_dict({"a": [0, 1, 2]}) +>>> d2 = Dataset.from_dict({"a": [10, 11, 12, 13]}) +>>> d3 = Dataset.from_dict({"a": [20, 21, 22]}) +>>> dataset = interleave_datasets([d1, d2, d3], probabilities=probabilities, seed=seed) +>>> dataset["a"] +[10, 11, 20, 12, 0, 21, 13] +``` + +يمكنك أيضًا تحديد `stopping_strategy`. استراتيجية الافتراضية، `first_exhausted`، هي استراتيجية الاستبعاد، أي يتوقف بناء مجموعة البيانات بمجرد نفاد إحدى مجموعات البيانات من العينات. + +يمكنك تحديد `stopping_strategy=all_exhausted` لتنفيذ استراتيجية الإفراط في المعاينة. في هذه الحالة، يتوقف بناء مجموعة البيانات بمجرد إضافة كل عينة في كل مجموعة بيانات مرة واحدة على الأقل. في الممارسة العملية، يعني ذلك أنه إذا تم استنفاد مجموعة بيانات، فسيتم الرجوع إلى بداية مجموعة البيانات هذه حتى يتم الوصول إلى معيار التوقف. + +لاحظ أنه إذا لم يتم تحديد احتمالات المعاينة، فستحتوي مجموعة البيانات الجديدة على `max_length_datasets * nb_dataset samples`. + +```py +>>> d1 = Dataset.from_dict({"a": [0, 1, 2]}) +>>> d2 = Dataset.from_dict({"a": [10, 11, 12, 13]}) +>>> d3 = Dataset.from_dict({"a": [20, 21, 22]}) +>>> dataset = interleave_datasets([d1, d2, d3], stopping_strategy="all_exhausted") +>>> dataset["a"] +[0, 10, 20, 1, 11, 21, 2, 12, 22, 0, 13, 20] +``` + +## التنسيق +تغير دالة [`~Dataset.set_format`] تنسيق عمود ليكون متوافقًا مع بعض تنسيقات البيانات الشائعة. حدد الإخراج الذي تريده في معلمة `type` والأعمدة التي تريد تنسيقها. يتم تطبيق التنسيق أثناء التنقل. + +على سبيل المثال، قم بإنشاء tensers PyTorch عن طريق تعيين `type="torch"`: + +```py +>>> import torch +>>> dataset.set_format(type="torch", columns=["input_ids", "token_type_ids", "attention_mask", "label"]) +``` + +تغير دالة [`~Dataset.with_format`] أيضًا تنسيق عمود، باستثناء أنها تعيد كائن [`Dataset`] جديدًا: + +```py +>>> dataset = dataset.with_format(type="torch", columns=["input_ids", "token_type_ids", "attention_mask", "label"]) +``` + + +🤗 توفر Datasets أيضًا دعمًا لتنسيقات البيانات الشائعة الأخرى مثل NumPy وPandas وJAX. راجع دليل [Using Datasets with TensorFlow](https://huggingface.co/docs/datasets/master/en/use_with_tensorflow#using-totfdataset) للحصول على مزيد من التفاصيل حول كيفية إنشاء مجموعة بيانات TensorFlow بكفاءة. + + +إذا كنت بحاجة إلى إعادة تعيين مجموعة البيانات إلى تنسيقها الأصلي، فاستخدم دالة [`~Dataset.reset_format`]: + +```py +>>> dataset.format +{'type': 'torch', 'format_kwargs': {}, 'columns': ['label'], 'output_all_columns': False} +>>> dataset.reset_format() +>>> dataset.format +{'type': 'python', 'format_kwargs': {}, 'columns': ['idx', 'label', 'sentence1', 'sentence2'], 'output_all_columns': False} +``` + +### تحويل التنسيق +تطبق دالة [`~Dataset.set_transform`] تحويل تنسيق مخصص أثناء التنقل. تستبدل هذه الدالة أي تنسيق محدد سابقًا. على سبيل المثال، يمكنك استخدام هذه الدالة للتعرف على الرموز وتعبئة الرموز أثناء التنقل. يتم تطبيق التعرف على الرموز فقط عند الوصول إلى الأمثلة: + +```py +>>> from transformers import AutoTokenizer + +>>> tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") +>>> def encode(batch): +... return tokenizer(batch["sentence1"], batch["sentence2"], padding="longest", truncation=True, max_length=512, return_tensors="pt") +>>> dataset.set_transform(encode) +>>> dataset.format +{'type': 'custom', 'format_kwargs': {'transform': }, 'columns': ['idx', 'label', 'sentence1', 'sentence2'], 'output_all_columns': False} +``` + +يمكنك أيضًا استخدام دالة [`~Dataset.set_transform`] لترميز التنسيقات غير المدعومة بواسطة [`Features`]. على سبيل المثال، يستخدم ميزة [`Audio`] [`soundfile`](https://python-soundfile.readthedocs.io/en/0.11.0/) - وهي مكتبة سريعة وبسيطة لتثبيت - ولكنها لا توفر دعمًا لتنسيقات الصوت الأقل شيوعًا. هنا يمكنك استخدام [`~Dataset.set_transform`] لتطبيق تحويل ترميز مخصص أثناء التنقل. يمكنك استخدام أي مكتبة تريدها لترميز ملفات الصوت. + +يستخدم المثال أدناه حزمة [`pydub`](http://pydub.com/) لفتح تنسيق صوتي لا يدعمه `soundfile`: + +```py +>>> import numpy as np +>>> from pydub import AudioSegment + +>>> audio_dataset_amr = Dataset.from_dict({"audio": ["audio_samples/audio.amr"]}) + +>>> def decode_audio_with_pydub(batch, sampling_rate=16_000): +... def pydub_decode_file(audio_path): +... sound = AudioSegment.from_file(audio_path) +... if sound.frame_rate != sampling_rate: +... sound = sound.set_frame_rate(sampling_rate) +... channel_sounds = sound.split_to_mono() +... samples = [s.get_array_of_samples() for s in channel_sounds] +... fp_arr = np.array(samples).T.astype(np.float32) +... fp_arr /= np.iinfo(samples[0].typecode).max +... return fp_arr +... +... batch["audio"] = [pydub_decode_file(audio_path) for audio_path in batch["audio"]] +... return batch + +>>> audio_dataset_amr.set_transform(decode_audio_with_pydub) +``` + +## الحفظ +بمجرد الانتهاء من معالجة مجموعة البيانات الخاصة بك، يمكنك حفظها وإعادة استخدامها لاحقًا مع [`~Dataset.save_to_disk`]. + +احفظ مجموعة البيانات الخاصة بك عن طريق توفير المسار إلى الدليل الذي تريد حفظه فيه: + +```py +>>> encoded_dataset.save_to_disk("path/of/my/dataset/directory") +``` + +استخدم دالة [`load_from_disk`] لإعادة تحميل مجموعة البيانات: + +```py +>>> from datasets import load_from_disk +>>> reloaded_dataset = load_from_disk("path/of/my/dataset/directory") +``` + + +هل تريد حفظ مجموعة البيانات الخاصة بك إلى موفر تخزين سحابي؟ اقرأ دليلنا [Cloud Storage](./filesystems) لمعرفة كيفية حفظ مجموعة البيانات الخاصة بك إلى AWS أو Google Cloud Storage. + + +## التصدير +يدعم 🤗 Datasets التصدير أيضًا، حتى تتمكن من العمل مع مجموعة البيانات الخاصة بك في تطبيقات أخرى. يُظهر الجدول التالي تنسيقات الملفات المدعومة حاليًا والتي يمكنك التصدير إليها: + +| نوع الملف | طريقة التصدير | +|-------------------------|----------------------------------------------------------------| +| CSV | [`Dataset.to_csv`] | +| JSON | [`Dataset.to_json`] | +| Parquet | [`Dataset.to_parquet`] | +| SQL | [`Dataset.to_sql`] | +| كائن Python في الذاكرة | [`Dataset.to_pandas`] أو [`Dataset.to_dict`] | + +على سبيل المثال، قم بتصدير مجموعة البيانات الخاصة بك إلى ملف CSV على النحو التالي: + +```py +>>> encoded_dataset.to_csv("path/of/my/dataset.csv") +``` \ No newline at end of file diff --git a/docs/source/ar/quickstart.mdx b/docs/source/ar/quickstart.mdx new file mode 100644 index 00000000000..1bc25e12b24 --- /dev/null +++ b/docs/source/ar/quickstart.mdx @@ -0,0 +1,360 @@ +# بداية سريعة + +[[open-in-colab]] + +هذه البداية السريعة مخصصة للمطورين الذين يرغبون في الغوص في الشفرة البرمجية ورؤية مثال على كيفية دمج 🤗 Datasets في سير عمل التدريب على النماذج. إذا كنت مبتدئًا، نوصي بالبدء مع [البرامج التعليمية](./tutorial)، حيث ستتعرف على مقدمة أكثر شمولاً. + +يعد كل مجموعة بيانات فريدة من نوعها، واعتمادًا على المهمة، قد تتطلب بعض مجموعات البيانات خطوات إضافية لإعدادها للتدريب. ولكن يمكنك دائمًا استخدام أدوات 🤗 Datasets لتحميل ومعالجة مجموعة البيانات. أسرع وأسهل طريقة للبدء هي تحميل مجموعة بيانات موجودة من [Hugging Face Hub](https://huggingface.co/datasets). هناك الآلاف من مجموعات البيانات للاختيار من بينها، والتي تغطي العديد من المهام. اختر نوع مجموعة البيانات التي تريد العمل بها، ولنبدأ! + + + + + +اطلع على [الفصل 5](https://huggingface.co/course/chapter5/1؟fw=pt) من دورة Hugging Face للتعرف على المزيد من الموضوعات المهمة مثل تحميل مجموعات البيانات البعيدة أو المحلية، وأدوات لتنظيف مجموعة بيانات، وإنشاء مجموعة البيانات الخاصة بك. + + + +ابدأ بتثبيت 🤗 Datasets: + +```bash +pip install datasets +``` + +🤗 Datasets تدعم أيضًا تنسيقات البيانات الصوتية والصور: + +* للعمل مع مجموعات البيانات الصوتية، قم بتثبيت ميزة [`Audio`]: + +```bash +pip install datasets[audio] +``` + +* للعمل مع مجموعات البيانات الصورية، قم بتثبيت ميزة [`Image`]: + +```bash +pip install datasets[vision] +``` + +بالإضافة إلى 🤗 Datasets، تأكد من تثبيت إطار عمل التعلم الآلي المفضل لديك: + + + + +```bash +pip install torch +``` + + + + +```bash +pip install tensorflow +``` + + + + +## الصوت + +يتم تحميل مجموعات البيانات الصوتية تمامًا مثل مجموعات البيانات النصية. ومع ذلك، يتم معالجة مجموعة البيانات الصوتية بشكل مختلف قليلاً. بدلاً من أداة التعرف على الكيانات المسماة، ستحتاج إلى [مستخرج الميزات](https://huggingface.co/docs/transformers/main_classes/feature_extractor#feature-extractor). قد يتطلب إدخال الصوت أيضًا إعادة أخذ عينات من معدل العينات الخاص به لمطابقة معدل عينات النموذج المسبق التدريب الذي تستخدمه. في هذه البداية السريعة، ستعد مجموعة بيانات [MInDS-14](https://huggingface.co/datasets/PolyAI/minds14) لتدريب نموذج على تصنيف المشكلة المصرفية التي يواجهها العميل. + +**1**. قم بتحميل مجموعة بيانات MInDS-14 عن طريق تزويد الدالة [`load_dataset`] باسم مجموعة البيانات، وتكوين مجموعة البيانات (لا تحتوي جميع مجموعات البيانات على تكوين)، وانقسام مجموعة البيانات: + +```py +>>> from datasets import load_dataset, Audio + +>>> dataset = load_dataset("PolyAI/minds14", "en-US", split="train") +``` + +**2**. بعد ذلك، قم بتحميل نموذج Wav2Vec2 مسبق التدريب ومستخرج الميزات المقابل له من مكتبة [🤗 Transformers](https://huggingface.co/transformers/). من الطبيعي تمامًا أن ترى تحذيرًا بعد تحميل النموذج حول بعض الأوزان التي لم يتم تهيئتها. هذا متوقع لأنك تقوم بتحميل نقطة تفتيش هذا النموذج للتدريب مع مهمة أخرى. + +```py +>>> from transformers import AutoModelForAudioClassification, AutoFeatureExtractor + +>>> model = AutoModelForAudioClassification.from_pretrained("facebook/wav2vec2-base") +>>> feature_extractor = AutoFeatureExtractor.from_pretrained("facebook/wav2vec2-base") +``` + +**3**. تشير بطاقة مجموعة بيانات [MInDS-14](https://huggingface.co/datasets/PolyAI/minds14) إلى أن معدل العينات يبلغ 8 كيلو هرتز، ولكن تم تدريب نموذج Wav2Vec2 مسبقًا على معدل عينات يبلغ 16 كيلو هرتز. ستحتاج إلى إعادة أخذ عينات من عمود "الصوت" باستخدام دالة [`~Dataset.cast_column`] وميزة [`Audio`] لمطابقة معدل عينات النموذج. + +```py +>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16000)) +>>> dataset[0]["audio"] +{'array': array([ 2.3443763e-05, 2.1729663e-04, 2.2145823e-04, ..., +3.8356509e-05, -7.3497440e-06, -2.1754686e-05], dtype=float32), +'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav', +'sampling_rate': 16000} +``` + +**4**. قم بإنشاء دالة لمعالجة مصفوفة الصوت باستخدام مستخرج الميزات، وقص وتوسيد التسلسلات إلى مصفوفات مستطيلة مرتبة. أهم شيء يجب تذكره هو استدعاء مصفوفة الصوت في مستخرج الميزات لأن المصفوفة - إشارة الكلام الفعلية - هي إدخال النموذج. + +بمجرد أن يكون لديك دالة معالجة، استخدم دالة [`~Dataset.map`] لتسريع المعالجة عن طريق تطبيق الدالة على دفعات من الأمثلة في مجموعة البيانات. + +```py +>>> def preprocess_function(examples): +... audio_arrays = [x["array"] for x in examples["audio"]] +... inputs = feature_extractor( +... audio_arrays, +... sampling_rate=16000, +... padding=True, +... max_length=100000, +... truncation=True, +... ) +... return inputs + +>>> dataset = dataset.map(preprocess_function, batched=True) +``` + +**5**. استخدم دالة [`~Dataset.rename_column`] لإعادة تسمية عمود "intent_class" إلى "labels"، وهو اسم الإدخال المتوقع في [Wav2Vec2ForSequenceClassification](https://huggingface.co/docs/transformers/main/en/model_doc/wav2vec2#transformers.Wav2Vec2ForSequenceClassification): + +```py +>>> dataset = dataset.rename_column("intent_class", "labels") +``` + +**6**. قم بتعيين تنسيق مجموعة البيانات وفقًا لإطار عمل التعلم الآلي الذي تستخدمه. + + + + +استخدم دالة [`~Dataset.set_format`] لتعيين تنسيق مجموعة البيانات إلى "torch" وحدد الأعمدة التي تريد تنسيقها. تطبق هذه الدالة التنسيق أثناء التنقل. بعد تحويلها إلى مصفوفات PyTorch، قم بلف مجموعة البيانات في [`torch.utils.data.DataLoader`](https://alband.github.io/doc_view/data.html؟highlight=torch%20utils%20data%20dataloader#torch.utils.data.DataLoader): + +```py +>>> from torch.utils.data import DataLoader + +>>> dataset.set_format(type="torch", columns=["input_values", "labels"]) +>>> dataloader = DataLoader(dataset, batch_size=4) +``` + + + + +استخدم طريقة [`~transformers.TFPreTrainedModel.prepare_tf_dataset`] من 🤗 Transformers لإعداد مجموعة البيانات لتكون متوافقة مع TensorFlow، وجاهزة لتدريب/ضبط نموذج، حيث تقوم بتغليف مجموعة بيانات HuggingFace [`~datasets.Dataset`] كـ `tf.data.Dataset` + +مع الجمع والتشغيل، حتى تتمكن من تمريره مباشرة إلى أساليب Keras مثل `fit()` دون تعديل آخر. + +```py +>>> import tensorflow as tf + +>>> tf_dataset = model.prepare_tf_dataset( +... dataset, +... batch_size=4, +... shuffle=True, +... ) +``` + + + + +**7**. ابدأ التدريب باستخدام إطار عمل التعلم الآلي الخاص بك! اطلع على دليل تصنيف الصوت في 🤗 Transformers للحصول على مثال شامل حول كيفية تدريب نموذج على مجموعة بيانات صوتية. + +## الرؤية + +يتم تحميل مجموعات البيانات الصورية تمامًا مثل مجموعات البيانات النصية. ومع ذلك، بدلاً من أداة التعرف على الكيانات المسماة، ستحتاج إلى [مستخرج الميزات](https://huggingface.co/docs/transformers/main_classes/feature_extractor#feature-extractor) لمعالجة مجموعة البيانات. يعد تطبيق زيادة البيانات على صورة أمرًا شائعًا في رؤية الكمبيوتر لجعل النموذج أكثر قوة ضد الإفراط في التخصيص. يمكنك استخدام أي مكتبة لزيادة البيانات تريدها، ثم يمكنك تطبيق الزيادات باستخدام 🤗 Datasets. في هذه البداية السريعة، ستقوم بتحميل مجموعة بيانات [Beans](https://huggingface.co/datasets/beans) وجعلها جاهزة للنموذج لتدريب وتحديد المرض من صور الأوراق. + +**1**. قم بتحميل مجموعة بيانات Beans عن طريق تزويد دالة [`load_dataset`] باسم مجموعة البيانات وانقسام مجموعة البيانات: + +```py +>>> from datasets import load_dataset, Image + +>>> dataset = load_dataset("beans", split="train") +``` + +تعمل معظم نماذج الصور مع صور RGB. إذا كانت مجموعة البيانات الخاصة بك تحتوي على صور في وضع مختلف، فيمكنك استخدام دالة [`~Dataset.cast_column`] لتعيين الوضع إلى RGB: + +```py +>>> dataset = dataset.cast_column("image", Image(mode="RGB")) +``` + +تحتوي مجموعة بيانات Beans على صور RGB فقط، لذا فإن هذه الخطوة غير ضرورية هنا. + +**2**. الآن يمكنك إضافة بعض الزيادات باستخدام أي مكتبة ([Albumentations](https://albumentations.ai/)، [imgaug](https://imgaug.readthedocs.io/en/latest/)، [Kornia](https://kornia.readthedocs.io/en/latest/)) التي تريدها. هنا، ستستخدم [torchvision](https://pytorch.org/vision/stable/transforms.html) لتغيير خصائص اللون في الصورة بشكل عشوائي: + +```py +>>> from torchvision.transforms import Compose, ColorJitter, ToTensor + +>>> jitter = Compose( +... [ColorJitter(brightness=0.5, hue=0.5), ToTensor()] +... ) +``` + +**3**. قم بإنشاء دالة لتطبيق تحويلك على مجموعة البيانات وتوليد إدخال النموذج: `pixel_values`. + +```python +>>> def transforms(examples): +... examples["pixel_values"] = [jitter(image.convert("RGB")) for image in examples["image"]] +... return examples +``` + +**4**. استخدم دالة [`~Dataset.with_transform`] لتطبيق الزيادات أثناء التنقل: + +```py +>>> dataset = dataset.with_transform(transforms) +``` + +**5**. قم بتعيين تنسيق مجموعة البيانات وفقًا لإطار عمل التعلم الآلي الذي تستخدمه. + + + + +قم بتغليف مجموعة البيانات في [`torch.utils.data.DataLoader`](https://alband.github.io/doc_view/data.html؟highlight=torch%20utils%20data%20dataloader#torch.utils.data.DataLoader). ستحتاج أيضًا إلى إنشاء دالة تجميع لتجميع العينات في دفعات: + +```py +>>> from torch.utils.data import DataLoader + +>>> def collate_fn(examples): +... images = [] +... labels = [] +... for example in examples: +... images.append((example["pixel_values"])) +... labels.append(example["labels"]) +... +... pixel_values = torch.stack(images) +... labels = torch.tensor(labels) +... return {"pixel_values": pixel_values, "labels": labels} +>>> dataloader = DataLoader(dataset, collate_fn=collate_fn, batch_size=4) +``` + + + + +استخدم طريقة [`~transformers.TFPreTrainedModel.prepare_tf_dataset`] من 🤗 Transformers لإعداد مجموعة البيانات لتكون متوافقة مع TensorFlow، وجاهزة لتدريب/ضبط نموذج، حيث تقوم بتغليف مجموعة بيانات HuggingFace [`~datasets.Dataset`] كـ `tf.data.Dataset` + +مع الجمع والتشغيل، حتى تتمكن من تمريره مباشرة إلى أساليب Keras مثل `fit()` دون تعديل آخر. + +قبل البدء، تأكد من تثبيت الإصدارات الأحدث من `albumentations` و`cv2`: + +```bash +pip install -U albumentations opencv-python +``` + +```py +>>> import albumentations +>>> import numpy as np + +>>> transform = albumentations.Compose([ +... albumentations.RandomCrop(width=256, height=256)، +... albumentations.HorizontalFlip(p=0.5)، +... albumentاءات RandomBrightnessContrast (p=0.2)، +... ]) + +>>> def transforms(examples): +... examples["pixel_values"] = [ +... transform(image=np.array(image))["image"] for image in examples["image"] +... ] +... return examples + +>>> dataset.set_transform(transforms) +>>> tf_dataset = model.prepare_tf_dataset( +... dataset, +... batch_size=4, +... shuffle=True, +... ) +``` + + + + +**6**. ابدأ التدريب باستخدام إطار عمل التعلم الآلي الخاص بك! اطلع على دليل تصنيف الصور في 🤗 Transformers للحصول على مثال شامل حول كيفية تدريب نموذج على مجموعة بيانات صورية. +## NLP + +يجب توكينز النص إلى رموز فردية بواسطة [توكينيزر](https://huggingface.co/docs/transformers/main_classes/tokenizer). بالنسبة للبدء السريع، ستقوم بتحميل مجموعة بيانات التدريب [Microsoft Research Paraphrase Corpus (MRPC)](https://huggingface.co/datasets/glue/viewer/mrpc) لتدريب نموذج لتحديد ما إذا كان زوج من الجمل يعني نفس الشيء. + +**1**. قم بتحميل مجموعة بيانات MRPC عن طريق تزويد الدالة [`load_dataset`] باسم مجموعة البيانات، وتكوين مجموعة البيانات (ليس جميع مجموعات البيانات سيكون لها تكوين)، وتقسيم مجموعة البيانات: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("glue", "mrpc", split="train") +``` + +**2**. بعد ذلك، قم بتحميل نموذج BERT مسبق التدريب و tokenizer المقابل من مكتبة [🤗 Transformers](https://huggingface.co/transformers/). من الطبيعي تمامًا أن ترى تحذيرًا بعد تحميل النموذج حول بعض الأوزان التي لم يتم تهيئتها. هذا متوقع لأنك تقوم بتحميل نقطة تفتيش هذا النموذج للتدريب مع مهمة أخرى. + +```py +>>> from transformers import AutoModelForSequenceClassification, AutoTokenizer + +>>> model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased") +>>> tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") +===PT-TF-SPLIT=== +>>> from transformers import TFAutoModelForSequenceClassification, AutoTokenizer + +>>> model = TFAutoModelForSequenceClassification.from_pretrained("bert-base-uncased") +>>> tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") +``` + +**3**. قم بإنشاء دالة لتوكينز مجموعة البيانات، ويجب أيضًا تقليم وسادة النص في المنسوجات المستطيلة الأنيقة. يقوم tokenizer بإنشاء ثلاثة أعمدة جديدة في مجموعة البيانات: `input_ids`، و`token_type_ids`، و`attention_mask`. هذه هي مدخلات النموذج. + +استخدم وظيفة [`~Dataset.map`] لتسريع المعالجة عن طريق تطبيق دالة tokenization على دفعات من الأمثلة في مجموعة البيانات: + +```py +>>> def encode(examples): +... return tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, padding="max_length") + +>>> dataset = dataset.map(encode, batched=True) +>>> dataset[0] +{'sentence1': 'Amrozi accused his brother , whom he called " the witness " , of deliberately distorting his evidence .', +'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .', +'label': 1, +'idx': 0, +'input_ids': array([ 101, 7277, 2180, 5303, 4806, 1117, 1711, 117, 2292, 1119, 1270, 107, 1103, 7737, 107, 117, 1104, 9938, 4267, 12223, 21811, 1117, 2554, 119, 102, 11336, 6732, 3384, 1106, 1140, 1112, 1178, 107, 1103, 7737, 107, 117, 7277, 2180, 5303, 4806, 1117, 1711, 1104, 9938, 4267, 12223, 21811, 1117, 2554, 119, 102]), +'token_type_ids': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), +'attention_mask': array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])} +``` + +**4**. أعِد تسمية عمود `label` إلى `labels`، وهو اسم الإدخال المتوقع في [BertForSequenceClassification](https://huggingface.co/docs/transformers/main/en/model_doc/bert#transformers.BertForSequenceClassification): + +```py +>>> dataset = dataset.map(lambda examples: {"labels": examples["label"]}, batched=True) +``` + +**5**. قم بتعيين تنسيق مجموعة البيانات وفقًا لإطار عمل التعلم الآلي الذي تستخدمه. + + + +استخدم وظيفة [`~Dataset.set_format`] لتعيين تنسيق مجموعة البيانات إلى `torch` وحدد الأعمدة التي تريد تنسيقها. تطبق هذه الدالة التنسيق أثناء التنقل. بعد تحويلها إلى تنسورات PyTorch، قم بلف مجموعة البيانات في [`torch.utils.data.DataLoader`](https://alband.github.io/doc_view/data.html?highlight=torch%20utils%20data%20dataloader#torch.utils.data.DataLoader): + +```py +>>> import torch + +>>> dataset.set_format(type="torch", columns=["input_ids", "token_type_ids", "attention_mask", "labels"]) +>>> dataloader = torch.utils.data.DataLoader(dataset, batch_size=32) +``` + + + + +استخدم طريقة [`~transformers.TFPreTrainedModel.prepare_tf_dataset`] من مكتبة 🤗 Transformers لإعداد مجموعة البيانات لتكون متوافقة مع TensorFlow، وجاهزة لتدريب/ضبط نموذج دقيق، حيث تقوم بلف مجموعة بيانات HuggingFace [`~datasets.Dataset`] كـ `tf.data.Dataset` مع التجميع والدفعات، لذا يمكنك تمريرها مباشرة إلى أساليب Keras مثل `fit()` بدون تعديل إضافي. + +```py +>>> import tensorflow as tf + +>>> tf_dataset = model.prepare_tf_dataset( +... dataset, +... batch_size=4, +... shuffle=True, +... ) +``` + + + + +**6**. ابدأ التدريب باستخدام إطار عمل التعلم الآلي الخاص بك! تحقق من دليل تصنيف النص في 🤗 Transformers للحصول على مثال شامل حول كيفية تدريب نموذج على مجموعة بيانات نصية. + +## ما هو التالي؟ + +هذا يكمل دليل البدء السريع لـ 🤗 Datasets! يمكنك تحميل أي نص أو صوت أو صورة مجموعة بيانات باستخدام دالة واحدة وجعلها جاهزة لتدريب نموذجك عليها. + +بالنسبة لخطواتك التالية، اطلع على أدلة كيفية القيام بذلك وتعرف على كيفية القيام بأشياء أكثر تحديدًا مثل تحميل تنسيقات مجموعات بيانات مختلفة، ومواءمة التسميات، وبث مجموعات البيانات الكبيرة. إذا كنت مهتمًا بمعرفة المزيد عن المفاهيم الأساسية لـ 🤗 Datasets، فاحصل على فنجان من القهوة واقرأ أدلة المفاهيم لدينا! \ No newline at end of file diff --git a/docs/source/ar/repository_structure.mdx b/docs/source/ar/repository_structure.mdx new file mode 100644 index 00000000000..c7dbb764cae --- /dev/null +++ b/docs/source/ar/repository_structure.mdx @@ -0,0 +1,282 @@ +# هيكلة مستودعك + +لاستضافة ومشاركة مجموعة بياناتك، قم بإنشاء مستودع لمجموعة البيانات على Hugging Face Hub وتحميل ملفات البيانات الخاصة بك. + +سيوضح هذا الدليل كيفية هيكلة مستودع مجموعة البيانات الخاصة بك عند تحميله. + +تتم تحميل مجموعة البيانات ذات البنية المدعومة وتنسيق الملف (`.txt`، `.csv`، `.parquet`، `.jsonl`، `.mp3`، `.jpg`، `.zip`، إلخ.) تلقائيًا باستخدام [`~datasets.load_dataset`]، وستحتوي على عارض مجموعة بيانات في صفحة مجموعة البيانات الخاصة بها على Hub. + +## الاستخدام الأساسي + +أبسط هيكل لمجموعة البيانات يحتوي على ملفين: `train.csv` و`test.csv` (يعمل هذا مع أي تنسيق ملف مدعوم). + +سيحتوي مستودعك أيضًا على ملف `README.md`، [بطاقة مجموعة البيانات](dataset_card) المعروضة على صفحة مجموعة البيانات الخاصة بك. + +``` +my_dataset_repository/ +├── README.md +├── train.csv +└── test.csv +``` + +في هذه الحالة البسيطة، ستحصل على مجموعة بيانات بتقسيمين: `train` (تحتوي على أمثلة من `train.csv`) و`test` (تحتوي على أمثلة من `test.csv`). + +## تحديد تقسيماتك ومجموعاتك الفرعية في YAML + +## التقسيمات + +إذا كان لديك ملفات متعددة وتريد تحديد الملف الذي ينتمي إلى كل تقسيم، فيمكنك استخدام حقل YAML `configs` في أعلى ملف `README.md`. + +على سبيل المثال، بالنظر إلى مستودع مثل هذا: + +``` +my_dataset_repository/ +├── README.md +├── data.csv +└── holdout.csv +``` + +يمكنك تحديد تقسيماتك عن طريق إضافة حقل `configs` في كتلة YAML في أعلى ملف `README.md`: + +```yaml +--- +configs: +- config_name: default + data_files: + - split: train + path: "data.csv" + - split: test + path: "holdout.csv" +--- +``` + +يمكنك تحديد ملفات متعددة لكل تقسيم باستخدام قائمة المسارات: + +``` +my_dataset_repository/ +├── README.md +├── data/ +│ ├── abc.csv +│ └── def.csv +└── holdout/ + └── ghi.csv +``` + +```yaml +--- +configs: +- config_name: default + data_files: + - split: train + path: + - "data/abc.csv" + - "data/def.csv" + - split: test + path: "holdout/ghi.csv" +--- +``` + +أو يمكنك استخدام أنماط glob لتحديد جميع الملفات التي تحتاجها تلقائيًا: + +```yaml +--- +configs: +- config_name: default + data_files: + - split: train + path: "data/*.csv" + - split: test + path: "holdout/*.csv" +--- +``` + + +لاحظ أن حقل `config_name` مطلوب حتى إذا كان لديك تكوين واحد. + + +## التكوينات + +قد تحتوي مجموعة البيانات الخاصة بك على عدة مجموعات فرعية من البيانات التي تريد أن تكون قادرًا على تحميلها بشكل منفصل. في هذه الحالة، يمكنك تحديد قائمة بالتكوينات داخل حقل `configs` في YAML: + +``` +my_dataset_repository/ +├── README.md +├── main_data.csv +└── additional_data.csv +``` + +```yaml +--- +configs: +- config_name: main_data + data_files: "main_data.csv" +- config_name: additional_data + data_files: "additional_data.csv" +--- +``` + +يتم عرض كل تكوين بشكل منفصل على Hugging Face Hub، ويمكن تحميله عن طريق تمرير اسمه كمعامل ثانٍ: + +```python +from datasets import load_dataset + +main_data = load_dataset("my_dataset_repository", "main_data") +additional_data = load_dataset("my_dataset_repository", "additional_data") +``` + +## معلمات الباني + +لا يمكن تمرير معلمات الباني المحددة فقط عبر YAML، مما يتيح المزيد من المرونة في كيفية تحميل البيانات دون الحاجة إلى أي رمز مخصص. على سبيل المثال، حدد الفاصل الذي سيتم استخدامه في أي تكوين لتحميل ملفات csv الخاصة بك: + +```yaml +--- +configs: +- config_name: tab + data_files: "main_data.csv" + sep: "\t" +- config_name: comma + data_files: "additional_data.csv" + sep: "," +--- +``` + +راجع [توثيق البناة المحددين](./package_reference/builder_classes) لمعرفة معلمات التكوين التي لديهم. + + +يمكنك تعيين تكوين افتراضي باستخدام `default: true`، على سبيل المثال، يمكنك تشغيل `main_data = load_dataset("my_dataset_repository")` إذا قمت بتعيين + +```yaml +- config_name: main_data + data_files: "main_data.csv" + default: true +``` + + + +## الكشف التلقائي عن التقسيمات + +إذا لم يتم توفير أي ملف YAML، فيبحث 🤗 Datasets عن أنماط معينة في مستودع مجموعة البيانات لاستنتاج تقسيمات مجموعة البيانات تلقائيًا. + +هناك ترتيب للأنماط، بدءًا من تنسيق اسم الملف المخصص لعلاج جميع الملفات كتقسيم واحد إذا لم يتم العثور على أي نمط. + +### اسم الدليل + +قد يتم أيضًا وضع ملفات البيانات الخاصة بك في مجلدات مختلفة تسمى `train` و`test` و`validation` حيث يحتوي كل مجلد على ملفات البيانات لذلك التقسيم: + +``` +my_dataset_repository/ +├── README.md +└── data/ + ├── train/ + │ └── bees.csv + ├── test/ + │ └── more_bees.csv + └── validation/ + └── even_more_bees.csv +``` + +### تقسيمات اسم الملف + +إذا لم يكن لديك أي تقسيمات غير تقليدية، فيمكنك وضع اسم التقسيم في أي مكان في ملف البيانات وسيتم استنتاجه تلقائيًا. القاعدة الوحيدة هي أنه يجب أن يكون اسم التقسيم محاطًا بحرف غير أبجدي، مثل `test-file.csv` على سبيل المثال بدلاً من `testfile.csv`. تشمل الفواصل المدعومة الشرطات السفلية والشرطات والمسافات والنقاط والأرقام. + +على سبيل المثال، أسماء الملفات التالية مقبولة جميعها: + +- تقسيم التدريب: `train.csv`، `my_train_file.csv`، `train1.csv` +- تقسيم التحقق من الصحة: `validation.csv`، `my_validation_file.csv`، `validation1.csv` +- تقسيم الاختبار: `test.csv`، `my_test_file.csv`، `test1.csv` + +هنا مثال يتم فيه وضع جميع الملفات في مجلد يسمى `data`: + +``` +my_dataset_repository/ +├── README.md +└── data/ + ├── train.csv + ├── test.csv + └── validation.csv +``` + +### اسم ملف التقسيم المخصص + +إذا كانت تقسيمات مجموعة البيانات الخاصة بك لها أسماء مخصصة ليست `train` أو `test` أو `validation`، فيمكنك تسمية ملفات البيانات الخاصة بك مثل `data/-xxxxx-of-xxxxx.csv`. + +هنا مثال يحتوي على ثلاثة تقسيمات، `train` و`test` و`random`: + +``` +my_dataset_repository/ +├── README.md +└── data/ + ├── train-00000-of-00003.csv + ├── train-00001-of-00003.csv + ├── train-00002-of-00003.csv + ├── test-00000-of-00001.csv + ├── random-00000-of-00003.csv + ├── random-00001-of-00003.csv + └── random-00002-of-00003.csv +``` + +### تقسيم واحد + +عندما لا يتمكن 🤗 Datasets من العثور على أي من الأنماط المذكورة أعلاه، فسيتم التعامل مع جميع الملفات على أنها تقسيم تدريب واحد. إذا لم يتم تحميل تقسيمات مجموعة البيانات الخاصة بك كما هو متوقع، فقد يكون ذلك بسبب نمط غير صحيح. + +### كلمات مفتاحية لاسم التقسيم + +هناك عدة طرق لتسمية التقسيمات. يُشار إلى تقسيمات التحقق من الصحة أحيانًا باسم "dev"، وقد يُشار إلى تقسيمات الاختبار باسم "eval". + +يتم أيضًا دعم أسماء التقسيمات الأخرى، والكلمات الرئيسية التالية متكافئة: + +- train، training +- validation، valid، val، dev +- test، testing، eval، evaluation + +الهيكل أدناه هو مستودع صالح: + +``` +my_dataset_repository/ +├── README.md +└── data/ + ├── training.csv + ├── eval.csv + └── valid.csv +``` + +### ملفات متعددة لكل تقسيم + +إذا كان أحد تقسيماتك يتكون من عدة ملفات، فيمكن لـ 🤗 Datasets استنتاج ما إذا كان تقسيم التدريب أو التحقق من الصحة أو الاختبار من اسم الملف. + +على سبيل المثال، إذا كان تقسيم التدريب والاختبار الخاص بك يمتد عبر عدة ملفات: + +``` +my_dataset_repository/ +├── README.md +├── train_0.csv +├── train_1.csv +├── train_2.csv +├── train_3.csv +├── test_0.csv +└── test_1.csv +``` + +تأكد من أن جميع ملفات مجموعة "التدريب" الخاصة بك تحتوي على "التدريب" في أسمائها (نفس الشيء بالنسبة لاختبار والتحقق من الصحة). + +حتى إذا أضفت بادئة أو لاحقة إلى "التدريب" في اسم الملف (مثل `my_train_file_00001.csv` على سبيل المثال)، + +يمكن لـ 🤗 Datasets استنتاج التقسيم المناسب. + +للراحة، يمكنك أيضًا وضع ملفات البيانات الخاصة بك في مجلدات مختلفة. + +في هذه الحالة، يتم استنتاج اسم التقسيم من اسم المجلد. + +``` +my_dataset_repository/ +├── README.md +└── data/ + ├── train/ + │ ├── shard_0.csv + │ ├── shard_1.csv + │ ├── shard_2.csv + │ └── shard_3.csv + └── test/ + ├── shard_0.csv + └── shard_1.csv +``` \ No newline at end of file diff --git a/docs/source/ar/semantic_segmentation.mdx b/docs/source/ar/semantic_segmentation.mdx new file mode 100644 index 00000000000..38c6e2f972f --- /dev/null +++ b/docs/source/ar/semantic_segmentation.mdx @@ -0,0 +1,168 @@ +# التجزئة الدلالية + +تُستخدم مجموعات بيانات التجزئة الدلالية لتدريب نموذج لتصنيف كل بكسل في صورة. وهناك مجموعة واسعة من التطبيقات التي تمكّنها هذه المجموعات من البيانات مثل إزالة الخلفية من الصور، أو تحويل الصور إلى أسلوب معين، أو فهم المشهد للقيادة الذاتية. سيوضح هذا الدليل كيفية تطبيق التحولات على مجموعة بيانات تجزئة الصور. + +قبل البدء، تأكد من أن لديك الإصدارات المحدثة من `albumentations` و`cv2` المثبتة: + +```bash +pip install -U albumentations opencv-python +``` + +[Albumentations](https://albumentations.ai/) هي مكتبة بايثون للقيام بزيادة البيانات للرؤية الحاسوبية. تدعم العديد من مهام الرؤية الحاسوبية مثل تصنيف الصور، وكشف الأشياء، والتجزئة، وتقدير النقاط الرئيسية. + +يستخدم هذا الدليل مجموعة بيانات [Scene Parsing](https://huggingface.co/datasets/scene_parse_150) لتجزئة وتحليل صورة إلى مناطق صورة مختلفة مرتبطة بفئات دلالية، مثل السماء، والطريق، والشخص، والسرير. + +قم بتحميل قسم `train` من مجموعة البيانات وإلقاء نظرة على مثال: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("scene_parse_150", split="train") +>>> index = 10 +>>> dataset[index] +{'image': , +'annotation': , +'scene_category': 927} +``` + +تحتوي مجموعة البيانات على ثلاثة حقول: + +* `image`: كائن صورة PIL. +* `annotation`: قناع التجزئة للصورة. +* `scene_category`: التسمية أو فئة المشهد للصورة (مثل "المطبخ" أو "المكتب"). + +بعد ذلك، تحقق من صورة باستخدام: + +```py +>>> dataset[index]["image"] +``` + +
+ +
+ +وبالمثل، يمكنك التحقق من قناع التجزئة المقابل: + +```py +>>> dataset[index]["annotation"] +``` + +
+ +
+ +يمكننا أيضًا إضافة [لوحة ألوان](https://github.com/tensorflow/models/blob/3f1ca33afe3c1631b733ea7e40c294273b9e406d/research/deeplab/utils/get_dataset_colormap.py#L51) على قناع التجزئة ووضعه فوق الصورة الأصلية لتصور مجموعة البيانات: + +بعد تحديد لوحة الألوان، يجب أن تكون جاهزًا لعرض بعض الطبقات. + +```py +>>> import matplotlib.pyplot as plt + +>>> def visualize_seg_mask(image: np.ndarray, mask: np.ndarray): + color_seg = np.zeros((mask.shape[0], mask.shape[1], 3), dtype=np.uint8) + palette = np.array(create_ade20k_label_colormap()) + for label, color in enumerate(palette): + color_seg[mask == label, :] = color + color_seg = color_seg[..., ::-1] # تحويل إلى BGR + + img = np.array(image) * 0.5 + color_seg * 0.5 # عرض الصورة مع خريطة التجزئة + img = img.astype(np.uint8) + + plt.figure(figsize=(15, 10)) + plt.imshow(img) + plt.axis("off") + plt.show() + + +>>> visualize_seg_mask( + np.array(dataset[index]["image"]), + np.array(dataset[index]["annotation"]) +) +``` + +
+ +
+ +الآن قم بتطبيق بعض التحسينات باستخدام `albumentations`. أولاً، ستقوم بإعادة تحجيم الصورة وتعديل سطوعها. + +```py +>>> import albumentations + +>>> transform = albumentations.Compose( + [ + albumentations.Resize(256, 256), + albumentations.RandomBrightnessContrast(brightness_limit=0.3, contrast_limit=0.3, p=0.5), + ] +) +``` + +قم بإنشاء دالة لتطبيق التحويل على الصور: + +```py +>>> def transforms(examples): + transformed_images, transformed_masks = [], [] + + for image, seg_mask in zip(examples["image"], examples["annotation"]): + image, seg_mask = np.array(image), np.array(seg_mask) + transformed = transform(image=image, mask=seg_mask) + transformed_images.append(transformed["image"]) + transformed_masks.append(transformed["mask"]) + + examples["pixel_values"] = transformed_images + examples["label"] = transformed_masks + return examples +``` + +استخدم وظيفة [`~Dataset.set_transform`] لتطبيق التحويل أثناء التنقل على دفعات من مجموعة البيانات لتقليل مساحة القرص المستخدمة: + +```py +>>> dataset.set_transform(transforms) +``` + +يمكنك التحقق من نجاح التحويل عن طريق الفهرسة في `pixel_values` و`label` لمثال: + +```py +>>> image = np.array(dataset[index]["pixel_values"]) +>>> mask = np.array(dataset[index]["label"]) + +>>> visualize_seg_mask(image, mask) +``` + +
+ +
+ +في هذا الدليل، استخدمت `albumentations` لزيادة مجموعة البيانات. من الممكن أيضًا استخدام `torchvision` لتطبيق بعض التحولات المماثلة. + +```py +>>> from torchvision.transforms import Resize, ColorJitter, Compose + +>>> transformation_chain = Compose([ + Resize((256, 256)), + ColorJitter(brightness=0.25, contrast=0.25, saturation=0.25, hue=0.1) +]) +>>> resize = Resize((256, 256)) + +>>> def train_transforms(example_batch): + example_batch["pixel_values"] = [transformation_chain(x) for x in example_batch["image"]] + example_batch["label"] = [resize(x) for x in example_batch["annotation"]] + return example_batch + +>>> dataset.set_transform(train_transforms) + +>>> image = np.array(dataset[index]["pixel_values"]) +>>> mask = np.array(dataset[index]["label"]) + +>>> visualize_seg_mask(image, mask) +``` + +
+ +
+ + + +الآن بعد أن عرفت كيفية معالجة مجموعة بيانات للتجزئة الدلالية، تعلم [كيفية تدريب نموذج تجزئة دلالية](https://huggingface.co/docs/transformers/tasks/semantic_segmentation) واستخدامه للاستدلال. + + \ No newline at end of file diff --git a/docs/source/ar/share.mdx b/docs/source/ar/share.mdx new file mode 100644 index 00000000000..1411aa21e11 --- /dev/null +++ b/docs/source/ar/share.mdx @@ -0,0 +1,224 @@ +# مشاركة مجموعة بيانات باستخدام واجهة سطر الأوامر + +في Hugging Face، نحن في مهمة لإضفاء الطابع الديمقراطي على التعلم الآلي الجيد ونؤمن بقيمة المصادر المفتوحة. ولهذا السبب قمنا بتصميم 🤗 Datasets بحيث يمكن لأي شخص مشاركة مجموعة بيانات مع مجتمع ML الأوسع. هناك حاليًا آلاف مجموعات البيانات بأكثر من 100 لغة في Hugging Face Hub، ويرحب فريق Hugging Face دائمًا بالمساهمات الجديدة! + +تقدم مستودعات مجموعات البيانات ميزات مثل: + +- استضافة مجموعة البيانات المجانية +- التحكم في إصدار مجموعة البيانات +- سجل الالتزام والفروق +- البيانات الوصفية للاكتشاف +- بطاقات مجموعة البيانات للتوثيق والترخيص والقيود، إلخ. +- [عارض مجموعة البيانات](../hub/datasets-viewer) + +سيوضح هذا الدليل كيفية مشاركة مجلد مجموعة بيانات أو مستودع يمكن لأي شخص الوصول إليه بسهولة. + + + +## إضافة مجموعة بيانات + +يمكنك مشاركة مجموعة البيانات الخاصة بك مع المجتمع باستخدام مستودع مجموعة بيانات على Hugging Face Hub. + +يمكن أن تكون أيضًا مجموعة بيانات خاصة إذا كنت تريد التحكم في من يمكنه الوصول إليها. + +في مستودع مجموعة البيانات، يمكنك استضافة جميع ملفات البيانات الخاصة بك و[تكوين مجموعة البيانات](./repository_structure#define-your-splits-in-yaml) لتحديد الملف الذي ينتمي إلى كل قسم. + +تتم دعم التنسيقات التالية: CSV وTSV وJSON وJSON lines وtext وParquet وArrow وSQLite وWebDataset. + +كما يتم دعم العديد من أنواع الملفات المضغوطة: GZ وBZ2 وLZ4 وLZMA أو ZSTD. + +على سبيل المثال، يمكن أن تتكون مجموعة البيانات الخاصة بك من ملفات `.json.gz`. + +من ناحية أخرى، إذا كانت مجموعة البيانات الخاصة بك غير مدعومة أو إذا كنت تريد مزيدًا من التحكم في كيفية تحميل مجموعة البيانات الخاصة بك، فيمكنك كتابة نص البرنامج النصي الخاص بك. + +لاحظ أن بعض الميزات غير متوفرة لمجموعات البيانات المحددة باستخدام برامج نصية للتحميل، مثل عارض مجموعة البيانات. يجب على المستخدمين أيضًا تمرير `trust_remote_code=True` لتحميل مجموعة البيانات. يوصى عمومًا بألا تعتمد مجموعات البيانات على برنامج نصي للتحميل، إذا أمكن ذلك، للاستفادة من جميع ميزات Hub. + +عند تحميل مجموعة بيانات من Hub، يتم تحميل جميع الملفات بتنسيقات مدعومة، باتباع [هيكل المستودع](./repository_structure). + +ومع ذلك، إذا كان هناك برنامج نصي لمجموعة البيانات، فسيتم تنزيله وتنفيذه لتنزيل مجموعة البيانات وإعدادها بدلاً من ذلك. + +للحصول على مزيد من المعلومات حول كيفية تحميل مجموعة بيانات من Hub، راجع البرنامج التعليمي [تحميل مجموعة بيانات من Hub](./load_hub). + +### إنشاء المستودع + +ستحتاج مشاركة مجموعة بيانات مجتمعية إلى إنشاء حساب على [hf.co](https://huggingface.co/join) إذا لم يكن لديك واحد بالفعل. + +يمكنك إنشاء [مستودع مجموعة بيانات جديدة](https://huggingface.co/login?next=%2Fnew-dataset) مباشرة من حسابك على Hugging Face Hub، ولكن هذا الدليل سيوضح لك كيفية تحميل مجموعة بيانات من المحطة الطرفية. + +1. تأكد من أنك في بيئة افتراضية حيث قمت بتثبيت Datasets، وقم بتشغيل الأمر التالي: + +``` +huggingface-cli login +``` + +2. قم بتسجيل الدخول باستخدام بيانات اعتماد Hugging Face Hub الخاصة بك، ثم قم بإنشاء مستودع مجموعة بيانات جديدة: + +``` +huggingface-cli repo create my-cool-dataset --type dataset +``` + +أضف العلم `-organization` لإنشاء مستودع ضمن منظمة محددة: + +``` +huggingface-cli repo create my-cool-dataset --type dataset --organization your-org-name +``` + +## تحضير الملفات الخاصة بك + +تحقق من دليلك للتأكد من أن الملفات الوحيدة التي تقوم بتحميلها هي: + +- ملفات البيانات الخاصة بمجموعة البيانات +- بطاقة مجموعة البيانات `README.md` +- (اختياري) `your_dataset_name.py` هو برنامجك النصي لتحميل مجموعة البيانات (اختياري إذا كانت ملفات البيانات الخاصة بك بتنسيقات مدعومة بالفعل csv/jsonl/json/parquet/txt). لإنشاء برنامج نصي لمجموعة البيانات، راجع صفحة [برنامج نصي لمجموعة البيانات](dataset_script). لاحظ أن بعض الميزات غير متوفرة لمجموعات البيانات المحددة باستخدام برامج نصية للتحميل، مثل عارض مجموعة البيانات. يجب على المستخدمين أيضًا تمرير `trust_remote_code=True` لتحميل مجموعة البيانات. يوصى عمومًا بألا تعتمد مجموعات البيانات على برنامج نصي للتحميل، إذا أمكن ذلك، للاستفادة من جميع ميزات Hub. + +## huggingface-cli upload + +استخدم الأمر `huggingface-cli upload` لتحميل الملفات إلى Hub مباشرةً. داخليًا، فإنه يستخدم نفس مساعدي [`upload_file`] و [`upload_folder`] الموضحين في دليل [التحميل](../huggingface_hub/guides/upload). في الأمثلة أدناه، سنمشي خلال حالات الاستخدام الأكثر شيوعًا. للحصول على قائمة كاملة بالخيارات المتاحة، يمكنك تشغيل: + +```bash +>>> huggingface-cli upload --help +``` + +للحصول على معلومات عامة حول `huggingface-cli`، يمكنك التحقق من [دليل CLI](../huggingface_hub/guides/cli). + +### تحميل مجلد كامل + +الاستخدام الافتراضي لهذا الأمر هو: + +```bash +# Usage: huggingface-cli upload [dataset_repo_id] [local_path] [path_in_repo] --repo-type dataset +``` + +لتحميل الدليل الحالي في جذر المستودع، استخدم: + +```bash +>>> huggingface-cli upload my-cool-dataset . . --repo-type dataset +https://huggingface.co/datasets/Wauplin/my-cool-dataset/tree/main/ +``` + + + +إذا لم يكن المستودع موجودًا بعد، فسيتم إنشاؤه تلقائيًا. + + + +يمكنك أيضًا تحميل مجلد محدد: + +```bash +>>> huggingface-cli upload my-cool-dataset ./data . --repo-type dataset +https://huggingface.co/datasetsWauplin/my-cool-dataset/tree/main/ +``` + +أخيرًا، يمكنك تحميل مجلد إلى وجهة محددة في المستودع: + +```bash +>>> huggingface-cli upload my-cool-dataset ./path/to/curated/data /data/train --repo-type dataset +https://huggingface.co/datasetsWauplin/my-cool-dataset/tree/main/data/train +``` + +### تحميل ملف واحد + +يمكنك أيضًا تحميل ملف واحد عن طريق تعيين `local_path` للإشارة إلى ملف على جهازك. إذا كان الأمر كذلك، فإن `path_in_repo` اختياري وسيتم تعيينه افتراضيًا إلى اسم ملفك المحلي: + +```bash +>>> huggingface-cli upload Wauplin/my-cool-dataset ./files/train.csv --repo-type dataset +https://huggingface.co/datasetsWauplin/my-cool-dataset/blob/main/train.csv +``` + +إذا كنت تريد تحميل ملف واحد إلى دليل محدد، فقم بتعيين `path_in_repo` وفقًا لذلك: + +```bash +>>> huggingface-cli upload Wauplin/my-cool-dataset ./files/train.csv /data/train.csv --repo-type dataset +https://huggingface.co/datasetsWauplin/my-cool-dataset/blob/main/data/train.csv +``` + +### تحميل ملفات متعددة + +لتحميل ملفات متعددة من مجلد في نفس الوقت دون تحميل المجلد بالكامل، استخدم أنماط `--include` و `--exclude`. يمكن أيضًا الجمع بينه وبين خيار `--delete` لحذف الملفات على المستودع أثناء تحميل ملفات جديدة. في المثال أدناه، نقوم بمزامنة مساحة محلية عن طريق حذف الملفات البعيدة وتحميل جميع ملفات CSV: + +```bash +# Sync local Space with Hub (upload new CSV files, delete removed files) +>>> huggingface-cli upload Wauplin/my-cool-dataset --repo-type dataset --include="/data/*.csv" --delete="*" --commit-message="Sync local dataset with Hub" +... +``` + +### تحميل إلى منظمة + +لتحميل المحتوى إلى مستودع تمتلكه منظمة بدلاً من مستودع شخصي، يجب تحديده صراحةً في `repo_id`: + +```bash +>>> huggingface-cli upload MyCoolOrganization/my-cool-dataset . . --repo-type dataset +https://huggingface.co/datasetsMyCoolOrganization/my-cool-dataset/tree/main/ +``` + +### تحميل إلى مراجعة محددة + +بشكل افتراضي، يتم تحميل الملفات إلى فرع `main`. إذا كنت تريد تحميل الملفات إلى فرع أو مرجع آخر، فاستخدم خيار `--revision`: + +```bash +# Upload files to a PR +huggingface-cli upload bigcode/the-stack . . --repo-type dataset --revision refs/pr/104 +... +``` + +**ملاحظة:** إذا لم يكن `revision` موجودًا ولم يتم تعيين `--create-pr`، فسيتم إنشاء فرع تلقائيًا من فرع `main`. + +### تحميل وإنشاء طلب سحب + +إذا لم يكن لديك إذن بالدفع إلى مستودع، فيجب عليك فتح طلب سحب وإبلاغ المؤلفين بالتغييرات التي تريد إجراؤها. يمكن القيام بذلك عن طريق تعيين خيار `--create-pr`: + +```bash +# Create a PR and upload the files to it +>>> huggingface-cli upload bigcode/the-stack --repo-type dataset --revision refs/pr/104 --create-pr . . +https://huggingface.co/datasets/bigcode/the-stack/blob/refs%2Fpr%2F104/ +``` + +### التحميل بفترات زمنية منتظمة + +في بعض الحالات، قد ترغب في إجراء تحديثات منتظمة لمستودع. على سبيل المثال، هذا مفيد إذا كانت مجموعة البيانات الخاصة بك تنمو بمرور الوقت وتريد تحميل مجلد البيانات كل 10 دقائق. يمكنك القيام بذلك باستخدام خيار `--every`: + +```bash +# Upload new logs every 10 minutes +huggingface-cli upload my-cool-dynamic-dataset data/ --every=10 +``` + +### تحديد رسالة الالتزام + +استخدم `--commit-message` و `--commit-description` لتعيين رسالة ووصف مخصصين لالتزامك بدلاً من الافتراضي + +```bash +>>> huggingface-cli upload Wauplin/my-cool-dataset ./data . --repo-type dataset --commit-message="Version 2" --commit-description="Train size: 4321. Check Dataset Viewer for more details." +... +https://huggingface.co/datasetsWauplin/my-cool-dataset/tree/main +``` + +### تحديد رمز مميز + +لتحميل الملفات، يجب استخدام رمز مميز. يتم استخدام الرمز المميز المحفوظ محليًا (باستخدام `huggingface-cli login`) بشكل افتراضي. إذا كنت تريد المصادقة بشكل صريح، فاستخدم خيار `--token`: + +```bash +>>> huggingface-cli upload Wauplin/my-cool-dataset ./data . --repo-type dataset --token=hf_**** +... +https://huggingface.co/datasetsWauplin/my-cool-data/tree/main +``` + +### الوضع الصامت + +بشكل افتراضي، سيكون الأمر `huggingface-cli upload` مفصلاً. سوف يطبع تفاصيل مثل رسائل التحذير ومعلومات حول الملفات المحملة وشرائط التقدم. إذا كنت تريد إسكات كل هذا، فاستخدم خيار `--quiet`. يتم طباعة السطر الأخير فقط (أي عنوان URL للملفات المحملة). قد يكون هذا مفيدًا إذا كنت تريد تمرير الإخراج إلى أمر آخر في أحد البرامج النصية. + +```bash +>>> huggingface-cli upload Wauplin/my-cool-dataset ./data . --repo-type dataset --quiet +https://huggingface.co/datasets/Wauplin/my-cool-dataset/tree/main +``` + +## استمتع! + +تهانينا، لقد تم الآن تحميل مجموعة البيانات الخاصة بك إلى Hugging Face Hub حيث يمكن لأي شخص تحميلها في سطر واحد من التعليمات البرمجية! 🥳 + +``` +dataset = load_dataset("Wauplin/my-cool-dataset") +``` + +إذا كانت مجموعة البيانات الخاصة بك مدعومة، فيجب أن يكون لديها أيضًا [عارض مجموعة البيانات](../hub/datasets-viewer) للجميع لاستكشاف محتوى مجموعة البيانات. + +أخيرًا، لا تنس إثراء بطاقة مجموعة البيانات لتوثيق مجموعة البيانات الخاصة بك وجعلها قابلة للاكتشاف! تحقق من دليل [إنشاء بطاقة مجموعة بيانات](dataset_card) لمعرفة المزيد. \ No newline at end of file diff --git a/docs/source/ar/stream.mdx b/docs/source/ar/stream.mdx new file mode 100644 index 00000000000..300045bf001 --- /dev/null +++ b/docs/source/ar/stream.mdx @@ -0,0 +1,398 @@ +# البث المباشر + +يتيح لك بث مجموعة البيانات العمل مع مجموعة بيانات دون تنزيلها. يتم بث البيانات أثناء تنقلك عبر مجموعة البيانات. وهذا مفيد بشكل خاص عندما: + +- لا تريد الانتظار حتى يتم تنزيل مجموعة بيانات كبيرة للغاية. +- يتجاوز حجم مجموعة البيانات مساحة القرص المتوفرة على جهاز الكمبيوتر الخاص بك. +- تريد استكشاف عدد قليل فقط من عينات مجموعة البيانات بسرعة. + +![صورة متحركة توضح بث مجموعة البيانات](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/datasets/streaming.gif) + +على سبيل المثال، يبلغ حجم قسم اللغة الإنجليزية من مجموعة بيانات [oscar-corpus/OSCAR-2201](https://huggingface.co/datasets/oscar-corpus/OSCAR-2201) 1.2 تيرابايت، ولكن يمكنك استخدامها على الفور باستخدام البث. قم ببث مجموعة بيانات عن طريق تعيين `streaming=True` في [`load_dataset`] كما هو موضح أدناه: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('oscar-corpus/OSCAR-2201', 'en', split='train', streaming=True) +>>> print(next(iter(dataset))) +{'id': 0, 'text': 'تأسست Golden Bees في عام 2015، وهي منصة توظيف برمجية مخصصة لأصحاب العمل ووكالات التوظيف ومجالس العمل. وقد طورت الشركة تقنيات مخصصة للموارد البشرية وخوارزميات تنبؤية فريدة لتحديد أفضل المرشحين لفرصة عمل وجذبهم.'، ... +``` + +كما يسمح بث مجموعة البيانات بالعمل مع مجموعة بيانات مصنوعة من ملفات محلية دون إجراء أي تحويل. في هذه الحالة، يتم بث البيانات من الملفات المحلية أثناء تنقلك عبر مجموعة البيانات. وهذا مفيد بشكل خاص عندما: + +- لا تريد الانتظار حتى يتم تحويل مجموعة بيانات محلية كبيرة جدًا إلى Arrow. +- سيتجاوز حجم الملفات المحولة مساحة القرص المتوفرة على جهاز الكمبيوتر الخاص بك. +- تريد استكشاف عدد قليل فقط من عينات مجموعة البيانات بسرعة. + +على سبيل المثال، يمكنك بث مجموعة بيانات محلية مكونة من مئات ملفات JSONL المضغوطة مثل [oscar-corpus/OSCAR-2201](https://huggingface.co/datasets/oscar-corpus/OSCAR-2201) لاستخدامها على الفور: + +```py +>>> from datasets import load_dataset +>>> data_files = {'train': 'path/to/OSCAR-2201/compressed/en_meta/*.jsonl.gz'} +>>> dataset = load_dataset('json', data_files=data_files, split='train', streaming=True) +>>> print(next(iter(dataset))) +{'id': 0, 'text': 'تأسست Golden Bees في عام 2015، وهي منصة توظيف برمجية مخصصة لأصحاب العمل ووكالات التوظيف ومجالس العمل. وقد طورت الشركة تقنيات مخصصة للموارد البشرية وخوارزميات تنبؤية فريدة لتحديد أفضل المرشحين لفرصة عمل وجذبهم.'، ... +``` + +يؤدي تحميل مجموعة بيانات في وضع البث إلى إنشاء مثيل نوع مجموعة بيانات جديدة (بدلاً من كائن [`Dataset`] الكلاسيكي)، المعروف باسم [`IterableDataset`]. يحتوي هذا النوع الخاص من مجموعة البيانات على مجموعة خاصة به من طرق المعالجة الموضحة أدناه. + +> ملاحظة: تعد [`IterableDataset`] مفيدة للوظائف المتكررة مثل تدريب نموذج. لا يجب استخدام [`IterableDataset`] للوظائف التي تتطلب الوصول العشوائي إلى الأمثلة لأنك مضطر للتنقل في جميع أنحاء باستخدام حلقة for. سيتطلب الحصول على المثال الأخير في مجموعة بيانات قابلة للتنقل منك التنقل عبر جميع الأمثلة السابقة. يمكنك العثور على مزيد من التفاصيل في دليل [Dataset vs. IterableDataset](./about_mapstyle_vs_iterable). + +## التحويل من مجموعة بيانات + +إذا كان لديك كائن [`Dataset`] موجود، فيمكنك تحويله إلى [`IterableDataset`] باستخدام دالة [`~Dataset.to_iterable_dataset`]. في الواقع، هذا أسرع من تعيين وسيط `streaming=True` في [`load_dataset`] لأن البيانات يتم بثها من ملفات محلية. + +```py +>>> from datasets import load_dataset + +# أسرع 🐇 +>>> dataset = load_dataset("food101") +>>> iterable_dataset = dataset.to_iterable_dataset() + +# أبطأ 🐢 +>>> iterable_dataset = load_dataset("food101", streaming=True) +``` + +تدعم دالة [`~Dataset.to_iterable_dataset`] التجزئة عندما يتم إنشاء مثيل [`IterableDataset`]. هذا مفيد عند العمل مع مجموعات بيانات كبيرة، وترغب في خلط مجموعة البيانات أو تمكين التحميل الموازي السريع باستخدام PyTorch DataLoader. + +```py +>>> import torch +>>> from datasets import load_dataset + +>>> dataset = load_dataset("food101") +>>> iterable_dataset = dataset.to_iterable_dataset(num_shards=64) # تجزئة مجموعة البيانات +>>> iterable_dataset = iterable_dataset.shuffle(buffer_size=10_000) # خلط ترتيب التجزئة واستخدام مخزن مؤقت للخلط عند بدء التنقل +dataloader = torch.utils.data.DataLoader(iterable_dataset، num_workers=4) # تعيين 64 / 4 = 16 شظية من قائمة التجزئة المخلوطة لكل عامل عند بدء التنقل +``` + +## خلط + +مثل كائن [`Dataset`] العادي، يمكنك أيضًا خلط [`IterableDataset`] باستخدام [`IterableDataset.shuffle`]. + +يتحكم وسيط `buffer_size` في حجم المخزن المؤقت لاختيار أمثلة عشوائية منه. لنفترض أن لديك مجموعة بيانات تحتوي على مليون مثال، وتحدد حجم المخزن المؤقت إلى عشرة آلاف. سيختار [`IterableDataset.shuffle`] عشوائيًا أمثلة من أول عشرة آلاف مثال في المخزن المؤقت. يتم استبدال الأمثلة المحددة في المخزن المؤقت بأمثلة جديدة. يكون حجم المخزن المؤقت الافتراضي 1000. + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('oscar', "unshuffled_deduplicated_en"، split='train'، streaming=True) +>>> shuffled_dataset = dataset.shuffle(seed=42، buffer_size=10_000) +``` + +> تلميح: سيقوم [`IterableDataset.shuffle`] أيضًا بخلط ترتيب التجزئة إذا تم تقسيم مجموعة البيانات إلى ملفات متعددة. + +## إعادة الخلط + +في بعض الأحيان، قد ترغب في إعادة خلط مجموعة البيانات بعد كل فترة. سيتطلب ذلك منك تعيين بذرة مختلفة لكل فترة. استخدم [`IterableDataset.set_epoch`] بين الفترات لإخبار مجموعة البيانات بالفترة التي أنت فيها. + +تصبح البذرة الخاصة بك بشكل فعال: `البذرة الأولية + الفترة الحالية`. + +```py +>>> for epoch in range(epochs): +... shuffled_dataset.set_epoch(epoch) +... for example in shuffled_dataset: +... ... +``` + +## تقسيم مجموعة البيانات + +يمكنك تقسيم مجموعة البيانات الخاصة بك بطريقتين: + +- [`IterableDataset.take`] يعيد أول `n` أمثلة في مجموعة بيانات: + +```py +>>> dataset = load_dataset('oscar', "unshuffled_deduplicated_en"، split='train'، streaming=True) +>>> dataset_head = dataset.take(2) +>>> list(dataset_head) +[{'id': 0، 'text': 'قرية متنديري مستوحاة من الرؤية ...'}, {'id': 1، 'text': 'لا تستطيع ليلي جيمس محاربة الموسيقى ...'}] +``` + +- [`IterableDataset.skip`] يتجاهل أول `n` أمثلة في مجموعة بيانات ويعيد الأمثلة المتبقية: + +```py +>>> train_dataset = shuffled_dataset.skip(1000) +``` + +> تحذير: تمنع `take` و`skip` الاستدعاءات المستقبلية لـ `shuffle` لأنها تقفل ترتيب التجزئة. يجب عليك `خلط` مجموعة البيانات الخاصة بك قبل تقسيمها. + + + +## التداخل + +يمكن أن [`interleave_datasets`] الجمع بين [`IterableDataset`] مع مجموعات البيانات الأخرى. تجمع مجموعة البيانات المشتركة أمثلة متناوبة من كل من مجموعات البيانات الأصلية. + +```py +>>> from datasets import interleave_datasets +>>> en_dataset = load_dataset('oscar', "unshuffled_deduplicated_en"، split='train'، streaming=True، trust_remote_code=True) +>>> fr_dataset = load_dataset('oscar', "unshuffled_deduplicated_fr"، split='train'، streaming=True، trust_remote_code=True) + +>>> multilingual_dataset = interleave_datasets([en_dataset، fr_dataset]) +>>> list(multilingual_dataset.take(2)) +[{'text': 'قرية متنديري مستوحاة من الرؤية ...'}, {'text': "ميديا للنقاش الأفكار والثقافة والأدب ..."}] +``` + +حدد احتمالات أخذ العينات من كل من مجموعات البيانات الأصلية لمزيد من التحكم في كيفية أخذ العينات من كل منها ودمجها. قم بتعيين وسيط `probabilities` مع احتمالات أخذ العينات المرغوبة: + +```py +>>> multilingual_dataset_with_oversampling = interleave_datasets([en_dataset، fr_dataset]، probabilities=[0.8، 0.2]، seed=42) +>>> list(multilingual_dataset_with_oversampling.take(2)) +[{'text': 'قرية متنديري مستوحاة من الرؤية ...'}, {'text': 'لا تستطيع ليلي جيمس محاربة الموسيقى ...'}] +``` + +حوالي 80% من مجموعة البيانات النهائية مصنوعة من `en_dataset`، و20% من `fr_dataset`. + +يمكنك أيضًا تحديد `stopping_strategy`. الاستراتيجية الافتراضية، `first_exhausted`، هي استراتيجية الاستخلاص الفرعي، أي يتم إيقاف بناء مجموعة البيانات بمجرد نفاد عينات إحدى مجموعات البيانات. + +يمكنك تحديد `stopping_strategy=all_exhausted` لتنفيذ استراتيجية الإفراط في أخذ العينات. في هذه الحالة، يتوقف بناء مجموعة البيانات بمجرد إضافة كل عينة في كل مجموعة بيانات مرة واحدة على الأقل. في الممارسة العملية، هذا يعني أنه إذا نفدت مجموعة البيانات، فستعود إلى بداية مجموعة البيانات هذه حتى يتم الوصول إلى معيار التوقف. + +لاحظ أنه إذا لم يتم تحديد احتمالات أخذ العينات، فستحتوي مجموعة البيانات الجديدة على `max_length_datasets*nb_dataset samples`. + +## إعادة التسمية والإزالة والصب + +تسمح الطرق التالية بتعديل أعمدة مجموعة البيانات. هذه الطرق مفيدة لإعادة تسمية الأعمدة أو إزالتها أو تغييرها إلى مجموعة جديدة من الميزات. + +### إعادة التسمية + +استخدم [`IterableDataset.rename_column`] عند الحاجة إلى إعادة تسمية عمود في مجموعة البيانات الخاصة بك. يتم نقل الميزات المرتبطة بالعمود الأصلي فعليًا تحت اسم العمود الجديد، بدلاً من مجرد استبدال العمود الأصلي في مكانه. + +قم بتزويد [`IterableDataset.rename_column`] باسم العمود الأصلي، واسم العمود الجديد: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('mc4', 'en'، streaming=True، split='train'، trust_remote_code=True) +>>> dataset = dataset.rename_column("text"، "content") +``` + +### إزالة + +عندما تحتاج إلى إزالة عمود واحد أو أكثر، قم بتزويد [`IterableDataset.remove_columns`] باسم العمود الذي سيتم إزالته. قم بإزالة أكثر من عمود واحد عن طريق توفير قائمة بأسماء الأعمدة: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('mc4', 'en'، streaming=True، split='train'، trust_remote_code=True) +>>> dataset = dataset.remove_columns('timestamp') +``` + +### Cast + +[`IterableDataset.cast`] يغير نوع الميزة لواحد أو أكثر من الأعمدة. تأخذ هذه الطريقة `Features` الجديد الخاص بك كوسيط لها. يوضح مثال التعليمات البرمجية التالي كيفية تغيير أنواع الميزات لـ `ClassLabel` و`Value`: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('glue', 'mrpc'، split='train'، streaming=True) +>>> dataset.features +{'sentence1': Value(dtype='string'، id=None)، +'sentence2': Value(dtype='string'، id=None)، +'label': ClassLabel(num_classes=2، names=['not_equivalent'، 'equivalent']، names_file=None، id=None)، +'idx': Value(dtype='int32'، id=None)} + +>>> from datasets import ClassLabel، Value +>>> new_features = dataset.features.copy() +>>> new_features["label"] = ClassLabel(names=['negative'، 'positive']) +>>> new_features["idx"] = Value('int64') +>>> dataset = dataset.cast(new_features) +>>> dataset.features +{'sentence1': Value(dtype='string'، id=None)، +'sentence2': Value(dtype='string'، id=None)، +'label': ClassLabel(num_classes=2، names=['negative'، 'positive']، names_file=None، id=None)، +'idx': Value(dtype='int64'، id=None)} +``` + +> تلميح: يعمل الصب فقط إذا كان نوع الميزة الأصلي ونوع الميزة الجديد متوافقين. على سبيل المثال، يمكنك صب عمود بسمات `Value('int32')` إلى `Value('bool')` إذا كان العمود الأصلي يحتوي فقط على أحاد وصفار. + +استخدم [`IterableDataset.cast_column`] لتغيير نوع الميزة لعمود واحد فقط. مرر اسم العمود ونوع الميزة الجديد الخاص به كوسيطات: + +```py +>>> dataset.features +{'audio': Audio(sampling_rate=44100، mono=True، id=None)} + +>>> dataset = dataset.cast_column("audio"، Audio(sampling_rate=16000)) +>>> dataset.features +{'audio': Audio(sampling_rate=16000، mono=True، id=None)} +``` +## Map + +على غرار وظيفة [`Dataset.map`] لمجموعة بيانات عادية [`Dataset`]، توفر مكتبة 🤗 Datasets وظيفة [`IterableDataset.map`] لمعالجة [`IterableDataset`]. + +تطبق [`IterableDataset.map`] المعالجة أثناء التنقل عندما يتم بث الأمثلة. + +تتيح لك تطبيق دالة معالجة على كل مثال في مجموعة البيانات، بشكل مستقل أو في مجموعات. يمكن لهذه الدالة حتى إنشاء صفوف وأعمدة جديدة. + +يوضح المثال التالي كيفية توكينزات مجموعة بيانات [`IterableDataset`]. يجب أن تقبل الدالة إخراج "dict": + +```py +>>> def add_prefix(example): +... example['text'] = 'My text: ' + example['text'] +... return example +``` + +بعد ذلك، قم بتطبيق هذه الدالة على مجموعة البيانات باستخدام [`IterableDataset.map`]: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('oscar', 'unshuffled_deduplicated_en', streaming=True, split='train', trust_remote_code=True) +>>> updated_dataset = dataset.map(add_prefix) +>>> list(updated_dataset.take(3)) +[{'id': 0, 'text': 'My text: Mtendere Village was inspired by...'}, +{'id': 1, 'text': 'My text: Lily James cannot fight the music...'}, +{'id': 2, 'text': 'My text: "I\'d love to help kickstart...'}] +``` + +دعونا نلقي نظرة على مثال آخر، ولكن هذه المرة، سوف تقوم بإزالة عمود باستخدام [`IterableDataset.map`]. عند إزالة عمود، تتم إزالته فقط بعد توفير المثال للدالة المحددة. يسمح هذا للدالة المحددة باستخدام محتوى الأعمدة قبل إزالتها. + +حدد العمود الذي تريد إزالته باستخدام وسيط `remove_columns` في [`IterableDataset.map`]: + +```py +>>> updated_dataset = dataset.map(add_prefix, remove_columns=["id"]) +>>> list(updated_dataset.take(3)) +[{'text': 'My text: Mtendere Village was inspired by...'}, +{'text': 'My text: Lily James cannot fight the music...'}, +{'text': 'My text: "I\'d love to help kickstart...'}] +``` + +### معالجة الدفعات + +يدعم [`IterableDataset.map`] أيضًا العمل مع دفعات من الأمثلة. للعمل على الدفعات، قم بتعيين `batched=True`. حجم الدفعة الافتراضي هو 1000، ولكن يمكنك ضبطه باستخدام وسيط `batch_size`. يفتح هذا الباب أمام العديد من التطبيقات المثيرة للاهتمام مثل التوكينزات، وتقسيم الجمل الطويلة إلى قطع أقصر، وتعزيز البيانات. + +#### التوكينزات + +```py +>>> from datasets import load_dataset +>>> from transformers import AutoTokenizer +>>> dataset = load_dataset("mc4", "en", streaming=True, split="train", trust_remote_code=True) +>>> tokenizer = AutoTokenizer.from_pretrained('distilbert-base-uncased') +>>> def encode(examples): +... return tokenizer(examples['text'], truncation=True, padding='max_length') +>>> dataset = dataset.map(encode, batched=True, remove_columns=["text", "timestamp", "url"]) +>>> next(iter(dataset)) +{'input_ids': [101, 8466, 1018, 1010, 4029, 2475, 2062, 18558, 3100, 2061, ...,1106, 3739, 102], +'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ..., 1, 1]} +``` + + + +راجع أمثلة أخرى على معالجة الدفعات في وثائق [معالجة الخرائط ذات الدفعات](./process#batch-processing). تعمل بنفس الطريقة لمجموعات البيانات القابلة للبث. + + + +### مرشح + +يمكنك تصفية الصفوف في مجموعة البيانات بناءً على دالة شرطية باستخدام [`Dataset.filter`]. فهو يعيد الصفوف التي تتطابق مع شرط محدد: + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset('oscar', 'unshuffled_deduplicated_en', streaming=True, split='train', trust_remote_code=True) +>>> start_with_ar = dataset.filter(lambda example: example['text'].startswith('Ar')) +>>> next(iter(start_with_ar)) +{'id': 4, 'text': 'Are you looking for Number the Stars (Essential Modern Classics)?...'} +``` + +يمكن أيضًا لـ [`Dataset.filter`] التصفية حسب الفهارس إذا قمت بتعيين `with_indices=True`: + +```py +>>> even_dataset = dataset.filter(lambda example, idx: idx % 2 == 0, with_indices=True) +>>> list(even_dataset.take(3)) +[{'id': 0, 'text': 'Mtendere Village was inspired by the vision of Chief Napoleon Dzombe, ...'}, +{'id': 2, 'text': '"I\'d love to help kickstart continued development! And 0 EUR/month...'}, +{'id': 4, 'text': 'Are you looking for Number the Stars (Essential Modern Classics)? Normally, ...'}] +``` + +## البث في حلقة تدريب + +يمكن دمج [`IterableDataset`] في حلقة تدريب. أولاً، قم بخلط مجموعة البيانات: + + + +```py +>>> seed, buffer_size = 42, 10_000 +>>> dataset = dataset.shuffle(seed, buffer_size=buffer_size) +``` + +أخيرًا، قم بإنشاء حلقة تدريب بسيطة وابدأ التدريب: + +```py +>>> import torch +>>> from torch.utils.data import DataLoader +>>> from transformers import AutoModelForMaskedLM, DataCollatorForLanguageModeling +>>> from tqdm import tqdm +>>> dataset = dataset.with_format("torch") +>>> dataloader = DataLoader(dataset, collate_fn=DataCollatorForLanguageModeling(tokenizer)) +>>> device = 'cuda' if torch.cuda.is_available() else 'cpu' +>>> model = AutoModelForMaskedLM.from_pretrained("distilbert-base-uncased") +>>> model.train().to(device) +>>> optimizer = torch.optim.AdamW(params=model.parameters(), lr=1e-5) +>>> for epoch in range(3): +... dataset.set_epoch(epoch) +... for i, batch in enumerate(tqdm(dataloader, total=5)): +... if i == 5: +... break +... batch = {k: v.to(device) for k, v in batch.items()} +... outputs = model(**batch) +... loss = outputs[0] +... loss.backward() +... optimizer.step() +... optimizer.zero_grad() +... if i % 10 == 0: +... print(f"loss: {loss}") +``` + + + + + + +### حفظ نقطة تفتيش لمجموعة البيانات واستئناف التكرار + +إذا توقفت حلقة التدريب الخاصة بك، فقد ترغب في استئناف التدريب من حيث توقفت. للقيام بذلك، يمكنك حفظ نقطة تفتيش لنموذجك ومؤشرات الترابط، بالإضافة إلى برنامج تحميل البيانات الخاص بك. + +لا توفر مجموعات البيانات القابلة للبث إمكانية الوصول العشوائي إلى فهرس مثال محدد لاستئناف العمل منه، ولكن يمكنك استخدام [`IterableDataset.state_dict`] و [`IterableDataset.load_state_dict`] لاستئناف العمل من نقطة تفتيش بدلاً من ذلك، على غرار ما يمكنك القيام به للنماذج ومؤشرات الترابط: + +```python +>>> iterable_dataset = Dataset.from_dict({"a": range(6)}).to_iterable_dataset(num_shards=3) +>>> for idx, example in enumerate(iterable_dataset): +... print(example) +... if idx == 2: +... state_dict = iterable_dataset.state_dict() +... print("checkpoint") +... break +>>> iterable_dataset.load_state_dict(state_dict) +>>> print(f"restart from checkpoint") +>>> for example in iterable_dataset: +... print(example) +``` + +الإرجاع: + +``` +{'a': 0} +{'a': 1} +{'a': 2} +checkpoint +restart from checkpoint +{'a': 3} +{'a': 4} +{'a': 5} +``` + +تحت الغطاء، تحتفظ مجموعة البيانات القابلة للبث بتتبع الشريحة الحالية التي تتم قراءتها وفهرس المثال في الشريحة الحالية، وتخزن هذه المعلومات في `state_dict`. + +للاستئناف من نقطة تفتيش، تقوم مجموعة البيانات بتخطي جميع الشرائح التي تم قراءتها سابقًا لاستئناف العمل من الشريحة الحالية. + +ثم تقرأ الشريحة وتتخطى الأمثلة حتى تصل إلى المثال المحدد من نقطة التفتيش. + +لذلك، فإن إعادة تشغيل مجموعة بيانات أمر سريع للغاية، حيث لن تقوم بإعادة قراءة الشرائح التي تمت قراءتها بالفعل. ومع ذلك، فإن استئناف مجموعة بيانات ليس فوريًا بشكل عام لأنه يجب أن يبدأ القراءة من بداية الشريحة الحالية ويتخطى الأمثلة حتى يصل إلى موقع نقطة التفتيش. + +يمكن استخدام هذا مع `StatefulDataLoader` من `torchdata`: + +```python +>>> from torchdata.stateful_dataloader import StatefulDataLoader +>>> iterable_dataset = load_dataset("deepmind/code_contests", streaming=True, split="train") +>>> dataloader = StatefulDataLoader(iterable_dataset, batch_size=32, num_workers=4) +>>> # checkpoint +>>> state_dict = dataloader.state_dict() # uses iterable_dataset.state_dict() under the hood +>>> # resume from checkpoint +>>> dataloader.load_state_dict(state_dict) # uses iterable_dataset.load_state_dict() under the hood +``` + + + +تستأنف نقطة التفتيش من المكان الذي تم حفظها فيه تمامًا ما لم يتم استخدام `.shuffle()`: يتم فقدان الأمثلة من مخازن التخزين المؤقت للخلط عند الاستئناف ويتم إعادة ملء المخازن المؤقتة بالبيانات الجديدة. + + \ No newline at end of file diff --git a/docs/source/ar/tabular_load.mdx b/docs/source/ar/tabular_load.mdx new file mode 100644 index 00000000000..1192e5c23b2 --- /dev/null +++ b/docs/source/ar/tabular_load.mdx @@ -0,0 +1,139 @@ +# تحميل البيانات الجدولية + +إن مجموعة البيانات الجدولية هي مجموعة بيانات عامة تستخدم لوصف أي بيانات مخزنة في صفوف وأعمدة، حيث تمثل الصفوف مثالاً وتمثل الأعمدة خاصية (يمكن أن تكون مستمرة أو تصنيفية). وعادة ما يتم تخزين هذه المجموعات من البيانات في ملفات CSV، أو أطر بيانات Pandas، أو في جداول قواعد البيانات. وسيوضح هذا الدليل لك كيفية تحميل وإنشاء مجموعة بيانات جدولية من: + +- CSV files +- Pandas DataFrames +- Databases + +## ملفات CSV + +يمكن لمكتبة 🤗 Datasets قراءة ملفات CSV عن طريق تحديد اسم منشئ مجموعة البيانات العامة "csv" في طريقة التحميل `~datasets.load_dataset`. ولتحميل أكثر من ملف CSV، قم بتمريرها كقائمة إلى وسيط "data_files": + +```py +>>> from datasets import load_dataset +>>> dataset = load_dataset("csv", data_files="my_file.csv") + +# تحميل عدة ملفات CSV +>>> dataset = load_dataset("csv", data_files=["my_file_1.csv", "my_file_2.csv", "my_file_3.csv"]) +``` + +يمكنك أيضًا تعيين ملفات CSV محددة للمجموعات التدريبية والاختبارية: + +```py +>>> dataset = load_dataset("csv", data_files={"train": ["my_train_file_1.csv", "my_train_file_2.csv"], "test": "my_test_file.csv"}) +``` + +لتحميل ملفات CSV عن بعد، قم بتمرير عناوين URL بدلاً من ذلك: + +```py +>>> base_url = "https://huggingface.co/datasets/lhoestq/demo1/resolve/main/data/" +>>> dataset = load_dataset('csv', data_files={"train": base_url + "train.csv", "test": base_url + "test.csv"}) +``` + +لتحميل ملفات CSV مضغوطة: + +```py +>>> url = "https://domain.org/train_data.zip" +>>> data_files = {"train": url} +>>> dataset = load_dataset("csv", data_files=data_files) +``` + +## أطر بيانات Pandas + +تدعم مكتبة 🤗 Datasets أيضًا تحميل مجموعات البيانات من [أطر بيانات Pandas](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html) باستخدام طريقة `~datasets.Dataset.from_pandas`: + +```py +>>> from datasets import Dataset +>>> import pandas as pd + +# إنشاء إطار بيانات Pandas +>>> df = pd.read_csv("https://huggingface.co/datasets/imodels/credit-card/raw/main/train.csv") +>>> df = pd.DataFrame(df) +# تحميل مجموعة بيانات من إطار بيانات Pandas +>>> dataset = Dataset.from_pandas(df) +``` + +استخدم وسيط "splits" لتحديد اسم مجموعة البيانات المنقسمة: + +```py +>>> train_ds = Dataset.from_pandas(train_df, split="train") +>>> test_ds = Dataset.from_pandas(test_df, split="test") +``` + +إذا لم تبدو مجموعة البيانات كما هو متوقع، فيجب عليك تحديد ميزات مجموعة البيانات الخاصة بك بشكل صريح. وقد لا يحمل [pandas.Series](https://pandas.pydata.org/docs/reference/api/pandas.Series.html) دائمًا معلومات كافية ليقوم Arrow باستنتاج نوع البيانات تلقائيًا. على سبيل المثال، إذا كان إطار البيانات بطول `0` أو إذا كان السلسلة تحتوي فقط على كائنات `None/NaN`، فسيتم تعيين النوع إلى `null`. + +## قواعد البيانات + +تُخزن مجموعات البيانات في قواعد البيانات عادةً باستخدام استعلامات SQL. باستخدام مكتبة 🤗 Datasets، يمكنك الاتصال بقاعدة بيانات، والبحث عن البيانات التي تحتاجها، وإنشاء مجموعة بيانات منها. بعد ذلك، يمكنك استخدام ميزات المعالجة في مكتبة 🤗 Datasets لإعداد مجموعة البيانات للتدريب. + +### SQLite + +SQLite هي قاعدة بيانات صغيرة وخفيفة الوزن وسريعة وسهلة الإعداد. يمكنك استخدام قاعدة بيانات موجودة إذا أردت، أو اتباع الإرشادات والبدء من الصفر. + +ابدأ بإنشاء قاعدة بيانات SQLite سريعة باستخدام [بيانات Covid-19](https://github.com/nytimes/covid-19-data/blob/master/us-states.csv) من صحيفة نيويورك تايمز: + +```py +>>> import sqlite3 +>>> import pandas as pd + +>>> conn = sqlite3.connect("us_covid_data.db") +>>> df = pd.read_csv("https://raw.githubusercontent.com/nytimes/covid-19-data/master/us-states.csv") +>>> df.to_sql("states", conn, if_exists="replace") +``` + +هذا ينشئ جدول "states" في قاعدة البيانات "us_covid_data.db" التي يمكنك الآن تحميلها في مجموعة بيانات. + +للاتصال بقاعدة البيانات، ستحتاج إلى [سلسلة URI](https://docs.sqlalchemy.org/en/13/core/engines.html#database-urls) التي تحدد قاعدة البيانات الخاصة بك. ويؤدي الاتصال بقاعدة بيانات باستخدام URI إلى تخزين مجموعة البيانات التي تم إرجاعها مؤقتًا. ويختلف سلسلة URI لكل لهجة قاعدة بيانات، لذا تأكد من التحقق من [عناوين URL لقاعدة البيانات](https://docs.sqlalchemy.org/en/13/core/engines.html#database-urls) لأي قاعدة بيانات تستخدمها. + +بالنسبة لـ SQLite، يكون كما يلي: + +```py +>>> uri = "sqlite:///us_covid_data.db" +``` + +قم بتحميل الجدول عن طريق تمرير اسم الجدول وURI إلى طريقة `~datasets.Dataset.from_sql`: + +```py +>>> from datasets import Dataset + +>>> ds = Dataset.from_sql("states", uri) +>>> ds +Dataset({ +features: ['index', 'date', 'state', 'fips', 'cases', 'deaths'], +num_rows: 54382 +}) +``` + +بعد ذلك، يمكنك استخدام جميع ميزات المعالجة في مكتبة 🤗 Datasets مثل طريقة `~datasets.Dataset.filter` على سبيل المثال: + +```py +>>> ds.filter(lambda x: x["state"] == "California") +``` + +يمكنك أيضًا تحميل مجموعة بيانات من استعلام SQL بدلاً من جدول كامل، وهو أمر مفيد للاستعلام والانضمام إلى جداول متعددة. + +قم بتحميل مجموعة البيانات عن طريق تمرير استعلامك وURI إلى طريقة `~datasets.Dataset.from_sql`: + +```py +>>> from datasets import Dataset + +>>> ds = Dataset.from_sql('SELECT * FROM states WHERE state="California";', uri) +>>> ds +Dataset({ +features: ['index', 'date', 'state', 'fips', 'cases', 'deaths'], +num_rows: 1019 +}) +``` + +بعد ذلك، يمكنك استخدام جميع ميزات المعالجة في مكتبة 🤗 Datasets مثل طريقة `~datasets.Dataset.filter` على سبيل المثال: + +```py +>>> ds.filter(lambda x: x["cases"] > 10000) +``` + +### PostgreSQL + +يمكنك أيضًا الاتصال بقاعدة بيانات PostgreSQL وتحميل مجموعة بيانات منها، ولكننا لن نوضح ذلك مباشرة في الوثائق لأن المثال مخصص للتشغيل في دفتر ملاحظات فقط. بدلاً من ذلك، اطلع على كيفية تثبيت وإعداد خادم PostgreSQL في هذا [دفتر الملاحظات](https://colab.research.google.com/github/nateraw/huggingface-hub-examples/blob/main/sql_with_huggingface_datasets.ipynb#scrollTo=d83yGQMPHGFi)! + +بعد إعداد قاعدة بيانات PostgreSQL الخاصة بك، يمكنك استخدام طريقة `~datasets.Dataset.from_sql` لتحميل مجموعة بيانات من جدول أو استعلام. \ No newline at end of file diff --git a/docs/source/ar/troubleshoot.mdx b/docs/source/ar/troubleshoot.mdx new file mode 100644 index 00000000000..c0ac93f2812 --- /dev/null +++ b/docs/source/ar/troubleshoot.mdx @@ -0,0 +1,108 @@ +# استكشاف الأخطاء وإصلاحها + +يهدف هذا الدليل إلى تزويدك بالأدوات والمعرفة اللازمة للتعامل مع بعض المشكلات الشائعة. إذا لم تغطِ الاقتراحات المدرجة في هذا الدليل حالتك، يرجى الرجوع إلى قسم [طلب المساعدة](#طلب-المساعدة) لمعرفة مكان العثور على المساعدة فيما يتعلق بمشكلتك المحددة. + +## المشكلات عند تحميل مجموعات البيانات باستخدام `push_to_hub` + +### مشكلات المصادقة + +إذا كنت تواجه مشكلات في المصادقة عند مشاركة مجموعة بيانات على 🤗 Hub باستخدام [`Dataset.push_to_hub`] ورمز وصول Hugging Face: + +* تأكد من أن رمز Hugging Face الذي تستخدمه للتحقق من هويتك هو رمز لديه إذن **الكتابة**. +* على نظام التشغيل OSX، قد يكون من المفيد مسح جميع كلمات مرور huggingface.co في "Access Keychain" الخاص بك، وكذلك إعادة تكوين `git config --global credential.helper osxkeychain`، قبل استخدام `huggingface-cli login`. + +بدلاً من ذلك، يمكنك استخدام مفاتيح SSH للمصادقة - اقرأ المزيد في [توثيق 🤗 Hub](https://huggingface.co/docs/hub/security-git-ssh). + +### فقدان الاتصال عند تحميل مجموعة بيانات كبيرة + +عند تحميل مجموعات بيانات كبيرة إلى Hub، إذا كان عدد شظايا مجموعة البيانات كبيرًا، فقد يؤدي ذلك إلى إنشاء العديد من الالتزامات في Hub خلال فترة قصيرة. سيؤدي هذا إلى خطأ في الاتصال. + +قد يكون خطأ الاتصال ناتجًا أيضًا عن خطأ HTTP 500 يرسله دلو AWS S3 الذي يستخدمه Hub داخليًا. + +في أي من الحالتين، يمكنك إعادة تشغيل [`Dataset.push_to_hub`] لمتابعة تحميل مجموعة البيانات. سيتحقق Hub من SHAs للشظايا التي تم تحميلها بالفعل لتجنب إعادة تحميلها. + +نحن نعمل على جعل عملية التحميل أكثر مقاومة للأخطاء العابرة، لذلك فإن التحديث إلى أحدث إصدار من المكتبة فكرة جيدة دائمًا. + +### `Too Many Requests` + +قد يؤدي تحميل مجموعات بيانات كبيرة عبر `push_to_hub()` إلى حدوث خطأ: + +```bash +HfHubHTTPError: 429 Client Error: Too Many Requests for url: ... +You have exceeded our hourly quotas for action: commit. We invite you to retry later. +``` + +إذا واجهت هذه المشكلة، فأنت بحاجة إلى ترقية مكتبة `datasets` إلى أحدث إصدار (أو على الأقل `2.15.0`). + +## المشكلات عند إنشاء مجموعات بيانات من بيانات مخصصة + +### تحميل الصور والملفات الصوتية من مجلد + +عند إنشاء مجموعة بيانات من مجلد، تتمثل إحدى المشكلات الأكثر شيوعًا في أن هيكل المجلد لا يتبع التنسيق المتوقع، أو أن هناك مشكلة في ملف البيانات الوصفية. + +تعرف على المزيد حول هيكل المجلد المطلوب في صفحات التوثيق المقابلة: + +* [AudioFolder](https://huggingface.co/docs/datasets/audio_dataset#audiofolder) +* [ImageFolder](https://huggingface.co/docs/datasets/image_dataset#imagefolder) + +### مشكلات التخليل + +#### مشكلات التخليل عند استخدام `Dataset.from_generator` + +عند إنشاء مجموعة بيانات، يتوقع [`IterableDataset.from_generator`] و [`Dataset.from_generator`] دالة مولد "قابلة للتخليل". هذا مطلوب لتجزئة الدالة باستخدام [`pickle`](https://docs.python.org/3/library/pickle.html) لتكون قادرًا على تخزين مجموعة البيانات على القرص. + +في حين أن دالات المولد قابلة للتخليل بشكل عام، لاحظ أن كائنات المولد ليست كذلك. لذلك، إذا كنت تستخدم كائن مولد، فستصادف خطأ `TypeError` مثل هذا: + +```bash +TypeError: cannot pickle 'generator' object +``` + +قد يحدث هذا الخطأ أيضًا عند استخدام دالة مولد تستخدم كائنًا عالميًا غير قابل للتخليل، مثل اتصال قاعدة بيانات، على سبيل المثال. إذا كان الأمر كذلك، فيمكنك تهيئة هذا الكائن مباشرة داخل دالة المولد لتجنب هذا الخطأ. + +#### مشكلات التخليل مع `Dataset.map` + +قد تحدث أخطاء التخليل أيضًا في [`Dataset.map`] متعدد العمليات - يتم تخليل الكائنات لتمريرها إلى العمليات الفرعية. إذا لم تكن الكائنات المستخدمة في التحويل قابلة للتخليل، فلا يمكن تخزين نتيجة `map`، مما يؤدي إلى حدوث خطأ. + +فيما يلي بعض الطرق لمعالجة هذه المشكلة: + +* الحل الشامل لمشكلات التخليل هو التأكد من أن الكائنات (أو فئات المولدات) قابلة للتخليل يدويًا عن طريق تنفيذ `__getstate__` / `__setstate__` / `__reduce__`. +* يمكنك أيضًا توفير قيمة تجزئة فريدة خاصة بك في `map` باستخدام وسيط `new_fingerprint`. +* يمكنك أيضًا تعطيل التخزين المؤقت عن طريق استدعاء `datasets.disable_caching()`، ومع ذلك، هذا غير مرغوب فيه - [اقرأ المزيد حول أهمية التخزين المؤقت](cache) + +## طلب المساعدة + +إذا لم تساعدك نصائح استكشاف الأخطاء وإصلاحها أعلاه في حل مشكلتك، فاطلب المساعدة من المجتمع والفريق. + +### المنتديات + +اطلب المساعدة في منتديات Hugging Face - اطرح سؤالك في فئة [🤗Datasets](https://discuss.huggingface.co/c/datasets/10) + +تأكد من كتابة مشاركة وصفية مع السياق ذي الصلة حول إعدادك ورموز قابلة للتكرار لزيادة احتمالية حل مشكلتك! + +### Discord + +اطرح سؤالاً على [Discord](http://hf.co/join/discord)، ودع الفريق والمجتمع يساعدانك. + +### مناقشات المجتمع على 🤗 Hub + +إذا كنت تواجه مشكلات في إنشاء مجموعة بيانات مخصصة باستخدام نص برمجي على Hub، فيمكنك طلب المساعدة من فريق Hugging Face عن طريق فتح مناقشة في علامة التبويب "Community" لمجموعة البيانات الخاصة بك بهذه الرسالة: + +```txt +# Dataset rewiew request for + +## Description + + + +## Files to review + +- file1 +- file2 +- ... + +cc @lhoestq @polinaeterna @mariosasko @albertvillanova +``` + +### قضايا GitHub + +أخيرًا، إذا كنت تشك في أنك وجدت خطأً يتعلق بالمكتبة نفسها، فقم بإنشاء مشكلة على مستودع 🤗 Datasets [GitHub](https://github.com/huggingface/datasets/issues). تضمين السياق فيما يتعلق بالخطأ: مقتطف من التعليمات البرمجية لإعادة الإنتاج، وتفاصيل حول بيئتك وبياناتك، وما إلى ذلك للمساعدة في معرفة ما هو الخطأ وكيف يمكننا إصلاحه. \ No newline at end of file diff --git a/docs/source/ar/tutorial.md b/docs/source/ar/tutorial.md new file mode 100644 index 00000000000..6480fee78c9 --- /dev/null +++ b/docs/source/ar/tutorial.md @@ -0,0 +1,15 @@ +# نظرة عامة + +مرحبا بك في دروس 🤗 Datasets! هذه الدروس سهلة المتابعة ستوجهك خلال أساسيات العمل مع 🤗 Datasets. سوف تقوم بتحميل وإعداد مجموعة بيانات للتدريب باستخدام إطار عمل التعلم الآلي الذي تختاره. وفي أثناء ذلك، ستتعلم كيفية تحميل تكوينات ومجموعات بيانات مختلفة، والتفاعل مع مجموعة البيانات الخاصة بك ومعرفة ما بداخلها، والمعالجة المسبقة، ومشاركة مجموعة البيانات على [Hub](https://huggingface.co/datasets). + +تفترض هذه الدروس بعض المعرفة الأساسية بلغة Python وإطار عمل للتعلم الآلي مثل PyTorch أو TensorFlow. إذا كنت معتادا بالفعل على هذه الأشياء، فلا تتردد في الاطلاع على [الدليل السريع](./quickstart) لمعرفة ما يمكنك القيام به باستخدام 🤗 Datasets. + + + +تغطي هذه الدروس فقط المهارات الأساسية التي تحتاجها لاستخدام 🤗 Datasets. هناك العديد من الوظائف والتطبيقات الأخرى المفيدة التي لا تناقش هنا. إذا كنت مهتما بمعرفة المزيد، قم بإلقاء نظرة على [الفصل الخامس](https://huggingface.co/course/chapter5/1?fw=pt) من دورة Hugging Face. + + + +إذا كان لديك أي أسئلة حول 🤗 Datasets، لا تتردد في الانضمام إلى مجتمعنا وطرح أسئلتك على [المنتدى](https://discuss.huggingface.co/c/datasets/10). + +لنبدأ! 🏁 \ No newline at end of file diff --git a/docs/source/ar/upload_dataset.mdx b/docs/source/ar/upload_dataset.mdx new file mode 100644 index 00000000000..5640431c1c9 --- /dev/null +++ b/docs/source/ar/upload_dataset.mdx @@ -0,0 +1,135 @@ +# مشاركة مجموعة بيانات على Hub + +[Hub](https://huggingface.co/datasets) هو موطن لمجموعة واسعة من مجموعات البيانات البحثية التي يديرها المجتمع والشعبية. نشجعك على مشاركة مجموعة البيانات الخاصة بك على Hub للمساعدة في نمو مجتمع ML وتسريع التقدم للجميع. جميع المساهمات موضع ترحيب؛ إن إضافة مجموعة بيانات ليست سوى عملية سحب وإفلات! + +ابدأ بـ [إنشاء حساب Hub Hugging Face](https://huggingface.co/join) إذا لم يكن لديك واحدًا بالفعل. + +## التحميل باستخدام واجهة مستخدم Hub + +تسمح واجهة المستخدم المستندة إلى الويب للمستخدمين الذين ليس لديهم أي خبرة في تطوير البرامج بتحميل مجموعة بيانات. + +### إنشاء مستودع + +يستضيف المستودع جميع ملفات مجموعة البيانات الخاصة بك، بما في ذلك تاريخ المراجعة، مما يجعل تخزين أكثر من إصدار واحد من مجموعة البيانات ممكنًا. + +1. انقر فوق ملفك الشخصي وحدد **مجموعة بيانات جديدة** لإنشاء مستودع مجموعة بيانات جديدة. + +2. اختر اسمًا لمجموعة البيانات الخاصة بك، وحدد ما إذا كانت عامة أو خاصة. مجموعة البيانات العامة مرئية لأي شخص، في حين أن مجموعة البيانات الخاصة لا يمكن عرضها إلا من قبلك أو أعضاء منظمتك. + +
+ +
+ +### تحميل مجموعة البيانات + +1. بمجرد إنشاء مستودع، انتقل إلى علامة التبويب **الملفات والإصدارات** لإضافة ملف. حدد **إضافة ملف** لتحميل ملفات مجموعة البيانات الخاصة بك. ندعم العديد من ملحقات البيانات النصية والصوتية والصور مثل `.csv` و `.mp3` و `.jpg` من بين العديد من الآخرين. بالنسبة لملحقات البيانات النصية مثل `.csv` و `.json` و `.jsonl` و `.txt`، نوصي بضغطها قبل تحميلها إلى Hub (إلى ملحق ملف `.zip` أو `.gz` على سبيل المثال). + +لا يتم تتبع ملحقات الملفات النصية افتراضيًا بواسطة Git LFS، وإذا كانت أكبر من 10 ميجابايت، فلن يتم الالتزام بها وتحميلها. الق نظرة على ملف `.gitattributes` في مستودعك للحصول على قائمة كاملة بملحقات الملفات التي يتم تتبعها. بالنسبة لهذا البرنامج التعليمي، يمكنك استخدام ملفات `.csv` التوضيحية التالية لأنها صغيرة: train.csv، test.csv. + +
+ +
+ +2. اسحب ملفات مجموعة البيانات الخاصة بك وأضف رسالة ارتكاب وصفية موجزة. + +
+ +
+ +3. بعد تحميل ملفات مجموعة البيانات الخاصة بك، يتم تخزينها في مستودع مجموعة البيانات الخاصة بك. + +
+ +
+ +### إنشاء بطاقة مجموعة بيانات + +إن إضافة بطاقة مجموعة بيانات أمر قيم للغاية لمساعدة المستخدمين في العثور على مجموعة البيانات الخاصة بك وفهم كيفية استخدامها بشكل مسؤول. + +1. انقر فوق **إنشاء بطاقة مجموعة بيانات** لإنشاء بطاقة مجموعة بيانات. يقوم هذا الزر بإنشاء ملف `README.md` في مستودعك. + +
+ +
+ +2. في الأعلى، سترى **واجهة المستخدم للبيانات الوصفية** مع العديد من الحقول للاختيار من بينها مثل الترخيص واللغة وفئات المهام. هذه هي أهم العلامات لمساعدة المستخدمين على اكتشاف مجموعة البيانات الخاصة بك على Hub. عندما تحدد خيارًا من كل حقل، سيتم إضافتها تلقائيًا إلى أعلى بطاقة مجموعة البيانات. + +يمكنك أيضًا الاطلاع على [مواصفات بطاقة مجموعة البيانات](https://github.com/huggingface/hub-docs/blob/main/datasetcard.md?plain=1)، والتي تحتوي على مجموعة كاملة من (ولكن غير مطلوبة) خيارات العلامات مثل `annotations_creators`، لمساعدتك في اختيار العلامات المناسبة. + +
+ +
+ +3. انقر فوق الرابط **استيراد قالب بطاقة مجموعة البيانات** في أعلى المحرر لإنشاء قالب بطاقة مجموعة بيانات تلقائيًا. تعد تعبئة القالب طريقة رائعة لتقديم مجموعة البيانات الخاصة بك إلى المجتمع ومساعدة المستخدمين على فهم كيفية استخدامها. للحصول على مثال مفصل لما يجب أن تبدو عليه بطاقة مجموعة البيانات الجيدة، راجع [بطاقة مجموعة بيانات CNN DailyMail](https://huggingface.co/datasets/cnn_dailymail). + +### تحميل مجموعة البيانات + +بمجرد تخزين مجموعة البيانات الخاصة بك على Hub، يمكن لأي شخص تحميلها باستخدام الدالة [`load_dataset`] : + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("stevhliu/demo") +``` + +## التحميل باستخدام Python + +يمكن للمستخدمين الذين يفضلون تحميل مجموعة بيانات برمجيًا استخدام مكتبة [huggingface_hub](https://huggingface.co/docs/huggingface_hub/index). تسمح هذه المكتبة للمستخدمين بالتفاعل مع Hub من Python. + +1. ابدأ بتثبيت المكتبة: + +```bash +pip install huggingface_hub +``` + +2. لتحميل مجموعة بيانات على Hub في Python، يلزمك تسجيل الدخول إلى حساب Hugging Face الخاص بك: + +```bash +huggingface-cli login +``` + +3. استخدم الدالة [`push_to_hub()`](https://huggingface.co/docs/datasets/main/en/package_reference/main_classes#datasets.DatasetDict.push_to_hub) لمساعدتك في إضافة ملف والالتزام به ودفعه إلى مستودعك: + +```py +>>> from datasets import load_dataset + +>>> dataset = load_dataset("stevhliu/demo") +# dataset = dataset.map(...) # قم بجميع معالجتك هنا +>>> dataset.push_to_hub("stevhliu/processed_demo") +``` + +لجعل مجموعة البيانات الخاصة بك خاصة، قم بتعيين المعلمة `private` على `True`. لن يعمل هذا المعلمة إلا إذا كنت تقوم بإنشاء مستودع للمرة الأولى. + +```py +>>> dataset.push_to_hub("stevhliu/private_processed_demo", private=True) +``` + +لإضافة تكوين جديد (أو مجموعة فرعية) إلى مجموعة بيانات أو لإضافة تقسيم جديد (التدريب/التحقق/الاختبار)، يرجى الرجوع إلى وثائق [`Dataset.push_to_hub`] . + +### الخصوصية + +لا يمكن الوصول إلى مجموعة البيانات الخاصة إلا من قبلك. وبالمثل، إذا قمت بمشاركة مجموعة بيانات داخل مؤسستك، فيمكن لأعضاء المنظمة أيضًا الوصول إلى مجموعة البيانات. + +قم بتحميل مجموعة بيانات خاصة عن طريق توفير رمز المصادقة الخاص بك لمعلمة `token` : + +```py +>>> from datasets import load_dataset + +# تحميل مجموعة بيانات فردية خاصة +>>> dataset = load_dataset("stevhliu/demo", token=True) + +# تحميل مجموعة بيانات منظمة خاصة +>>> dataset = load_dataset("organization/dataset_name"، token=True) +``` + +## ماذا بعد؟ + +تهانينا، لقد أكملت البرامج التعليمية! 🥳 + +من هنا، يمكنك: + +- تعرف على المزيد حول كيفية استخدام وظائف 🤗 Datasets الأخرى [لمعالجة مجموعة البيانات](process) الخاصة بك. +- [قم بتشغيل مجموعات البيانات الكبيرة](stream) دون تنزيلها محليًا. +- [حدد تقسيمات مجموعة البيانات وتكويناتها](repository_structure) ومشاركة مجموعة البيانات الخاصة بك مع المجتمع. + +إذا كان لديك أي أسئلة حول 🤗 Datasets، فلا تتردد في الانضمام إلى المجتمع وسؤاله على [المنتدى](https://discuss.huggingface.co/c/datasets/10). \ No newline at end of file diff --git a/docs/source/ar/use_dataset.mdx b/docs/source/ar/use_dataset.mdx new file mode 100644 index 00000000000..0d41bbd79d4 --- /dev/null +++ b/docs/source/ar/use_dataset.mdx @@ -0,0 +1,203 @@ +# معالجة مسبقة + +بالإضافة إلى تحميل مجموعات البيانات، يتمثل الهدف الرئيسي الآخر لـ 🤗 Datasets في تقديم مجموعة متنوعة من وظائف المعالجة المسبقة لتحويل مجموعة البيانات إلى تنسيق مناسب للتدريب مع إطار عمل التعلم الآلي الخاص بك. + +هناك العديد من الطرق الممكنة لمعالجة مجموعة البيانات مسبقًا، وكل ذلك يعتمد على مجموعة البيانات المحددة الخاصة بك. في بعض الأحيان، قد تحتاج إلى إعادة تسمية عمود، وفي أحيان أخرى، قد تحتاج إلى إلغاء تسطيح الحقول المضمنة. يوفر 🤗 Datasets طريقة للقيام بمعظم هذه الأشياء. ولكن في جميع حالات المعالجة المسبقة تقريبًا، اعتمادًا على طريقة مجموعة البيانات الخاصة بك، ستحتاج إلى: + +- رموز نصية لمجموعة بيانات نصية. +- إعادة أخذ عينات من مجموعة بيانات صوتية. +- تطبيق تحويلات على مجموعة بيانات الصور. + +تتمثل خطوة المعالجة المسبقة الأخيرة عادةً في تعيين تنسيق مجموعة البيانات الخاصة بك ليكون متوافقًا مع تنسيق الإدخال المتوقع لإطار عمل التعلم الآلي الخاص بك. + +في هذا البرنامج التعليمي، ستحتاج أيضًا إلى تثبيت مكتبة 🤗 Transformers: + +```bash +pip install transformers +``` + +احصل على مجموعة بيانات من اختيارك واتبع التعليمات! + +## رموز نصية + +لا يمكن للنماذج معالجة النص الخام، لذلك ستحتاج إلى تحويل النص إلى أرقام. توفر عملية الرمزية طريقة للقيام بذلك من خلال تقسيم النص إلى كلمات فردية تسمى *الرموز*. يتم تحويل الرموز في النهاية إلى أرقام. + + + +اطلع على قسم [الرموز](https://huggingface.co/course/chapter2/4؟fw=pt) في الفصل 2 من دورة Hugging Face لمزيد من المعلومات حول الرمزية وخوارزميات الرمزية المختلفة. + + + +**1**. ابدأ بتحميل مجموعة بيانات [rotten_tomatoes](https://huggingface.co/datasets/rotten_tomatoes) ومحول الرموز المقابل لنموذج [BERT](https://huggingface.co/bert-base-uncased) المعلم مسبقًا. من المهم استخدام نفس محول الرموز مثل النموذج المعلم مسبقًا لأنك تريد التأكد من تقسيم النص بنفس الطريقة. + +```py +>>> from transformers import AutoTokenizer +>>> from datasets import load_dataset + +>>> tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") +>>> dataset = load_dataset("rotten_tomatoes", split="train") +``` + +**2**. قم بالاتصال بمحول الرموز على السطر الأول من `text` في مجموعة البيانات: + +```py +>>> tokenizer(dataset[0]["text"]) +{'input_ids': [101, 1103, 2067, 1110, 17348, 1106, 1129, 1103, 6880, 1432, 112, 188, 1207, 107, 14255, 1389, 107, 1105, 1115, 1119, 112, 188, 1280, 1106, 1294, 170, 24194, 1256, 3407, 1190, 170, 11791, 5253, 188, 1732, 7200, 10947, 12606, 2895, 117, 179, 7766, 118, 172, 15554, 1181, 3498, 6961, 3263, 1137, 188, 1566, 7912, 14516, 6997, 119, 102], +'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +``` + +يعيد محول الرموز قاموسًا يحتوي على ثلاثة عناصر: + +- `input_ids`: الأرقام التي تمثل الرموز في النص. +- `token_type_ids`: يشير إلى التسلسل الذي ينتمي إليه الرمز إذا كان هناك أكثر من تسلسل واحد. +- `attention_mask`: يشير إلى ما إذا كان يجب إخفاء رمز أم لا. + +هذه القيم هي في الواقع إدخالات النموذج. + +**3**. أسرع طريقة لرموز مجموعة البيانات بأكملها هي استخدام وظيفة [`~ Dataset.map`] . تسرع هذه الوظيفة عملية الرمزية من خلال تطبيق محول الرموز على دفعات من الأمثلة بدلاً من الأمثلة الفردية. قم بتعيين معلمة `batched` إلى `True`: + +```py +>>> def tokenization(example): +... return tokenizer(example["text"]) + +>>> dataset = dataset.map(tokenization, batched=True) +``` + +**4**. قم بتعيين تنسيق مجموعة البيانات الخاصة بك ليكون متوافقًا مع إطار عمل التعلم الآلي الخاص بك: + + + + + +استخدم وظيفة [`~ Dataset.set_format`] لتعيين تنسيق مجموعة البيانات ليكون متوافقًا مع PyTorch: + +```py +>>> dataset.set_format(type="torch", columns=["input_ids", "token_type_ids", "attention_mask", "label"]) +>>> dataset.format['type'] +'torch' +``` + + + + + +استخدم وظيفة [`~ Dataset.to_tf_dataset`] لتعيين تنسيق مجموعة البيانات ليكون متوافقًا مع TensorFlow. ستحتاج أيضًا إلى استيراد [collator البيانات](https://huggingface.co/docs/transformers/main_classes/data_collator#transformers.DataCollatorWithPadding) من 🤗 Transformers لدمج أطوال التسلسلات المتغيرة في دفعة واحدة من الأطوال المتساوية: + +```py +>>> from transformers import DataCollatorWithPadding + +>>> data_collator = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="tf") +>>> tf_dataset = dataset.to_tf_dataset( +... columns=["input_ids", "token_type_ids", "attention_mask"], +... label_cols=["label"], +... batch_size=2, +... collate_fn=data_collator, +... shuffle=True +... ) +``` + + + + + +**5**. مجموعة البيانات جاهزة الآن للتدريب باستخدام إطار عمل التعلم الآلي الخاص بك! + +## إعادة أخذ عينات من إشارات الصوت + +مثل مجموعات البيانات النصية، تحتاج إدخالات الصوت إلى تقسيمها إلى نقاط بيانات منفصلة. يُعرف هذا باسم *العينات*؛ ومعدل العينات يخبرك بكمية إشارة الكلام التي يتم التقاطها في الثانية. من المهم التأكد من أن معدل عينات مجموعة البيانات الخاصة بك يتطابق مع معدل عينات البيانات المستخدمة لتدريب النموذج الذي تستخدمه مسبقًا. إذا كانت معدلات العينات مختلفة، فقد يؤدي النموذج المعلم مسبقًا إلى أداء ضعيف على مجموعة البيانات الخاصة بك لأنه لا يتعرف على الاختلافات في معدل العينات. + +**1**. ابدأ بتحميل مجموعة بيانات [MInDS-14](https://huggingface.co/datasets/PolyAI/minds14) وميزة [`Audio`] ومستخرج الميزات المقابل لنموذج [Wav2Vec2](https://huggingface.co/facebook/wav2vec2-base-960h) المعلم مسبقًا: + +```py +>>> from transformers import AutoFeatureExtractor +>>> from datasets import load_dataset, Audio + +>>> feature_extractor = AutoFeatureExtractor.from_pretrained("facebook/wav2vec2-base-960h") +>>> dataset = load_dataset("PolyAI/minds14", "en-US", split="train") +``` + +**2**. قم بفهرسة السطر الأول من مجموعة البيانات. عندما تستدعي عمود `audio` في مجموعة البيانات، يتم فك ترميزه وإعادة أخذ عينات منه تلقائيًا: + +```py +>>> dataset[0]["audio"] +{'array': array([ 0. , 0.00024414, -0.00024414, ..., -0.00024414, + 0. , 0. ], dtype=float32), + 'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav', + 'sampling_rate': 8000} +``` + +**3**. إن قراءة بطاقة مجموعة البيانات مفيدة للغاية ويمكن أن تعطيك الكثير من المعلومات حول مجموعة البيانات. نظرة سريعة على بطاقة مجموعة بيانات MInDS-14 تخبرك بأن معدل العينة هو 8 كيلو هرتز. وبالمثل، يمكنك الحصول على العديد من التفاصيل حول نموذج من بطاقة النموذج الخاصة به. تقول بطاقة نموذج Wav2Vec2 إنه تم أخذ عينات منه على صوت 16 كيلو هرتز. وهذا يعني أنك ستحتاج إلى زيادة عينات مجموعة بيانات MInDS-14 لمطابقة معدل عينات النموذج. + +استخدم وظيفة [`~ Dataset.cast_column`] وقم بتعيين معلمة `sampling_rate` في ميزة [`Audio`] لزيادة عينات إشارة الصوت. عندما تستدعي عمود `audio` الآن، يتم فك تشفيره وإعادة أخذ العينات منه إلى 16 كيلو هرتز: + +```py +>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16_000)) +>>> dataset[0]["audio"] +{'array': array([ 2.3443763e-05, 2.1729663e-04, 2.2145823e-04, ..., + 3.8356509e-05, -7.3497440e-06, -2.1754686e-05], dtype=float32), + 'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav', + 'sampling_rate': 16000} +``` + +**4**. استخدم وظيفة [`~ Dataset.map`] لإعادة أخذ عينات من مجموعة البيانات بأكملها إلى 16 كيلو هرتز. تسرع هذه الوظيفة عملية إعادة أخذ العينات من خلال تطبيق مستخرج الميزات على دفعات من الأمثلة بدلاً من الأمثلة الفردية. قم بتعيين معلمة `batched` إلى `True`: + +```py +>>> def preprocess_function(examples): +... audio_arrays = [x["array"] for x in examples["audio"]] +... inputs = feature_extractor( +... audio_arrays, sampling_rate=feature_extractor.sampling_rate, max_length=16000, truncation=True +... ) +... return inputs + +>>> dataset = dataset.map(preprocess_function, batched=True) +``` + +**5**. مجموعة البيانات جاهزة الآن للتدريب باستخدام إطار عمل التعلم الآلي الخاص بك! + +## تطبيق التعزيزات البيانات + +أشيع معالجة مسبقة ستقوم بها مع مجموعات بيانات الصور هي *تعزيز البيانات*، وهي عملية تقوم بإدخال اختلافات عشوائية على صورة دون تغيير معنى البيانات. قد يعني ذلك تغيير خصائص اللون لصورة أو اقتصاص صورة بشكل عشوائي. أنت حر في استخدام أي مكتبة لتعزيز البيانات التي تريدها، وسيساعدك 🤗 Datasets في تطبيق تعزيزات البيانات الخاصة بك على مجموعة البيانات الخاصة بك. + +**1**. ابدأ بتحميل مجموعة بيانات [Beans](https://huggingface.co/datasets/beans) وميزة `Image` ومستخرج الميزات المقابل لنموذج [ViT](https://huggingface.co/google/vit-base-patch16-224-in21k) المعلم مسبقًا: + +```py +>>> from transformers import AutoFeatureExtractor +>>> from datasets import load_dataset, Image + +>>> feature_extractor = AutoFeatureExtractor.from_pretrained("google/vit-base-patch16-224-in21k") +>>> dataset = load_dataset("beans", split="train") +``` + +**2**. قم بفهرسة السطر الأول من مجموعة البيانات. عندما تستدعي عمود `image` في مجموعة البيانات، يتم فك تشفير كائن PIL الأساسي تلقائيًا إلى صورة. + +```py +>>> dataset[0]["image"] + +``` + +تتوقع معظم نماذج الصور أن تكون الصورة في وضع RGB. صور الفاصوليا هي بالفعل في وضع RGB، ولكن إذا كانت مجموعة البيانات الخاصة بك تحتوي على صور في وضع مختلف، فيمكنك استخدام وظيفة [`~ Dataset.cast_column`] لتعيين الوضع إلى RGB: + +```py +>>> dataset = dataset.cast_column("image", Image(mode="RGB")) +``` + +**3**. الآن، يمكنك تطبيق بعض التحويلات على الصورة. لا تتردد في إلقاء نظرة على [التحويلات المختلفة المتاحة](https://pytorch.org/vision/stable/auto_examples/plot_transforms.html#sphx-glr-auto-examples-plot-transforms-py) في torchvision واختيار واحد تريد تجربته. هذا المثال يطبق تحويلًا يقوم بتدوير الصورة بشكل عشوائي: + +```py +>>> from torchvision.transforms import RandomRotation + +>>> rotate = RandomRotation(degrees=(0, 90)) +>>> def transforms(examples): +... examples["pixel_values"] = [rotate(image) for image in examples["image"]] +... return examples +``` + +**4**. استخدم وظيفة [`~ Dataset.set_transform`] لتطبيق التحويل أثناء التنقل. عندما تقوم بفهرسة قيم بكسل الصورة، يتم تطبيق التحويل، ويتم تدوير صورتك. + +```py +>>> dataset.set_transform(transforms) +>>> dataset[0]["pixel_values"] +``` + +**5**. مجموعة البيانات جاهزة الآن للتدريب باستخدام إطار عمل التعلم الآلي الخاص بك! \ No newline at end of file diff --git a/docs/source/ar/use_with_jax.mdx b/docs/source/ar/use_with_jax.mdx new file mode 100644 index 00000000000..67886f7b56f --- /dev/null +++ b/docs/source/ar/use_with_jax.mdx @@ -0,0 +1,211 @@ +# الاستخدام مع JAX + +هذه الوثيقة هي مقدمة سريعة لاستخدام `datasets` مع JAX، مع التركيز بشكل خاص على كيفية الحصول على كائنات `jax.Array` من مجموعات البيانات الخاصة بنا، وكيفية استخدامها لتدريب نماذج JAX. + + + +يتطلب `jax` و`jaxlib` إعادة إنتاج الكود أعلاه، لذا يرجى التأكد من تثبيتهما باستخدام `pip install datasets[jax]`. + + + +## تنسيق مجموعة البيانات + +بشكل افتراضي، تعيد مجموعات البيانات كائنات Python عادية: الأعداد الصحيحة، والأعداد العشرية، والسلاسل النصية، والقوائم، إلخ، ولا تتغير الكائنات النصية والثنائية، لأن JAX يدعم الأرقام فقط. + +للحصول على مصفوفات JAX (شبيهة بمصفوفات Numpy) بدلاً من ذلك، يمكنك تعيين تنسيق مجموعة البيانات إلى `jax`: + +```py +>>> from datasets import Dataset +>>> data = [[1, 2], [3, 4]] +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("jax") +>>> ds[0] +{'data': DeviceArray([1, 2], dtype=int32)} +>>> ds[:2] +{'data': DeviceArray( + [[1, 2], + [3, 4]], dtype=int32)} +``` + + + +كائن [`Dataset`] هو عبارة عن غلاف لجدول Arrow، والذي يسمح بالقراءة السريعة من المصفوفات في مجموعة البيانات إلى مصفوفات JAX. + + + +لاحظ أن نفس الإجراء بالضبط ينطبق على كائنات `DatasetDict`، بحيث عند تعيين تنسيق `DatasetDict` إلى `jax`، سيتم تنسيق جميع كائنات `Dataset` هناك كتنسيق `jax`: + +```py +>>> from datasets import DatasetDict +>>> data = {"train": {"data": [[1, 2], [3, 4]]}, "test": {"data": [[5, 6], [7, 8]]}} +>>> dds = DatasetDict.from_dict(data) +>>> dds = dds.with_format("jax") +>>> dds["train"][:2] +{'data': DeviceArray( + [[1, 2], + [3, 4]], dtype=int32)} +``` + +شيء آخر يجب مراعاته هو أن التنسيق لا يتم تطبيقه حتى تقوم بالوصول إلى البيانات بالفعل. لذا إذا كنت تريد الحصول على مصفوفة JAX من مجموعة بيانات، فيجب عليك الوصول إلى البيانات أولاً، وإلا سيظل التنسيق كما هو. + +أخيرًا، لتحميل البيانات على الجهاز الذي تختاره، يمكنك تحديد وسيط `device`، ولكن لاحظ أن `jaxlib.xla_extension.Device` غير مدعوم لأنه غير قابل للتسلسل باستخدام `pickle` أو `dill`، لذا ستحتاج إلى استخدام معرف السلسلة الخاص به بدلاً من ذلك: + +```py +>>> import jax +>>> from datasets import Dataset +>>> data = [[1, 2], [3, 4]] +>>> ds = Dataset.from_dict({"data": data}) +>>> device = str(jax.devices()[0]) # عدم التحويل إلى 'str' قبل تمريره إلى 'with_format' سيرفع 'ValueError' +>>> ds = ds.with_format("jax", device=device) +>>> ds[0] +{'data': DeviceArray([1, 2], dtype=int32)} +>>> ds[0]["data"].device() +TFRT_CPU_0 +>>> assert ds[0]["data"].device() == jax.devices()[0] +True +``` + +لاحظ أنه إذا لم يتم توفير وسيط `device` إلى `with_format`، فسيستخدم الجهاز الافتراضي وهو `jax.devices()[0]`. + +## المصفوفات متعددة الأبعاد + +إذا كانت مجموعة البيانات الخاصة بك تتكون من مصفوفات متعددة الأبعاد، فستلاحظ أنه يتم اعتبارها افتراضيًا على أنها نفس المصفوفة إذا كان الشكل ثابتًا: + +```py +>>> from datasets import Dataset +>>> data = [[[1, 2],[3, 4]], [[5, 6],[7, 8]]] # شكل ثابت +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("jax") +>>> ds[0] +{'data': Array([[1, 2], + [3, 4]], dtype=int32)} +``` + +```py +>>> from datasets import Dataset +>>> data = [[[1, 2],[3]], [[4, 5, 6],[7, 8]]] # شكل متغير +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("jax") +>>> ds[0] +{'data': [Array([1, 2], dtype=int32), Array([3], dtype=int32)]} +``` + +ومع ذلك، يتطلب هذا المنطق غالبًا مقارنات شكل بطيئة ونسخ بيانات. لتجنب ذلك، يجب عليك استخدام نوع الميزة [`Array`] بشكل صريح وتحديد شكل المصفوفات الخاصة بك: + +```py +>>> from datasets import Dataset, Features, Array2D +>>> data = [[[1, 2],[3, 4]],[[5, 6],[7, 8]]] +>>> features = Features({"data": Array2D(shape=(2, 2), dtype='int32')}) +>>> ds = Dataset.from_dict({"data": data}, features=features) +>>> ds = ds.with_format("torch") +>>> ds[0] +{'data': Array([[1, 2], + [3, 4]], dtype=int32)} +>>> ds[:2] +{'data': Array([[[1, 2], + [3, 4]], + + [[5, 6], + [7, 8]]], dtype=int32)} +``` + +## أنواع الميزات الأخرى + +يتم تحويل بيانات [`ClassLabel`] بشكل صحيح إلى مصفوفات: + +```py +>>> from datasets import Dataset, Features, ClassLabel +>>> labels = [0, 0, 1] +>>> features = Features({"label": ClassLabel(names=["negative", "positive"])}) +>>> ds = Dataset.from_dict({"label": labels}, features=features) +>>> ds = ds.with_format("jax") +>>> ds[:3] +{'label': DeviceArray([0, 0, 1], dtype=int32)} +``` + +لا تتغير الكائنات النصية والثنائية، لأن JAX يدعم الأرقام فقط. + +يتم أيضًا دعم نوعي الميزات [`Image`] و [`Audio`]. + + + +لاستخدام نوع الميزة [`Image`]`، ستحتاج إلى تثبيت الميزة الإضافية `vision` باستخدام الأمر `pip install datasets[vision]`. + + + +```py +>>> from datasets import Dataset, Features, Image +>>> images = ["path/to/image.png"] * 10 +>>> features = Features({"image": Image()}) +>>> ds = Dataset.from_dict({"image": images}, features=features) +>>> ds = ds.with_format("jax") +>>> ds[0]["image"].shape +(512, 512, 3) +>>> ds[0] +{'image': DeviceArray([[[ 255, 255, 255], + [ 255, 255, 255], + ..., + [ 255, 255, 255], + [ 255, 255, 255]]], dtype=uint8)} +>>> ds[:2]["image"].shape +(2, 512, 512, 3) +>>> ds[:2] +{'image': DeviceArray([[[[ 255, 255, 255], + [ 255, 255, 255], + ..., + [ 255, 255, 255], + [ 255, 255, 255]]]], dtype=uint8)} +``` + + + +لاستخدام نوع الميزة [`Audio`]`، ستحتاج إلى تثبيت الميزة الإضافية `audio` باستخدام الأمر `pip install datasets[audio]`. + + + +```py +>>> from datasets import Dataset, Features, Audio +>>> audio = ["path/to/audio.wav"] * 10 +>>> features = Features({"audio": Audio()}) +>>> ds = Dataset.from_dict({"audio": audio}, features=features) +>>> ds = ds.with_format("jax") +>>> ds[0]["audio"]["array"] +DeviceArray([-0.059021 , -0.03894043, -0.00735474, ..., 0.0133667 , + 0.01809692, 0.00268555], dtype=float32) +>>> ds[0]["audio"]["sampling_rate"] +DeviceArray(44100, dtype=int32, weak_type=True) +``` + +## تحميل البيانات + +لا تحتوي JAX على أي قدرات مدمجة لتحميل البيانات، لذا ستحتاج إلى استخدام مكتبة مثل [PyTorch](https://pytorch.org/) لتحميل بياناتك باستخدام `DataLoader` أو [TensorFlow](https://www.tensorflow.org/) باستخدام `tf.data.Dataset`. نقلاً عن [وثائق JAX](https://jax.readthedocs.io/en/latest/notebooks/Neural_Network_and_Data_Loading.html#data-loading-with-pytorch) حول هذا الموضوع: + +> "JAX يركز بشدة على تحويلات البرامج ومسرعات NumPy، لذا فإننا لا ندرج تحميل البيانات أو معالجتها في مكتبة JAX. هناك بالفعل الكثير من برامج تحميل البيانات الرائعة، لذا دعونا نستخدمها بدلاً من إعادة اختراع أي شيء. سنحصل على برنامج تحميل البيانات الخاص بـ PyTorch، ونصنع شيمًا صغيرًا لجعله يعمل مع مصفوفات NumPy." + +لذا، هذا هو السبب في أن تنسيق JAX في `datasets` مفيد للغاية، لأنه يتيح لك استخدام أي نموذج من HuggingFace Hub مع JAX، دون الحاجة إلى القلق بشأن جزء تحميل البيانات. + +### استخدام `with_format('jax')` + +أسهل طريقة للحصول على مصفوفات JAX من مجموعة بيانات هي استخدام طريقة `with_format('jax')`. دعونا نفترض أننا نريد تدريب شبكة عصبية على مجموعة بيانات MNIST المتوفرة في HuggingFace Hub على https://huggingface.co/datasets/mnist. + +```py +>>> from datasets import load_dataset +>>> ds = load_dataset("mnist") +>>> ds = ds.with_format("jax") +>>> ds["train"][0] +{'image': DeviceArray([[ 0, 0, 0, ...], + [ 0, 0, 0, ...], + ..., + [ 0, 0, 0, ...], + [ 0, 0, 0, ...]], dtype=uint8), + 'label': DeviceArray(5, dtype=int32)} +``` + +بمجرد تعيين التنسيق، يمكننا إدخال مجموعة البيانات إلى نموذج JAX على شكل دفعات باستخدام طريقة `Dataset.iter()`: + +```py +>>> for epoch in range(epochs): +... for batch in ds["train"].iter(batch_size=32): +... x, y = batch["image"], batch["label"] +... ... +``` \ No newline at end of file diff --git a/docs/source/ar/use_with_pytorch.mdx b/docs/source/ar/use_with_pytorch.mdx new file mode 100644 index 00000000000..16ec637897f --- /dev/null +++ b/docs/source/ar/use_with_pytorch.mdx @@ -0,0 +1,268 @@ +# الاستخدام مع PyTorch + +هذه الوثيقة هي مقدمة سريعة لاستخدام `datasets` مع PyTorch، مع التركيز بشكل خاص على كيفية الحصول على كائنات `torch.Tensor` من مجموعات البيانات الخاصة بنا، وكيفية استخدام PyTorch `DataLoader` و Hugging Face `Dataset` بأفضل أداء. + +## تنسيق مجموعة البيانات + +بشكل افتراضي، تعيد مجموعات البيانات كائنات بايثون عادية: أعداد صحيحة، أعداد ذات فاصلة عائمة، سلاسل نصية، قوائم، إلخ. + +للحصول على تنسورات PyTorch بدلاً من ذلك، يمكنك تعيين تنسيق مجموعة البيانات إلى `pytorch` باستخدام [`Dataset.with_format`]: + +```py +>>> from datasets import Dataset +>>> data = [[1, 2],[3, 4]] +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("torch") +>>> ds[0] +{'data': tensor([1, 2])} +>>> ds[:2] +{'data': tensor([[1, 2], + [3, 4]])} +``` + + + +كائن [`Dataset`] هو غلاف لجدول Arrow، والذي يسمح بقراءات سريعة بدون نسخ من المصفوفات في مجموعة البيانات إلى تنسورات PyTorch. + + + +لتحميل البيانات كـتنسورات على GPU، حدد وسيط `device`: + +```py +>>> import torch +>>> device = torch.device("cuda" if torch.cuda.is_available() else "cpu") +>>> ds = ds.with_format("torch", device=device) +>>> ds[0] +{'data': tensor([1, 2], device='cuda:0')} +``` + +## المصفوفات متعددة الأبعاد + +إذا كانت مجموعة البيانات الخاصة بك تتكون من مصفوفات متعددة الأبعاد، فستلاحظ أنها تعتبر افتراضيًا نفس التنسور إذا كان الشكل ثابتًا: + +```py +>>> from datasets import Dataset +>>> data = [[[1, 2],[3, 4]],[[5, 6],[7, 8]]] # fixed shape +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("torch") +>>> ds[0] +{'data': tensor([[1, 2], + [3, 4]])} +``` + +```py +>>> from datasets import Dataset +>>> data = [[[1, 2],[3]],[[4, 5, 6],[7, 8]]] # varying shape +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("torch") +>>> ds[0] +{'data': [tensor([1, 2]), tensor([3])]} +``` + +ومع ذلك، يتطلب هذا المنطق غالبًا مقارنات شكل بطيئة ونسخ بيانات. + +للتغلب على ذلك، يجب عليك استخدام [`Array`] نوع الميزة بشكل صريح وتحديد شكل تنسوراتك: + +```py +>>> from datasets import Dataset, Features, Array2D +>>> data = [[[1, 2],[3, 4]],[[5, 6],[7, 8]]] +>>> features = Features({"data": Array2D(shape=(2, 2), dtype='int32')}) +>>> ds = Dataset.from_dict({"data": data}, features=features) +>>> ds = ds.with_format("torch") +>>> ds[0] +{'data': tensor([[1, 2], + [3, 4]])} +>>> ds[:2] +{'data': tensor([[[1, 2], + [3, 4]], + + [[5, 6], + [7, 8]]])} +``` + +## أنواع الميزات الأخرى + +يتم تحويل بيانات [`ClassLabel`] بشكل صحيح إلى تنسورات: + +```py +>>> from datasets import Dataset, Features, ClassLabel +>>> labels = [0, 0, 1] +>>> features = Features({"label": ClassLabel(names=["negative", "positive"])}) +>>> ds = Dataset.from_dict({"label": labels}, features=features) +>>> ds = ds.with_format("torch") +>>> ds[:3] +{'label': tensor([0, 0, 1])} +``` + +لا تتغير الكائنات النصية والثنائية، لأن PyTorch يدعم الأرقام فقط. + +يتم أيضًا دعم أنواع الميزات [`Image`] و [`Audio`]. + + + +لاستخدام نوع الميزة [`Image`]`، ستحتاج إلى تثبيت الميزة الإضافية `vision` كما يلي: +`pip install datasets[vision]`. + + + +```py +>>> from datasets import Dataset, Features, Audio, Image +>>> images = ["path/to/image.png"] * 10 +>>> features = Features({"image": Image()}) +>>> ds = Dataset.from_dict({"image": images}, features=features) +>>> ds = ds.with_format("torch") +>>> ds[0]["image"].shape +torch.Size([512, 512, 4]) +>>> ds[0] +{'image': tensor([[[255, 215, 106, 255], + [255, 215, 106, 255], + ..., + [255, 255, 255, 255], + [255, 255, 255, 255]]], dtype=torch.uint8)} +>>> ds[:2]["image"].shape +torch.Size([2, 512, 512, 4]) +>>> ds[:2] +{'image': tensor([[[[255, 215, 106, 255], + [255, 215, 106, 255], + ..., + [255, 255, 255, 255], + [255, 255, 255, 255]]]], dtype=torch.uint8)} +``` + + + +لاستخدام نوع الميزة [`Audio`]`، ستحتاج إلى تثبيت الميزة الإضافية `audio` كما يلي: +`pip install datasets[audio]`. + + + +```py +>>> from datasets import Dataset, Features, Audio, Image +>>> audio = ["path/to/audio.wav"] * 10 +>>> features = Features({"audio": Audio()}) +>>> ds = Dataset.from_dict({"audio": audio}, features=features) +>>> ds = ds.with_format("torch") +>>> ds[0]["audio"]["array"] +tensor([ 6.1035e-05, 1.5259e-05, 1.6785e-04, ..., -1.5259e-05, + -1.5259e-05, 1.5259e-05]) +>>> ds[0]["audio"]["sampling_rate"] +tensor(44100) +``` + +## تحميل البيانات + +مثل كائنات `torch.utils.data.Dataset`، يمكن تمرير كائن [`Dataset`] مباشرةً إلى PyTorch `DataLoader`: + +```py +>>> import numpy as np +>>> from datasets import Dataset +>>> from torch.utils.data import DataLoader +>>> data = np.random.rand(16) +>>> label = np.random.randint(0, 2, size=16) +>>> ds = Dataset.from_dict({"data": data, "label": label}).with_format("torch") +>>> dataloader = DataLoader(ds, batch_size=4) +>>> for batch in dataloader: +... print(batch) +{'data': tensor([0.0047, 0.4979, 0.6726, 0.8105]), 'label': tensor([0, 1, 0, 1])} +{'data': tensor([0.4832, 0.2723, 0.4259, 0.2224]), 'label': tensor([0, 0, 0, 0])} +{'data': tensor([0.5837, 0.3444, 0.4658, 0.6417]), 'label': tensor([0, 1, 0, 0])} +{'data': tensor([0.7022, 0.1225, 0.7228, 0.8259]), 'label': tensor([1, 1, 1, 1])} +``` + +### تحسين تحميل البيانات + +هناك عدة طرق يمكنك من خلالها زيادة سرعة تحميل البيانات، والتي يمكن أن توفر لك الوقت، خاصة إذا كنت تعمل مع مجموعات بيانات كبيرة. + +يوفر PyTorch تحميل بيانات متوازي، واسترداد دفعات من المؤشرات بدلاً من ذلك، والبث لتخطي مجموعة البيانات دون تنزيلها على القرص. + +#### استخدام Workers متعددة + +يمكنك موازاة تحميل البيانات باستخدام وسيط `num_workers` من PyTorch `DataLoader` والحصول على إنتاجية أعلى. + +تحت الغطاء، يبدأ `DataLoader` عدد `num_workers` من العمليات. + +تتم إعادة تحميل كل عملية لمجموعة البيانات التي تم تمريرها إلى `DataLoader` ويتم استخدامها لاستعلام الأمثلة. + +لا يؤدي إعادة تحميل مجموعة البيانات داخل عامل إلى ملء ذاكرة الوصول العشوائي (RAM)، نظرًا لأنه يقوم ببساطة برسم خريطة الذاكرة لمجموعة البيانات مرة أخرى من القرص. + +```py +>>> import numpy as np +>>> from datasets import Dataset, load_from_disk +>>> from torch.utils.data import DataLoader +>>> data = np.random.rand(10_000) +>>> Dataset.from_dict({"data": data}).save_to_disk("my_dataset") +>>> ds = load_from_disk("my_dataset").with_format("torch") +>>> dataloader = DataLoader(ds, batch_size=32, num_workers=4) +``` + +### بث البيانات + +قم ببث مجموعة بيانات عن طريق تحميلها كـ [`IterableDataset`]. يسمح لك هذا بالتقدم تدريجيًا خلال مجموعة بيانات عن بُعد دون تنزيلها على القرص أو ملفات بيانات محلية. + +تعرف على المزيد حول نوع مجموعة البيانات الأنسب لحالتك الاستخدامية في دليل [الاختيار بين مجموعة بيانات عادية أو مجموعة بيانات قابلة للبث](./about_mapstyle_vs_iterable). + +ترث مجموعة البيانات القابلة للبث من `datasets` من `torch.utils.data.IterableDataset` بحيث يمكنك تمريرها إلى `torch.utils.data.DataLoader`: + +```py +>>> import numpy as np +>>> from datasets import Dataset, load_dataset +>>> from torch.utils.data import DataLoader +>>> data = np.random.rand(10_000) +>>> Dataset.from_dict({"data": data}).push_to_hub("/my_dataset") # Upload to the Hugging Face Hub +>>> my_iterable_dataset = load_dataset("/my_dataset", streaming=True, split="train") +>>> dataloader = DataLoader(my_iterable_dataset, batch_size=32) +``` + +إذا تم تقسيم مجموعة البيانات إلى عدة شظايا (أي إذا كانت مجموعة البيانات تتكون من عدة ملفات بيانات)، فيمكنك البث بالتوازي باستخدام `num_workers`: + +```py +>>> my_iterable_dataset = load_dataset("deepmind/code_contests", streaming=True, split="train") +>>> my_iterable_dataset.n_shards +39 +>>> dataloader = DataLoader(my_iterable_dataset, batch_size=32, num_workers=4) +``` + +في هذه الحالة، يتم منح كل عامل مجموعة فرعية من قائمة الشظايا للبث منها. + +إذا كنت بحاجة إلى DataLoader يمكنك حفظ نقطة تفتيش له واستئنافه في منتصف التدريب، فيمكنك استخدام `StatefulDataLoader` من [torchdata](https://github.com/pytorch/data): + +```py +>>> from torchdata.stateful_dataloader import StatefulDataLoader +>>> my_iterable_dataset = load_dataset("deepmind/code_contests", streaming=True, split="train") +>>> dataloader = StatefulDataLoader(my_iterable_dataset, batch_size=32, num_workers=4) +>>> # save in the middle of training +>>> state_dict = dataloader.state_dict() +>>> # and resume later +>>> dataloader.load_state_dict(state_dict) +``` + +هذا ممكن بفضل [`IterableDataset.state_dict`] و [`IterableDataset.load_state_dict`]. + +### موزعة + +لتقسيم مجموعة البيانات الخاصة بك عبر عقد التدريب الخاصة بك، يمكنك استخدام [`datasets.distributed.split_dataset_by_node`]: + +```python +import os +from datasets.distributed import split_dataset_by_node + +ds = split_dataset_by_node(ds, rank=int(os.environ["RANK"]), world_size=int(os.environ["WORLD_SIZE"])) +``` + +يعمل هذا لكل من مجموعات البيانات على الطريقة الخرائطية ومجموعات البيانات القابلة للبث. + +يتم تقسيم مجموعة البيانات للعقدة في الرتبة `rank` في مجموعة من العقد بحجم `world_size`. + +بالنسبة لمجموعات البيانات على الطريقة الخرائطية: + +يتم تعيين كتلة بيانات لكل عقدة، على سبيل المثال، يتم إعطاء الرتبة 0 الكتلة الأولى من مجموعة البيانات. + +بالنسبة لمجموعات البيانات القابلة للبث: + +إذا كان عدد شظايا مجموعة البيانات عاملًا لـ `world_size` (أي إذا كان `dataset.n_shards % world_size == 0`)، + +يتم توزيع الشظايا بالتساوي عبر العقد، وهو الأكثر تحسينًا. + +وإلا، تحتفظ كل عقدة بمثال واحد من أصل `world_size`، متخطية الأمثلة الأخرى. + +يمكن أيضًا دمج هذا مع `torch.utils.data.DataLoader` إذا كنت تريد أن يستخدم كل عقدة عدة عمال لتحميل البيانات. \ No newline at end of file diff --git a/docs/source/ar/use_with_spark.mdx b/docs/source/ar/use_with_spark.mdx new file mode 100644 index 00000000000..7814dd7410a --- /dev/null +++ b/docs/source/ar/use_with_spark.mdx @@ -0,0 +1,68 @@ +# الاستخدام مع Spark + +هذه الوثيقة هي مقدمة سريعة لاستخدام مجموعات البيانات 🤗 مع Spark، مع التركيز بشكل خاص على كيفية تحميل DataFrame من Spark في كائن [`Dataset`]. + +من هناك، يمكنك الوصول السريع إلى أي عنصر ويمكنك استخدامه كمحمل بيانات لتدريب النماذج. + +## التحميل من Spark + +كائن [`Dataset`] هو غلاف لجدول Arrow، والذي يسمح بالقراءات السريعة من المصفوفات في مجموعة البيانات إلى PyTorch و TensorFlow و JAX tensors. + +يتم تعيين جدول Arrow في الذاكرة من القرص، والذي يمكنه تحميل مجموعات البيانات الأكبر من ذاكرة الوصول العشوائي المتوفرة. + +يمكنك الحصول على [`Dataset`] من DataFrame من Spark باستخدام [`Dataset.from_spark`]: + +```py +>>> from datasets import Dataset +>>> df = spark.createDataFrame( +... data=[[1, "Elia"], [2, "Teo"], [3, "Fang"]], +... columns=["id", "name"], +... ) +>>> ds = Dataset.from_spark(df) +``` + +يقوم عمال Spark بكتابة مجموعة البيانات على القرص في دليل ذاكرة التخزين المؤقت كملفات Arrow، ويتم تحميل [`Dataset`] من هناك. + +أو يمكنك تخطي التخزين المؤقت باستخدام [`IterableDataset.from_spark`]، والذي يعيد [`IterableDataset`]: + +```py +>>> from datasets import IterableDataset +>>> df = spark.createDataFrame( +... data=[[1, "Elia"], [2, "Teo"], [3, "Fang"]], +... columns=["id", "name"], +... ) +>>> ds = IterableDataset.from_spark(df) +>>> print(next(iter(ds))) +{"id": 1, "name": "Elia"} +``` + +### التخزين المؤقت + +عند استخدام [`Dataset.from_spark`]، يتم تخزين كائن [`Dataset`] الناتج مؤقتًا؛ إذا قمت باستدعاء [`Dataset.from_spark`] عدة مرات على نفس DataFrame، فلن يقوم بإعادة تشغيل مهمة Spark التي تكتب مجموعة البيانات كملفات Arrow على القرص. + +يمكنك تعيين موقع ذاكرة التخزين المؤقت عن طريق تمرير `cache_dir=` إلى [`Dataset.from_spark`]. + +تأكد من استخدام قرص متوفر لكل من عمالك وآلتك الحالية (السائق). + + +في جلسة مختلفة، لا يكون لجدول بيانات Spark نفس [hash الدلالي](https://spark.apache.org/docs/3.2.0/api/python/reference/api/pyspark.sql.DataFrame.semanticHash.html)، وسيعيد تشغيل مهمة Spark ويخزنها في ذاكرة تخزين مؤقت جديدة. + + +### أنواع الميزات + +إذا كانت مجموعة البيانات الخاصة بك تتكون من صور أو بيانات صوتية أو مصفوفات متعددة الأبعاد، فيمكنك تحديد وسيطة `features=` في [`Dataset.from_spark`] (أو [`IterableDataset.from_spark`]): + +```py +>>> from datasets import Dataset, Features, Image, Value +>>> data = [(0, open("image.png", "rb").read())] +>>> df = spark.createDataFrame(data, "idx: int, image: binary") +>>> # يعمل أيضًا إذا كان لديك مصفوفات +>>> # data = [(0, np.zeros(shape=(32, 32, 3), dtype=np.int32).tolist())] +>>> # df = spark.createDataFrame(data, "idx: int, image: array>>") +>>> features = Features({"idx": Value("int64"), "image": Image()}) +>>> dataset = Dataset.from_spark(df, features=features) +>>> dataset[0] +{'idx': 0, 'image': } +``` + +يمكنك التحقق من وثائق [`Features`] للتعرف على جميع أنواع الميزات المتاحة. \ No newline at end of file diff --git a/docs/source/ar/use_with_tensorflow.mdx b/docs/source/ar/use_with_tensorflow.mdx new file mode 100644 index 00000000000..bafc1cfccf8 --- /dev/null +++ b/docs/source/ar/use_with_tensorflow.mdx @@ -0,0 +1,227 @@ +# استخدام مجموعات البيانات مع TensorFlow + +هذا المستند هو مقدمة سريعة لاستخدام `datasets` مع TensorFlow، مع التركيز بشكل خاص على كيفية الحصول على كائنات `tf.Tensor` من مجموعات البيانات الخاصة بنا، وكيفية بث البيانات من كائنات `Dataset` من Hugging Face إلى أساليب Keras مثل `model.fit()`. + +## تنسيق مجموعة البيانات + +بشكل افتراضي، تعيد مجموعات البيانات كائنات Python عادية: أعداد صحيحة، أعداد ذات فاصلة عائمة، سلاسل نصية، قوائم، إلخ. + +للحصول على Tensors TensorFlow بدلاً من ذلك، يمكنك تعيين تنسيق مجموعة البيانات إلى "tf": + +```py +>>> from datasets import Dataset +>>> data = [[1, 2],[3, 4]] +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("tf") +>>> ds[0] +{'data': } +>>> ds[:2] +{'data': } +``` + + + +كائن [`Dataset`] هو عبارة عن غلاف (wrapper) لجدول Arrow، والذي يسمح بالقراءة السريعة من المصفوفات في مجموعة البيانات إلى Tensors TensorFlow. + + + +يمكن أن يكون هذا مفيدًا لتحويل مجموعة البيانات إلى قاموس من كائنات `Tensor`، أو لكتابة مولد لتحميل عينات TF منها. إذا كنت ترغب في تحويل مجموعة البيانات بأكملها إلى `Tensor`، فما عليك سوى استعلام مجموعة البيانات بالكامل: + +```py +>>> ds[:] +{'data': } +``` + +## المصفوفات متعددة الأبعاد + +إذا كانت مجموعة البيانات الخاصة بك تتكون من مصفوفات متعددة الأبعاد، فستلاحظ أنها تعتبر افتراضيًا نفس المصفوفة إذا كان الشكل ثابتًا: + +```py +>>> from datasets import Dataset +>>> data = [[[1, 2],[3, 4]],[[5, 6],[7, 8]]] # شكل ثابت +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("tf") +>>> ds[0] +{'data': } +``` + +وبخلاف ذلك، فإن مجموعة البيانات بتنسيق TensorFlow تُخرج `RaggedTensor` بدلاً من مصفوفة واحدة: + +```py +>>> from datasets import Dataset +>>> data = [[[1, 2],[3]],[[4, 5, 6],[7, 8]]] # شكل متغير +>>> ds = Dataset.from_dict({"data": data}) +>>> ds = ds.with_format("torch") +>>> ds[0] +{'data': } +``` + +ومع ذلك، يتطلب هذا المنطق غالبًا مقارنات شكل بطيئة ونسخًا للبيانات. + +للتغلب على هذه المشكلة، يجب عليك استخدام نوع ميزة [`Array`] وتحديد شكل المصفوفات الخاصة بك بشكل صريح: + +```py +>>> from datasets import Dataset, Features, Array2D +>>> data = [[[1, 2],[3, 4]],[[5, 6],[7, 8]]] +>>> features = Features({"data": Array2D(shape=(2, 2), dtype='int32')}) +>>> ds = Dataset.from_dict({"data": data}, features=features) +>>> ds = ds.with_format("tf") +>>> ds[0] +{'data': } +>>> ds[:2] +{'data': } +``` + +## أنواع الميزات الأخرى + +تتم تحويل بيانات [`ClassLabel`] بشكل صحيح إلى المصفوفات: + +```py +>>> from datasets import Dataset, Features, ClassLabel +>>> labels = [0, 0, 1] +>>> features = Features({"label": ClassLabel(names=["negative", "positive"])}) +>>> ds = Dataset.from_dict({"label": labels}, features=features) +>>> ds = ds.with_format("tf") +>>> ds[:3] +{'label': } +``` + +كما يتم دعم السلاسل النصية والكائنات الثنائية: + +```py +>>> from datasets import Dataset, Features +>>> text = ["foo", "bar"] +>>> data = [0, 1] +>>> ds = Dataset.from_dict({"text": text, "data": data}) +>>> ds = ds.with_format("tf") +>>> ds[:2] +{'text': , +'data': } +``` + +يمكنك أيضًا تنسيق أعمدة معينة بشكل صريح وترك الأعمدة الأخرى بدون تنسيق: + +```py +>>> ds = ds.with_format("tf", columns=["data"], output_all_columns=True) +>>> ds[:2] +{'data': , +'text': ['foo', 'bar']} +``` + +لا تتغير السلاسل النصية والكائنات الثنائية، نظرًا لأن PyTorch يدعم الأرقام فقط. + +كما يتم دعم نوعي الميزات [`Image`] و [`Audio`]. + + + +لاستخدام نوع الميزة [`Image`]`، ستحتاج إلى تثبيت الميزة الإضافية `vision` كما يلي: + +`pip install datasets[vision]`. + + + +```py +>>> from datasets import Dataset, Features, Audio, Image +>>> images = ["path/to/image.png"] * 10 +>>> features = Features({"image": Image()}) +>>> ds = Dataset.from_dict({"image": images}, features=features) +>>> ds = ds.with_format("tf") +>>> ds[0] +{'image': } +>>> ds[:2] +{'image': } +``` + + + +لاستخدام نوع الميزة [`Audio`]`، ستحتاج إلى تثبيت الميزة الإضافية `audio` كما يلي: + +`pip install datasets[audio]`. + + + +```py +>>> from datasets import Dataset, Features, Audio, Image +>>> audio = ["path/to/audio.wav"] * 10 +>>> features = Features({"audio": Audio()}) +>>> ds = Dataset.from_dict({"audio": audio}, features=features) +>>> ds[0]["audio"]["array"] + +>>> ds[0]["audio"]["sampling_rate"] + +``` + +## تحميل البيانات + +على الرغم من أنه يمكنك تحميل عينات فردية ودفعات عن طريق الفهرسة فقط في مجموعة البيانات الخاصة بك، إلا أن هذا لن ينجح إذا كنت تريد استخدام أساليب Keras مثل `fit()` و`predict()`. يمكنك كتابة دالة مولد تقوم بخلط وتحميل دفعات من مجموعة البيانات الخاصة بك و`fit()` عليها، ولكن يبدو ذلك مثل الكثير من العمل غير الضروري. بدلاً من ذلك، إذا كنت تريد بث البيانات من مجموعة البيانات الخاصة بك أثناء التنقل، نوصي بتحويل مجموعة البيانات إلى `tf.data.Dataset` باستخدام طريقة `to_tf_dataset()`. + +تغطي فئة `tf.data.Dataset` مجموعة واسعة من حالات الاستخدام - غالبًا ما يتم إنشاؤها من المصفوفات في الذاكرة، أو باستخدام دالة تحميل لقراءة الملفات على القرص أو التخزين الخارجي. يمكن تحويل مجموعة البيانات بشكل تعسفي باستخدام طريقة `map()`، أو يمكن استخدام أساليب مثل `batch()` و`shuffle()` لإنشاء مجموعة بيانات جاهزة للتدريب. لا تعدل هذه الأساليب البيانات المخزنة بأي طريقة - بدلاً من ذلك، تقوم الأساليب ببناء رسم بياني لخط أنابيب البيانات الذي يتم تنفيذه عند التنقل خلال مجموعة البيانات، عادةً أثناء تدريب النموذج أو الاستدلال. وهذا يختلف عن طريقة `map()` لكائنات `Dataset` من Hugging Face، والتي تقوم بتشغيل دالة الخريطة على الفور وحفظ الأعمدة الجديدة أو المعدلة. + +نظرًا لأنه يمكن تجميع خط أنابيب معالجة البيانات بأكمله في `tf.data.Dataset`، فإن هذا النهج يسمح بتحميل البيانات والتدريب بشكل موازي ومتوازي بشكل كبير. ومع ذلك، فإن متطلبات تجميع الرسوم البيانية يمكن أن تكون محدودة، خاصة بالنسبة إلى برامج Hugging Face لتحويل النص إلى أجزاء، والتي لا يمكن تجميعها عادةً (بعد!) كجزء من رسم بياني لـ TF. ونتيجة لذلك، فإننا ننصح عادةً بمعالجة مجموعة البيانات مسبقًا كمجموعة بيانات Hugging Face، حيث يمكن استخدام وظائف Python تعسفية، ثم تحويلها إلى `tf.data.Dataset` بعد ذلك باستخدام `to_tf_dataset()` للحصول على مجموعة بيانات مجمعة جاهزة للتدريب. لمشاهدة أمثلة على هذا النهج، يرجى الاطلاع على [الأمثلة](https://github.com/huggingface/transformers/tree/main/examples) أو [دفاتر الملاحظات](https://huggingface.co/docs/transformers/notebooks) لـ `transformers`. + +### استخدام `to_tf_dataset()` + +يعد استخدام `to_tf_dataset()` أمرًا مباشرًا. بمجرد معالجة مجموعة البيانات الخاصة بك وجاهزيتها، فما عليك سوى استدعائها كما يلي: + +```py +>>> from datasets import Dataset +>>> data = {"inputs": [[1, 2],[3, 4]], "labels": [0, 1]} +>>> ds = Dataset.from_dict(data) +>>> tf_ds = ds.to_tf_dataset( + columns=["inputs"], + label_cols=["labels"], + batch_size=2, + shuffle=True + ) +``` + +يعتبر كائن `tf_ds` الذي تمت إعادته هنا جاهزًا الآن للتدريب عليه بالكامل، ويمكن تمريره مباشرة إلى `model.fit()`. لاحظ أنك قمت بتعيين حجم الدفعة عند إنشاء مجموعة البيانات، لذلك لا تحتاج إلى تحديده عند استدعاء `fit()`: + +```py +>>> model.fit(tf_ds, epochs=2) +``` + +للاطلاع على وصف كامل للحجج، يرجى الاطلاع على وثائق [`~Dataset.to_tf_dataset`]. في كثير من الحالات، ستحتاج أيضًا إلى إضافة `collate_fn` إلى استدعائك. هذه هي الدالة التي تأخذ عناصر متعددة من مجموعة البيانات وتجمعها في دفعة واحدة. عندما يكون لجميع العناصر نفس الطول، فإن الدالة الافتراضية المدمجة ستكون كافية، ولكن بالنسبة للمهام الأكثر تعقيدًا، قد تكون هناك حاجة إلى دالة تجميع مخصصة. على وجه الخصوص، تحتوي العديد من المهام على عينات ذات أطوال تسلسل متغيرة والتي ستحتاج إلى [دالة تجميع بيانات](https://huggingface.co/docs/transformers/main/en/main_classes/data_collator) يمكنها إضافة وسائد إلى الدفعات بشكل صحيح. يمكنك الاطلاع على أمثلة على ذلك في أمثلة NLP الخاصة بـ `transformers` [أمثلة](https://github.com/huggingface/transformers/tree/main/examples) و[دفاتر الملاحظات](https://huggingface.co/docs/transformers/notebooks)، حيث تعد أطوال التسلسل المتغيرة شائعة جدًا. + +إذا وجدت أن التحميل باستخدام `to_tf_dataset` بطيء، فيمكنك أيضًا استخدام وسيط `num_workers`. يقوم هذا بإنشاء عمليات فرعية متعددة لتحميل البيانات بشكل متواز. هذه الميزة حديثة ولا تزال تجريبية إلى حد ما - يرجى إرسال مشكلة إذا واجهتك أي أخطاء أثناء استخدامها! + +### متى يجب استخدام to_tf_dataset + +قد يلاحظ القارئ المتمعن في هذه المرحلة أننا قدمنا نهجين لتحقيق نفس الهدف - إذا كنت تريد تمرير مجموعة البيانات إلى نموذج TensorFlow، فيمكنك إما تحويل مجموعة البيانات إلى `Tensor` أو `dict` من `Tensors` باستخدام `.with_format('tf')`، أو يمكنك تحويل مجموعة البيانات إلى `tf.data.Dataset` مع `to_tf_dataset()`. يمكن تمرير أي منهما إلى `model.fit()`، لذلك أيهما يجب أن تختار؟ + +الشيء الرئيسي الذي يجب إدراكه هو أنه عند تحويل مجموعة البيانات بأكملها إلى مصفوفات، تكون ثابتة ومحملة بالكامل في ذاكرة الوصول العشوائي. على الرغم من أن هذا بسيط وملائم، إلا أنه إذا انطبق أي مما يلي، فيجب عليك على الأرجح استخدام `to_tf_dataset()` بدلاً من ذلك: + +- مجموعة البيانات كبيرة جدًا بحيث لا يمكن وضعها في ذاكرة الوصول العشوائي. `to_tf_dataset()` يبث دفعة واحدة فقط في كل مرة، لذلك حتى مجموعات البيانات الكبيرة جدًا يمكن التعامل معها بهذه الطريقة. + +- تريد تطبيق تحويلات عشوائية باستخدام `dataset.with_transform()` أو `collate_fn`. هذا أمر شائع في عدة طرائق، مثل الزيادات الصورية عند تدريب نماذج الرؤية، أو التعتيم العشوائي عند تدريب نماذج اللغة المعتمة. سيؤدي استخدام `to_tf_dataset()` إلى تطبيق هذه التحولات في اللحظة التي يتم فيها تحميل دفعة، مما يعني أن العينات نفسها ستحصل على زيادات مختلفة في كل مرة يتم تحميلها فيها. هذا هو ما تريده عادة. + +- تحتوي بياناتك على بُعد متغير، مثل النصوص المدخلة في NLP التي تتكون من أعداد متغيرة من الرموز. عند إنشاء دفعة بعينات ذات بُعد متغير، يتمثل الحل القياسي في إضافة وسائد إلى العينات الأقصر لتتناسب مع طول العينة الأطول. عند بث العينات من مجموعة بيانات باستخدام `to_tf_dataset`، يمكنك تطبيق هذه الوسادة على كل دفعة عبر `collate_fn` الخاص بك. ومع ذلك، إذا كنت تريد تحويل مثل هذه المجموعة من البيانات إلى مصفوفات كثيفة، فسيتعين عليك إضافة وسائد إلى العينات لتتناسب مع طول العينة الأطول في *مجموعة البيانات بأكملها!* يمكن أن يؤدي هذا إلى كميات هائلة من الوسائد، مما يهدر الذاكرة ويقلل من سرعة نموذجك. + +### التحذيرات والقيود + +في الوقت الحالي، يعيد `to_tf_dataset()` دائماً مجموعة بيانات مجمعة - وسنضيف دعمًا لمجموعات البيانات غير المجمعة قريبًا \ No newline at end of file diff --git a/docs/source/_config.py b/docs/source/en/_config.py similarity index 100% rename from docs/source/_config.py rename to docs/source/en/_config.py diff --git a/docs/source/en/_redirects.yml b/docs/source/en/_redirects.yml new file mode 100644 index 00000000000..606a00ea1cc --- /dev/null +++ b/docs/source/en/_redirects.yml @@ -0,0 +1,13 @@ +# This first_section was backported from nginx +loading_datasets: loading +share_dataset: share +quicktour: quickstart +dataset_streaming: stream +torch_tensorflow: use_dataset +splits: loading#slice-splits +processing: process +faiss_and_ea: faiss_es +features: about_dataset_features +exploring: access +package_reference/logging_methods: package_reference/utilities +# end of first_section diff --git a/docs/source/_toctree.yml b/docs/source/en/_toctree.yml similarity index 100% rename from docs/source/_toctree.yml rename to docs/source/en/_toctree.yml diff --git a/docs/source/about_arrow.md b/docs/source/en/about_arrow.md similarity index 100% rename from docs/source/about_arrow.md rename to docs/source/en/about_arrow.md diff --git a/docs/source/about_cache.mdx b/docs/source/en/about_cache.mdx similarity index 100% rename from docs/source/about_cache.mdx rename to docs/source/en/about_cache.mdx diff --git a/docs/source/about_dataset_features.mdx b/docs/source/en/about_dataset_features.mdx similarity index 100% rename from docs/source/about_dataset_features.mdx rename to docs/source/en/about_dataset_features.mdx diff --git a/docs/source/about_dataset_load.mdx b/docs/source/en/about_dataset_load.mdx similarity index 100% rename from docs/source/about_dataset_load.mdx rename to docs/source/en/about_dataset_load.mdx diff --git a/docs/source/about_map_batch.mdx b/docs/source/en/about_map_batch.mdx similarity index 100% rename from docs/source/about_map_batch.mdx rename to docs/source/en/about_map_batch.mdx diff --git a/docs/source/about_mapstyle_vs_iterable.mdx b/docs/source/en/about_mapstyle_vs_iterable.mdx similarity index 100% rename from docs/source/about_mapstyle_vs_iterable.mdx rename to docs/source/en/about_mapstyle_vs_iterable.mdx diff --git a/docs/source/access.mdx b/docs/source/en/access.mdx similarity index 100% rename from docs/source/access.mdx rename to docs/source/en/access.mdx diff --git a/docs/source/audio_dataset.mdx b/docs/source/en/audio_dataset.mdx similarity index 100% rename from docs/source/audio_dataset.mdx rename to docs/source/en/audio_dataset.mdx diff --git a/docs/source/audio_load.mdx b/docs/source/en/audio_load.mdx similarity index 100% rename from docs/source/audio_load.mdx rename to docs/source/en/audio_load.mdx diff --git a/docs/source/audio_process.mdx b/docs/source/en/audio_process.mdx similarity index 100% rename from docs/source/audio_process.mdx rename to docs/source/en/audio_process.mdx diff --git a/docs/source/cache.mdx b/docs/source/en/cache.mdx similarity index 100% rename from docs/source/cache.mdx rename to docs/source/en/cache.mdx diff --git a/docs/source/cli.mdx b/docs/source/en/cli.mdx similarity index 100% rename from docs/source/cli.mdx rename to docs/source/en/cli.mdx diff --git a/docs/source/create_dataset.mdx b/docs/source/en/create_dataset.mdx similarity index 100% rename from docs/source/create_dataset.mdx rename to docs/source/en/create_dataset.mdx diff --git a/docs/source/dataset_card.mdx b/docs/source/en/dataset_card.mdx similarity index 100% rename from docs/source/dataset_card.mdx rename to docs/source/en/dataset_card.mdx diff --git a/docs/source/dataset_script.mdx b/docs/source/en/dataset_script.mdx similarity index 100% rename from docs/source/dataset_script.mdx rename to docs/source/en/dataset_script.mdx diff --git a/docs/source/depth_estimation.mdx b/docs/source/en/depth_estimation.mdx similarity index 100% rename from docs/source/depth_estimation.mdx rename to docs/source/en/depth_estimation.mdx diff --git a/docs/source/faiss_es.mdx b/docs/source/en/faiss_es.mdx similarity index 100% rename from docs/source/faiss_es.mdx rename to docs/source/en/faiss_es.mdx diff --git a/docs/source/filesystems.mdx b/docs/source/en/filesystems.mdx similarity index 100% rename from docs/source/filesystems.mdx rename to docs/source/en/filesystems.mdx diff --git a/docs/source/how_to.md b/docs/source/en/how_to.md similarity index 100% rename from docs/source/how_to.md rename to docs/source/en/how_to.md diff --git a/docs/source/image_classification.mdx b/docs/source/en/image_classification.mdx similarity index 100% rename from docs/source/image_classification.mdx rename to docs/source/en/image_classification.mdx diff --git a/docs/source/image_dataset.mdx b/docs/source/en/image_dataset.mdx similarity index 100% rename from docs/source/image_dataset.mdx rename to docs/source/en/image_dataset.mdx diff --git a/docs/source/image_load.mdx b/docs/source/en/image_load.mdx similarity index 100% rename from docs/source/image_load.mdx rename to docs/source/en/image_load.mdx diff --git a/docs/source/image_process.mdx b/docs/source/en/image_process.mdx similarity index 100% rename from docs/source/image_process.mdx rename to docs/source/en/image_process.mdx diff --git a/docs/source/en/imgs/course_banner.png b/docs/source/en/imgs/course_banner.png new file mode 100644 index 00000000000..45773d164c4 Binary files /dev/null and b/docs/source/en/imgs/course_banner.png differ diff --git a/docs/source/en/imgs/datasets_logo_name.jpg b/docs/source/en/imgs/datasets_logo_name.jpg new file mode 100644 index 00000000000..7162c2c1f22 Binary files /dev/null and b/docs/source/en/imgs/datasets_logo_name.jpg differ diff --git a/docs/source/index.mdx b/docs/source/en/index.mdx similarity index 100% rename from docs/source/index.mdx rename to docs/source/en/index.mdx diff --git a/docs/source/installation.md b/docs/source/en/installation.md similarity index 100% rename from docs/source/installation.md rename to docs/source/en/installation.md diff --git a/docs/source/load_hub.mdx b/docs/source/en/load_hub.mdx similarity index 100% rename from docs/source/load_hub.mdx rename to docs/source/en/load_hub.mdx diff --git a/docs/source/loading.mdx b/docs/source/en/loading.mdx similarity index 100% rename from docs/source/loading.mdx rename to docs/source/en/loading.mdx diff --git a/docs/source/nlp_load.mdx b/docs/source/en/nlp_load.mdx similarity index 100% rename from docs/source/nlp_load.mdx rename to docs/source/en/nlp_load.mdx diff --git a/docs/source/nlp_process.mdx b/docs/source/en/nlp_process.mdx similarity index 100% rename from docs/source/nlp_process.mdx rename to docs/source/en/nlp_process.mdx diff --git a/docs/source/object_detection.mdx b/docs/source/en/object_detection.mdx similarity index 100% rename from docs/source/object_detection.mdx rename to docs/source/en/object_detection.mdx diff --git a/docs/source/package_reference/builder_classes.mdx b/docs/source/en/package_reference/builder_classes.mdx similarity index 100% rename from docs/source/package_reference/builder_classes.mdx rename to docs/source/en/package_reference/builder_classes.mdx diff --git a/docs/source/package_reference/loading_methods.mdx b/docs/source/en/package_reference/loading_methods.mdx similarity index 100% rename from docs/source/package_reference/loading_methods.mdx rename to docs/source/en/package_reference/loading_methods.mdx diff --git a/docs/source/package_reference/main_classes.mdx b/docs/source/en/package_reference/main_classes.mdx similarity index 100% rename from docs/source/package_reference/main_classes.mdx rename to docs/source/en/package_reference/main_classes.mdx diff --git a/docs/source/package_reference/table_classes.mdx b/docs/source/en/package_reference/table_classes.mdx similarity index 100% rename from docs/source/package_reference/table_classes.mdx rename to docs/source/en/package_reference/table_classes.mdx diff --git a/docs/source/package_reference/task_templates.mdx b/docs/source/en/package_reference/task_templates.mdx similarity index 100% rename from docs/source/package_reference/task_templates.mdx rename to docs/source/en/package_reference/task_templates.mdx diff --git a/docs/source/package_reference/utilities.mdx b/docs/source/en/package_reference/utilities.mdx similarity index 100% rename from docs/source/package_reference/utilities.mdx rename to docs/source/en/package_reference/utilities.mdx diff --git a/docs/source/process.mdx b/docs/source/en/process.mdx similarity index 100% rename from docs/source/process.mdx rename to docs/source/en/process.mdx diff --git a/docs/source/quickstart.mdx b/docs/source/en/quickstart.mdx similarity index 100% rename from docs/source/quickstart.mdx rename to docs/source/en/quickstart.mdx diff --git a/docs/source/repository_structure.mdx b/docs/source/en/repository_structure.mdx similarity index 100% rename from docs/source/repository_structure.mdx rename to docs/source/en/repository_structure.mdx diff --git a/docs/source/semantic_segmentation.mdx b/docs/source/en/semantic_segmentation.mdx similarity index 100% rename from docs/source/semantic_segmentation.mdx rename to docs/source/en/semantic_segmentation.mdx diff --git a/docs/source/share.mdx b/docs/source/en/share.mdx similarity index 100% rename from docs/source/share.mdx rename to docs/source/en/share.mdx diff --git a/docs/source/stream.mdx b/docs/source/en/stream.mdx similarity index 100% rename from docs/source/stream.mdx rename to docs/source/en/stream.mdx diff --git a/docs/source/tabular_load.mdx b/docs/source/en/tabular_load.mdx similarity index 100% rename from docs/source/tabular_load.mdx rename to docs/source/en/tabular_load.mdx diff --git a/docs/source/troubleshoot.mdx b/docs/source/en/troubleshoot.mdx similarity index 100% rename from docs/source/troubleshoot.mdx rename to docs/source/en/troubleshoot.mdx diff --git a/docs/source/tutorial.md b/docs/source/en/tutorial.md similarity index 100% rename from docs/source/tutorial.md rename to docs/source/en/tutorial.md diff --git a/docs/source/upload_dataset.mdx b/docs/source/en/upload_dataset.mdx similarity index 100% rename from docs/source/upload_dataset.mdx rename to docs/source/en/upload_dataset.mdx diff --git a/docs/source/use_dataset.mdx b/docs/source/en/use_dataset.mdx similarity index 100% rename from docs/source/use_dataset.mdx rename to docs/source/en/use_dataset.mdx diff --git a/docs/source/use_with_jax.mdx b/docs/source/en/use_with_jax.mdx similarity index 100% rename from docs/source/use_with_jax.mdx rename to docs/source/en/use_with_jax.mdx diff --git a/docs/source/use_with_pytorch.mdx b/docs/source/en/use_with_pytorch.mdx similarity index 100% rename from docs/source/use_with_pytorch.mdx rename to docs/source/en/use_with_pytorch.mdx diff --git a/docs/source/use_with_spark.mdx b/docs/source/en/use_with_spark.mdx similarity index 100% rename from docs/source/use_with_spark.mdx rename to docs/source/en/use_with_spark.mdx diff --git a/docs/source/use_with_tensorflow.mdx b/docs/source/en/use_with_tensorflow.mdx similarity index 100% rename from docs/source/use_with_tensorflow.mdx rename to docs/source/en/use_with_tensorflow.mdx