it-swarm.com.ru

Поиск текста в PDF с использованием Python?

Проблема
Я пытаюсь определить, к какому типу относится документ (например, просьба, корреспонденция, повестка в суд и т.д.), Просматривая его текст, предпочтительно используя python. Все PDF-файлы доступны для поиска, но я не нашел решения для его анализа с помощью python и ​​применения сценария для его поиска (если сначала не преобразовать его в текстовый файл, но это может потребовать значительных ресурсов). русские документы).

Что я сделал до сих пор
Я изучил pypdf, pdfminer, документацию Adobe pdf и любые вопросы, которые я мог найти здесь (хотя, похоже, ни один из них напрямую не решал эту проблему). PDFminer, кажется, обладает наибольшим потенциалом, но после прочтения документации я даже не знаю, с чего начать.

Существует ли простой эффективный способ чтения текста PDF по странице, по строке или по всему документу? Или любые другие обходные пути?

24
Insarov

Это называется PDF майнингом, и это очень сложно, потому что:

  • PDF - это формат документа, предназначенный для печати, а не для анализа. Внутри документа PDF текст не имеет определенного порядка (если порядок не важен для печати), большую часть времени исходная структура текста теряется (буквы не могут быть сгруппированы, так как слова и слова не могут быть сгруппированы в предложениях, и порядок их размещения в статье часто бывает случайным).
  • Существует множество программ для создания PDF-файлов, многие из них неисправны.

Такие инструменты, как PDFminer, используют эвристику для повторной группировки букв и слов в зависимости от их положения на странице. Я согласен, интерфейс довольно низкого уровня, но он имеет больше смысла, когда вы знаете, какую проблему они пытаются решить (в конце концов, важно выбрать, как близко от соседей должна быть буква/слово/строка считаться частью абзаца).

Дорогая альтернатива (с точки зрения времени/мощности компьютера) - генерирование изображений для каждой страницы и подача их в OCR, возможно, стоит попробовать, если у вас очень хорошее OCR.

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

Я бы очень хотел оказаться неправым.

[Обновление]

Ответ не изменился, но недавно я участвовал в двух проектах: один из них использует компьютерное зрение для извлечения данных из отсканированных больничных форм. Другой извлекает данные из судебных протоколов. То, что я узнал, это:

  1. В 2018 году компьютерное зрение станет доступным для простых смертных. Если у вас есть хороший образец уже классифицированных документов, вы можете использовать OpenCV или SciKit-Image, чтобы извлечь функции и обучить классификатор машинного обучения, чтобы определить, какой тип документа.

  2. Если анализируемый PDF "доступен для поиска", вы можете очень далеко извлечь весь текст, используя программное обеспечение, такое как pdftotext , и байесовский фильтр (такой же алгоритм, используемый для классификации СПАМ).

Таким образом, не существует надежного и эффективного метода извлечения текста из PDF файлов, но он может вам не понадобиться для решения рассматриваемой проблемы (классификация типов документов).

32
Paulo Scardine

Я написал обширные системы для компании, в которой я работаю, для преобразования PDF в данные для обработки (счета, расчеты, отсканированные билеты и т.д.), И @Paulo Scardine верен - не существует абсолютно надежного и простого способа сделать это , Тем не менее, самый быстрый, самый надежный и наименее интенсивный способ - это использовать pdftotext, часть набора xpdf инструментов. Этот инструмент быстро преобразует PDF с возможностью поиска в текстовый файл, который вы можете прочитать и проанализировать с помощью Python. Подсказка: используйте аргумент -layout. И, кстати, не все PDF-файлы доступны для поиска, только те, которые содержат текст. Некоторые PDF-файлы содержат только изображения без текста.

12
MikeHunter

Я полностью зеленая рука, но у меня как-то работает этот скрипт:

# import packages
import PyPDF2
import re

# open the pdf file
object = PyPDF2.PdfFileReader("test.pdf")

