Datasets 文件

載入 pdf 資料

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

載入 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 資料集,請先使用行索引,然後再使用 pdf 列 - dataset[0]["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>

請注意,您可以向 .to_image() 傳遞 resolution= 引數,以比預設值(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 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.