이 플러그인은 Docling과 통합되어 PDF , Word 문서 및 기타 입력 형식의 구조화된 처리를 spaCy 파이프라인에 제공합니다. 깨끗하고 구조화된 데이터를 텍스트 기반 형식으로 출력하고 섹션이나 제목과 같은 레이블이 지정된 텍스트 범위와 데이터가 pandas.DataFrame
으로 변환된 테이블에 액세스할 수 있는 spaCy의 친숙한 Doc
개체를 생성합니다.
이 워크플로우를 사용하면 언어 분석, 명명된 엔터티 인식, 텍스트 분류 등을 포함한 강력한 NLP 기술을 문서에 쉽게 적용할 수 있습니다. RAG 파이프라인에 대한 청크를 구현하는 데에도 적합합니다.
️ 이 패키지에는 Python 3.10 이상이 필요합니다.
pip install spacy-layout
토큰화를 위해 nlp
객체로 spaCyLayout
전처리기를 초기화한 후 문서 경로에서 이를 호출하여 구조화된 데이터로 변환할 수 있습니다. 결과 Doc
객체에는 원본 원시 텍스트에 매핑되고 콘텐츠 유형 및 레이아웃 기능을 포함한 다양한 속성을 노출하는 레이아웃 범위가 포함됩니다.
import spacy
from spacy_layout import spaCyLayout
nlp = spacy . blank ( "en" )
layout = spaCyLayout ( nlp )
# Process a document and create a spaCy Doc object
doc = layout ( "./starcraft.pdf" )
# The text-based contents of the document
print ( doc . text )
# Document layout including pages and page sizes
print ( doc . _ . layout )
# Tables in the document and their extracted data
print ( doc . _ . tables )
# Layout spans for different sections
for span in doc . spans [ "layout" ]:
# Document section and token and character offsets into the text
print ( span . text , span . start , span . end , span . start_char , span . end_char )
# Section type, e.g. "text", "title", "section_header" etc.
print ( span . label_ )
# Layout features of the section, including bounding box
print ( span . _ . layout )
# Closest heading to the span (accuracy depends on document structure)
print ( span . _ . heading )
더 많은 양의 문서를 대규모로 처리해야 하는 경우 spaCyLayout.pipe
메서드를 사용할 수 있습니다. 이 메서드는 대신 반복 가능한 경로나 바이트를 사용하여 Doc
개체를 생성합니다.
paths = [ "one.pdf" , "two.pdf" , "three.pdf" , ...]
for doc in layout . pipe ( paths ):
print ( doc . _ . layout )
문서를 처리한 후 spaCy의 효율적인 바이너리 형식으로 구조화된 Doc
개체를 직렬화할 수 있으므로 리소스를 많이 사용하는 변환을 다시 실행할 필요가 없습니다.
또한 spaCy를 사용하면 이미 생성된 Doc
에서 nlp
개체를 호출할 수 있으므로 언어 분석이나 명명된 엔터티 인식을 위한 구성 요소 파이프라인을 쉽게 적용하고 규칙 기반 일치를 사용하거나 spaCy로 수행할 수 있는 모든 작업을 수행할 수 있습니다.
# Load the transformer-based English pipeline
# Installation: python -m spacy download en_core_web_trf
nlp = spacy . load ( "en_core_web_trf" )
layout = spaCyLayout ( nlp )
doc = layout ( "./starcraft.pdf" )
# Apply the pipeline to access POS tags, dependencies, entities etc.
doc = nlp ( doc )
테이블은 "table"
레이블과 Doc._.tables
바로가기 아래의 레이아웃 범위에 포함됩니다. 이는 layout
확장 속성과 pandas.DataFrame
으로 변환된 표 형식 데이터를 포함하는 data
노출합니다.
for table in doc . _ . tables :
# Token position and bounding box
print ( table . start , table . end , table . _ . layout )
# pandas.DataFrame of contents
print ( table . _ . data )
기본적으로 범위 텍스트는 자리 표시자 TABLE
이지만, 데이터의 pandas.DataFrame
을 수신하는 spaCyLayout
에 display_table
콜백을 제공하여 테이블이 렌더링되는 방식을 사용자 정의할 수 있습니다. 이를 통해 문서 텍스트에 표 그림을 포함하고 나중에 사용할 수 있습니다(예: 훈련된 명명된 엔터티 인식기 또는 텍스트 분류기를 사용하여 정보를 추출하는 동안).
def display_table ( df : pd . DataFrame ) -> str :
return f"Table with columns: { ', ' . join ( df . columns . tolist ()) } "
layout = spaCyLayout ( nlp , display_table = display_table )
layout = spaCyLayout ( nlp )
doc = layout ( "./starcraft.pdf" )
print ( doc . _ . layout )
for span in doc . spans [ "layout" ]:
print ( span . label_ , span . _ . layout )
기인하다 | 유형 | 설명 |
---|---|---|
Doc._.layout | DocLayout | 문서의 레이아웃 기능. |
Doc._.pages | list[tuple[PageLayout, list[Span]]] | 문서의 페이지와 페이지에 포함된 범위입니다. |
Doc._.tables | list[Span] | 문서의 모든 테이블. |
Doc.spans["layout"] | spacy.tokens.SpanGroup | 레이아웃은 문서에 걸쳐 있습니다. |
Span.label_ | str | 추출된 레이아웃 범위의 유형입니다(예: "text" 또는 "section_header" . 옵션은 여기를 참조하세요. |
Span.label | int | 범위 레이블의 정수 ID입니다. |
Span.id | int | 레이아웃 범위의 인덱스를 실행 중입니다. |
Span._.layout | SpanLayout | None | 레이아웃 범위의 레이아웃 기능입니다. |
Span._.heading | Span | None | 가능한 경우 범위에 가장 가까운 방향입니다. |
Span._.data | pandas.DataFrame | None | 테이블 범위에 대해 추출된 데이터입니다. |
기인하다 | 유형 | 설명 |
---|---|---|
page_no | int | 페이지 번호(1-인덱스)입니다. |
width | float | 픽셀 단위의 페이지입니다. |
height | float | 페이지 높이(픽셀)입니다. |
기인하다 | 유형 | 설명 |
---|---|---|
pages | list[PageLayout] | 문서의 페이지입니다. |
기인하다 | 유형 | 설명 |
---|---|---|
x | float | 경계 상자의 수평 오프셋(픽셀)입니다. |
y | float | 경계 상자의 수직 오프셋(픽셀)입니다. |
width | float | 경계 상자의 너비(픽셀)입니다. |
height | float | 경계 상자의 높이(픽셀)입니다. |
page_no | int | 범위가 있는 페이지 수입니다. |
spaCyLayout
spaCyLayout.__init__
메소드문서 프로세서를 초기화합니다.
nlp = spacy . blank ( "en" )
layout = spaCyLayout ( nlp )
논쟁 | 유형 | 설명 |
---|---|---|
nlp | spacy.language.Language | 토큰화에 사용할 초기화된 nlp 개체입니다. |
separator | str | 생성된 Doc 개체의 섹션을 구분하는 데 사용되는 토큰입니다. 구분 기호는 레이아웃 범위의 일부가 아닙니다. None 인 경우 구분 기호가 추가되지 않습니다. 기본값은 "nn" 입니다. |
attrs | dict[str, str] | 사용자 정의 spaCy 속성을 재정의합니다. "doc_layout" , "doc_pages" , "doc_tables" , "span_layout" , "span_data" , "span_heading" 및 "span_group" 포함할 수 있습니다. |
headings | list[str] | Span._.heading 감지를 위해 고려할 제목 레이블입니다. 기본값은 ["section_header", "page_header", "title"] 입니다. |
display_table | Callable[[pandas.DataFrame], str] | str | Doc.text 또는 자리 표시자 텍스트에서 테이블의 텍스트 기반 표현을 생성하는 기능입니다. 기본값은 "TABLE" 입니다. |
docling_options | dict[InputFormat, FormatOption] | Docling의 DocumentConverter 에 전달된 형식 옵션입니다. |
보고 | spaCyLayout | 초기화된 개체입니다. |
spaCyLayout.__call__
메소드 문서를 처리하고 기본적으로 Doc.spans["layout"]
를 통해 사용할 수 있는 텍스트 콘텐츠와 레이아웃 범위를 포함하는 spaCy Doc
개체를 만듭니다.
layout = spaCyLayout ( nlp )
doc = layout ( "./starcraft.pdf" )
논쟁 | 유형 | 설명 |
---|---|---|
source | str | Path | bytes | 처리할 문서의 경로 또는 바이트입니다. |
보고 | Doc | 처리된 spaCy Doc 개체입니다. |
spaCyLayout.pipe
메소드 여러 문서를 처리하고 spaCy Doc
개체를 만듭니다. 대규모로 더 많은 양의 문서를 처리하는 경우 이 방법을 사용해야 합니다.
layout = spaCyLayout ( nlp )
paths = [ "one.pdf" , "two.pdf" , "three.pdf" , ...]
docs = layout . pipe ( paths )
논쟁 | 유형 | 설명 |
---|---|---|
sources | Iterable[str | Path | bytes] | 처리할 문서의 경로 또는 바이트입니다. |
수확량 | Doc | 처리된 spaCy Doc 개체입니다. |