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)的主要内容,如果未能解决你的问题,请参考以下文章