資料集文件
載入 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>請先使用列索引再透過
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 上更新