Datasets documentation
تحميل بيانات pdf
تحميل بيانات pdf
دعم ملفات Pdf تجريبي وقد يخضع للتغيير.
تحتوي مجموعات بيانات Pdf على أعمدة من نوع Pdf، والتي تتضمن كائنات pdfplumber.
للتعامل مع مجموعات بيانات pdf، يجب أن يكون حزمة
pdfplumberمثبّتة. اطّلع على دليل التثبيت لمعرفة كيفية تثبيتها.
عند تحميل مجموعة بيانات pdf واستدعاء عمود pdf، يتم فك ترميز ملفات pdf كـ pdfplumber Pdfs:
>>> from datasets import load_dataset, Pdf
>>> dataset = load_dataset("path/to/pdf/folder", split="train")
>>> dataset[0]["pdf"]
<pdfplumber.pdf.PDF at 0x1075bc320>استخدم فهرس الصف أولاً ثم عمود
dataset[0]["pdf"]- لتجنب إنشاء جميع كائنات pdf في مجموعة البيانات. وإلا، فقد يكون هذا الأمر بطيئاً ومستهلكاً للوقت إذا كانت لديك مجموعة بيانات كبيرة.
للاطلاع على دليل حول كيفية تحميل أي نوع من مجموعات البيانات، راجع دليل التحميل العام.
قراءة الصفحات
يمكنك الوصول إلى الصفحات مباشرةً من ملف pdf باستخدام خاصية .pages.
ثم يمكنك استخدام دوال pdfplumber لقراءة النصوص والجداول والصور، على سبيل المثال:
>>> pdf = dataset[0]["pdf"]
>>> first_page = pdf.pages[0]
>>> first_page
<Page:1>
>>> first_page.extract_text()
Docling Technical Report
Version1.0
ChristophAuer MaksymLysak AhmedNassar MicheleDolfi NikolaosLivathinos
PanosVagenas CesarBerrospiRamis MatteoOmenetti FabianLindlbauer
KasperDinkla LokeshMishra YusikKim ShubhamGupta RafaelTeixeiradeLima
ValeryWeber LucasMorin IngmarMeijer ViktorKuropiatnyk PeterW.J.Staar
AI4KGroup,IBMResearch
Ru¨schlikon,Switzerland
Abstract
This technical report introduces Docling, an easy to use, self-contained, MIT-
licensed open-source package for PDF document conversion.
...
>>> first_page.images
In [24]: first_page.images
Out[24]:
[{'x0': 256.5,
'y0': 621.0,
'x1': 355.49519999999995,
'y1': 719.9952,
'width': 98.99519999999995,
'height': 98.99519999999995,
'name': 'Im1',
'stream': <PDFStream(44): raw=88980, {'Type': /'XObject', 'Subtype': /'Image', 'BitsPerComponent': 8, 'ColorSpace': /'DeviceRGB', 'Filter': /'DCTDecode', 'Height': 1024, 'Length': 88980, 'Width': 1024}>,
'srcsize': (1024, 1024),
'imagemask': None,
'bits': 8,
'colorspace': [/'DeviceRGB'],
'mcid': None,
'tag': None,
'object_type': 'image',
'page_number': 1,
'top': 72.00480000000005,
'bottom': 171.0,
'doctop': 72.00480000000005}]
>>> first_page.extract_tables()
[]يمكنك أيضًا تحميل كل صفحة كـPIL.Image:
>>> import PIL.Image
>>> import io
>>> first_page.to_image()
<pdfplumber.display.PageImage at 0x107d68dd0>
>>> buffer = io.BytesIO()
>>> first_page.to_image().save(buffer)
>>> img = PIL.Image.open(buffer)
>>> img
<PIL.PngImagePlugin.PngImageFile image mode=P size=612x792>لاحظ أنه يمكنك تمرير resolution= إلى .to_image() لعرض الصورة بدقة أعلى من القيمة الافتراضية (72 ppi).
الملفات المحلية
يمكنك تحميل مجموعة بيانات من مسار ملف pdf. استخدم دالة cast_column() لقبول عمود يحتوي على مسارات ملفات pdf، وفكّ تشفيره إلى pdf باستخدام pdfplumber مع ميزة Pdf:
>>> from datasets import Dataset, Pdf
>>> dataset = Dataset.from_dict({"pdf": ["path/to/pdf_1", "path/to/pdf_2", ..., "path/to/pdf_n"]}).cast_column("pdf", Pdf())
>>> dataset[0]["pdf"]
<pdfplumber.pdf.PDF at 0x1657d0280>إذا كنت ترغب فقط في تحميل المسار الأساسي لبيانات pdf دون فك ترميز كائن pdf، فاضبط decode=False في ميزة Pdf:
>>> dataset = dataset.cast_column("pdf", Pdf(decode=False))
>>> dataset[0]["pdf"]
{'bytes': None,
'path': 'path/to/pdf/folder/pdf0.pdf'}PdfFolder
يمكنك أيضًا تحميل مجموعة بيانات باستخدام منشئ مجموعات البيانات PdfFolder الذي لا يتطلب كتابة مُحمِّل بيانات مخصص. وهذا يجعل PdfFolder مثاليًا لإنشاء وتحميل مجموعات بيانات pdf بسرعة تحتوي على آلاف ملفات pdf لمهام الرؤية المختلفة. يجب أن يبدو هيكل مجموعة بيانات pdf الخاصة بك على النحو التالي:
folder/train/resume/0001.pdf
folder/train/resume/0002.pdf
folder/train/resume/0003.pdf
folder/train/invoice/0001.pdf
folder/train/invoice/0002.pdf
folder/train/invoice/0003.pdfإذا اتبع مجموعة البيانات بنية PdfFolder، فيمكنك تحميلها مباشرةً باستخدام load_dataset():
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_name")
>>> # OR locally:
>>> dataset = load_dataset("/path/to/folder")بالنسبة إلى مجموعات البيانات المحلية، يعادل هذا تمرير pdffolder يدويًا في load_dataset() والمجلد في data_dir:
>>> dataset = load_dataset("pdffolder", data_dir="/path/to/folder")ثم يمكنك الوصول إلى ملفات PDF ككائنات pdfplumber.pdf.PDF:
>>> dataset["train"][0]
{"pdf": <pdfplumber.pdf.PDF at 0x161715e50>, "label": 0}
>>> dataset["train"][-1]
{"pdf": <pdfplumber.pdf.PDF at 0x16170bd90>, "label": 1}لتجاهل المعلومات في ملف البيانات الوصفية، اضبط drop_metadata=True في load_dataset():
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_with_metadata", drop_metadata=True)إذا لم يكن لديك ملف بيانات وصفية، يستنتج PdfFolder تلقائيًا اسم التسمية من اسم المجلد.
إذا كنت ترغب في إسقاط التسميات المُنشأة تلقائيًا، اضبط drop_labels=True.
في هذه الحالة، لن يحتوي مجموعة البيانات الخاصة بك إلا على عمود pdf:
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_without_metadata", drop_labels=True)وأخيرًا، يتيح لك الحجة filters تحميل مجموعة فرعية فقط من مجموعة البيانات، بناءً على شرط يتعلق بالتسمية أو البيانات الوصفية. وهذا مفيد بشكل خاص إذا كانت البيانات الوصفية بصيغة Parquet، لأن هذه الصيغة تتيح التصفية السريعة. كما يُنصح باستخدام هذه الحجة مع streaming=True، لأن مجموعة البيانات تُحمَّل بالكامل قبل التصفية افتراضيًا.
>>> filters = [("label", "=", 0)]
>>> dataset = load_dataset("username/dataset_name", streaming=True, filters=filters)لمزيد من المعلومات حول إنشاء مجموعة بيانات
PdfFolderخاصة بك، راجع دليل إنشاء مجموعة بيانات pdf.
فك ترميز ملفات PDF
بشكل افتراضي، يتم فك ترميز ملفات pdf بشكل تسلسلي كـ PDFs من pdfplumber عند تكرار مجموعة بيانات.
فإنه يفك ترميز البيانات الوصفية لملفات pdf بشكل تسلسلي، ولا يقرأ صفحات pdf حتى تقوم بالوصول إليها.
ومع ذلك، من الممكن تسريع مجموعة البيانات بشكل كبير باستخدام فك الترميز متعدد الخيوط:
>>> import os
>>> num_threads = num_threads = min(32, (os.cpu_count() or 1) + 4)
>>> dataset = dataset.decode(num_threads=num_threads)
>>> for example in dataset: # up to 20 times faster !
... ...يمكنك تفعيل تعدد الخيوط باستخدام num_threads. وهذا مفيد بشكل خاص لتسريع بث البيانات عن بُعد.
ومع ذلك، قد يكون أبطأ من num_threads=0 للبيانات المحلية على الأقراص سريعة.
إذا لم تكن مهتمًا بالوثائق المُفكَّكة بصيغة PDFs باستخدام pdfplumber، وأردت الوصول إلى المسار/البايتات بدلاً من ذلك، يمكنك تعطيل فك الترميز:
>>> dataset = dataset.decode(False)ملاحظة: IterableDataset.decode() متاح حاليًا فقط لمجموعات البيانات التي يتم بثها.
Update on GitHub