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

问题描述

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

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

我将如何找到“时间”一词的多个实例?

这是我的代码

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 上)时,有很多单词会出现多个随机符号和字符,即使它是完美的清晰易读。这是否是计算机编程的局限性,而不必应用更复杂的概念(例如机器学习)来准确读取文件

解决方法

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

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。