Datasets documentation
Загрузка данных PDF
Загрузка данных PDF
Поддержка PDF является экспериментальной и может быть изменена.
Наборы данных Pdf имеют столбцы типа Pdf, которые содержат объекты pdfplumber.
Для работы с наборами данных в формате PDF необходимо установить пакет
pdfplumber. Ознакомьтесь с руководством по установке, чтобы узнать, как это сделать.
При загрузке датасета pdf и обращении к столбцу pdf файлы pdf декодируются как Pdf из pdfplumber:
>>> from datasets import load_dataset, Pdf
>>> dataset = load_dataset("path/to/pdf/folder", split="train")
>>> dataset[0]["pdf"]
<pdfplumber.pdf.PDF at 0x1075bc320>Обращайтесь к набору данных PDF сначала по индексу строки, а затем по столбцу
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 должна выглядеть следующим образом:
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ознакомьтесь с руководством Create a pdf dataset.
Декодирование 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