该插件与 Doling 集成,将PDF 、 Word 文档和其他输入格式的结构化处理引入您的 spaCy 管道。它以基于文本的格式输出干净的结构化数据,并创建 spaCy 熟悉的Doc
对象,使您可以访问带标签的文本范围(如章节或标题)以及数据转换为pandas.DataFrame
表格。
此工作流程可以轻松地将强大的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
扩展属性以及属性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
,但您可以通过向spaCyLayout
提供display_table
回调来自定义表格的呈现方式,该回调接收数据的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 | 跨度标签的整数 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] | 传递给 Doling 的DocumentConverter 格式选项。 |
退货 | 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 对象。 |