表格抽取是什么
表格是知识库里最容易丢信息的部分:正文可以按段落检索,表格一旦被当纯文本拍平,行列对应关系就没了,问「第三列的金额是多少」这类问题必然答错。实践中有三条路线:规则抽取(pdfplumber、camelot 一类)适合有线框、版式规整的 PDF;版面模型适合复杂版面与扫描件;少量疑难表格用模型兜底抽取。三条路的产出统一转成 Markdown 或 CSV 再入库,保留表头语义,检索命中后模型才能按行列理解。
基本信息
| 规则抽取 | pdfplumber、camelot,适合有线框规整表 |
|---|---|
| 版面模型 | 复杂版面与扫描件,需部署模型 |
| 模型兜底 | 少量疑难表格,逐表调用成本较高 |
| 统一产出 | Markdown 或 CSV,必须保留表头 |
| 易失点 | 跨页表、合并单元格、多级表头 |
| 验收方式 | 抽检行列对应关系与关键数值 |
典型使用场景
- 财务报表入库:把利润表、资产负债表的行列完整保留
- 产品参数表:抽取规格与型号对应关系供检索问答
- 制度附表:收费标准、假期天数等结构化查询
- 合同附件:报价明细与交付清单的字段化提取
- 扫描件表格:先 OCR 再按版面区域重建表格
- 批量文档处理:统一转 Markdown 后进入同一套切分流程
pdfplumber 抽表
pdfplumber 抽表
import pdfplumber
# 打开 PDF 逐页抽取表格,注意跨页表需要按表头续接
with pdfplumber.open("report.pdf") as pdf:
for page_no, page in enumerate(pdf.pages, start=1):
for table in page.extract_tables():
for row in table:
# 单元格内的换行符会破坏 Markdown 表格,先压平
cells = [(c or "").replace("\n", " ").strip() for c in row]
print(page_no, cells)
# 抽完先抽检:行列数量是否与原件一致,关键数值能否对上三条抽取路线对比
| 路线 | 适用 | 代价与注意 |
|---|---|---|
| 规则抽取 | 有线框、版式规整的 PDF | 遇到合并单元格与无线框表容易拆错行列 |
| 版面模型 | 复杂版面与扫描件 | 需要部署与调参,工程投入更大 |
| 模型兜底 | 少量疑难表格 | 逐表调用成本高,且可能漏行或编造数值 |
| 人工修复 | 关键表格与少量数据 | 最可靠,但无法规模化,适合作为兜底 |
表格转 Markdown 保留表头语义,检索命中后模型能直接按行列理解,效果远好于把单元格拍成一行文本。
用模型抽取表格时务必核对数值:模型会在缺行时补齐、把空单元格填成看似合理的内容,金额与比例字段必须与原件对照。