Este complemento se integra con Docling para llevar el procesamiento estructurado de archivos PDF , documentos de Word y otros formatos de entrada a su canal de spaCy. Genera datos limpios y estructurados en un formato basado en texto y crea los conocidos objetos Doc
de spaCy que le permiten acceder a tramos de texto etiquetados como secciones o encabezados, y tablas con sus datos convertidos a pandas.DataFrame
.
Este flujo de trabajo facilita la aplicación de potentes técnicas de PNL a sus documentos, incluido el análisis lingüístico, el reconocimiento de entidades con nombre, la clasificación de texto y más. También es excelente para implementar fragmentación para canalizaciones RAG .
️ Este paquete requiere Python 3.10 o superior.
pip install spacy-layout
Después de inicializar el preprocesador spaCyLayout
con un objeto nlp
para tokenización, puede llamarlo en una ruta de documento para convertirlo en datos estructurados. El objeto Doc
resultante incluye espacios de diseño que se asignan al texto sin formato original y exponen varios atributos, incluido el tipo de contenido y las características de diseño.
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 )
Si necesita procesar grandes volúmenes de documentos a escala, puede utilizar el método spaCyLayout.pipe
, que toma un iterable de rutas o bytes y genera objetos Doc
:
paths = [ "one.pdf" , "two.pdf" , "three.pdf" , ...]
for doc in layout . pipe ( paths ):
print ( doc . _ . layout )
Después de haber procesado los documentos, puede serializar los objetos Doc
estructurados en el eficiente formato binario de spaCy, para no tener que volver a ejecutar la conversión que consume muchos recursos.
spaCy también le permite llamar al objeto nlp
en un Doc
ya creado, por lo que puede aplicar fácilmente una canalización de componentes para análisis lingüístico o reconocimiento de entidades con nombre, usar coincidencias basadas en reglas o cualquier otra cosa que pueda hacer con 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 )
Las tablas se incluyen en los espacios de diseño con la etiqueta "table"
y bajo el acceso directo Doc._.tables
. Exponen un atributo de extensión layout
, así como un atributo data
, que incluye los datos tabulares convertidos en 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 )
De forma predeterminada, el texto abarcado es un marcador de posición TABLE
, pero puedes personalizar cómo se representa una tabla proporcionando una devolución de llamada display_table
a spaCyLayout
, que recibe el pandas.DataFrame
de los datos. Esto le permite incluir las figuras de la tabla en el texto del documento y utilizarlas más adelante, por ejemplo, durante la extracción de información con un reconocedor de entidades con nombre o un clasificador de texto capacitado.
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 | Descripción |
---|---|---|
Doc._.layout | DocLayout | Características de diseño del documento. |
Doc._.pages | list[tuple[PageLayout, list[Span]]] | Páginas del documento y los espacios que contienen. |
Doc._.tables | list[Span] | Todas las tablas del documento. |
Doc.spans["layout"] | spacy.tokens.SpanGroup | El diseño se extiende por todo el documento. |
Span.label_ | str | El tipo de extensión del diseño extraído, por ejemplo "text" o "section_header" . Consulte aquí para conocer las opciones. |
Span.label | int | El ID entero de la etiqueta de extensión. |
Span.id | int | Índice de ejecución del intervalo de diseño. |
Span._.layout | SpanLayout | None | Características de diseño de un tramo de diseño. |
Span._.heading | Span | None | Rumbo más cercano a un tramo, si está disponible. |
Span._.data | pandas.DataFrame | None | Los datos extraídos para los tramos de tabla. |
Atributo | Tipo | Descripción |
---|---|---|
page_no | int | El número de página (indexado 1). |
width | float | Página con píxeles. |
height | float | Altura de la página en píxeles. |
Atributo | Tipo | Descripción |
---|---|---|
pages | list[PageLayout] | Las páginas del documento. |
Atributo | Tipo | Descripción |
---|---|---|
x | float | Desplazamiento horizontal del cuadro delimitador en píxeles. |
y | float | Desplazamiento vertical del cuadro delimitador en píxeles. |
width | float | Ancho del cuadro delimitador en píxeles. |
height | float | Alto del cuadro delimitador en píxeles. |
page_no | int | Número de página en la que se encuentra el intervalo. |
spaCyLayout
spaCyLayout.__init__
Inicialice el procesador de documentos.
nlp = spacy . blank ( "en" )
layout = spaCyLayout ( nlp )
Argumento | Tipo | Descripción |
---|---|---|
nlp | spacy.language.Language | El objeto nlp inicializado que se utilizará para la tokenización. |
separator | str | Token utilizado para separar secciones en el objeto Doc creado. El separador no formará parte del espacio del diseño. Si es None , no se agregará ningún separador. El valor predeterminado es "nn" . |
attrs | dict[str, str] | Anule los atributos spaCy personalizados. Puede incluir "doc_layout" , "doc_pages" , "doc_tables" , "span_layout" , "span_data" , "span_heading" y "span_group" . |
headings | list[str] | Etiquetas de encabezados a considerar para la detección Span._.heading . El valor predeterminado es ["section_header", "page_header", "title"] . |
display_table | Callable[[pandas.DataFrame], str] | str | Función para generar la representación basada en texto de la tabla en el Doc.text o texto de marcador de posición. El valor predeterminado es "TABLE" . |
docling_options | dict[InputFormat, FormatOption] | Opciones de formato pasadas a DocumentConverter de Docling. |
DEVOLUCIONES | spaCyLayout | El objeto inicializado. |
spaCyLayout.__call__
Procese un documento y cree un objeto spaCy Doc
que contenga el contenido del texto y los espacios de diseño, disponible a través de Doc.spans["layout"]
de forma predeterminada.
layout = spaCyLayout ( nlp )
doc = layout ( "./starcraft.pdf" )
Argumento | Tipo | Descripción |
---|---|---|
source | str | Path | bytes | Ruta del documento a procesar o bytes. |
DEVOLUCIONES | Doc | El objeto spaCy Doc procesado. |
spaCyLayout.pipe
Procese múltiples documentos y cree objetos spaCy Doc
. Debe utilizar este método si procesa grandes volúmenes de documentos a escala.
layout = spaCyLayout ( nlp )
paths = [ "one.pdf" , "two.pdf" , "three.pdf" , ...]
docs = layout . pipe ( paths )
Argumento | Tipo | Descripción |
---|---|---|
sources | Iterable[str | Path | bytes] | Rutas de documentos a procesar o bytes. |
RENDIMIENTOS | Doc | El objeto spaCy Doc procesado. |