数据集文档
加载 pdf 数据
并获得增强的文档体验
开始使用
加载 pdf 数据
Pdf 支持是实验性的,可能会发生变化。
Pdf 数据集具有 Pdf 类型列,其中包含 pdfplumber
对象。
要使用 pdf 数据集,你需要安装 pdfplumber
包。查看安装指南了解如何安装。
当你加载 pdf 数据集并调用 pdf 列时,pdf 将被解码为 pdfplumber
Pdf
>>> from datasets import load_dataset, Pdf
>>> dataset = load_dataset("path/to/pdf/folder", split="train")
>>> dataset[0]["pdf"]
<pdfplumber.pdf.PDF at 0x1075bc320>
首先使用行索引,然后使用 pdf
列 - dataset[0]["pdf"]
- 索引到 pdf 数据集中,以避免在数据集中创建所有 pdf 对象。否则,如果你的数据集很大,这可能是一个缓慢且耗时的过程。
有关如何加载任何类型数据集的指南,请查看通用加载指南。
读取页面
使用 PDF
的 .pages
直接从 pdf 访问页面。
然后你可以使用 pdfplumber
函数读取文本、表格和图像,例如
>>> 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()
[]
你也可以将每个页面加载为 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>
请注意,你可以将 resolution=
传递给 .to_image()
,以更高的分辨率(而不是默认的 72 ppi)渲染图像。
本地文件
你可以从 pdf 路径加载数据集。使用 cast_column() 函数接受 pdf 文件路径列,并使用 Pdf 特性将其解码为 pdfplumber
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>
如果你只想加载 pdf 数据集的底层路径而不解码 pdf 对象,请在 Pdf 特性中设置 decode=False
>>> dataset = dataset.cast_column("pdf", Pdf(decode=False))
>>> dataset[0]["pdf"]
{'bytes': None,
'path': 'path/to/pdf/folder/pdf0.pdf'}
PdfFolder
你还可以使用 PdfFolder
数据集构建器加载数据集,这不需要编写自定义数据加载器。这使得 PdfFolder
非常适合快速创建和加载包含数千个 pdf 的 pdf 数据集,用于不同的视觉任务。你的 pdf 数据集结构应如下所示
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
如果数据集遵循 PdfFolder
结构,那么你可以使用 load_dataset() 直接加载它
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_name")
>>> # OR locally:
>>> dataset = load_dataset("/path/to/folder")
对于本地数据集,这等效于在 load_dataset() 中手动传递 pdffolder
,并在 data_dir
中传递目录
>>> dataset = load_dataset("pdffolder", data_dir="/path/to/folder")
然后你可以将 pdf 作为 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}
要忽略元数据文件中的信息,请在 load_dataset() 中设置 drop_metadata=True
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_with_metadata", drop_metadata=True)
如果你没有元数据文件,PdfFolder
会自动从目录名称推断标签名称。如果你想删除自动创建的标签,请设置 drop_labels=True
。在这种情况下,你的数据集将仅包含一个 pdf 列
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_without_metadata", drop_labels=True)
最后,filters
参数允许你仅加载数据集的子集,基于标签或元数据的条件。如果元数据是 Parquet 格式,这尤其有用,因为这种格式支持快速过滤。也建议将此参数与 streaming=True
一起使用,因为默认情况下,数据集在过滤之前会被完全下载。
>>> filters = [("label", "=", 0)]
>>> dataset = load_dataset("username/dataset_name", streaming=True, filters=filters)
有关创建你自己的 PdfFolder
数据集的更多信息,请查看创建 pdf 数据集指南。
Pdf 解码
默认情况下,当你迭代数据集时,pdf 会按顺序解码为 pdfplumber PDFs
。它按顺序解码 pdf 的元数据,并且在你访问 pdf 页面之前不会读取它们。
但是,可以使用多线程解码来显着加速数据集
>>> 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 !
... ...
你可以使用 num_threads
启用多线程。这对于加速远程数据流式传输尤其有用。但是,对于快速磁盘上的本地数据,它可能比 num_threads=0
慢。
如果你对解码为 pdfplumber PDFs
的文档不感兴趣,并且希望访问路径/字节,则可以禁用解码
>>> dataset = dataset.decode(False)
注意:IterableDataset.decode() 目前仅适用于流式数据集。
< > 在 GitHub 上更新