Datasets documentation
Charger des données PDF
Charger des données PDF
La prise en charge des PDF est expérimentale et peut évoluer.
Les jeux de données Pdf ont des colonnes de type Pdf, qui contiennent des objets pdfplumber.
Pour travailler avec des jeux de données PDF, vous devez avoir le package
pdfplumberinstallé. Consultez le guide installation pour apprendre comment l'installer.
Lorsque vous chargez un jeu de données pdf et appelez la colonne pdf, les pdf sont décodés en 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>Accédez à un jeu de données PDF en utilisant d'abord l'index de la ligne, puis la colonne
dataset[0]["pdf"]- afin d'éviter de créer tous les objets PDF du jeu de données. Sinon, cela peut être un processus lent et chronophage si vous disposez d'un jeu de données volumineux.
Pour un guide sur la façon de charger n'importe quel type de jeu de données, consultez le guide de chargement général.
Lire les pages
Accédez directement aux pages d'un PDF à l'aide de l'attribut .pages.
Vous pouvez ensuite utiliser les fonctions de pdfplumber pour lire des textes, des tableaux et des images, par exemple :
>>> 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()
[]Vous pouvez également charger chaque page en tant que 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>Notez que vous pouvez passer resolution= à .to_image() pour afficher l'image dans une résolution supérieure à la valeur par défaut (72 ppi).
Fichiers locaux
Vous pouvez charger un jeu de données à partir du chemin d'accès au pdf. Utilisez la fonction cast_column() pour accepter une colonne de chemins d'accès aux fichiers pdf, puis décodez-la en pdf pdfplumber avec la fonctionnalité 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 vous souhaitez uniquement charger le chemin sous-jacent du jeu de données pdf sans décoder l'objet pdf, définissez decode=False dans la fonctionnalité Pdf :
>>> dataset = dataset.cast_column("pdf", Pdf(decode=False))
>>> dataset[0]["pdf"]
{'bytes': None,
'path': 'path/to/pdf/folder/pdf0.pdf'}PdfFolder
Vous pouvez également charger un jeu de données avec le constructeur de jeu de données PdfFolder, qui ne nécessite pas d'écrire un chargeur de données personnalisé. Cela rend PdfFolder idéal pour créer et charger rapidement des jeux de données PDF contenant plusieurs milliers de PDF pour différentes tâches de vision. La structure de votre jeu de données PDF doit ressembler à ceci :
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 le jeu de données suit la structure PdfFolder, vous pouvez le charger directement avec load_dataset() :
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_name")
>>> # OR locally:
>>> dataset = load_dataset("/path/to/folder")Pour les jeux de données locaux, cela équivaut à passer manuellement pdffolder dans load_dataset() et le répertoire dans data_dir :
>>> dataset = load_dataset("pdffolder", data_dir="/path/to/folder")Vous pouvez ensuite accéder aux PDF en tant qu'objets 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}Pour ignorer les informations du fichier de métadonnées, définissez drop_metadata=True dans load_dataset() :
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_with_metadata", drop_metadata=True)Si vous n’avez pas de fichier de métadonnées, PdfFolder infère automatiquement le nom de l’étiquette à partir du nom du répertoire.
Si vous souhaitez supprimer les étiquettes créées automatiquement, définissez drop_labels=True.
Dans ce cas, votre jeu de données ne contiendra qu’une colonne pdf :
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_without_metadata", drop_labels=True)Enfin, l'argument filters permet de charger uniquement un sous-ensemble du jeu de données, en fonction d'une condition sur l'étiquette ou les métadonnées. C'est particulièrement utile si les métadonnées sont au format Parquet, car ce format permet un filtrage rapide. Il est également recommandé d'utiliser cet argument avec streaming=True, car par défaut le jeu de données est entièrement téléchargé avant le filtrage.
>>> filters = [("label", "=", 0)]
>>> dataset = load_dataset("username/dataset_name", streaming=True, filters=filters)Pour plus d'informations sur la création de votre propre jeu de données
PdfFolder, consultez le guide Créer un jeu de données pdf.
Décodage de PDF
Par défaut, les PDF sont décodés séquentiellement en tant que PDFs pdfplumber lorsque vous itérez sur un jeu de données.
Il décode séquentiellement les métadonnées des PDF et ne lit les pages du PDF que lorsque vous y accédez.
Cependant, il est possible d'accélérer considérablement le jeu de données en utilisant un décodage multithreadé :
>>> 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 !
... ...Vous pouvez activer le multithreading à l'aide de num_threads. Cela est particulièrement utile pour accélérer le streaming de données distantes.
Cependant, cela peut être plus lent que num_threads=0 pour des données locales sur des disques rapides.
Si vous n’êtes pas intéressé par les documents décodés en PDFs par pdfplumber et souhaitez plutôt accéder au chemin/aux octets, vous pouvez désactiver le décodage :
>>> dataset = dataset.decode(False)Remarque : IterableDataset.decode() n'est actuellement disponible que pour les jeux de données en flux.
Update on GitHub