資料集文件

載入 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>

請注意,您可以將 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 資料集產生器載入資料集,它不需要編寫自訂的資料載入器 (dataloader)。這使得 PdfFolder 非常適合快速建立並載入用於各種視覺任務的數千個 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)

如果您沒有中繼資料 (metadata) 檔案,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 的 PDF 物件。它會依序解碼 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 的 PDF 物件,而是想存取路徑或位元組資料,您可以停用解碼功能。

>>> dataset = dataset.decode(False)

注意:IterableDataset.decode() 目前僅適用於串流數據集。

在 GitHub 上更新

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