如何在保持文本结构(标题/副标题/正文)的同时进行 PDF 文本提取的 OCR

Posted

技术标签:

【中文标题】如何在保持文本结构(标题/副标题/正文)的同时进行 PDF 文本提取的 OCR【英文标题】:How to do OCR for PDF text extraction WHILE maintaining text structure (header/subtitle/body) 【发布时间】:2018-12-17 13:40:55 【问题描述】:

我一直在寻找一种可以在保持结构的同时从 PDF 中提取文本的工具。也就是说,给定这样的文本:


标题

字幕1

身体1

字幕2

身体2



标题

字幕 1。身体1

字幕2。身体2


我想要一个可以输出标题、副标题和正文列表的工具。或者,如果有人知道如何做到这一点,那也会很有用:)

如果这 3 个类别采用相同的格式,这会更容易,但有时字幕可以是粗体、斜体、下划线或三者的随机组合。标题也是如此。从 html/PDF/Docx 进行简单解析的问题是这些文本没有标准,因此我们经常会遇到分成几个标签的句子(在 HTML 的情况下)并且非常难以解析。如您所见,字幕并不总是在给定段落的上方,或者有时在项目符号中。这么多可能的格式组合...

到目前为止,我在使用 Tesseract 的 here 和使用 OpenCV 的 here 中遇到过类似的询问,但他们都没有完全回答我的问题。

我知道有一些机器学习工具可以从科学论文中提取“目录”部分,但这也没有删减它。 有谁知道包/库,或者是否已经实施了这样的事情?或者有谁知道解决这个问题的方法,最好是在 Python 中?

谢谢!

编辑:

我所指的文件是来自公司的 10-Ks,比如这个https://www.sec.gov/Archives/edgar/data/789019/000119312516662209/d187868d10k.htm#tx187868_10 并且说,我想以如上所述的程序化和结构化方式提取第 7 项。但并非所有这些都标准化以进行 HTML 解析。 (PDF文档就是这个HTML保存为PDF)

【问题讨论】:

你是指pdf文本提取还是ocr pdf图片? 要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题对于 Stack Overflow 来说是题外话。您的“相关”问题之一包含实际代码;另一个是几年前没有那么多工具请求的时候,今天它也应该迅速关闭。 @zindarod 我指的是 pdf 文本提取 - 这些是从 html 文档中解析出来的 pdf,因此它们包含文本。但将其视为文本提取问题并没有奏效,因此我搜索了 OCR 工具。 @usr2564301 我会重新提出我的问题,谢谢 有用 Python 编写的 PDF 文本提取模块(例如,PyMuPDF)。但是您说问题在于标题、副标题和正文没有标准,那么您打算如何以编程方式获取这些信息?你心目中的算法大纲是什么?此外,如果这些 PDF 中的任何一个可以在线访问,链接到它们可能会有所帮助。 【参考方案1】:

有些工具可以在一定程度上完成您要求的功能。说“一定程度”,是指OCR转换后会保留标题和标题字体属性。

看看 Adob​​e 的 Document Cloud 平台。它仍处于发布阶段,将于 2020 年初发布。但是,开发人员可以通过注册抢先体验计划来抢先体验。所有信息都可以在以下链接中找到:

https://www.adobe.com/devnet-docs/dcsdk/servicessdk/index.html

我亲自试用了这项服务,结果看起来很有希望。所有标题和标题案例都会在输入文档中得到识别。提供此功能的微服务是“ExportPDF”服务,可将扫描的 PDF 文档转换为 Microsoft Word 文档。

示例代码位于:https://www.adobe.com/devnet-docs/dcsdk/servicessdk/howtos.html#export-a-pdf

【讨论】:

谢谢你!目前,他们免费提供 1.000 次通话,然后需要支付一笔未公开的费用。无论如何,我被困在“生成个性化代码示例”这一步。这就是我解决它的方法:medium.com/@netpalantir/…【参考方案2】:

