【问题标题】:Title Extraction/Identification from PDFs从 PDF 中提取/识别标题
【发布时间】:2019-03-22 17:23:33
【问题描述】:

我有大量不同格式的 pdf。除其他外,我需要提取它们的标题(不是文档名称,而是文本中的标题)。由于格式的范围,标题不在 pdf 中的相同位置。此外,一些 pdf 文件实际上是扫描图像(我需要对它们使用 OCR/光学字符识别)。标题有时是一行,有时是 2 行。它们的词组往往不同。在标题通常出现的物理位置范围内,通常还有其他词(即,如果 doc 1 在 x1, y1 有标题 1,则 doc 2 可能在 x2, y2 有标题 2,但在 x1 y1 有其他非标题文本)。此外,在极少数情况下 pdf 没有标题。

到目前为止,我可以使用 pdftotext 在给定的边界框中提取文本,并将其转换为文本文件。如果有标题,这可以让我捕捉到标题,但通常会包含其他无关的词。这也仅适用于非图像 pdf。我想知道是否a)有一种从我为文档提取的所有单词中识别标题的好方法(因为经常有无关的单词),理想情况下是一种识别标题不存在的好方法,并且b)如果有任何与 pdftotext 等效的工具也适用于扫描的图像(我确实有一个 ocr 脚本工作,但它对整个图像而不是一个部分进行 ocr)。

在一定程度上解决标题困境的一种方法是提取边界框中的单词,使用文档的其余部分来识别哪些边界框单词是文档的关键字,并根据关键字构造标题。这不会提取实际标题,但可能会给出可以构建合理替代方案的单词。我已经在为项目的其他部分提取关键字,但我肯定更喜欢提取实际标题,因为人们可能会使用逐字标题进行查找。

如果不清楚,请进一步注意 - 我正在尝试使用开源/免费工具以编程方式执行此操作,最好是在 Python 中,并且我将拥有大量文档(10,000 多个)。

【问题讨论】:

  • 这听起来像是一项艰巨的任务,不仅仅是 OCR,还有标题在哪里的识别。我很想知道是否有办法以编程方式做到这一点。我建议考虑像Amazon Mechanical Turk 这样的东西来完成这项任务。它不会是免费的,但你的时间也不是,而且可以通过这种方式完成。

标签: python pdf nlp ocr pdf-scraping


【解决方案1】:

您可以利用word font-size 信息来提取标题词。 根据您的问题,我在这里所理解的是我建议提取标题词:

使用任何开源模块(例如 pdf2image)将 pdf 文档转换为图像,然后使用 tesseract 进行 OCR。从 OCR 输出中,您可以获得文本数据及其尺寸信息,即。单个单词的宽度和高度。

对单词的高度做一些统计分析(柱状图),看看你是否可以使用高度分布来识别标题单词。 您可以使用基于启发式信息的固定阈值值,也可以使用基于高度分布的一些自适应阈值并使用此阈值来识别标题词。

【讨论】:

  • 感谢您的推荐 - 我认为如果其他人看到这个,这将对他们的问题很有用,但不幸的是,我的语料库的标题和正文字体大小相同。您是否碰巧知道 tesseract 的 OCR 是否也可以识别粗体文本?我的 pdf 中确实有其他粗体文本,但它的一个功能可以提供相当大的帮助。
  • 我不确定粗体文本,但 tesseract 的 TessbaseAPI 提供了在这种情况下可能有用的单词和符号级别的字体类型信息。如果我猜,那么与非标题文本字符相比,粗体文本字符将具有不同的宽度,因此此信息可能很有用。
【解决方案2】:

对于以后遇到这个问题的人,我将提供一个关于我决定做什么的快速更新(虽然我没有测试过准确性,所以我不知道这种方法是否真的有用) .

我将使用的总体方法是通过神经网络进行机器学习(一旦我掌握了准确性,我会报告它)。我实际上是在获取文档的前 200 个单词,并生成 4-20 个连续单词的 n-grams(所以 ~16*200 n-grams 的单词;4 bc 我的标题都不短,20 个相同但更长) .然后,我从每个 n-gram 生成一个唯一的特征向量,我决定使用的特征部分取决于我的文本,但有些更通用,例如“n-gram 第一个单词的首字母大写吗?”。知道正确的标题,我可以把它们变成一个等价的向量。因此,如果 vec(n_gram) = vec(correct_title) 则输出 1,否则输出 0。我正在使用它来训练 ML 模型。目前这不能解决我扫描图像 pdf 的问题,除非它们首先被转换成文本文档。它还假设当 pdf 转换为 n-gram 时,在标题词中保留了词序。我注意到非标题单词的顺序并不总是通过转换保留,但这是一个非常罕见的问题,并且似乎只在有换行符然后整行不合适时才会发生(所以它不应该影响标题希望)。

【讨论】:

    猜你喜欢
    • 2015-04-16
    • 1970-01-01
    • 2017-08-25
    • 2019-04-11
    • 1970-01-01
    • 2014-03-02
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多