Datasets documentation
Carregar dados de PDF
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
pdfplumberinstalado. 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
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.pdfSe 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