PDF 上的光学字符识别 (python)

Posted

技术标签:

【中文标题】PDF 上的光学字符识别 (python)【英文标题】:Optical Character Recognition on PDFs (python) 【发布时间】:2020-12-26 03:32:01 【问题描述】:

我正在使用 ocrmypdf。我正在尝试对竞选财务 pdf 进行 ocr。示例 pdf:https://apps1.lavote.net/camp/comm.cfm?&cid=11

我的客户想要解析这些 pdf 文件以及其他文件(表格 496s、表格 497s)。问题是,即使是相同类型的表单,ocr 结果也不一致。

例如,一份 pdf(表格 460)将产生以下结果:

Statement covers period

from 07/01/2005

through __11/30/2005

另一个相同类型的产生:

Statement covers period

01/01/2006

from

through 03/17/2006

请注意,第一个日期在from 之后,而在第二个中,第一个日期在from 之前。这会在尝试解析数据时产生复杂性。

我正在使用我所谓的“检查点”来解析类似类型的表单。这是一个例子:

checkpoints = [
        ['Statement covers period from', 'Date From'],
        ['through', 'Date Thru'],
        ['Date of election if applicable:', None],
        ['\n', None],
        ['\\NUMBER Treasurer(s)\n', 'ID'],
        ['\n', None],
        ['COMMITTEE NAME (OR CANDIDATE’S NAME IF NO COMMITTEE)\n\n', 'Committee / Candidate Name'],
        ['\n', None],
        ['NAME OF TREASURER\n\n', 'Name of Treasurer'],
        ['\n', None],
        ['NAME OF OFFICEHOLDER OR CANDIDATE\n\n', 'Name of Officeholder or Candidate'],
        ['\n', None],
        ['OFFICE SOUGHT OR HELD (INCLUDE LOCATION AND DISTRICT NUMBER IF APPLICABLE)\n\n', 'Office Sough or Held'],
        ['\n', None],
    ]

我遍历每个检查点,找到当前迭代的开始索引和结束(使用当前检查点和下一个)索引,[0] 而不是 [1],并将内容保存到主对象中的键中,喜欢county_object[checkpoint[1]] = contents[start_index:end_index]

此设置仅适用于我正在解析的 pdf。因为 ocrmypdf 即使对于相同的表单类型也会产生不同的结果,所以我的设置并不理想。有人可以指出我应该如何去做的正确方向吗?

谢谢

【问题讨论】:

这是一个很难解决的问题,我什至会说没有 NLP 几乎是不可能的。有很多公司基本上都在解决这个确切的问题(提取您想要的事件数据,但文档和/或 OCR 结果略有不同)。资料来源:曾从事研发工作。 【参考方案1】:

我想“相同”的 460 表格之间的区别是 由于被扫描而导致的垂直错位 在一个轻微的 CW 角度和另一个在轻微的 CCW 角度。 我希望您使用--deskew 调用, 但即便如此,也可能会出现一些小偏差,这很麻烦。

日期之间的垂直间隔似乎很大而且很牢固, 所以一个日期将以适当的方式在另一个日期之前。 考虑更多地关注 mm/dd/yyyy 模式 而在文本锚点上则更少。

您可以从 Tesseract OCR 中obtain bound box coordinates。 用它们来消除日期的歧义, 根据您对表格上较高或较低的内容的了解, 以及(大约)多少。

【讨论】:

以上是关于PDF 上的光学字符识别 (python)的主要内容,如果未能解决你的问题,请参考以下文章

光学字符识别OCR

光学字符识别

OCR技术(光学字符识别)

通过字段识别和光学字符识别(OCR)进行数据输入自动化,用于预定义表格上的手写

用于屏幕文本的 OCR(光学字符识别)

Tesseract:简单的Java光学字符识别