Skip to content

OCR、表格与结构校验 ​

OCR输出字符和置信度,却不理解每个数值的业务含义。“100.00”被识别为“10000”时,全文字符准确率仍可能很高。缩放、去倾斜、语言模型和版面裁剪应先用同一批标注页比较;盲目锐化也可能使细线断裂。

表格需要恢复单元格边界、行列关系、合并单元格和表头上下文。跨页表格的重复表头可以合并,但必须保留原页与行定位。把CSV当作逗号分隔字符串手工split,会在带引号字段内部的逗号处拆错。

python
import csv, io
from decimal import Decimal
raw = 'item,qty,price,total\n"pen, blue",2,3.50,7.00\nbook,1,12.00,1200\n'
rows = list(csv.DictReader(io.StringIO(raw)))
errors = []
for line, row in enumerate(rows, start=2):
    expected = Decimal(row['qty']) * Decimal(row['price'])
    if expected != Decimal(row['total']):
        errors.append((line, str(expected), row['total']))
assert rows[0]['item'] == 'pen, blue'
assert errors == [(3, '12.00', '1200')]
print(errors)

校验指出第三行不满足数量×单价=金额,却不能自动断言总额错了:数量或单价也可能识别错误。正确处理是保留原始识别值、候选修复、规则、原图定位,再人工或二次解析确认。金额用Decimal避免二进制浮点误差;税额、折扣、四舍五入规则必须明确,否则正常账单也会被误判。

把表格送入检索而不丢语义 ​

孤立单元格“12”没有单位和所属产品。可将每行转成“产品=book,数量=1,单价=12.00元”,同时保留表标题和列名;这利于文本检索。需要汇总和过滤时则保存关系表,用确定性SQL/代码执行,模型仅解释结果。图片里的图表还涉及坐标轴、单位和图例,视觉模型一句摘要不能替代数值读取。

低置信度区域可以重试另一模型、提高分辨率或转人工,但阈值来自标注集校准。按整页平均置信度放行会掩盖关键金额区域错误。对重要字段分别统计精确匹配率;字符错误率只是辅助。

练习 ​

将book行金额恢复为12.00,加入数量3、单价0.10、总额0.30的行,要求校验无错误。为何不能用OCR置信度代替这个检查?

完成后查看本章答案。

下一章:网页、代码与不可信内容。

用心记录每一步成长