OCR 识别表格时如何保留行列关系
OCR 识别表格时,真正容易丢失的不是文字,而是文字所在的格子。只拿到按阅读顺序排列的字符串,后面再怎么拼接也很难恢复列关系。可靠做法是让每个识别片段同时携带文本、坐标框和置信度,再根据几何位置重建行列。
官方文档:https://huggingface.co/docs/transformers/en/model_doc/table-transformer
- OCR 输出至少保留
text、box、score三类信息。 - 先按文本框垂直中心聚成行,再按左边界排序,不能依赖模型返回顺序。
- 合并单元格、无边框表格和低置信度片段必须单独标记,交给规则或人工复核。
先把 OCR 结果从文字升级为带坐标的单元格候选
一个表格片段可以抽象成 (text, x1, y1, x2, y2, score)。坐标最好统一为原图像素坐标,避免裁剪、缩放后混用不同参考系。若使用 Table Transformer 一类模型,还应在后处理阶段把归一化框还原到原图尺寸;官方处理器提供了取得未归一化 bounding box 的方法。
不要先把识别结果拼成长字符串。先过滤明显无效的空文本,保留低置信度项并加上标记,因为它可能正好是表头、合计或跨列说明。
from dataclasses import dataclass
@dataclass
class Cell:
# box 使用原图像素坐标:左、上、右、下
text: str
box: tuple[int, int, int, int]
score: float
def center(box: tuple[int, int, int, int]) -> tuple[float, float]:
# 用中心点参与聚类,降低字框高度不同带来的偏差
x1, y1, x2, y2 = box
return (x1 + x2) / 2, (y1 + y2) / 2
用坐标聚类恢复行列,而不是按识别顺序拼接
恢复结构可以分两层:先按 y 方向判断哪些框属于同一行,再在每一行内按 x1 升序排列。行判断不宜写死一个像素阈值,更稳妥的做法是用当前文字高度估计容差,例如两个框的垂直中心差小于较小框高度的 0.5~0.7 倍时归为同一行。
行聚好后,再从左到右排序。若同一行里有两个框水平重叠,先合并文本或保留为候选冲突,不要悄悄覆盖。这样可以看出“2024”“年报”被拆开,还是两个本来就属于不同列的值。

def same_row(a: Cell, b: Cell) -> bool:
# 使用框高估算容差,适应扫描件中字号略有变化的情况
_, ay = center(a.box)
_, by = center(b.box)
ah = a.box[3] - a.box[1]
bh = b.box[3] - b.box[1]
tolerance = min(ah, bh) * 0.6
return abs(ay - by) list[Cell]:
# x1 是列顺序的主要依据,y 只用于稳定排序
return sorted(row, key=lambda item: (item.box[0], item.box[1]))
合并单元格和错位文本要单独处理
普通行列排序只能解决“看起来像网格”的表格。遇到合并单元格时,应先估计列边界,再判断文本框覆盖了几列。如果一个框横向覆盖两个以上列中心,输出中不要复制到每一列,而是保存 colspan,或将它放入带跨度的单元格对象。
无边框表格还要留意两种误判:一是相邻列文字距离很小,被误合并;二是换行文本的第二行被误认为新行。可以用同列重叠、行高连续性和相邻空白共同决策。低置信度文本不要直接删除,给它附上 needs_review 标记,比生成一个看似完整但列错位的 CSV 更安全。

