Извлечение текста вокруг определенного слова из PDF - PullRequest
0 голосов
/ 11 сентября 2018

Я - пользователь Python базового уровня, и я пытаюсь создать программу, которая дает тексту до и после (например, 50 слов до и 50 слов после) конкретное слово, которое я использую.До сих пор мне удалось создать программу, которая сообщает, на какой странице PDF упоминается слово.Как я могу написать в CVS эти дополнительные 100 слов?

import PyPDF2
import re
import os
...
for pdfName in pdffiles:
    pdfFull = pdfFolder + pdfName
    pdfFileObj = open(pdfFull, mode='rb')
    pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

    number_of_pages = pdfReader.numPages
    pages_text = []
    words_start_pos = {}
    words = {}

    csvFolder = newpath
    csvName = pdfName.replace('pdf', 'csv')
    csvFull = csvFolder + csvName
    with open(csvFull, 'w') as f:
        f.write('{0},{1},{2}\n'.format("Sheet Number", "Search Word", "File Name"))
        for word in searchwords:
            for page in range(number_of_pages):
                pages_text.append(pdfReader.getPage(page).extractText())
                words_start_pos[page] = [dwg.start() for dwg in re.finditer(word, pages_text[page].lower())]
                words[page] = [pages_text[page][value:value + len(word)] for value in words_start_pos[page]]
            for page in words:
                for i in range(0, len(words[page])):
                    if str(words[page][i]) != 'nan':
                        f.write('{0},{1},{2}\n'.format(page + 1, words[page][i], pdfFull))

1 Ответ

0 голосов
/ 11 сентября 2018

Я не думаю, что нужно брать каждую букву на странице и находить индекс первой буквы, вместо этого вы все равно можете выполнить:

pages_text.append(pdfReader.getPage(page).extractText())

и затем сделайте что-то вроде этого:

pages_text[0].split()

, который получит каждое слово из извлеченного текста, поэтому вместо индексации букв и необходимости выяснить, где слова начинаются и заканчиваются, у вас уже есть слова. На этом этапе я перебрал бы слова и нашел бы индекс слова, а затем добавил бы и вычел 50 из позиции этого слова и распечатал их. Я использовал его на первой странице PDF следующим образом:

import PyPDF2
import re
import os


pdfFileObj = open(r'C:\path','rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

number_of_pages = pdfReader.numPages
pages_text = []
words_start_pos = {}
words = {}
searchwords = ["pdf"]
word_pos = 0
print_words = []


word_pos = []
print_text = ''
line = []

for word in searchwords:
    for page in range(number_of_pages):
        pages_text.append(pdfReader.getPage(page).extractText())

text = pages_text[0].split()
for each_word in range(0, len(text)):
    if(text[each_word] == "PDF"):
        word_pos.append(each_word)

print(word_pos)
for each_pos in word_pos:    
    for each_word in range(each_pos-50, each_pos+50):
        print_text = print_text +' ' + text[each_word]
    line.append(print_text)
    print_text = ''    
print(line)
with open(r'C:\path', 'w') as f:
    f.write('{0},{1},{2}\n'.format("Sheet Number", word, "File Name"))
    for each_line in line:
        f.write('{0},{1},{2}\n'.format(page + 1, each_line, r'C:\path'))

Примечание: я бы с осторожностью сохранял текст, извлеченный из PDF-файла, в CSV-файле, потому что в тексте могли быть запятые, которые могли бы испортить ваш CSV-файл. Надеюсь, это поможет!

...