Как извлечь таблицы из исторического PDF?
Мне нужно извлечь данные из таблиц одинакового формата из этого файла. Есть некоторые ошибки OCR, но у меня есть автоматический метод их исправления.
Я пытался:
- ABBYY Finereader для обнаружения таблиц.
- Табула извлечение таблицы
- Камелот извлечение столов
- Пользовательский код Python
Проблема: рекламные инструменты очень плохо распознают края таблицы. Таблицы следуют схожему общему формату, но каждое сканирование выравнивается немного по-разному, поэтому жесткое кодирование границ также не будет работать.
Вопрос: Ребята, знаете ли вы хороший способ определить, где начинается таблица, а затем применить один из нескольких шаблонов?
Любые другие советы для такого рода работы с благодарностью.
3 ответа
ОБНОВЛЕНИЕ 2/26: Я решил свой собственный вопрос, хотя не стесняйтесь отвечать быстрыми или лучшими решениями.
Одна из основных проблем заключается в том, что таблицы примерно одинаковы по размерам, но они различаются от страницы к странице. Отсканированные изображения также слегка смещены от страницы к странице, что создает две проблемы с выравниванием. Мой текущий рабочий процесс решает оба и заключается в следующем.
Выравнивание типа таблицы
Решение:
- Используйте инструменты редактирования изображений в ABBYY, чтобы разрезать каждую страницу по горизонтали. Это дает одну таблицу на каждой странице.
- Обратите внимание, что существует 4 типа таблиц. Четные страницы и нечетные страницы имеют отдельные макеты. Первая таблица на каждой странице содержит поле для даты.
- Это дает четность первой таблицы, нечетность первой таблицы, четность регулярной таблицы, нечетную регулярную таблицу. Обработка по одному типу за раз с фиксированными областями таблицы и столбцами устраняет смещение из-за различий в разметке таблиц.
Выравнивание изображения
Изображения одного и того же типа таблицы все еще не выровнены, поэтому указание макета таблицы в координатах (x,y) не сработает. Расположение таблиц на разных изображениях различно.
Мне нужно было выровнять изображения в зависимости от местоположения стола, но без определения таблицы не было хорошего способа сделать это.
Я решил проблему интересным способом, но сначала я попробовал следующие шаги.
- Обнаружение вертикальных линий с помощью Opencv. Результат: плохо обнаружил слабые линии. Часто будет пропускать линии, что делает его бесполезным для выравнивания.
- Используйте Scan Tailor для обнаружения контента. Результат: алгоритм обнаружения может обрезать некоторые таблицы в одних файлах, а в других включать пробелы из-за пятен на изображении. Депеплинг не помог.
- Используйте Камелот с широкими областями таблицы, без значений столбцов. Результат: Это, вероятно, будет работать хорошо в других случаях, но Камелот упал здесь. Данные доводятся до центов, и между каждыми тремя цифрами есть пробелы. Это привело к неправильному расположению 00 в нескольких столбцах.
Решение:
После нарезки изображений на таблицы, описанные в разделе "Выравнивание типов таблиц", используйте функцию "Автоматическое выравнивание слоев" в Photoshop, чтобы выровнять изображения.
Пошаговое решение:
- Открыть фотошоп
- Загрузите изображения одного типа таблицы в один файл, используя: File-Scripts-Load Files to Stack
- Использование: Edit-Auto-выравнивание слоев
- Используйте инструмент кадрирования, чтобы каждый файл имел одинаковый размер.
- Экспортируйте каждое изображение как отдельный файл: File-Export-Layers в файлы
- Используйте редактор ABBYY OCR для каждого из 4 типов таблиц, жестко закодируйте столбцы и строки с помощью графического редактора.
- Экспорт в CSV из ABBYY
- Используйте что-то вроде clean.py для удаления пробелов и плохих символов.
Готово! Объедините файлы для каждой таблицы, как вам нравится. Я опубликую свой код Python для этого, когда я закончу с проектом. После очистки я опубликую данные тоже.
Здесь есть бесплатный онлайн-инструмент https://www.pdftron.com/pdf-tools/pdf-table-extraction/
Соответствующий блог https://www.pdftron.com/blog/parsing-extraction/table-extraction-and-pdf-to-xml-with-pdfgenie/ содержит ссылки на инструмент командной строки PDFGenie.
Вместо параметра Camelot table_areas (который определяет фиксированные границы) вы можете попытаться использовать параметр table_regions, чтобы указать регионы, в которых, вероятно, находятся таблицы (Camelot будет анализировать только указанные регионы для поиска таблиц).
https://camelot-py.readthedocs.io/en/master/user/advanced.html
Пожалуйста, держите нас в курсе.