Этот плагин интегрируется с Docling, чтобы обеспечить структурированную обработку PDF-файлов , документов Word и других входных форматов в вашем конвейере SpaCy. Он выводит чистые, структурированные данные в текстовом формате и создает знакомые SpaCy объекты Doc
, которые позволяют вам получать доступ к помеченным текстовым диапазонам, таким как разделы или заголовки, а также к таблицам с данными, преобразованными в pandas.DataFrame
.
Этот рабочий процесс позволяет легко применять к вашим документам мощные методы НЛП , включая лингвистический анализ, распознавание именованных объектов, классификацию текста и многое другое. Он также отлично подходит для реализации фрагментирования конвейеров RAG .
️ Для этого пакета требуется Python 3.10 или выше.
pip install spacy-layout
После инициализации препроцессора spaCyLayout
с помощью объекта nlp
для токенизации вы можете вызвать его по пути к документу, чтобы преобразовать его в структурированные данные. Результирующий объект 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 )
После обработки документов вы можете сериализовать структурированные объекты Doc
в эффективный двоичный формат spaCy, поэтому вам не придется повторно запускать ресурсоемкое преобразование.
spaCy также позволяет вам вызывать объект nlp
в уже созданном Doc
, поэтому вы можете легко применить конвейер компонентов для лингвистического анализа или распознавания именованного объекта, использовать сопоставление на основе правил или что-то еще, что вы можете сделать с помощью 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
, а также атрибут data
, который включает табличные данные, преобразованные в pandas.DataFrame
.
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
, но вы можете настроить способ отображения таблицы, предоставив обратный вызов display_table
для spaCyLayout
, который получает pandas.DataFrame
данных. Это позволяет включать рисунки таблицы в текст документа и использовать их в дальнейшем, например, при извлечении информации с помощью обученного распознавателя именованных объектов или классификатора текста.
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 | Целочисленный идентификатор метки диапазона. |
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] | Параметры формата, передаваемые в DocumentConverter Docling. |
ВОЗВРАТЫ | spaCyLayout | Инициализированный объект. |
spaCyLayout.__call__
Обработайте документ и создайте объект SpaCy Doc
содержащий текстовое содержимое и диапазоны макета, доступные по умолчанию через Doc.spans["layout"]
.
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 . |