Datasets documentation

PDF 데이터 로드

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v4.8.4).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

PDF 데이터 로드

Pdf 지원은 실험적이며 변경될 수 있습니다.

Pdf 데이터셋에는 pdfplumber 객체를 포함하는 Pdf 타입의 컬럼이 있습니다.

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 컬럼을 인덱싱하여 데이터셋의 모든 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 dataset builder를 사용하여 커스텀 dataloader를 작성하지 않고도 dataset을 로드할 수 있습니다. 이를 통해 PdfFolder은 다양한 vision task에 대해 수천 개의 pdf로 구성된 pdf dataset을 빠르게 생성하고 로드하는 데 이상적입니다. pdf dataset 구조는 다음과 같아야 합니다:

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")

이후 pdfplumber.pdf.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보다 느려질 수 있습니다.

If you are not interested in the documents decoded as pdfplumber PDFs and would like to access the path/bytes instead, you can disable decoding:

>>> dataset = dataset.decode(False)

참고: IterableDataset.decode()는 현재 스트리밍 데이터셋에서만 사용할 수 있습니다.

Update on GitHub