Datasets documentation

Carregar dados de PDF

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Carregar dados de PDF

O suporte a PDF é experimental e está sujeito a alterações.

Os conjuntos de dados Pdf possuem colunas do tipo Pdf, que contêm objetos pdfplumber.

Para trabalhar com conjuntos de dados em PDF, é necessário ter o pacote pdfplumber instalado. Consulte o guia de instalação para aprender como instalá-lo.

Ao carregar um conjunto de dados em PDF e chamar a coluna pdf, os PDFs são decodificados como PDFs do pdfplumber:

>>> from datasets import load_dataset, Pdf

>>> dataset = load_dataset("path/to/pdf/folder", split="train")
>>> dataset[0]["pdf"]
<pdfplumber.pdf.PDF at 0x1075bc320>

Acesse um conjunto de dados de PDF usando primeiro o índice da linha e depois a coluna pdf - dataset[0]["pdf"] - para evitar a criação de todos os objetos de PDF no conjunto de dados. Caso contrário, isso pode ser um processo lento e demorado se você tiver um conjunto de dados grande.

Para um guia sobre como carregar qualquer tipo de conjunto de dados, consulte o guia de carregamento geral.

Ler páginas

Acesse páginas diretamente de um pdf usando o atributo .pages.

Em seguida, você pode usar as funções do pdfplumber para ler textos, tabelas e imagens, por exemplo:

>>> 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()
[]

Você também pode carregar cada página como uma 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>

Observe que você pode passar resolution= para .to_image() para renderizar a imagem em uma resolução maior que o padrão (72 ppi).

Arquivos locais

Você pode carregar um dataset a partir do caminho do pdf. Use a função cast_column() para aceitar uma coluna de caminhos de arquivos pdf e decodificá-la em um pdf pdfplumber com o recurso 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>

Se você deseja apenas carregar o caminho subjacente do conjunto de dados em PDF sem decodificar o objeto PDF, defina decode=False no recurso Pdf:

>>> dataset = dataset.cast_column("pdf", Pdf(decode=False))
>>> dataset[0]["pdf"]
{'bytes': None,
 'path': 'path/to/pdf/folder/pdf0.pdf'}

PdfFolder

Você também pode carregar um conjunto de dados com um construtor de conjunto de dados PdfFolder, que não exige a criação de um dataloader personalizado. Isso torna o PdfFolder ideal para criar e carregar rapidamente conjuntos de dados de pdf com vários milhares de pdfs para diferentes tarefas de visão. A estrutura do seu conjunto de dados de pdf deve ser assim:

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

Se o conjunto de dados seguir a estrutura PdfFolder, você pode carregá-lo diretamente com load_dataset():

>>> from datasets import load_dataset

>>> dataset = load_dataset("username/dataset_name")
>>> # OR locally:
>>> dataset = load_dataset("/path/to/folder")

Para conjuntos de dados locais, isso é equivalente a passar pdffolder manualmente em load_dataset() e o diretório em data_dir:

>>> dataset = load_dataset("pdffolder", data_dir="/path/to/folder")

Em seguida, você pode acessar os PDFs como objetos 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}

Para ignorar as informações no arquivo de metadados, defina drop_metadata=True em load_dataset():

>>> from datasets import load_dataset

>>> dataset = load_dataset("username/dataset_with_metadata", drop_metadata=True)

Se você não tiver um arquivo de metadados, o PdfFolder infere automaticamente o nome do rótulo a partir do nome do diretório. Se você quiser descartar os rótulos criados automaticamente, defina drop_labels=True. Nesse caso, seu conjunto de dados conterá apenas uma coluna pdf:

>>> from datasets import load_dataset

>>> dataset = load_dataset("username/dataset_without_metadata", drop_labels=True)

Por fim, o argumento filters permite carregar apenas um subconjunto do conjunto de dados, com base em uma condição sobre o rótulo ou os metadados. Isso é especialmente útil se os metadados estiverem em formato Parquet, pois esse formato permite filtragem rápida. Também é recomendado usar este argumento com streaming=True, porque, por padrão, o conjunto de dados é totalmente baixado antes da filtragem.

>>> filters = [("label", "=", 0)]
>>> dataset = load_dataset("username/dataset_name", streaming=True, filters=filters)

Para mais informações sobre a criação do seu próprio conjunto de dados PdfFolder, consulte o guia Criar um conjunto de dados de PDF.

Decodificação de PDF

By default, pdfs are decoded sequentially as pdfplumber PDFs when you iterate on a dataset. It sequentially decodes the metadata of the pdfs, and doesn’t read the pdf pages until you access them.

No entanto, é possível acelerar significativamente o conjunto de dados usando decodificação multithreaded:

>>> 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 !
...     ...

Você pode habilitar a multithreading usando num_threads. Isso é especialmente útil para acelerar o streaming de dados remotos. No entanto, pode ser mais lento que num_threads=0 para dados locais em discos rápidos.

Se você não se interessa pelos documentos decodificados como PDFs pelo pdfplumber e deseja acessar o caminho/bytes em vez disso, você pode desabilitar a decodificação:

>>> dataset = dataset.decode(False)

Observação: IterableDataset.decode() está disponível apenas para datasets em streaming no momento.

Update on GitHub