这里有很多编码要做,但让我来描述一下我将在 Python 中做什么。这是基于在字体大小和样式方面存在一些结构:

    使用 Tesseract OCR 软件(开源、免费),在 Pytesseract 中使用 OEM 1、PSM 11 将 PDF 预处理为图像并应用其他相关预处理 以数据帧的形式获取输出,并将单个单词组合成由word_num 提供的单词行 计算每行文本的粗细(通过使用图像和 tesseract 输出) 将图像转换为灰度并反转图像颜色 对图像上选定的文本区域进行张素细化(opencv 贡献:cv2.ximgproc.thinning) 细化图像中有白色像素的总和,即值等于 255(白色像素是字母) 倒置图像中有白色像素的总和 最后计算粗细(sum_inverted_pixels - sum_skeleton_pixels) / sum_skeleton_pixels(有时会出现0除错,检查骨架总和为0时,改为返回0) 通过最小值和最大值标准化厚度 通过应用阈值来获取标题,当一行文本为粗体时,例如0.6 或 0.7 要区分不同的标题和副标题,您必须依赖枚举的标题和副标题或标题和副标题的大小。 通过将高度(以像素为单位)转换为以点为单位的高度来计算每个单词的字体大小 中间字体大小成为每行文本的本地字体大小 最后,您可以对标题、副标题进行分类,中间的所有内容都可以是文本。

请注意,有一些方法可以检测表格、页脚等,我不会深入探讨。查找类似以下的研究论文。

相关研究论文:

An Unsupervised Machine Learning Approach to Body Text and Table of Contents Extraction from Digital Scientific Articles. DOI: 10.1007/978-3-642-40501-3_15. Image-based logical document structure recognition. DOI: 10.1007/978-3-642-40501-3_15.

【讨论】:

【参考方案3】:

我在这个话题上做了一些研究和实验,所以让我试着给出一些我从工作中得到的提示,这仍然远非完美。

我还没有找到任何可靠的库来做这件事,虽然有时间和可能的能力(我在阅读其他人的代码方面仍然相对缺乏经验)我希望检查那里的一些工作,特别是一个( parsr)。

通过对Tesseract's hOCR 输出应用过滤器,我确实在标题/标题识别方面取得了一些不错的结果。它需要大量的工作,即

    OCR pdf 正确解析生成的 hOCR,以便您可以访问其段落、行和单词 通过分割边界框扫描每行的高度 扫描每个单词的宽度和高度,再次分割边界框,并跟踪它们 需要高度来拦截误报,因为线高度有时会被夸大 找出最常见的行高,这样你就有了通用基础字体的基线 首先确定高度高于 #6 中找到的基线的线条 消除误报检查是否存在与该行匹配的行单词的最大高度,否则使用每行的最大单词高度与 #6 基线进行比较。 现在你有几个候选人,你想检查一下 一种。候选行不属于其他行不遵循相同高度的段落,除非它是第一行(有时 Tesseract 将标题与段落连接起来)。 湾。该行不以“。”结尾。或“,”以及可能排除标题/标题的其他标记

该列表的运行时间要长一些。例如。您可能还想应用其他一些标准 就像比较相同的词宽:如果在一行中你发现超过一定数量的词(我使用 >= 50%)大于平均水平——与文档中其他地方的相同词相比——你几乎肯定有好的候选人标题或标题。 (标题和标题通常包含在文档中也出现的单词,通常出现多次)

另一个标准是检查所有大写行,增强可以是单行(属于只有一行的段落的行)。

很抱歉,我无法发布任何代码 (*),但希望你明白了要点。

这并不是一件容易的事,如果您不使用 ML,则需要做很多工作。也不确定 ML 会使其更快,因为那里有大量的 PDF,而且可能大人物(Adobe、Google、Abbyy 等)训练他们的模型很长一段时间。

(*) 我的代码在 JS 中,它严重地交织在一个大型转换应用程序中,到目前为止我还不能发布开源代码。我有理由相信你可以在 Python 中完成这项工作,尽管 JS DOM 操作在那里可能有点优势。

【讨论】:

以上是关于如何在保持文本结构(标题/副标题/正文)的同时进行 PDF 文本提取的 OCR的主要内容,如果未能解决你的问题,请参考以下文章

如何在保持 UTF-8 字母的同时进行 slugify [重复]

如何在保持格式的同时从数据库中检索和回显文本[重复]

iOS推送通知中的标题(粗体文本)和正文

如何在保持结构的同时使用 xslt 重新排序 xml 文件

如何创建具有不透明度的父 div,同时将文本的不透明度保持在 100% [重复]

发送 VB.NET 后电子邮件不保持格式