如何优化算法对OCR识别的文本、公式块按正确顺序排序
请参考以下段落以及检测到的单词和公式块:
(OCR结果示例:绿色矩形高亮显示文本区域,蓝色矩形高亮显示单个单词和公式,这些识别结果由Google Vision API和Mathpix OCR API结合获取)
所有提取到的矩形都会被标记为block、word或math三种类型,同时附带两个核心属性:
- 图像上的坐标:格式为[左上、右上、右下、左下],每个点的坐标为(X,Y)格式
- 文本值:即识别出的实际内容,例如"Der"
每个block内的所有矩形都会被保存为该block的子元素,可以直接遍历单个block的全部子元素。
当前需要解决的需求是按照阅读顺序和换行规则提取block内的单词。本次示例使用的是印刷文本,但这套OCR算法同时支持手写文本和公式识别,这会导致同一行文本的单词顶部坐标波动更大,需要找到处理这类排序需求的最高效方案。
第一种尝试方案
我最先测试的方案是遍历block内的所有单词,用y ranges映射表存储数据,表中每一项对应一行文本,使用的数据结构示例如下:
lines = { [10, 20]: ["Der", "entsprechende", "Kapitalwert", "der", "Zahlungsreihe", "beträgt" ...], [25, 35]: ["next", "line"] }
完成行分组后再遍历每一行,将行内单词按照x坐标升序排序,就能得到正确的阅读顺序。
这套方案的缺点很明显:每个单词都需要遍历映射表的所有条目,检查自身y值是否落在对应区间内,时间复杂度较高。
我正在寻找更高效的实现思路:有没有办法可以将单个区间映射为唯一值(比如使用哈希?),直接将每一行的内容存储到对应的哈希值下?
保序哈希函数看起来适配有序值的处理场景,但我暂时不清楚如何将它应用到带阈值的区间处理场景中。
Google原生能力复用思路
前文提到识别结果本身就包含Google Vision API文档文本检测的输出,Google原生提供了扫描文档的full annotation结果,但目前单个段落的识别结果没有做排序,或许可以基于Vision API的这些输出优化排序逻辑。
内容的提问来源于stack exchange,提问作者aseidma

