Datasets documentation

Carregar dados de PDF

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v4.8.4).
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