【问题标题】:Python pdf2txt cleanup issuePython pdf2txt 清理问题
【发布时间】:2019-08-17 03:54:10
【问题描述】:

我正在从 pdf 文件中提取文本,但我面临一些提取后问题。

我在哪里

s = 'Our offer is \n4\n4\nProcessing\n\nPipeline\nPipeline\n2\nA\nm\na\nz\no\nn\nE\nC\n2\n'
s.replace('\n','')
Our offer is 44ProcessingPipelinePipeline2AmazonEC23

但我想要的是:

我们的报价是 44 Processing Pipeline Pipeline 2 Amazon EC 2 3

我的代码:

from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams, LTTextBox, LTTextLine
import warnings
warnings.filterwarnings("ignore")

parser = PDFParser(fp)
doc = PDFDocument()
parser.set_document(doc)
doc.set_parser(parser)
doc.initialize('')
rsrcmgr = PDFResourceManager()
laparams = LAParams()
laparams.char_margin = 13.0
laparams.word_margin = 13.0
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device)
extracted_text = ''

for page in doc.get_pages():
    interpreter.process_page(page)
    layout = device.get_result()
    for lt_obj in layout:
        if isinstance(lt_obj, LTTextBox) or isinstance(lt_obj, LTTextLine):
            extracted_text += lt_obj.get_text()

print(extracted_text)



from nltk import tokenize
#split by sentence
newtext = tokenize.sent_tokenize(extracted_text)

然后使用输出我在 \n

上运行替换

我的想法是找到**的邻居\n并评估**

如果

\n 没有先前的邻居(空白)但有以下替换 '(\n+空白') 为 (空白)

\n 两边都有邻居时,将 '(\n) 替换为(空格)

\n 后面有大写的邻居并且没有之前的邻居(空格)时,将 '(\n+'Uppercase') 替换为(空格)

我想我正在深入研究这个问题,可能有人以前做过。

'我们的报价是 IO)\n4\n4\nProcessing\n\nPipeline\nPipeline\n2\nA\nm\na\nz\no\nn\nE\nC\n2\n'

【问题讨论】:

    标签: python pdf text


    【解决方案1】:

    使用正则表达式似乎相当困难。我得到了以下解决方案,并不优雅,但可以完成工作。

    s = 'Our offer is \n4\n4\nProcessing\n\nPipeline\nPipeline\n2\nA\nm\na\nz\no\nn\nE\nC\n2\n'
    
    prev_c = '\0'
    
    out = ''
    for ii,cc in enumerate(s):
      cc = s[ii]
      c = s[ii+1] if ii<len(s)-1 else '\0'
      if cc=='\n':
        if prev_c==' ' or \
           prev_c=='\n' or \
           prev_c.isdigit() and c.isdigit() or \
           prev_c.islower() and c.islower() or \
           prev_c.isupper() and c.isupper() or \
           prev_c.isupper() and c.islower():
          pass
        else:
          out += ' ' 
      else:
        out += cc
    
      prev_c = cc
    
    print(out)
    

    但是,我很确定您会遇到其他这种方法不起作用的情况。比如下面这句话,

    “带有连字符(-)和其他 CamelCases 的 2head P2P 解决方案!OoO”

    【讨论】:

    • 嗨,我的用例非常简单的解决方案,但就像你提到的那样,这可能属于其他情况。
    【解决方案2】:

    我认为一种解决方案是使用正则表达式。我试图编写一个合适的模式,但我不是正则表达式或模式的专家。我不知道为什么它不起作用。这是我能得到的最接近的。代码:

    import re
    
    s = "Our offer is \n4\n4\nProcessing\n\nPipeline\nPipeline\n2\nA\nm\na\nz\no\nn\nE\nC\n2\n"
    s1 = "A\nb\nc"
    w = s.replace('\n',' ')
    print(w)
    # Our offer is 44ProcessingPipelinePipeline2AmazonEC23
    
    
    pattern = '([A-Z](\n[a-z])+[\n])|([A-Z](\n[A-Z])+[\n])'
    
    result = re.findall(pattern, s) 
    
    m = re.search(pattern, s)
    iter = re.finditer(pattern, s)
    indices = [m.start(0) for m in iter]
    
    print(result)
    print(indices)
    

    输出:

    $ python3 a.py 
    Our offer is  4 4 Processing  Pipeline Pipeline 2 A m a z o n E C 2 
    [('A\nm\na\nz\no\nn\n', '\nn', '', ''), ('', '', 'E\nC\n', '\nC')]
    [50, 62]
    

    祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2021-03-15
      • 2011-06-07
      • 2013-02-15
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多