Datasets documentation
تحميل
تحميل
يمكن تخزين بياناتك في أماكن مختلفة؛ فقد تكون على قرص جهازك المحلي، أو في مستودع Github، أو في هياكل بيانات في الذاكرة مثل قواميس Python وأطارات بيانات Pandas. أينما كان موقع مجموعة البيانات، يمكن لـ 🤗 Datasets مساعدتك في تحميلها.
ستُظهر لك هذه الدليل كيفية تحميل مجموعة بيانات من:
- مركز هافينغ فاس
- الملفات المحلية
- البيانات في الذاكرة
- دون اتصال
- شريحة محددة من تقسيم
لمزيد من التفاصيل الخاصة بتحميل أنماط بيانات أخرى، راجع دليل تحميل مجموعة بيانات الصوت، ودليل تحميل مجموعة بيانات الصور، ودليل تحميل مجموعة بيانات الفيديو، ودليل تحميل مجموعة بيانات الشبكات، ودليل تحميل مجموعة بيانات النص، أو دليل تحميل مهام تقييم الوكلاء.
Hugging Face Hub
يمكنك أيضًا تحميل مجموعة بيانات من أي مستودع مجموعات بيانات على الـ Hub! ابدأ بـ إنشاء مستودع مجموعة بيانات ثم ارفع ملفات بياناتك. الآن يمكنك استخدام دالة load_dataset() لتحميل مجموعة البيانات.
على سبيل المثال، جرّب تحميل الملفات من مستودع العرض هذا عن طريق تقديم مساحة أسماء المستودع واسم مجموعة البيانات. يحتوي مستودع مجموعة البيانات هذا على ملفات CSV، ويحمّل الكود أدناه مجموعة البيانات من ملفات CSV:
>>> from datasets import load_dataset
>>> dataset = load_dataset("lhoestq/demo1")قد تحتوي بعض مجموعات البيانات على أكثر من إصدار بناءً على وسوم Git أو الفروع أو الالتزامات. استخدم معامل revision لتحديد إصدار مجموعة البيانات الذي تريد تحميله:
>>> dataset = load_dataset(
... "lhoestq/custom_squad",
... revision="main" # tag name, or branch name, or commit hash
... )راجع شرح رفع مجموعة بيانات إلى Hub لمزيد من التفاصيل حول كيفية إنشاء مستودع مجموعة بيانات على Hub، وكيفية رفع ملفات البيانات الخاصة بك.
تُحمّل مجموعة البيانات افتراضيًا جميع البيانات إلى الجزء train، أو تبحث عن ذكر أسماء الأجزاء في أسماء ملفات البيانات (مثل “train” و “test” و “validation”). استخدم معامل data_files لربط ملفات البيانات بالأجزاء مثل train و validation و test:
>>> 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. يمكن لهذه المعاملات قبول مسار نسبي يُحل إلى المسار الأساسي المقابل للمكان الذي يُحمَّل منه مجموعة البيانات.
>>> from datasets import load_dataset
# load files that match the grep pattern
>>> c4_subset = load_dataset("allenai/c4", data_files="en/c4-train.0000*-of-01024.json.gz")
# load dataset from the en directory on the Hub
>>> c4_subset = load_dataset("allenai/c4", data_dir="en")يمكن أيضًا لمعامل split تعيين ملف بيانات إلى قسم محدد:
>>> data_files = {"validation": "en/c4-validation.*.json.gz"}
>>> c4_validation = load_dataset("allenai/c4", data_files=data_files, split="validation")الملفات المحلية والبعيدة
يمكن تحميل مجموعات البيانات من ملفات محلية مخزنة على حاسوبك ومن ملفات عن بُعد. غالبًا ما تُخزَّن مجموعات البيانات كملف csv أو json أو txt أو parquet أو tsfile. ويمكن لدالة load_dataset() تحميل كلٍّ من هذه الأنواع من الملفات.
CSV
🤗 يمكن لـ Datasets قراءة مجموعة بيانات تتكون من ملف CSV واحد أو عدة ملفات (في هذه الحالة، مرر ملفات CSV الخاصة بك كقائمة):
>>> from datasets import load_dataset
>>> dataset = load_dataset("csv", data_files="my_file.csv")لمزيد من التفاصيل، راجد دليل كيفية تحميل مجموعات البيانات الجدولية من ملفات CSV.
JSON
تُحمَّل ملفات JSON مباشرةً باستخدام load_dataset() كما هو موضح أدناه:
>>> from datasets import load_dataset
>>> dataset = load_dataset("json", data_files="my_file.json")تتميز ملفات JSON بتنسيقات متنوعة، لكننا نعتقد أن الأكثر كفاءة هو تضمين كائنات JSON متعددة؛ حيث يمثل كل سطر صفًا فرديًا من البيانات. على سبيل المثال:
{"a": 1, "b": 2.0, "c": "foo", "d": false}
{"a": 4, "b": -5.5, "c": null, "d": true}تنسيق JSON آخر قد تواجهه هو الحقل المتداخل، وفي هذه الحالة ستحتاج إلى تحديد معامل field كما هو موضح فيما يلي:
{"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 بدلاً من ذلك:
>>> 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:
>>> from datasets import load_dataset
>>> dataset = load_dataset("parquet", data_files={'train': 'train.parquet', 'test': 'test.parquet'})لتحميل ملفات Parquet عن بُعد عبر HTTP، مرر عناوين URL بدلاً من ذلك:
>>> base_url = "https://huggingface.co/datasets/wikimedia/wikipedia/resolve/main/20231101.ab/"
>>> data_files = {"train": base_url + "train-00000-of-00001.parquet"}
>>> wiki = load_dataset("parquet", data_files=data_files, split="train")Arrow
تُخزَّن ملفات Arrow في تنسيق أعمدة في الذاكرة، على عكس التنسيقات القائمة على الصفوف مثل CSV والتنسيقات غير المضغوطة مثل Parquet.
لتحميل ملف Arrow:
>>> from datasets import load_dataset
>>> dataset = load_dataset("arrow", data_files={'train': 'train.arrow', 'test': 'test.arrow'})لتحميل ملفات Arrow عن بُعد عبر HTTP، مرر عناوين URL بدلاً من ذلك:
>>> base_url = "https://huggingface.co/datasets/croissantllm/croissant_dataset/resolve/main/english_660B_11/"
>>> data_files = {"train": base_url + "train/data-00000-of-00080.arrow"}
>>> wiki = load_dataset("arrow", data_files=data_files, split="train")Arrow is the file format used by 🤗 Datasets under the hood, therefore you can load a local Arrow file using Dataset.from_file() directly:
>>> from datasets import Dataset
>>> dataset = Dataset.from_file("data.arrow")على عكس load_dataset()، يقوم Dataset.from_file() بتعيين ملف Arrow في الذاكرة دون إعداد مجموعة البيانات في ذاكرة التخزين المؤقت، مما يوفر لك مساحة القرص. في هذه الحالة، ستكون مجلد التخزين المؤقت لتخزين نتائج المعالجة الوسيطة هو مجلد ملف Arrow.
حاليًا، يُدعم فقط تنسيق Arrow للبث. ولا يُدعم تنسيق ملفات Arrow IPC (المعروف أيضًا باسم Feather V2).
Lance
Lance هو تنسيق جداول مفتوح المصدر متعدد الوسائط لخزانات البيانات (lakehouse) مخصص للذكاء الاصطناعي. يمكن لجداول Lance تخزين القيم النصية والقياسية بشكل أصلي، بالإضافة إلى الكائنات الثنائية الكبيرة (blobs) مثل الصور والصوت والفيديو، جنبًا إلى جنب مع بياناتك الجدولية.
>>> from datasets import load_dataset
>>> lance_base_url = "lance-format/laion-1m"لتبثّ مجموعة البيانات دون نسخها إلى جهازك المحلي، حدّد معامل streaming=True:
ds = load_dataset(lance_base_url, split="train", streaming=True)
# Take first three rows
for row in ds.take(3):
print(row["caption"], row["image"])سيُعيد هذا وصف الصورة وبيانات الصورة في طلب واحد.
Vortex
Vortex هو تنسيق ملفات عمودي مصمم للعمليات المسحية السريعة على البيانات المضغوطة. ثبّته باستخدام pip install vortex-data، ثم حمّل ملفات .vortex كما تفعل مع أي تنسيق آخر:
>>> from datasets import load_dataset
>>> dataset = load_dataset("vortex", data_files="data.vortex", split="train")تُمرَّر الأعمدة والفلاتر إلى عملية المسح في Vortex، بحيث تُقرأ الصفوف والأعمدة المطلوبة فقط. ويعمل هذا أثناء البث أيضًا، مما يتيح لك تصفية مجموعة بيانات على Hub دون تنزيل الأجزاء التي لا تطابق الشروط:
>>> filters = [("label", "==", 1)]
>>> dataset = load_dataset(vortex_dataset_id, columns=["text", "label"], filters=filters, streaming=True, split="train")تتّبع المرشِّحات نفس الشكل الطبيعي المنفصل (disjunctive normal form) الذي يتّبعه مُحمِّل Parquet: قائمة من الشروط (column, operator, value) تُشكِّل عطفًا (conjunction)، وقائمة من تلك القوائم تُشكِّل فصلًا (disjunction). تتّبع القيم الفارغة (Nulls) دلالات SQL — فالقيمة الفارغة لا تُحقِّق أي مقارنة، لذا لن تُعاد أبدًا أي صف تكون قيمته في العمود المُرشَّح فارغة، بما في ذلك عند استخدام not in. لأي شيء لا يمكن التعبير عنه بهذا الشكل، مرِّر تعبير Vortex بدلاً من ذلك:
>>> import vortex.expr as ve
>>> dataset = load_dataset(vortex_dataset_id, filters=ve.column("score") >= 0.5, split="train")يفتح Vortex الملفات بنفسه بدلاً من المرور عبر fsspec، لذا يمكن أن يشير data_files إلى مسارات محلية، ومجموعات بيانات Hub، والمواقع البعيدة التي يقرأها Vortex بشكل أصلي (HTTP ومخازن الكائنات الشائعة) — لكن ليس داخل الأرشيفات (zip://...) أو بروتوكولات fsspec الحصرية الأخرى.
ملفات HDF5
تُستخدم ملفات HDF5 بشكل شائع لتخزين كميات كبيرة من البيانات الرقمية في الحوسبة العلمية وتعلم الآلة. يشبه تحميل ملفات HDF5 باستخدام 🤗 Datasets تحميل ملفات CSV:
>>> from datasets import load_dataset
>>> dataset = load_dataset("hdf5", data_files="data.h5")لاحظ أن محمّل HDF5 يفترض أن الملف له بنية “جدولية”، أي أن جميع مجموعات البيانات في الملف تحتوي على (نفس عدد) الصفوف في بُعدها الأول.
TsFile
TsFile هو تنسيق ملفات عمودي مصمم لبيانات السلاسل الزمنية، ويُستخدم كطبقة تخزين أصلية في Apache IoTDB. يمثل بشكل أصلي الطوابع الزمنية، ووسوم الأجهزة، ومجالات القياس، ويحافظ على فهرس زمني داخلي يتيح تقليم نطاقات الوقت بكفاءة.
تتوافق كل صف في مجموعة البيانات الناتجة مع جهاز واحد (يُعرَّف بأعمدة TAG الخاصة به)؛ وعمود time وكل عمود FIELD هو عمود قائمة يحتوي على سلسلة زمنية كاملة لذلك الجهاز، مرتبة بترتيب تصاعدي زمني.
لتحميل ملف TsFile:
>>> from datasets import load_dataset
>>> dataset = load_dataset("tsfile", data_files="my_data.tsfile")التصفية حسب نطاق زمني — تُدفع الحدود إلى فهرس الوقت الداخلي في TsFile وتقبل int epochs، وdatetime، وdate، وسلاسل ISO-6601، أو قيم pyarrow timestamp:
>>> from datetime import datetime
>>> dataset = load_dataset(
... "tsfile",
... data_files="my_data.tsfile",
... start_time=datetime(2023, 11, 14),
... end_time=datetime(2023, 11, 15),
... )لمزيد من التفاصيل، راجد دليل كيفية تحميل بيانات TsFile.
Harbor
مجموعات بيانات Harbor هي مجموعات من المهام تُستخدم لتقييم وكلاء الذكاء الاصطناعي.
تتكون من مجلدات بدلاً من ملفات البيانات: كل مهمة هي مجلد يحتوي على ملف إعدادات task.toml وملف instruction.md، بالإضافة إلى بيئتها ومُتحققها وحلّها.
تصف كل صف في مجموعة البيانات الناتجة مهمة واحدة (تعليماتها، وملف task.toml الخاص بها، والملفات المرفقة بها)،
ولا يؤدي تحميلها إلى تشغيل أي شيء:
>>> from datasets import load_dataset
>>> dataset = load_dataset("harborframework/terminal-bench")
>>> dataset["train"][0]["task_id"]
'tasks/atrx-vep-crispr'لمزيد من التفاصيل، راجد دليل كيفية تحميل مهام تقييم الوكلاء.
PDB
PDB (Protein Data Bank) هو التنسيق القديم ذو العرض الثابت لتمثيل الهياكل ثلاثية الأبعاد للماكرو جزيئات. وعلى الرغم من أن mmCIF هو المعيار الحديث، إلا أن PDB لا يزال مستخدماً على نطاق واسع، والعديد من مجموعات البيانات التاريخية موجودة بهذا التنسيق.
كل صف يمثل ملف بنية واحدًا، ويتبع نفس تخطيط المجلدات كما في ImageFolder: حيث تصبح أسماء المجلدات الفرعية تسميات، ويضيف ملف metadata.csv/metadata.jsonl بيانات وصفية لكل بنية. يستخدم عمود structure BioStructure مع format="pdb" ويُفكّك إلى كائن Bio.PDB.Structure.Structure يحتوي على نماذج الملف وسلاسله ومخلفاته وذراته. يتطلب فك الترميز biopython؛ وبدونه، يؤدي الوصول إلى بنية مفكوكة الترميز إلى رفع ImportError.
لتحميل ملفات PDB من مجلد:
>>> from datasets import BioStructure, load_dataset
>>> dataset = load_dataset("pdb", data_dir="path/to/structures")
>>> dataset["train"].features["structure"]
BioStructure(format='pdb', decode=True)للوصول إلى قاموس {"bytes": ..., "path": ...} الأساسي دون فك الترميز أو الحاجة إلى biopython، قم بتحويل العمود باستخدام decode=False:
>>> dataset = dataset.cast_column("structure", BioStructure(format="pdb", decode=False))تُدعَم الامتدادات .pdb و.ent.
SQL
اقرأ محتوى قاعدة البيانات باستخدام from_sql() عن طريق تحديد URI للاتصال بقاعدة بياناتك. يمكنك قراءة أسماء الجداول والاستعلامات على حد سواء:
>>> from datasets import Dataset
# load entire table
>>> dataset = Dataset.from_sql("data_table_name", con="sqlite:///sqlite_file.db")
# load from query
>>> dataset = Dataset.from_sql("SELECT text FROM table WHERE length(text) > 100 LIMIT 10", con="sqlite:///sqlite_file.db")لمزيد من التفاصيل، راجد دليل كيفية تحميل مجموعات البيانات الجدولية من قواعد بيانات SQL.
WebDataset
يعتمد تنسيق WebDataset على أرشيفات TAR وهو مناسب لمجموعات بيانات الصور الكبيرة.
ونظرًا لحجمها، يتم تحميل WebDatasets بشكل عام في وضع البث (باستخدام streaming=True).
يمكنك تحميل WebDataset على النحو التالي:
>>> from datasets import load_dataset
>>>
>>> path = "path/to/train/*.tar"
>>> dataset = load_dataset("webdataset", data_files={"train": path}, split="train", streaming=True)لتحميل مجموعات بيانات ويب عن بُعد عبر HTTP، مرر عناوين URL بدلاً من ذلك:
>>> 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)mmCIF
mmCIF (ملف معلومات البلورات الجزيئية الكبيرة) هو المعيار الحديث لتمثيل البنى الجزيئية الكبيرة ثلاثية الأبعاد، وتستخدمه بنك بيانات البروتين (PDB) منذ عام 2014.
كل صف يمثل ملف بنية واحدًا، ويتبع نفس تخطيط المجلدات كما في ImageFolder: حيث تصبح أسماء المجلدات الفرعية تسميات، ويضيف ملف metadata.csv/metadata.jsonl بيانات وصفية لكل بنية. يستخدم عمود structure BioStructure مع format="mmcif" ويُفكّك إلى كائن Bio.PDB.Structure.Structure يحتوي على نماذج الملف وسلاسله ومخلفاته وذراته. يتطلب فك الترميز biopython؛ وبدونه، يؤدي الوصول إلى بنية مفكوكة الترميز إلى رفع ImportError.
لتحميل ملفات mmCIF من مجلد:
>>> from datasets import BioStructure, load_dataset
>>> dataset = load_dataset("mmcif", data_dir="path/to/structures")
>>> dataset["train"].features["structure"]
BioStructure(format='mmcif', decode=True)للوصول إلى قاموس {"bytes": ..., "path": ...} الأساسي دون فك الترميز أو الحاجة إلى biopython، قم بتحويل العمود باستخدام decode=False:
>>> dataset = dataset.cast_column("structure", BioStructure(format="mmcif", decode=False))تُدعَم الامتدادات .cif و.mmcif.
GenBank
GenBank هو تنسيق نصي من NCBI لتسلسلات النيوكليوتيدات والبروتينات معًا مع تعليقاتها. تستخدم الملفات الامتداد .gb أو .gbk أو .genbank (مع الضغط اختياريًا)، ويتم فك ترميز قسم FEATURES في كل سجل إلى كائنات منظمة.
إلى جانب الأعمدة المُحلَّلة خفيفة الوزن، تتضمن كل صف عمود record من النوع BioSequence(format="genbank")، والذي يُفكَّك إلى Bio.SeqRecord.SeqRecord عند تثبيت biopython. قم بتحويل هذا العمود إلى BioSequence(format="genbank", decode=False) للوصول إلى بايتات السجل الأصلية على شكل {"bytes": ..., "path": None}، أو احذفه باستخدام columns=[...] لاستخدام الأعمدة المُحلَّلة فقط دون biopython.
لتحميل ملفات GenBank:
>>> from datasets import load_dataset
>>> dataset = load_dataset("genbank", data_files="*.gb", split="train")يمكنك تجربتها على مجموعة بيانات صغيرة تحتوي على سجلات حقيقية من NCBI (أحدها مضغوط بصيغة gzip لإظهار أن الملفات المضغوطة تُحمَّل بشكل شفاف):
>>> from datasets import load_dataset
>>> dataset = load_dataset("ermiaazarkhalili/datasets-genbank-test", data_files="*.gb*", split="train")
>>> dataset[0]["locus_name"], dataset[0]["organism"], dataset[0]["length"]FASTQ
FASTQ هو تنسيق نصي لتخزين تسلسلات النيوكليوتيدات مع درجات جودتها، ويُستخدم على نطاق واسع لبيانات التسلسل عالي الإنتاجية.
تحميل ملف FASTQ:
>>> from datasets import load_dataset
>>> dataset = load_dataset("fastq", data_files="reads.fq")يعيد المُحمِّل خمس أعمدة:
| عمود | النوع | الوصف |
|---|---|---|
id | string | معرّف التسلسل (الكلمة الأولى بعد @) |
description | string | سطر الوصف الكامل (كل ما يلي المعرّف) |
sequence | large_string | تسلسل النيوكليوتيدات |
quality | large_string | درجات الجودة المُرمّزة بتشفير ASCII |
record | BioSequence | مع format="fastq"، تُخزَّن البايتات الأصلية لكل سجل، وتُفكّك إلى SeqRecord من Biopython عند الوصول إليها. |
لا يتطلب قراءة الأعمدة المُحلَّلة استخدام Biopython؛ استبعد record باستخدام columns، أو استخدم dataset.cast_column("record", BioSequence(decode=False)) (المستورد من datasets) للوصول إلى تخزينه {"bytes": ..., "path": None} دون فك الترميز.
تحميل أعمدة محددة فقط:
>>> dataset = load_dataset("fastq", data_files="reads.fq", columns=["sequence", "quality"])تتمّ اكتشاف الملفات المضغوطة (.fq.gz، .fastq.gz، .fq.bz2، .fq.xz) تلقائيًا وفكّ ضغطها.
FASTA
FASTA هو تنسيق نصي لتمثيل تسلسلات النيوكليوتيدات (DNA/RNA) أو تسلسلات الببتيدات (البروتينات)، ويُستخدم على نطاق واسع في المعلوماتية الحيوية.
لتحميل ملف FASTA:
>>> from datasets import load_dataset
>>> dataset = load_dataset("fasta", data_files="sequences.fasta")يعيد هذا مجموعة بيانات بالأعمدة التالية:
id: معرّف التسلسل (الكلمة الأولى بعد>)description: سطر الوصف الكامل (كل ما يلي المعرّف)sequence: التسلسل البيولوجي (حمض نووي ريبوزي منقوص الأكسجين/حمض نووي ريبوزي/بروتين)record: BioSequence معformat="fasta"يخزّن البايتات الأصلية لكل سجل، ويُفكّ ترميزها إلىSeqRecordمن Biopython عند الوصول إليه.
لا يتطلب قراءة الأعمدة المُحلَّلة استخدام Biopython؛ استبعد record باستخدام columns، أو استخدم dataset.cast_column("record", BioSequence(decode=False)) (المستورد من datasets) للوصول إلى تخزينه {"bytes": ..., "path": None} دون فك الترميز.
يمكنك أيضًا تحميل أعمدة محددة فقط:
>>> dataset = load_dataset("fasta", data_files="sequences.fa", columns=["id", "sequence"])تُؤيَّد ملفات FASTA ذات الامتدادات المختلفة: .fa، .fasta، .fna (حمض نووي)، .ffn (نيوكليوتيدات مناطق الجينات)، .faa (حمض أميني)، و.frn (حمض نووي ريبوزي غير مشفر). يتم اكتشاف الملفات المضغوطة (gzip، bzip2، xz) تلقائيًا وفك ضغطها.
الملفات عن بُعد
إذا كانت لديك ملفات عن بُعد على الأرجح مخزنة بصيغة csv أو json أو txt أو parquet أو أي صيغة مدعومة، يمكن لدالة load_dataset() تحميلها إذا حددت مساراتها عن بُعد:
- عناوين
https://للملفات العامة المتوفرة عبر الإنترنت، مثلdata_files=["https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v2.0.json"] - روابط
hf://للملفات في أي مستودع مجموعة بيانات أو دلو تخزين على Hugging Face، على سبيل المثالdata_files=["hf://datasets/karpathy/tinystories-gpt4-clean/tinystories_gpt4_clean.parquet"]أوdata_files=["hf://buckets/julien-c/my-training-bucket/julien/affluence.csv"]
التعدد في المعالجة
عندما يتكوّن مجموعة بيانات من عدة ملفات (نسمّيها “شرائح”)، فمن الممكن تسريع خطوة تنزيل مجموعة البيانات وإعدادها بشكل كبير.
يمكنك تحديد عدد العمليات التي تريد استخدامها لتحضير مجموعة بيانات بالتوازي باستخدام num_proc.
في هذه الحالة، يُمنح كل عملية مجموعة فرعية من الشرائح لتحضيرها:
from datasets import load_dataset
imagenet = load_dataset("timm/imagenet-1k-wds", num_proc=8)
ml_librispeech_spanish = load_dataset("facebook/multilingual_librispeech", "spanish", num_proc=8)البيانات في الذاكرة
🤗 سيتيح لك Datasets أيضًا إنشاء Dataset مباشرة من هياكل بيانات في الذاكرة مثل قواميس Python وأطارات بيانات Pandas.
قاموس بايثون
حمّل قواميس بايثون باستخدام from_dict():
>>> from datasets import Dataset
>>> my_dict = {"a": [1, 2, 3]}
>>> dataset = Dataset.from_dict(my_dict)قائمة Python من القواميس
حمّل قائمة من قواميس بايثون باستخدام from_list():
>>> from datasets import Dataset
>>> my_list = [{"a": 1}, {"a": 2}, {"a": 3}]
>>> dataset = Dataset.from_list(my_list)مولّد بايثون
أنشئ مجموعة بيانات من مولّد بايثون باستخدام from_generator():
>>> from datasets import Dataset
>>> def my_gen():
... for i in range(1, 4):
... yield {"a": i}
...
>>> dataset = Dataset.from_generator(my_gen)يدعم هذا النهج تحميل بيانات أكبر من الذاكرة المتاحة.
يمكنك أيضًا تحديد مجموعة بيانات مجزأة عن طريق تمرير قوائم إلى gen_kwargs:
>>> 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) # shuffles the shards order + uses a shuffle buffer
>>> from torch.utils.data import DataLoader
>>> dataloader = DataLoader(ds.with_format("torch"), num_workers=4) # give each worker a subset of 32/4=8 shardsإطار بيانات Pandas
تحميل إطارات بيانات Pandas باستخدام from_pandas():
>>> from datasets import Dataset
>>> import pandas as pd
>>> df = pd.DataFrame({"a": [1, 2, 3]})
>>> dataset = Dataset.from_pandas(df)لمزيد من التفاصيل، راجد دليل كيفية تحميل مجموعات البيانات الجدولية من إطارات بيانات Pandas.
دون اتصال
حتى في حال عدم توفر اتصال بالإنترنت، لا يزال من الممكن تحميل مجموعة بيانات. طالما أنك قمت بتنزيل مجموعة بيانات من مستودع Hub سابقًا، فيجب أن تكون مخزنة مؤقتًا. وهذا يعني أنه يمكنك إعادة تحميل مجموعة البيانات من التخزين المؤقت واستخدامها دون اتصال.
إذا كنتَ على علم بأنك لن تتمكن من الوصول إلى الإنترنت، يمكنك تشغيل 🤗 Datasets في وضع عدم الاتصال الكامل. وهذا يوفر الوقت لأنه بدلاً من الانتظار حتى تنتهي مهلة تنزيل Dataset builder، سيقوم 🤗 Datasets بالبحث مباشرةً في ذاكرة التخزين المؤقت. اضبط متغير البيئة HF_HUB_OFFLINE على 1 لتفعيل وضع عدم الاتصال الكامل.
تقسيم الشرائح
يمكنك أيضًا اختيار تحميل شرائح محددة فقط من التقسيم. هناك خياران لتقسيم التقسيم: استخدام السلاسل النصية أو واجهة ReadInstruction. السلاسل النصية أكثر إحكامًا وقابلية للقراءة في الحالات البسيطة، بينما يسهل استخدام ReadInstruction مع معاملات التقسيم المتغيرة.
قم بدمج تقسيم train وتقسيم test عن طريق:
>>> train_test_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train+test")اختر صفوفًا محددة من الجزء train:
>>> train_10_20_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[10:20]")أو اختر نسبة من تقسيم باستخدام:
>>> train_10pct_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[:10%]")اختر مجموعة من النسب المئوية من كل تقسيم:
>>> train_10_80pct_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[:10%]+train[-80%:]")وأخيرًا، يمكنك حتى إنشاء تقسيمات مُتحقَّق منها عبر التحقق المتقاطع. يُنشئ المثال أدناه تقسيمات تحقق متقاطع بعشر طيّات. كل مجموعة بيانات التحقق هي جزء بنسبة 10%، بينما تتكون مجموعة بيانات التدريب من الجزء التكميلي المتبقي بنسبة 90%:
>>> val_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split=[f"train[{k}%:{k+10}%]" for k in range(0, 100, 10)])
>>> train_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split=[f"train[:{k}%]+train[{k+10}%:]" for k in range(0, 100, 10)])التقطيع والتقريب بالنسبة المئوية
السلوك الافتراضي هو تقريب الحدود إلى أقرب عدد صحيح للمجموعات التي لا تنقسم حدود الشرائح المطلوبة فيها بالتساوي على 100. كما هو موضح أدناه، قد تحتوي بعض الشرائح على أمثلة أكثر من غيرها. على سبيل المثال، إذا تضمنت مجموعة التدريب التالية 999 سجلاً، فإن:
# 19 records, from 500 (included) to 519 (excluded).
>>> train_50_52_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[50%:52%]")
# 20 records, from 519 (included) to 539 (excluded).
>>> train_52_54_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[52%:54%]")إذا كنت ترغب في تقسيمات متساوية الحجم، فاستخدم تقريب pct1_dropremainder بدلاً من ذلك. يعامل هذا الحدود المئوية المحددة كمضاعفات لـ 1%.
# 18 records, from 450 (included) to 468 (excluded).
>>> train_50_52pct1_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split=datasets.ReadInstruction("train", from_=50, to=52, unit="%", rounding="pct1_dropremainder"))
# 18 records, from 468 (included) to 486 (excluded).
>>> train_52_54pct1_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split=datasets.ReadInstruction("train",from_=52, to=54, unit="%", rounding="pct1_dropremainder"))
# Or equivalently:
>>> train_50_52pct1_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[50%:52%](pct1_dropremainder)")
>>> train_52_54pct1_ds = datasets.load_dataset("ajibawa-2023/General-Stories-Collection", split="train[52%:54%](pct1_dropremainder)")قد يؤدي التقريب
pct1_dropremainderإلى حذف الأمثلة الأخيرة في مجموعة البيانات إذا لم يكن عدد الأمثلة في مجموعتك قابلاً للقسمة على 100.
استكشاف الأخطاء وإصلاحها
في بعض الأحيان، قد تحصل على نتائج غير متوقعة عند تحميل مجموعة بيانات. ومن أكثر المشكلات شيوعًا التي قد تواجهها هي تنزيل مجموعة البيانات يدويًا وتحديد خصائص مجموعة البيانات.
تحديد الميزات
عند إنشاء مجموعة بيانات من ملفات محلية، يتم استنتاج Features تلقائيًا بواسطة Apache Arrow. ومع ذلك، قد لا تتطابق دائمًا ميزات مجموعة البيانات مع توقعاتك، أو قد ترغب في تعريف الميزات بنفسك. يُظهر المثال التالي كيفية إضافة تسميات مخصصة باستخدام ميزة ClassLabel.
ابدأ بتعريف التسميات الخاصة بك باستخدام فئة Features:
>>> class_names = ["sadness", "joy", "love", "anger", "fear", "surprise"]
>>> emotion_features = Features({'text': Value('string'), 'label': ClassLabel(names=class_names)})بعد ذلك، حدد معامل features في load_dataset() باستخدام الميزات التي أنشأتها للتو:
>>> dataset = load_dataset('csv', data_files=file_dict, delimiter=';', column_names=['text', 'label'], features=emotion_features)الآن، عند النظر إلى خصائص مجموعة البيانات الخاصة بك، يمكنك ملاحظة أنها تستخدم التسميات المخصصة التي حددتها:
>>> dataset['train'].features
{'text': Value('string'),
'label': ClassLabel(names=['sadness', 'joy', 'love', 'anger', 'fear', 'surprise'])}