spaCy Layout:使用spaCy处理PDF、Word文档等
该插件与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")
API参考
数据和扩展属性
| 属性 | 类型 | 描述 |
|---|---|---|
| Doc._.layout | DocLayout | 文档的布局特征 |
| Doc._.pages | list[tuple[PageLayout, list[Span]]] | 文档中的页面及其包含的跨度 |
| Doc._.tables | list[Span] | 文档中的所有表格 |
| 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 | 表格跨度的提取数据 |
PageLayout数据类
| 属性 | 类型 | 描述 |
|---|---|---|
| page_no | int | 页码(从1开始) |
| width | float | 页面宽度(像素) |
| height | float | 页面高度(像素) |
DocLayout数据类
| 属性 | 类型 | 描述 |
|---|---|---|
| pages | list[PageLayout] | 文档中的页面 |
SpanLayout数据类
| 属性 | 类型 | 描述 |
|---|---|---|
| x | float | 边界框的水平偏移(像素) |
| y | float | 边界框的垂直偏移(像素) |
| width | float | 边界框宽度(像素) |
| height | float | 边界框高度(像素) |
| page_no | int | 跨度所在的页码 |
示例代码
使用matplotlib可视化页面和边界框
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()
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)或者 我的个人博客 https://blog.qife122.com/
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
706

被折叠的 条评论
为什么被折叠?



