OCR识别病历报告,
为什么总是出问题
你装了一个OCR工具,把检验报告截图丢进去,识别率还不错,文字都认出来了。但输出结果你没法用:字段名和数值混在同一行,单位跟着数值跑到了另一行,不同报告的格式不一样导致同样的字段出现在完全不同的位置……
这不是工具不好用,也不是你的操作有问题。OCR工具做到了它能做的事,只是那件事和你真正需要的,不是同一件事。
OCR做的是什么
OCR(光学字符识别)的核心任务是:把图片里的像素转化成文字。给它一张有文字的图,它输出一段文本。就这些。
它不知道"白细胞"是字段名,"5.2"是对应的值,"×10⁹/L"是单位,三者之间有语义关系。它看到的是:一排像素对应"白细胞",旁边一排像素对应"5.2",再旁边是"×10⁹/L"。至于这三块内容是什么关系,OCR不管——它的工作在认出字符时就结束了。
输出的文本里,这三块内容可能在同一行,可能不在,取决于截图里的版面布局。如果检验报告用的是多列排版(很多医院的报告格式是这样),OCR按行扫描,可能把同一行不同列的内容混在一起,把本来相邻的字段和数值分到不同行。
结果就是你拿到的:一堆认识的字,但组合完全乱掉了。
病历报告场景的三个死穴
多列表格布局。标准检验报告通常是四列:项目名称、结果、参考范围、单位。OCR按行扫描时,一行里会同时有四列的内容,输出成文本后,这四块信息混在一起,没有任何分隔标记。你拿到的可能是"白细胞 5.2 3.5-9.5 ×10⁹/L 红细胞 4.35 3.80-5.10 ×10¹²/L"——字都认出来了,但哪个是哪份报告的哪个字段的值,需要你自己再解析。
格式因医院而异。不同医院、不同HIS系统、不同检验科,报告的版式都不一样:字体大小不同,列间距不同,某些报告有表格线,某些没有,某些用加粗区分异常值,某些用箭头标注。你在A医院的报告上训练出来的解析规则,换到B医院的报告就不适用了。这意味着每换一种报告格式,就要重新处理,没有通用解法。
手写内容和混排。病历里经常出现手写批注、手写签名、印章、或者扫描件里的折痕、污渍——这些对OCR来说是噪声。手写字体的识别准确率远低于印刷体,遇到连笔字或潦草字体时,OCR输出往往是乱码或空白。
识别文字和提取数据,是两件事
把这两个任务区分开来,事情就清楚多了。
"识别文字"是问:图片里有哪些字符?OCR非常擅长回答这个问题,主流工具在印刷体场景下准确率能达到95%以上。
"提取数据"是问:这张检验报告里,"血红蛋白"这个指标的数值是多少?这个问题需要理解"血红蛋白"是字段名,找到它在报告里的位置,找到与它对应的数值,排除掉旁边的参考范围和单位,返回那个具体的数字。
第二个问题涉及语义理解,不是字符识别。它需要知道"HGB"、"Hb"、"血色素"、"hemoglobin"指的是同一个概念;需要知道表格里哪一格是结果、哪一格是参考范围;需要知道"↑"或者"H"标注表示异常,但你要的是数值本身,不是标注。
OCR不做语义理解,这不是它的缺陷,是它的设计定位。用OCR去解决"提取数据"的问题,本质上是用错了工具。
视觉大模型做的是什么
简录AI这类基于视觉大模型的工具,处理的是"提取数据"这个任务,而不是"识别文字"。
它的工作方式是:给它一张检验报告截图,告诉它"我要血红蛋白的值",它理解"血红蛋白"这个概念,在截图里找到对应的数值——无论那个字段在报告里叫"HGB"、"血红蛋白(g/L)"还是"Hemoglobin",无论它出现在报告的哪个位置,无论报告的版式是什么样的。
这不是更好的OCR,是不同层次的任务。OCR在字符层面工作,视觉大模型在语义层面工作。前者的输出是"这张图里有哪些字",后者的输出是"你要的那个值是5.2"。
对临床研究数据采集来说,你实际需要的答案是后者。
实际用起来的差异
用OCR工具处理100张检验报告截图,流程大概是:运行OCR得到100个文本文件,写或找一个解析脚本,对文本做正则匹配或按行解析,处理格式异常,手动核查识别失败的条目,最后整理成Excel。这个过程涉及至少三个步骤,每个步骤都有出错的可能,而且每次遇到新格式的报告都要重新适配。
用简录AI的流程:上传截图,在界面里写下你要的字段名("血红蛋白"、"血肌酐"、"血小板"……),等处理完成,导出Excel,每行对应一份截图,每列对应一个字段。识别准确率在印刷体报告上最高可达99%,处理速度是单页5-10秒。
两个流程之间的差异不只是时间,还有"需要的技能":OCR方案需要你会写或能找到合适的解析代码,视觉大模型方案不需要。对大多数临床研究者来说,这个门槛差异比时间差异更实际。