AWS Textract - это инструмент AWS, используемый для извлечения текста из PDF (или изображения). Наилучший сценарий - когда в исходном документе всего одна колонка, как в книге. Когда у вас более одной колонки, например, в газетной статье, с ними работать сложнее. Я хотел бы поделиться своим опытом использования метода сортировки столбцов.

Мой источник - газетная статья с таким макетом:

Вывод Textract - это JSON, образованный различными типами BlockType, расположенными в иерархическом порядке. «Страница» BlockType состоит из нескольких «строк», которые, в свою очередь, состоят из нескольких «слов».

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

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

"BoundingBox": {
                    "Width": 0.007353090215474367,
                    "Height": 0.0288887619972229,
                    "Left": 0.08638829737901688,
                    "Top": 0.03477252274751663
                }

Мы собираемся использовать язык Ruby, чтобы показать пример.

Итак, после получения всех «несортированных» строк:

мы должны применить разбиение на блоки. Идея состоит в том, что две строки находятся в одном блоке по одной из следующих причин:

  • линии имеют более или менее одинаковую левую координату.
  • мы можем сказать, что линии в одном блоке имеют более или менее одинаковую ширину. Это неверно для предложения, в котором последнее слово заменяет новую строку. Однако средняя ширина столбца обычно более компактна, чем строка заголовка, которая в большинстве случаев использует всю ширину статьи.
  • если ширины недостаточно, мы можем измерить расстояние между линиями. Линия выглядит как прямоугольник с центром.

Давайте подробно рассмотрим каждый пункт. Левая координата присутствует в каждом линейном элементе. Таким образом, мы можем сказать, что две строки L1 и L2 в идеале имеют одинаковую левую координату, если x1 - x2 = 0, где x - это «левые» данные, которые мы уже извлекли. Однако мы должны оценить порог, учитывая тот факт, что входной PDF-файл не идеален. Лучше использовать функцию:

Ширина используется для обозначения блоков, которые отличаются большой шириной:

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

Расстояние - это центральное понятие для определения столбцов в статье. Вы можете использовать формулу расстояния:

Мы можем резюмировать функцию разбиения блока следующим образом:

Вы можете увидеть результаты:

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

Сортировка блоков зависит от способа чтения, также известного как направленность. Используя шаблон слева направо и сверху вниз, мы можем частично полагаться на стандарт AWS Textract по умолчанию, который дает нам порядок сверху вниз. Поэтому первые строки связаны с названием статьи. Для остальных блоков достаточно на каждой итерации выбирать самый левый:

Заключение

Aws Textract - хороший продукт, способный извлекать текст из источника, но он не может делать выводы о структуре документа.

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

Не стесняйтесь оставлять отзывы и следить за каналом XPeppers / Claranet: