该插件与Docling集成,将PDF、Word文档和其他输入格式的结构化处理引入spaCy管道。它输出清洁的结构化数据,创建spaCy的Doc对象,可访问带标签的文本跨度(如章节或标题),并将表格数据转换为pandas.DataFrame。
⚠️ 此包需要Python 3.10或更高版本。
pip install spacy-layout初始化spaCyLayout预处理器后,可调用文档路径将其转换为结构化数据。生成的Doc对象包含布局跨度,映射到原始文本并暴露各种属性。
import spacy
from spacy_layout import spaCyLayout
nlp = spacy.blank("en")
layout = spaCyLayout(nlp)
# 处理文档并创建spaCy Doc对象
doc = layout("./starcraft.pdf")
# 文档的基于文本的内容
print(doc.text)
# 文档布局包括页面和页面尺寸
print(doc._.layout)
# 文档中的表格及其提取的数据
print(doc._.tables)
# 文档的Markdown表示
print(doc._.markdown)
# 不同部分的布局跨度
for span in doc.spans["layout"]:
# 文档部分和文本字符偏移
print(span.text, span.start, span.end, span.start_char, span.end_char)
# 部分类型,如"text"、"title"、"section_header"等
print(span.label_)
# 部分的布局特征,包括边界框
print(span._.layout)
# 最接近该跨度的标题
print(span._.heading)如需大规模处理文档,可使用spaCyLayout.pipe方法:
paths = ["one.pdf", "two.pdf", "three.pdf", ...]
for doc in layout.pipe(paths):
print(doc._.layout)表格包含在标签为"table"的布局跨度中,可通过Doc._.tables访问。它们暴露布局扩展属性以及data属性,包含转换为pandas.DataFrame的表格数据。
for table in doc._.tables:
# 令牌位置和边界框
print(table.start, table.end, table._.layout)
# 内容的pandas.DataFrame
print(table._.data)处理文档后,可将结构化Doc对象序列化为spaCy的高效二进制格式:
from spacy.tokens import DocBin
docs = layout.pipe(["one.pdf", "two.pdf", "three.pdf"])
doc_bin = DocBin(docs=docs, store_user_data=True)
doc_bin.to_disk("./file.spacy")属性 | 类型 | 描述 |
|---|---|---|
Doc._.layout | DocLayout | 文档的布局特征 |
Doc._.pages | list[tuplePageLayout, listSpan] | 文档中的页面及其包含的跨度 |
Doc._.tables | listSpan | 文档中的所有表格 |
Doc._.markdown | str | 文档的Markdown表示 |
Doc.spans"layout" | spacy.tokens.SpanGroup | 文档中的布局跨度 |
Span.label_ | str | 提取的布局跨度类型 |
Span._.layout | SpanLayout | None | 布局跨度的布局特征 |
Span._.heading | Span | None | 最接近跨度的标题 |
Span._.data | pandas.DataFrame | None | 表格跨度的提取数据 |
属性 | 类型 | 描述 |
|---|---|---|
page_no | int | 页码(从1开始) |
width | float | 页面宽度(像素) |
height | float | 页面高度(像素) |
属性 | 类型 | 描述 |
|---|---|---|
pages | listPageLayout | 文档中的页面 |
属性 | 类型 | 描述 |
|---|---|---|
x | float | 边界框的水平偏移(像素) |
y | float | 边界框的垂直偏移(像素) |
width | float | 边界框宽度(像素) |
height | float | 边界框高度(像素) |
page_no | int | 跨度所在的页码 |
import pypdfium2 as pdfium
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
import spacy
from spacy_layout import spaCyLayout
DOCUMENT_PATH = "./document.pdf"
# 加载并将PDF页面转换为图像
pdf = pdfium.PdfDocument(DOCUMENT_PATH)
page_image = pdf[2].render(scale=1) # 获取第3页(索引2)
numpy_array = page_image.to_numpy()
# 使用spaCy处理文档
nlp = spacy.blank("en")
layout = spaCyLayout(nlp)
doc = layout(DOCUMENT_PATH)
# 获取第3页布局和部分
page = doc._.pages[2]
page_layout = doc._.layout.pages[2]
# 创建图形和坐标轴
fig, ax = plt.subplots(figsize=(12, 16))
ax.imshow(numpy_array)
# 为每个部分的边界框添加矩形
for section in page[1]:
rect = Rectangle(
(section._.layout.x, section._.layout.y),
section._.layout.width,
section._.layout.height,
fill=False,
color="blue",
linewidth=1,
alpha=0.5
)
ax.add_patch(rect)
ax.text(
section._.layout.x,
section._.layout.y,
section.label_,
fontsize=8,
color="red",
verticalalignment="bottom"
)
ax.axis("off")
plt.show()原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。