PDF转文本:一个充满挑战的问题
PDF转文本:一个充满挑战的问题
发布时间: 2025-05-13 标签: nlnet search-engine programming
搜索引擎最近获得了索引 PDF 文件格式的能力。这项变更将在几个月内逐步部署。
从 PDF 中提取文本信息远比看起来更具挑战性。问题的核心在于,这种文件格式根本不是文本格式,而是一种图形格式。
它并不像你想象的那样包含文本,而更像是字形到“纸张”上坐标的映射。这些字形可能会旋转、重叠和乱序出现,并且几乎没有附加语义信息。
你应该对你能够在喜欢的查看器(或浏览器)中打开 PDF 文件,按下 Ctrl+F 并搜索文本这一事实感到敬畏。
与此同时,搜索引擎最好能获得干净的 HTML 作为输入。
目前,解决这个问题的最佳方法可能是基于视觉的机器学习模型,但这距离在没有 GPU 的单台服务器上扩展到处理数百 GB 的 PDF 文件还很遥远。
幸运的是,这并不是一个完全未被探索的问题。可以从 PDFBox 的 PDFTextStripper
类开始,它 某种程度上 解决了这个问题,但存在很多局限性,这意味着它不太适合搜索引擎的需求,因为它正如其名,只是从 PDF 中提取文本,而不考虑标题或其他语义信息,而这些信息是非常重要的相关性信号。
以下是对 PDFTextStripper
所做的一些修改,以便提供更适合搜索引擎需求的 PDF 到文本的提取。
识别标题
一个寻找标题的简单方法是寻找加粗或更粗的,与其他文本隔离的文本行。这在标题加粗时有效,但并非所有标题都加粗!
"Can Education be Standardized? Evidence from Kenya"的第一页摘录,工作版本
正如我们在上面的例子中看到的,许多标题依赖于字体大小。
这带来了一个问题,因为字体大小很大程度上取决于文档本身。一个文档可能以 10pt 的字体显示正文,以 16pt 的字体显示标题,而另一个文档可能分别使用 14pt 和 20pt!寻找全局断点是徒劳的,相反,构建一些字体大小统计信息会更有效。
"Can Education be Standardized?"中字体大小的分布
这里,第 1 页是包含摘要和作者列表的封面,第 9 页是包含标题的文本,第 10 页只是文本。由于下标、脚注等原因,字体大小分布存在一定程度的噪声。
我们可以看到第 9 页和第 10 页的分布非常相似,但第 1 页偏差很大。
对于每一页,往往有一种主要的字体大小,通常是正文文本(注意对数 y 轴)。
分布的差异暗示我们可能需要使用每页的统计信息,而不是每个文档的统计信息,因为特别是第一页上的字体选择通常与其余页面不同。在“Can education be standardized…”的例子中,字体大小 17 用于文档的标题,但字体大小 14 用于后面的标题。
将每页中位字体大小的 20% 左右作为一个因子,似乎可以相当可靠地识别标题。当然,总会有例外情况,但这可以捕获大多数重要的情况。
连接连续标题
标题通常分为多行,通常是出于风格原因。这意味着我们有时希望将连续的标题文本行连接成一行,而决定何时执行此操作并非完全微不足道。我不会提供任何真正的解决方案,但主要尝试强调为什么这是一个棘手的问题。
上面的例子结合了一个两行标题,以及流行的标题美学选择,即标题右对齐——这会导致问题,因为缩进一行也通常是段落中断的标志——标题后面是另一行半粗体的文本(作者的名字),几行之后,我们有一个根本没有加粗的标题。
这是另一种我们不太可能找到万无一失的连接规则的情况。连接具有相同字体大小和粗细的连续标题似乎在很大程度上效果很好,但在很多情况下会产生不良结果。
识别段落
PDFTextStripper
在识别段落方面做得不错。它巧妙地结合了行间距和缩进来确定何时中断段落。但它仍然有一些改进的空间,特别是在行间距逻辑方面。
它最大的问题是,它对行分离使用了一个固定的断点,在该点之上,行不在同一个段落中,而没有考虑到文档使用不同的行间距。特别是在学术草稿和预印本中,1.5-2 倍的行间距相当常见!如果值太大,我们会干扰标题识别,因为一些标题会被吸收到正文的段落中,因此我们需要一个健壮的解决方案。
我们可以通过应用与字体大小类似的统计技术来解决这个缺点。让我们考虑一页文本,如下所示。这是一段 PDFTextStripper
可以毫无问题地处理的文本,但它可以更清楚地解释,所以我们仍然会考虑它。
"The role of phronesis in knowledge-based economy"的第5页摘录;显示了由不同空格分隔的四个不同的文本块。
如果我们为该文本构建一个行之间距离的直方图,我们会发现如下图所示。
"The role of phronesis in knowledge-based economy", Ceglarska 的第 5 页中行之间的距离。
我们往往在这里有相当大的异常值,因此使用平均方法不太可能表现良好,但中位数最终恰好是正文中使用的行距。因此,同样可以附加一些因子,最终得到一个用于分离段落的启发式方法,该方法可以应对任何行间距!
结论
从 PDF 中提取文本永远不会是完美的,因为该格式的设计初衷并非用于此类操作,并且在选择使用哪种“足够好”的解决方案时,需要进行许多权衡。搜索引擎主要对相关性信号感兴趣,例如标题。如果它可以识别摘要并获得剩余文本的某种连贯的画面,它会非常高兴。因此,从这个意义上讲,可以找到一种以某种优雅的方式处理大多数相关文档的解决方案。
使用的示例文本
Can Education be Standardized? Evidence from Kenya (2022) - Working Paper Guthrie Gray-Lobe, Anthony Keats, Michael Kremer, Isaac Mbiti, Owen W. Ozier The theory of ideas and Plato’s philosophy of mathematics (2019) Dembiński, B. The role of phronesis in Knowledge-Based Economy (2024) Anna Ceglarska, Cymbranowicz Katarzyna
上一篇:
Debugging A Crawler Stall| 2025-04-22 marginalia.nu © 2025 <> 考虑捐赠以支持 Marginalia Search 和其他服务的开发工作!