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

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

Постановка задачи

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

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

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

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

Ограничения

Работая в любом бизнесе, у нас будут бизнес-ограничения, в рамках которых необходимо решить проблему.

  • Быстрое извлечение текста с минимальными человеческими усилиями
  • Снижение стоимости извлечения PDF
  • Автоматизация процесса экстракции

Решение

Поскольку мы заинтересованы в извлечении текста из PDF-файлов, мы будем работать над следующим решением.

Решение для извлечения текста разделено на два компонента.

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

Во-вторых, у нас есть рукописный текст в формате PDF, в котором используется A.W.S. Сервис Texttract для извлечения текста из PDF. Мы используем этот компонент для извлечения текста из сложных PDF-файлов, таких как изображение ниже.

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

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

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

ПиМуPDF

PyMuPDF — это легкая библиотека, которая используется для просмотра, рендеринга и редактирования PDF-файлов, XPS и электронных книг. Хотя он поддерживает несколько целей, мы используем его для извлечения текста из PDF-файлов.

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

Мы используем метаданные файлов, которые дают нам такую ​​информацию, как ссылка ниже.

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

Текст

Amazon Textract — это сервис машинного обучения, который автоматически извлекает текст, почерк и данные из отсканированных документов. Он выполняет оптическое распознавание символов для извлечения текста. Он имеет ряд сервисов для анализа или извлечения текста из различных типов документов, однако в нашем случае мы будем просто использовать обнаружение текста Textract, поскольку нас не интересует структура текста с PDF или какой-либо анализ.

Более того, Texttract поддерживает два вида операций:

  • Синхронный: дескриптор ожидает завершения извлечения/анализа текста, прежде чем перейти к следующей задаче.
  • Асинхронный: дескриптор запускает операцию извлечения/анализа текста и переходит к следующей задаче. Как только задание завершено, мы можем вызвать texttract для получения результатов.

ПРИМЕЧАНИЕ. Textract — это платная услуга, взимаемая за количество страниц, использующих эту услугу.

С ценами на использование Textract можно ознакомиться здесь.

Поток данных:

Поток данных для нашего текущего приложения выглядит следующим образом

  1. Конвейер запускается, когда файл попадает в корзину на этапе S3.
  2. Триггерное уведомление в лендинговой корзине отправляет S.Q.S сообщение с указанием нового файла, который необходимо обработать.
  3. Первая лямбда-функция читает сообщение от SQS и выполняет следующие задачи.
  • Проверяет, может ли полученный файл PDF быть извлечен с помощью PyMuPDF (бесплатная библиотека Python). Это основано на метриках, которые мы собираемся обсудить позже в этом блоге.
  • Если PyMuPDF может успешно извлечь текст, функция извлекает текст и сохраняет текст в формате json в результирующую корзину S3.
  • Если PyMuPDF не может успешно извлечь текст, он инициирует вызов API texttract, чтобы начать извлечение документа.

4. Text, по завершении процесса извлечения текста, публикует сообщение в теме SNS.

5. Тема SNS подписывается очередью SQS, которая получает сообщение, когда Textract успешно завершил процесс извлечения.

6. Очередь SQS запускает вторую лямбда-функцию, которая отвечает за получение текста, извлеченного Textract, и сохранение его в результирующей корзине S3.

Код приложения:



Инфраструктура

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

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

Мы строим следующую инфраструктуру с использованием terraform по причинам, описанным ниже.

Код для инфраструктуры можно найти здесь (github).

Мы используем следующие услуги для создания предлагаемого решения

  • Простое решение для хранения данных (S3)
  • Лямбда-функции
  • Текст
  • Простая служба уведомлений (SNS)
  • Простая служба очереди (SQS)
  • Реестр эластичных контейнеров (ECR)
  • Управление доступом к идентификационным данным (I.A.M.)

Кроме того, мы используем

  • Докер
  • Терраформ

Простая служба хранения (S3)

Начнем с создания двух корзин S3.

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

Простая служба уведомлений (SNS)

Boto3 API для Textract использует S.N.S. тема, чтобы публиковать сообщение каждый раз, когда задание извлечения текста завершено.

Примечание. Название темы SNS должно начинаться с AmazonTextract, как это предлагается в документации здесь.

Простая служба очереди (SQS)

Мы используем S.Q.S. для следующего

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

Реестр эластичных контейнеров (ECR)

Мы используем два репозитория для следующих целей:

  • Извлечение PyMuPDF: в репозитории размещается код, используемый лямбда-функциями для извлечения текста с помощью PyMuPDF.
  • Извлечение текста: в репозитории размещается код, используемый лямбда-функциями для получения текста после завершения процесса извлечения текста.

Управление доступом к идентификационным данным (I.A.M.)

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

Мы создаем две роли, чтобы заставить работать текущий конвейер:

  1. Лямбда-роль: эта роль используется лямбда-функциями для выполнения таких задач, как
  • Получение данных из S3 или запись данных в S3
  • Запустить текстовое задание
  • Публикация сообщений в SNS и SQS

2. Роль Textract: эта роль используется для авторизации Textract для публикации сообщений в S.N.S.

Лямбда-функция

Лямбда-функция в AWS — это служба бессерверных вычислений. Мы используем лямбда-функцию для следующих операций:

PyMuPDF Lambda: первая лямбда-функция выполняет ряд задач, прежде чем использовать PyMuPDF для извлечения текста.

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

Мы можем настроить условие на основе критериев, которые соответствуют нашему решению. В целях демонстрации мы используем метаданные файла, которые могут быть извлечены PyMuPDF, чтобы отфильтровать PDF-файлы, извлекаемые библиотекой. Во-вторых, мы используем количество слов «words_threshold» как еще один фактор, определяющий качество извлечения.

  • Затем, если файл PDF извлекается библиотекой, мы извлекаем текст и сохраняем его в S3 как объект json.
  • Если файл не извлекается с помощью PyMuPDF, мы вызываем Textract, чтобы начать асинхронное извлечение текста.

Textract Lambda:функция lambda запускается, когда задание Textract завершено, и используется для обработки результата задания перед сохранением результатов в S3.

Код приложения:



Использованная литература :