Este plugin se integra ao Docling para trazer processamento estruturado de PDFs , documentos do Word e outros formatos de entrada para o seu pipeline spaCy. Ele gera dados limpos e estruturados em um formato baseado em texto e cria os objetos Doc
familiares do spaCy que permitem acessar extensões de texto rotuladas, como seções ou títulos, e tabelas com seus dados convertidos em pandas.DataFrame
.
Esse fluxo de trabalho facilita a aplicação de técnicas poderosas de PNL aos seus documentos, incluindo análise linguística, reconhecimento de entidade nomeada, classificação de texto e muito mais. Também é ótimo para implementar chunking em pipelines RAG .
️ Este pacote requer Python 3.10 ou superior.
pip install spacy-layout
Depois de inicializar o pré-processador spaCyLayout
com um objeto nlp
para tokenização, você pode chamá-lo em um caminho de documento para convertê-lo em dados estruturados. O objeto Doc
resultante inclui extensões de layout que são mapeadas no texto bruto original e expõem vários atributos, incluindo o tipo de conteúdo e recursos de layout.
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 )
Se precisar processar volumes maiores de documentos em escala, você pode usar o método spaCyLayout.pipe
, que usa um iterável de caminhos ou bytes e produz objetos Doc
:
paths = [ "one.pdf" , "two.pdf" , "three.pdf" , ...]
for doc in layout . pipe ( paths ):
print ( doc . _ . layout )
Depois de processar os documentos, você pode serializar os objetos Doc
estruturados no formato binário eficiente do spaCy, para não precisar executar novamente a conversão que consome muitos recursos.
spaCy também permite chamar o objeto nlp
em um Doc
já criado, para que você possa aplicar facilmente um pipeline de componentes para análise linguística ou reconhecimento de entidade nomeada, usar correspondência baseada em regras ou qualquer outra coisa que possa fazer com 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 )
As tabelas são incluídas nos espaços de layout com o rótulo "table"
e sob o atalho Doc._.tables
. Eles expõem um atributo de extensão layout
, bem como um atributo data
, que inclui os dados tabulares convertidos em 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 )
Por padrão, o texto span é um espaço reservado TABLE
, mas você pode personalizar como uma tabela é renderizada fornecendo um retorno de chamada display_table
para spaCyLayout
, que recebe o pandas.DataFrame
dos dados. Isto permite incluir os números da tabela no texto do documento e utilizá-los posteriormente, por exemplo, durante a extração de informações com um reconhecedor de entidade nomeado ou classificador de texto treinado.
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 )
Atributo | Tipo | Descrição |
---|---|---|
Doc._.layout | DocLayout | Recursos de layout do documento. |
Doc._.pages | list[tuple[PageLayout, list[Span]]] | Páginas do documento e os intervalos que elas contêm. |
Doc._.tables | list[Span] | Todas as tabelas do documento. |
Doc.spans["layout"] | spacy.tokens.SpanGroup | O layout abrange o documento. |
Span.label_ | str | O tipo do intervalo de layout extraído, por exemplo "text" ou "section_header" . Veja aqui as opções. |
Span.label | int | O ID inteiro do rótulo de intervalo. |
Span.id | int | Índice em execução do intervalo de layout. |
Span._.layout | SpanLayout | None | Recursos de layout de uma extensão de layout. |
Span._.heading | Span | None | Rumo mais próximo de um vão, se disponível. |
Span._.data | pandas.DataFrame | None | Os dados extraídos para intervalos de tabela. |
Atributo | Tipo | Descrição |
---|---|---|
page_no | int | O número da página (indexado em 1). |
width | float | Página em pixels. |
height | float | Altura da página em pixels. |
Atributo | Tipo | Descrição |
---|---|---|
pages | list[PageLayout] | As páginas do documento. |
Atributo | Tipo | Descrição |
---|---|---|
x | float | Deslocamento horizontal da caixa delimitadora em pixels. |
y | float | Deslocamento vertical da caixa delimitadora em pixels. |
width | float | Largura da caixa delimitadora em pixels. |
height | float | Altura da caixa delimitadora em pixels. |
page_no | int | Número da página em que o intervalo está. |
spaCyLayout
spaCyLayout.__init__
Inicialize o processador de documentos.
nlp = spacy . blank ( "en" )
layout = spaCyLayout ( nlp )
Argumento | Tipo | Descrição |
---|---|---|
nlp | spacy.language.Language | O objeto nlp inicializado a ser usado para tokenização. |
separator | str | Token usado para separar seções no objeto Doc criado. O separador não fará parte do intervalo de layout. Se None , nenhum separador será adicionado. O padrão é "nn" . |
attrs | dict[str, str] | Substitua os atributos spaCy customizados. Pode incluir "doc_layout" , "doc_pages" , "doc_tables" , "span_layout" , "span_data" , "span_heading" e "span_group" . |
headings | list[str] | Rótulos de títulos a serem considerados para detecção Span._.heading . O padrão é ["section_header", "page_header", "title"] . |
display_table | Callable[[pandas.DataFrame], str] | str | Função para gerar a representação textual da tabela no Doc.text ou placeholder de texto. O padrão é "TABLE" . |
docling_options | dict[InputFormat, FormatOption] | Opções de formato passadas para DocumentConverter do Docling. |
DEVOLUÇÕES | spaCyLayout | O objeto inicializado. |
spaCyLayout.__call__
Processe um documento e crie um objeto spaCy Doc
contendo o conteúdo do texto e extensões de layout, disponíveis via Doc.spans["layout"]
por padrão.
layout = spaCyLayout ( nlp )
doc = layout ( "./starcraft.pdf" )
Argumento | Tipo | Descrição |
---|---|---|
source | str | Path | bytes | Caminho do documento para processar ou bytes. |
DEVOLUÇÕES | Doc | O objeto spaCy Doc processado. |
spaCyLayout.pipe
Processe vários documentos e crie objetos spaCy Doc
. Você deve usar esse método se estiver processando volumes maiores de documentos em grande escala.
layout = spaCyLayout ( nlp )
paths = [ "one.pdf" , "two.pdf" , "three.pdf" , ...]
docs = layout . pipe ( paths )
Argumento | Tipo | Descrição |
---|---|---|
sources | Iterable[str | Path | bytes] | Caminhos de documentos para processar ou bytes. |
RENDIMENTOS | Doc | O objeto spaCy Doc processado. |