使用spaCy处理PDF和Word文档的技术指南

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._.layoutDocLayout文档的布局特征
Doc._.pageslist[tuple[PageLayout, list[Span]]]文档中的页面及其包含的跨度
Doc._.tableslist[Span]文档中的所有表格
Doc._.markdownstr文档的Markdown表示
Doc.spans[“layout”]spacy.tokens.SpanGroup文档中的布局跨度
Span.label_str提取的布局跨度类型
Span._.layoutSpanLayout | None布局跨度的布局特征
Span._.headingSpan | None最接近跨度的标题
Span._.datapandas.DataFrame | None表格跨度的提取数据

PageLayout数据类

属性类型描述
page_noint页码(从1开始)
widthfloat页面宽度(像素)
heightfloat页面高度(像素)

DocLayout数据类

属性类型描述
pageslist[PageLayout]文档中的页面

SpanLayout数据类

属性类型描述
xfloat边界框的水平偏移(像素)
yfloat边界框的垂直偏移(像素)
widthfloat边界框宽度(像素)
heightfloat边界框高度(像素)
page_noint跨度所在的页码

示例代码

使用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/
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值