Как выполнить пакетное извлечение текстового содержимого PDF с помощью Python?

Python Google анализ данных pandas

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

вопрос

В последнее время читательские комментарии на фоне становятся все более разнообразными.

После написания нескольких статей по обработке естественного языка голос становится сильнее:

Учитель, есть ли удобный способ извлечь текстовое содержимое в pdf?

Я чувствую настроение читателя.

В примерах, которые я показываю, текстовые данные можно напрямую считывать в инструмент фрейма данных для обработки. Они могут поступать из открытых коллекций данных, API-интерфейсов веб-сайтов или поисковых роботов.

Однако иногда вы сталкиваетесь с проблемами, связанными с обработкой данных в определенном формате.

Например пдф.

Многие научные статьи, исследовательские отчеты и даже обмен данными публикуются в этом формате.

В это время, если вы освоили многие средства анализа естественного языка, у вас возникнет ощущение «обнажить меч и оглядеться в недоумении» — вы четко знаете, как обращаться с текстовой информацией, но не можете этого сделать из-за проблема преобразования формата.

Как сделать?

Естественно, есть способы, такие как специальные инструменты, сайты онлайн-сервисов конвертации и даже ручное копирование и вставка.

Однако мы ценим эффективность, верно?

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

Как сделать?

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

В этой статье подробно показан этот процесс.

Хотите попробовать?

данные

Чтобы лучше проиллюстрировать процесс, я подготовил для вас zip-файл.

Он содержит код для этого руководства, а также данные, которые мы будем использовать.

пожалуйста, приходитеэтот URLЗагрузите zip-архив, прилагаемый к этому руководству.