# get number of pages
NumPages = object.getNumPages()

# define keyterms
String = "Social"

# extract text and do the search
for i in range(0, NumPages):
    PageObj = object.getPage(i)
    print("this is page " + str(i)) 
    Text = PageObj.extractText() 
    # print(Text)
    ResSearch = re.search(String, Text)
    print(ResSearch)
10
Emma Yu

Я недавно начал использовать ScraperWiki, чтобы делать то, что вы описали.

Вот пример пример использования ScraperWiki для извлечения PDF данных.

Функция scraperwiki.pdftoxml() возвращает структуру XML.

Затем вы можете использовать BeautifulSoup, чтобы разобрать это в навигационное дерево.

Вот мой код для -

import scraperwiki, urllib2
from bs4 import BeautifulSoup

def send_Request(url):
#Get content, regardless of whether an HTML, XML or PDF file
    pageContent = urllib2.urlopen(url)
    return pageContent

def process_PDF(fileLocation):
#Use this to get PDF, covert to XML
    pdfToProcess = send_Request(fileLocation)
    pdfToObject = scraperwiki.pdftoxml(pdfToProcess.read())
    return pdfToObject

def parse_HTML_tree(contentToParse):
#returns a navigatibale tree, which you can iterate through
    soup = BeautifulSoup(contentToParse)
    return soup

pdf = process_PDF('http://greenteapress.com/thinkstats/thinkstats.pdf')
pdfToSoup = parse_HTML_tree(pdf)
soupToArray = pdfToSoup.findAll('text')
for line in soupToArray:
    print line

Этот код собирается напечатать целую большую уродливую кучу тегов <text>. Каждая страница отделена </page>, если это утешением.

Если вам нужно содержимое внутри тегов <text>, которое может включать заголовки, например, заключенные в <b>, используйте line.contents

Если вам нужна только каждая строка текста, не включая теги, используйте line.getText()

Это грязно и мучительно, но это будет работать для документов с возможностью поиска PDF. До сих пор я находил это точным, но болезненным.

6
JasTonAChair

Я согласен с @Paulo PDF добыча данных - огромная боль. Но вы можете добиться успеха с pdftotext, который является частью свободно доступного здесь набора Xpdf:

http://www.foolabs.com/xpdf/download.html

Это должно быть достаточно для вашей цели, если вы просто ищете отдельные ключевые слова.

pdftotext - это утилита командной строки, но она очень проста в использовании. Это даст вам текстовые файлы, с которыми вам может быть проще работать.

4
qwwqwwq

Вот решение, которое мне показалось удобным для этой проблемы. В текстовой переменной вы получаете текст из PDF для поиска в нем. Но я сохранил также идею разбивать текст на ключевые слова, как нашел на этом сайте: https://medium.com/@rqaiserr/how-to-convert-pdfs-into-searchable-key-words -with-python-85aab86c544f откуда я взял это решение, хотя создание nltk было не очень простым, оно может пригодиться для дальнейших целей:

import PyPDF2 
import textract

from nltk.tokenize import Word_tokenize
from nltk.corpus import stopwords

def searchInPDF(filename, key):
    occurrences = 0
    pdfFileObj = open(filename,'rb')
    pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
    num_pages = pdfReader.numPages
    count = 0
    text = ""
    while count < num_pages:
        pageObj = pdfReader.getPage(count)
        count +=1
        text += pageObj.extractText()
    if text != "":
       text = text
    else:
       text = textract.process(filename, method='tesseract', language='eng')
    tokens = Word_tokenize(text)
    punctuation = ['(',')',';',':','[',']',',']
    stop_words = stopwords.words('english')
    keywords = [Word for Word in tokens if not Word in stop_words and  not Word in punctuation]
    for k in keywords:
        if key == k: occurrences+=1
    return occurrences 

pdf_filename = '/home/florin/Downloads/python.pdf'
search_for = 'string'
print searchInPDF (pdf_filename,search_for)
2
florin27