В этой статье показано, как использовать 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 объяснения:
- Я использую свой собственный тезис в качестве примера, потому что я боюсь использовать другие народные бумаги для экстракции текста, и будут споры интеллектуальной собственности с авторами документов и оператора базы данных;
- Разделены на 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 и закрепить его."Юшу Чжилань" (нкваншуйи).
Если вы интересуетесь наукой о данных, вы можете прочитать мою серию постов с учебными указателями "Как эффективно начать работу с наукой о данных?", есть более интересные задачи и решения.