如何让Pytesseract按表单框顺序返回文本以优化LLM实体提取?
解决Pytesseract表单OCR文本顺序错乱问题
一、调整Pytesseract参数优化识别顺序
你当前使用的--psm 12模式更适配稀疏文本场景,对表单这类结构化布局支持有限,可尝试以下参数调整:
- 切换PSM模式:优先测试
--psm 4(假设文本按列对齐,适配表单常见的标签-值两列布局)或--psm 6(将图像视为单一文本块,按自然阅读顺序输出)。示例代码:
text = pytesseract.image_to_string(image, lang='eng', config='--psm 4')
- 基于坐标手动排序:如果参数调整后仍无法解决,可通过
pytesseract.image_to_data()获取每个文本块的坐标信息,按位置重新排序。核心逻辑是按行(y坐标)分组,同一行内按x坐标从左到右排列,确保标签与对应值相邻:
import pandas as pd # 获取带坐标的OCR结果 df = pd.DataFrame(pytesseract.image_to_data(image, output_type='data.frame')) # 过滤有效文本行 df = df[df['text'].notna()] # 按行(top值)和列(left值)排序 df = df.sort_values(['top', 'left']) # 拼接成有序文本 ordered_text = ' '.join(df['text'].tolist())
二、通用替代方案
如果Pytesseract本身难以满足需求,可尝试以下思路:
- 图片预处理:用OpenCV对扫描件做二值化、降噪处理,强化表单框线和文本对比度,帮助OCR更好识别布局:
import cv2 # 读取并转灰度图 image = cv2.imread('your_form.png') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 二值化处理(可根据实际情况调整阈值) _, processed_image = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY) # 传入Pytesseract识别 text = pytesseract.image_to_string(processed_image, lang='eng', config='--psm 4')
- 使用布局感知型OCR模型:比如LayoutLM系列模型,它能同时利用文本内容和空间位置信息,直接提取表单中的键值对(标签-值对应关系),无需依赖OCR文本顺序。
- 结合位置信息喂给LLM:将OCR输出的所有文本(含坐标)传入LLM,明确告知每个文本块的位置信息,让LLM基于位置判断标签与对应值的关联。比如把每个文本块格式设为
[top:X, left:Y] 文本内容,再提示LLM:"根据以下带位置的文本,提取患者姓名、年龄等实体,注意标签(如Patient Name)和对应值的位置对应关系"
内容的提问来源于stack exchange,提问作者Srivatsan
相关产品推荐
相关产品推荐

