Aivaro
  • Оглавление
  • Вопросы
  • Практика
  • Вики
  • Материалы сообщества
  • Тесты
  • Поиск
✈Telegram @ai_varo
RUEN中文
…
Оглавление/Вопросы/#919

Как вы парсите сложные PDF с таблицами и колонками? Назовите инструменты (pdfplumber, pymupdf, Camelot, Unstructured.io)

Краткий тезис

Парсинг сложных PDF-документов с многоколоночной вёрсткой и таблицами требует комбинации инструментов, каждый из которых решает свою подзадачу: извлечение текста с координатами (pdfplumber, PyMuPDF), детекция и извлечение таблиц (Camelot), универсальная сегментация документа (Unstructured.io) и ML-модели для понимания макета (LayoutLM). В production-пайплайнах эти инструменты часто используются последовательно: сначала определяется структура страницы, затем применяется специализированный парсер для каждого элемента.

2. Camelot: извлечение таблиц

Camelot — специализированная библиотека для извлечения таблиц из PDF. Работает в двух режимах: lattice (по линиям сетки) и stream (по пробелам между данными). Для сложных PDF с таблицами без чётких границ часто требуется комбинация обоих.

Основные возможности:

  • Детекция таблиц на странице.
  • Извлечение ячеек с координатами.
  • Экспорт в pandas DataFrame, CSV, Excel.
  • Визуализация найденных таблиц (метод plot()).

Пример:

import camelot

tables = camelot.read_pdf("doc.pdf", pages="1-3", flavor="lattice")
for table in tables:
    print(table.df)  # pandas DataFrame
    table.to_csv("table.csv")

Ограничения:

  • Требует установки Ghostscript (для обработки PostScript).
  • Неэффективен на сканированных PDF (нужен предварительный OCR).
  • Может пропускать таблицы, встроенные в сложный макет (например, с объединёнными ячейками без линий).

Рекомендация: Используйте flavor="stream" для таблиц без линий, предварительно настроив параметры edge_tol и row_tol.


3. Unstructured.io: универсальный парсер документов

Unstructured.io — фреймворк для обработки неструктурированных документов (PDF, DOCX, HTML, изображения). Он автоматически определяет тип контента: заголовки, абзацы, списки, таблицы, изображения.

Ключевая функция: partition_pdf() — сегментирует PDF на элементы с метаданными (тип, координаты, связи).

Пример:

from unstructured.partition.pdf import partition_pdf

elements = partition_pdf("doc.pdf", strategy="auto")
for element in elements:
    print(element.category, element.text[:50])

Стратегии:

  • "auto" — пытается извлечь текст напрямую; если не удаётся, подключает OCR (Tesseract).
  • "ocr_only" — принудительный OCR.
  • "hi_res" — использует детектор таблиц (YOLO) для высокоточного распознавания.

Преимущества:

  • Встроенная поддержка OCR (через Tesseract или paddleocr).
  • Автоматическое определение колонок и порядка чтения.
  • Интеграция с RAG-пайплайнами (например, LlamaIndex и LangChain).

Недостатки:

  • Тяжеловесность (зависимости: detectron2, torch).
  • Не всегда корректно обрабатывает сложные таблицы (лучше комбинировать с Camelot).

4. LayoutLM: ML-подход для сложных макетов

LayoutLM — семейство моделей (LayoutLMv2, LayoutLMv3) от Microsoft, которые объединяют текстовую, визуальную и позиционную информацию. Они решают задачу понимания макета документа (Document Layout Analysis) как задачу sequence labeling или object detection.

Применение для парсинга:

  • Детекция таблиц, колонок, заголовков, списков.
  • Извлечение пар "ключ-значение" из форм.
  • Восстановление порядка чтения.

Пример использования (через Hugging Face):

from transformers import LayoutLMv3Processor, LayoutLMv3ForTokenClassification

processor = LayoutLMv3Processor.from_pretrained("microsoft/layoutlmv3-base")
model = LayoutLMv3ForTokenClassification.from_pretrained("microsoft/layoutlmv3-base")
# Далее — предобработка изображения страницы и инференс

Когда использовать:

  • PDF с нестандартной вёрсткой (газеты, журналы, рекламные буклеты).
  • Сканированные документы (после OCR).
  • Высокие требования к точности (например, юридические документы).

Ограничения:

  • Требует GPU для инференса.
  • Необходимость разметки данных для fine-tuning под конкретный домен.
  • Медленнее классических методов.

Сравнение подходов:

ИнструментТипСкоростьТочность на сложных макетахТребования
pdfplumberПравилаВысокаяСредняя (зависит от качества PDF)Нет
PyMuPDFПравилаОчень высокаяСредняяНет
CamelotПравила + эвристикиСредняяВысокая (для таблиц с линиями)Ghostscript
Unstructured.ioПравила + MLСредняяВысокая (благодаря OCR и детекции)Tesseract, torch
LayoutLMML (Transformer)НизкаяОчень высокаяGPU, размеченные данные

5. Пет-проект для закрепления

Задача: Разработать пайплайн парсинга сложного PDF-документа (например, научной статьи в двухколоночном формате IEEE с таблицами и формулами) и преобразовать его в структурированный JSON с полями: title, sections, tables, figures.

Инструменты:

  • PyMuPDF для извлечения текста с координатами.
  • Camelot для таблиц.
  • Unstructured.io (стратегия hi_res) для сегментации.
  • pandas для обработки таблиц.
  • json для вывода.

Шаги:

  1. Загрузить PDF и определить количество колонок на каждой странице (анализ гистограммы x-координат слов).
  2. Разделить страницу на колонки, извлечь текст в правильном порядке (слева направо, сверху вниз).
  3. Для каждой страницы запустить Camelot (flavor="lattice" или "stream"), сохранить найденные таблицы как DataFrame.
  4. Использовать Unstructured.io для детекции заголовков разделов и изображений.
  5. Объединить результаты: текст колонок + таблицы + метаданные.
  6. Сохранить в JSON.

Ожидаемый результат:

  • JSON-файл, где каждый раздел документа представлен как объект с полями type ("text", "table", "figure"), content и page_number.
  • Возможность загрузить этот JSON в RAG-систему для поиска по документу.

Связь с другими вопросами

ВопросТема
542Общие подходы к парсингу PDF, сравнение библиотек
553Специфика извлечения таблиц, Camelot vs Tabula

Навигация

  • Предыдущий: 918
  • Следующий: 920
  • Индекс: 00. Индекс разборов