输出结构化表格前做三项检查
第一,检查每一行的列数是否突然变化;如果变化只发生在表头或合计行,可能是合并单元格,不能简单补空值。第二,检查同一列的 x 范围是否稳定,漂移过大通常意味着扫描倾斜、裁剪不一致或行聚类阈值过宽。第三,抽样查看低置信度和跨度最大的片段,并把原始坐标一并保存,方便回溯。
最终输出可以是二维数组,也可以是更适合审计的 JSON:
{
"rows": [
[{"text": "项目", "colspan": 1}, {"text": "金额", "colspan": 1}],
[{"text": "服务费", "colspan": 2, "needs_review": false}]
]
}
这里的关键不是把每张图片都强行变成规则矩阵,而是保留“文字来自哪个位置、覆盖哪些列、是否需要复核”这三类证据。字符识别正确但位置错误,业务上仍然等于识别失败。
常见问题
为什么 OCR 文本都对,导出的 Excel 仍然错列?
因为文本准确率没有衡量坐标关系。导出前必须保留 bounding box,并重新做行聚类与列排序。
行聚类阈值应该固定多少?
不建议固定像素值。用文本框高度或页面缩放比例计算相对阈值,再用少量样本复核。
合并单元格要不要复制到每一列?
不要默认复制。优先保存 colspan 或覆盖列范围,后续由业务规则决定展示方式。
总结来说,保留表格行列关系的核心是“识别文字”和“重建布局”分离:OCR 负责提供文本与位置,几何规则负责恢复行列,异常项负责进入复核。只要坐标证据没有丢,后续换模型、换导出格式或增加合并单元格策略都还有调整空间。
Go map lookup value 是指针时如何区分空值
- 上一篇
- Go map lookup value 是指针时如何区分空值
- 下一篇
- Go encoding/csv FieldsPerRecord 列数错误发生在 Read 还是 ReadAll
-
- 科技周边 · 人工智能 | 3小时前 |
- RAG 文档切片的重叠长度怎么按检索目标调整
- 280浏览 收藏
-
- 科技周边 · 人工智能 | 5小时前 | 人工智能 · 向量数据库 · 索引选型 · 向量检索 vector index HNSW FLAT
- 向量索引选型时如何比较召回、内存和更新代价
- 485浏览 收藏
-
- 科技周边 · 人工智能 | 6小时前 |
- 图像输入的说明文字和图片内容冲突时如何设计提示
- 404浏览 收藏
-
- 科技周边 · 人工智能 | 7小时前 | openai · 工具调用 · 函数调用 · Responses API tool_choice allowed_tools
- OpenAI 工具选择策略怎么限制模型只调用指定工具
- 463浏览 收藏
-
- 科技周边 · 人工智能 | 7小时前 | 人工智能 · 结构化输出 · 接口排错 · 日志设计 · 结构化输出 JSON Schema Structured Outputs 响应校验 原始响应
- 结构化输出校验失败时应用层怎么保留原始响应
- 324浏览 收藏
-
- 科技周边 · 人工智能 | 1天前 | 上下文 · ai agent · 记忆系统 · AI Agent 上下文工程 agent memory
- AI Agent 记忆为什么要区分短期上下文和长期存储
- 155浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 63次使用
-
- SuperCLUE
- SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
- 224次使用
-
- C-Eval
- 深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
- 148次使用
-
- AI Prompt Library
- 探索AI Prompt Library免费资源库,涵盖营销、写作及多场景AI提示词。兼容ChatGPT、Claude等工具,一键复制优化输出,提升工作效率。
- 81次使用
-
- Generrated
- Generrated汇集9300+张DALL·E生成图像及对应提示词,支持查看完整图集、对比DALL·E 2与3版本差异,是AI绘图新手学习Prompt设计与获取创作灵感的实用工具。
- 58次使用
-
- 纸质档案扫描选 300dpi 还是 600dpi
- 2026-09-06 273浏览
-
- CodeGeeX for Jetbrains IDEs正式上线!
- 2023-01-17 284浏览
-
- 技术阿里云实现ocr批量图片和pdf文件表格图片转换excel文档/支持票据图片提取/普通图片文字提取处理
- 2023-01-18 387浏览
-
- 直播预告|FeatureStore Meetup V2
- 2023-01-10 328浏览
-
- 深入浅出特征工程 – 基于 OpenMLDB 的实践指南(上)
- 2023-02-25 426浏览

