Python:从pdf中提取文本时如何解决合并的单词?

青葱年少 nlp 235

原文标题Python: How to solve merged words when extracting text from pdf?

我正在努力从一组 pdf 文件中提取单词。这些文件是我从网上下载的学术论文。

数据存储在我的本地设备中,按名称排序,遵循项目文件夹内的相对路径:’./papers/data’。你可以在这里找到我的数据。

我的代码在项目 repo (‘./code’) 的代码文件夹中执行

代码的 pdf 单词提取部分如下所示:

import PyPDF2 as pdf
from os import listdir 

#Open the files:
#I) List of files:
files_in_dir = listdir('../papers/data')
#II) Open and saving files to python objects:
papers_text_list = []
for idx in range(len(files_in_dir)):
    with open(f"../papers/data/{files_in_dir[idx]}", mode="rb") as paper:
    my_pdf = pdf.PdfFileReader(paper)
    vars()["text_%s" % idx] = ''
    for i in range(my_pdf.numPages):
        page_to_print = my_pdf.getPage(i)
        vars()["text_%s" % idx] += page_to_print.extractText()
    papers_text_list.append(vars()["text_%s" %idx])

问题是对于某些文本,我在 python 列表中得到了合并的单词。

text_1.split()

[ …,’examinedthee’,’ectsofdi’,’erentoutdoorenvironmentsinkindergartenchildren’,’™sPAlevel,’,’ages3′,’Œ5.The’,’ndingsrevealedthatchildren’,”sPAlevelhigherin’,’naturalgreenenvironmentsthaninthekindergarten’,’™soutdoorenvir- ‘,’onment,表示绿色环境so’,’erbetteropportunities’,’forchildrendoPA.’, …]

而其他列表以正确的方式导入。

text_0.split()

[‘Urban’,’Forestry’, ‘&’, ‘Urban’, ‘Greening’, ’16’,'(2016)’,’76–83Contents’, ‘lists’, ‘available’, ‘at’,’ ScienceDirect”、“城市”、“林业”、“&”、“城市”、“绿化”、…]

此时,我认为tokenize可以解决我的问题。所以我给它一个机会给nltk模块。

from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer(r'\w+')
doc = tokenizer,tokenize(text_1)
paper_words = [token for token in doc]
paper_words_lower = []
for token  in paper_words:
    try:
        word = token.lower()
    except TypeError:
        word = token 
    finally:
        paper_words_lower.append(word)

[‘contentslistsavailableat’,’sciencedirecturbanforestry’,’urbangreening’,’journalhomepage’,’www’,’elsevier’,’com’,’locate’,’ufug’,’urbangreenspacesforchildren’,’across’,’sectionstudyofassociationswith’,’距离”、“身体活动”、“屏幕时间”、“一般健康”、“超重”、“abdullahakpinar”、“adnanmenderesüniversitesi”、“ziraatfakültesi”、“peyzajmimarl”、“bölümü”、“09100ayd”、“õn”、“土耳其” ,…’一般健康’,’独生子女’,’sagewas’,’与他们的超重显着相关’,…]

我什至尝试使用spacy模块…但问题仍然存在。

我在这里的结论是,如果问题可以解决它必须在pdf提取单词部分。我发现thisStackOverflowrelated question但解决方案无法解决我的问题。

为什么会这样?我该如何解决?

PD:清单上的一篇论文作为麻烦的例子是"AKPINAR_2017_Urban green spaces for children.pdf"

您可以使用以下代码进行导入。

import PyPDF2 as pdf
with open("AKPINAR_2017_Urban green spaces for children.pdf", mode="rb") as paper:
    my_pdf = pdf.PdfFileReader(paper)
    text = ''
    for i in range(my_pdf.numPages):
         page_to_print = my_pdf.getPage(i)
         text += page_to_print.extractText()

原文链接:https://stackoverflow.com//questions/71503225/python-how-to-solve-merged-words-when-extracting-text-from-pdf

回复

我来回复
  • ewz93的头像
    ewz93 评论

    是的,这是提取的问题。您提到的两个示例文档中的空格是不同的:

    enter image description here

    enter image description here

    PDF通常没有一个始终清晰的行和单词概念。它们在文档中的某些位置放置了字符/文本框。提取不能像eg一样“逐字符”读取它。一个txt文件,它会解析它从左上到右下,并使用距离来假设什么是行,什么是单词等。因为第一张图片中的那个似乎不仅使用空格字符,而且还使用左右的字符边距来创建文本间距更好,解析器很难理解它。

    每个 Parser 的做法都会略有不同,因此尝试一些不同的解析器可能是有意义的,也许另一个解析器是在具有相似模式的文档上训练/设计的,并且能够正确解析它。此外,由于示例中的 PDF 确实具有所有有效空格,但是通过将字符彼此靠近一些负边距的东西来混淆解析器,正常复制和粘贴到 txt 文件不会有这个问题,因为它忽略边际的东西。

    如果我们谈论的是大量数据并且您愿意花更多时间在这方面,您可以查看一些关于光学字符识别后校正(OCR Post Correction)的资源,这些模型试图修复解析错误的文本(尽管它通常更多地关注通过不同字体等无法正确识别字符的问题,而不是间距问题)。

    2年前 0条评论