Datasets documentation
Cargar datos de pdf
Cargar datos de pdf
La compatibilidad con PDF es experimental y está sujeta a cambios.
Los conjuntos de datos Pdf tienen columnas de tipo Pdf, que contienen objetos pdfplumber.
Para trabajar con conjuntos de datos en pdf, necesitas tener instalado el paquete
pdfplumber. Consulta la guía de instalación para aprender a instalarlo.
Cuando cargas un conjunto de datos pdf y llamas a la columna pdf, los pdf se decodifican como Pdf de pdfplumber:
>>> from datasets import load_dataset, Pdf
>>> dataset = load_dataset("path/to/pdf/folder", split="train")
>>> dataset[0]["pdf"]
<pdfplumber.pdf.PDF at 0x1075bc320>Índice en un conjunto de datos de pdf usando primero el índice de fila y luego la columna
dataset[0]["pdf"]- para evitar crear todos los objetos pdf del conjunto de datos. De lo contrario, este puede ser un proceso lento y que consume mucho tiempo si tiene un conjunto de datos grande.
Para una guía sobre cómo cargar cualquier tipo de conjunto de datos, consulte la guía general de carga.
Leer páginas
Acceda a páginas directamente desde un pdf usando el atributo .pages.
Luego puedes usar las funciones de pdfplumber para leer textos, tablas e imágenes, por ejemplo:
>>> 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()
[]También puedes cargar cada página como una 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>Tenga en cuenta que puede pasar resolution= a .to_image() para renderizar la imagen en una resolución más alta que la predeterminada (72 ppi).
Archivos locales
Puedes cargar un conjunto de datos desde la ruta del pdf. Usa la función cast_column() para aceptar una columna de rutas de archivos pdf y decodificarla en un pdf de pdfplumber con la función 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>Si solo desea cargar la ruta subyacente del conjunto de datos pdf sin decodificar el objeto pdf, establezca decode=False en la función Pdf:
>>> dataset = dataset.cast_column("pdf", Pdf(decode=False))
>>> dataset[0]["pdf"]
{'bytes': None,
'path': 'path/to/pdf/folder/pdf0.pdf'}PdfFolder
También puede cargar un conjunto de datos con el creador de conjuntos de datos PdfFolder, que no requiere escribir un dataloader personalizado. Esto hace que PdfFolder sea ideal para crear y cargar rápidamente conjuntos de datos de pdf con varios miles de pdf para diferentes tareas de visión. La estructura de su conjunto de datos de pdf debe ser así:
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.pdfSi el conjunto de datos sigue la estructura PdfFolder, puede cargarlo directamente con load_dataset():
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_name")
>>> # OR locally:
>>> dataset = load_dataset("/path/to/folder")Para conjuntos de datos locales, esto es equivalente a pasar pdffolder manualmente en load_dataset() y el directorio en data_dir:
>>> dataset = load_dataset("pdffolder", data_dir="/path/to/folder")Luego puedes acceder a los PDF 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 la información en el archivo de metadatos, establezca drop_metadata=True en load_dataset():
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_with_metadata", drop_metadata=True)Si no tiene un archivo de metadatos, PdfFolder infiere automáticamente el nombre de la etiqueta a partir del nombre del directorio.
Si desea eliminar las etiquetas creadas automáticamente, establezca drop_labels=True.
En este caso, su conjunto de datos solo contendrá una columna pdf:
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_without_metadata", drop_labels=True)Por último, el argumento filters permite cargar solo un subconjunto del conjunto de datos, basado en una condición sobre la etiqueta o los metadatos. Esto es especialmente útil si los metadatos están en formato Parquet, ya que este formato permite un filtrado rápido. También se recomienda usar este argumento con streaming=True, porque por defecto el conjunto de datos se descarga por completo antes de aplicar el filtrado.
>>> filters = [("label", "=", 0)]
>>> dataset = load_dataset("username/dataset_name", streaming=True, filters=filters)Para obtener más información sobre la creación de tu propio conjunto de datos
PdfFolder, consulta la guía Create a pdf dataset.
Decodificación de PDF
Por defecto, los PDF se decodifican de forma secuencial como PDFs de pdfplumber cuando se itera sobre un conjunto de datos.
Se decodifica secuencialmente la metadatos de los PDF y no se leen las páginas del PDF hasta que se accede a ellas.
Sin embargo, es posible acelerar significativamente el conjunto de datos mediante la decodificación multihilo:
>>> 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 !
... ...Puede habilitar el multihilo usando num_threads. Esto es especialmente útil para acelerar el streaming de datos remotos.
Sin embargo, puede ser más lento que num_threads=0 para datos locales en discos rápidos.
Si no le interesan los documentos decodificados como PDFs de pdfplumber y prefiere acceder a la ruta/bytes en su lugar, puede deshabilitar la decodificación:
>>> dataset = dataset.decode(False)Nota: IterableDataset.decode() solo está disponible actualmente para conjuntos de datos en streaming.
Update on GitHub