如何从python上的PDF文件中提取单词的多个实例?

Posted

技术标签:

【中文标题】如何从python上的PDF文件中提取单词的多个实例?【英文标题】:How to extract multiple instances of a word from PDF files on python? 【发布时间】:2021-01-22 18:56:27 【问题描述】:

我正在 python 上编写一个脚本来读取 PDF 文件并记录在每个提到“时间”的实例之后出现的字符串以及它所提到的页码。

我已经让它识别每个页面上何时有字符串“时间”并将页码发送给我,但是如果页面不止一次有“时间”,它不会告诉我。我假设这是因为它已经满足了字符串“时间”至少一次的标准,因此它会跳到下一页来执行检查。

如何查找“时间”一词的多个实例?

这是我的代码:

import PyPDF2

def pdf_read():
    pdfFile = "records\document.pdf"
    
    pdf = PyPDF2.PdfFileReader(pdfFile)
    pageCount = pdf.getNumPages()
    
    for pageNumber in range(pageCount):
        page = pdf.getPage(pageNumber)
        pageContent = page.extractText()   
        if "Time" in pageContent or "time" in pageContent:
            print(pageNumber)

另外作为一个附注,这个 pdf 是一个扫描的文档,因此当我在 python 上阅读文本(或复制并粘贴到 word 上)时,有很多单词会出现多个随机符号和字符,即使它非常完美易读。这是计算机编程的限制,而无需应用更复杂的概念(例如机器学习)来准确读取文件?

【问题讨论】:

【参考方案1】:

一种解决方案是在 pageContent 之外创建一个字符串列表,并计算列表中单词“时间”的频率。选择“时间”后面的单词也更容易 - 您可以简单地检索列表中的下一项:

import PyPDF2
import string

pdfFile = "records\document.pdf"

pdf = PyPDF2.PdfFileReader(pdfFile)
pageCount = pdf.getNumPages()

for pageNumber in range(pageCount):
    page = pdf.getPage(pageNumber)
    pageContent = page.extractText()   
    pageContent = ''.join(pageContent.splitlines()).split() # words to list
    pageContent = ["".join(j.lower() for j in i if j not in string.punctuation) for i in pageContent] # remove punctuation

    print(pageContent.count('time') + pageContent.count('Time')) # count occurances of time in list
    print([(j, pageContent[i+1] if i+1 < len(pageContent) else '') for i, j in enumerate(pageContent) if j == 'Time' or j == 'time']) # list time and following word

请注意,此示例还会从非字母或数字字符中删除所有单词。希望这足以清除坏的 OCR。

【讨论】:

这很完美,因为文字很清楚!我现在的问题是:更先进的机器学习方法是获得正确光学字符读数的唯一其他方法吗?就目前而言,由于正在扫描,PDF 仍然无法完全匹配单词。 你可以先试试pytesseract。

以上是关于如何从python上的PDF文件中提取单词的多个实例?的主要内容,如果未能解决你的问题,请参考以下文章

从 pdf azure 认知搜索中提取段落或句子

如何提取XML文件中的数据?

如何让 Python 从文本文件中读取和提取单词? [复制]

空格从PDF提取和奇怪的单词解释中消失了

如何从 python 中的图像(或 pdf 文件)中提取名称和手写数字?

如何从Java中提取PDF文件中的表格数据