После скачивания и распаковки вы окажетесь в сгенерированном каталоге (далее "демонстрационный каталог») и видим следующее.

Демонстрационный каталог содержит:

  • Pipfile: файл конфигурации pipenv, используемый для подготовки зависимостей, которые нам нужно использовать. Как его использовать, будет объяснено позже;
  • pdf_extractor.py: Используйте вспомогательные функции, написанные pdfminer.six. С его помощью вы можете напрямую вызывать функцию извлечения текстового содержимого PDF, предоставляемую pdfminer, без необходимости учитывать множество раздражающих параметров;
  • demo.ipynb: исходный код Python для этого руководства (формат Jupyter Notebook) был написан для вас.

Кроме того, в каталог demo включены 2 папки.

В этих двух папках есть китайские pdf-файлы, которые используются для демонстрации извлечения содержимого pdf. Это все основные статьи китайских журналов, которые я опубликовал несколько лет назад.

Вот 2 объяснения:

  1. Я использую свой собственный тезис в качестве примера, потому что я боюсь использовать другие народные бумаги для экстракции текста, и будут споры интеллектуальной собственности с авторами документов и оператора базы данных;
  2. Разделены на 2 папки, чтобы показать вам, как инструмент извлечения обрабатывает при добавлении нового файла PDF.

Содержимое папки pdf следующее:

Содержимое папки newpdf следующее:

Данные готовы, давайте развернем среду выполнения кода.

окружающая обстановка

Самый простой способ установить Python — это установить пакет Anaconda.

пожалуйста, перейдите кэтот URLЗагрузите последнюю версию Анаконды.

Пожалуйста, выберите Python слева3.6скачать версию и установить.

Если вам нужно конкретное пошаговое руководство или вы хотите узнать, как установить и запустить команды Anaconda на платформе Windows, обратитесь к тому, что я подготовил для вас.видеоурок.

После установки Anaconda откройте терминал и используйтеcdкоманда для входадемонстрационный каталог.

Если вы не знаете, как его использовать, вы также можете обратиться квидеоурок.

Нам нужно установить некоторые экологические зависимости.

Сначала выполните:

pip install pipenv

Здесь установлен отличный инструмент управления пакетами Python pipenv 。 После установки выполнить:

pipenv install --skip-lock

Инструмент pipenv автоматически установит для нас все необходимые зависимости в соответствии с Pipfile.

В терминале появится индикатор выполнения, показывающий количество устанавливаемого программного обеспечения и фактический прогресс.

После установки следуйте инструкциям для выполнения:

pipenv shell

Таким образом, мы входим в виртуальную операционную среду, посвященную этому руководству.

Обязательно выполните следующее предложение:

python -m ipykernel install --user --name=py36

Только тогда текущая среда Python будет зарегистрирована в системе как ядро ​​и названа py36.

Пожалуйста, убедитесь, что на вашем компьютере установлен браузер Google Chrome здесь.

Мы выполняем:

jupyter notebook

Откроется браузер по умолчанию (Google Chrome), и запустится интерфейс ноутбука Jupyter:

Вы можете напрямую щелкнуть первый файл ipynb в списке файлов, чтобы увидеть весь пример кода этого руководства.

Вы можете выполнять эти коды один за другим во время просмотра руководства.

но япредложениеМетод заключается в том, чтобы вернуться к основному интерфейсу и создать новый пустой блокнот Python 3 (тот, который имеет отображаемое имя py36).

Пожалуйста, следуйте инструкциям и введите соответствующий контент посимвольно. Это может помочь вам глубже понять смысл кода и более эффективно усвоить навыки.

Если у вас возникли проблемы с написанием кода, вы можете обратиться кdemo.ipynbдокумент.

Подготовка окончена, приступим к формальному вводу кода.

код

Во-первых, мы читаем некоторые модули для работы с файлами.

import glob
import os

Как упоминалось ранее, в демонстрационном каталоге есть две папки: pdf и newpdf.

Указываем путь где находится pdf файл какpdfпапка.

pdf_path = "pdf/"

Мы хотим получить путь ко всем pdf файлам. С помощью glob это можно сделать одной командой.

pdfs = glob.glob("{}/*.pdf".format(pdf_path))

Посмотрите, правильный ли путь к полученному файлу pdf.

pdfs
['pdf/复杂系统仿真的微博客虚假信息扩散模型研究.pdf',
 'pdf/面向影子分析的社交媒体竞争情报搜集.pdf',
 'pdf/面向人机协同的移动互联网政务门户探析.pdf']

经验证。 точный.

Давайте воспользуемся преимуществами PDFMiner для извлечения содержимого из файла PDF. Нам нужен из вспомогательного файла Pythonpdf_extractor.pyфункция считыванияextract_pdf_content.

from pdf_extractor import extract_pdf_content

С помощью этой функции мы пытаемся извлечь содержимое из первой статьи в списке pdf-файлов и сохранить текст в переменной содержимого.

content = extract_pdf_content(pdfs[0])

Посмотрим, что в содержании:

content

Очевидно, что извлечение контента не идеально, и информация, такая как верхние и нижние колонтитулы, смешивается.

Однако для многих наших применений в текстовом анализе это не имеет значения.

Вы увидите, что в контенте много контента\n,что это?

мы используемprintфункция для отображения содержимого содержимого.

print(content)

Хорошо видно, что те\nявляется символом новой строки.

С тестом на извлечение pdf-файла мы укрепляем доверие.

Теперь пришло время создать словарь, извлекать и хранить содержимое в пакетном режиме.

mydict = {}

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

Чтобы сделать этот процесс более понятным, пусть Python выводит имя извлекаемого pdf-файла.

for pdf in pdfs:
    key = pdf.split('/')[-1]
    if not key in mydict:
        print("Extracting content from {} ...".format(pdf))
        mydict[key] = extract_pdf_content(pdf)

Во время извлечения вы увидите такой вывод:

Extracting content from pdf/复杂系统仿真的微博客虚假信息扩散模型研究.pdf ...
Extracting content from pdf/面向影子分析的社交媒体竞争情报搜集.pdf ...
Extracting content from pdf/面向人机协同的移动互联网政务门户探析.pdf ...

Взгляните на ключевые значения в словаре в это время:

mydict.keys()
dict_keys(['复杂系统仿真的微博客虚假信息扩散模型研究.pdf', '面向影子分析的社交媒体竞争情报搜集.pdf', '面向人机协同的移动互联网政务门户探析.pdf'])

все нормально.

Затем мы вызываем pandas, чтобы превратить словарь в фрейм данных для анализа.

import pandas as pd

Следующий оператор может преобразовать словарь во фрейм данных. Обратите внимание на следующееreset_index()Индекс, сгенерированный исходным значением ключа словаря, также преобразуется в обычный столбец.

df = pd.DataFrame.from_dict(mydict, orient='index').reset_index()

Затем мы переименовываем столбцы для последующего использования.

df.columns = ["path", "content"]

Содержимое фрейма данных в это время выглядит следующим образом:

df

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

Из-за нехватки места мы используем только пример статистики количества символов для демонстрации основных функций анализа.

Мы позволяем Python помочь нам подсчитать длину извлеченного контента.

df["length"] = df.content.apply(lambda x: len(x))

Содержимое поля данных в это время изменится следующим образом:

df

Дополнительный столбец — это количество символов в текстовом содержимом pdf.

Чтобы правильно отобразить результаты графика в Jupyter Notebook, нам нужно использовать следующий оператор:

%matplotlib inline

Затем мы позволяем Pandas отображать информацию о столбце длиной символа с помощью значка столбца. Для красивого отображения мы устанавливаем соотношение сторон изображения и отображаем соответствующее имя файла pdf под углом 45 градусов.

import matplotlib.pyplot as plt
plt.figure(figsize=(14, 6))
df.set_index('path').length.plot(kind='bar')
plt.xticks(rotation=45)

Визуальный анализ завершен.

Затем мы организуем процесс анализа прямо сейчас в функции для более легкого вызова в будущем.

Сначала мы интегрируем модуль, который извлекает содержимое pdf в словарь:

def get_mydict_from_pdf_path(mydict, pdf_path):
    pdfs = glob.glob("{}/*.pdf".format(pdf_path))
    for pdf in pdfs:
        key = pdf.split('/')[-1]
        if not key in mydict:
            print("Extracting content from {} ...".format(pdf))
            mydict[key] = extract_pdf_content(pdf)
    return mydict

Вход здесь - путь к существующей папке словаря и PDF. Выход - новый словарь.

Вам может быть интересно, почему вам нужно ввести «существующий словарь». Не волнуйтесь, я покажу вам актуальный пример позже.

Следующая функция довольно проста — она преобразует словарь во фрейм данных.

def make_df_from_mydict(mydict):
    df = pd.DataFrame.from_dict(mydict, orient='index').reset_index()
    df.columns = ["path", "content"]
    return df

Последняя функция используется для отображения подсчитанного количества символов.

def draw_df(df):
    df["length"] = df.content.apply(lambda x: len(x))
    plt.figure(figsize=(14, 6))
    df.set_index('path').length.plot(kind='bar')
    plt.xticks(rotation=45)

Функция скомпилирована, давайте попробуем.

Помните, что в демонстрационном каталоге есть подкаталог с именемnewpdfВерно?

Мы переместили 2 pdf-файла в каталог pdf.

Таким образом, в каталоге pdf есть 5 файлов:

Мы выполняем 3 вновь отсортированные функции.

Сначала заходим в существующий словарь (обратите внимание, что в нем на данный момент 3 записи), а путь к папке pdf не изменился. Результатом является новый словарь.

mydict = get_mydict_from_pdf_path(mydict, pdf_path)
Extracting content from pdf/微博客 Twitter 的企业竞争情报搜集.pdf ...
Extracting content from pdf/移动社交媒体用户隐私保护对策研究.pdf ...

Обратите внимание на подсказку здесь, исходные 3 pdf-файла не извлекаются снова, извлекаются только 2 новых pdf-файла.

Всего у нас здесь всего 5 файлов, так что вы можете не почувствовать интуитивно существенной разницы.

Но допустим, вы часами извлекали информацию из сотен или тысяч pdf-файлов, а ваш начальник подбрасывает вам 3 новых pdf-файла...

Если вам придется извлекать информацию с нуля, боюсь, она будет сильно поломана.

В это время, используя нашу функцию, вы можете поместить новое содержимое файла за 1 минуту.добавитьвходить.

Это большая разница, не так ли?

Затем мы используем новый словарь для построения фрейма данных.

df = make_df_from_mydict(mydict)

Мы рисуем новый фрейм данных, и PDF-файл извлекает количество текстовых символов. Результат выглядит следующим образом:

draw_df(df)

В этот момент отображается код.

резюме

Подводя итог, эта статья знакомит вас со следующими знаниями:

  • Как использовать glob для пакетного чтения путей к файлам в указанном формате в каталоге;
  • Как извлечь текстовую информацию из pdf-файлов с помощью pdfminer;
  • Как построить словарь, сохранить содержимое, соответствующее значению ключа (имя файла в этой статье), и избежать дублирования обработки данных;
  • Как легко преобразовать структуру данных словаря в фрейм данных Pandas для удобного последующего анализа данных.
  • Как легко рисовать столбчатую статистическую графику с помощью функций рисования, которые поставляются с matplotlib и pandas.

Обсуждать

В вашей предыдущей работе по анализу данных вы сталкивались с задачей, требующей извлечения текста из pdf-файла? Как вы с этим справились? Есть ли лучшие инструменты и методы? Добро пожаловать, чтобы оставить сообщение, поделиться своим опытом и мыслями со всеми, мы обменяемся и обсудим вместе.

Лайк пожалуйста лайк. Вы также можете подписаться на мой публичный аккаунт в WeChat и закрепить его."Юшу Чжилань" (нкваншуйи).

Если вы интересуетесь наукой о данных, вы можете прочитать мою серию постов с учебными указателями "Как эффективно начать работу с наукой о данных?", есть более интересные задачи и решения.