Игорь Градов
Игорь Градов
6 мин
ai

Нейросеть для обработки документов deepdoctection: конвейер из открытых моделей без платных API

Библиотека deepdoctection версии 1.2.x собирает в один конвейер распознавание структуры страницы, таблиц, текста и порядка чтения, и в этом руководстве мы пройдём весь путь от установки до выгрузки структурированных данных из PDF и изображений.

Нейросеть для обработки документов deepdoctection: конвейер из открытых моделей без платных API
Почему это важно

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

Библиотека deepdoctection объединяет несколько моделей: детектор макета на базе DocLayNet, распознаватель структуры таблиц Table Transformer и OCR-движок DocTR (оптическое распознавание символов). До версии 1.2 эти компоненты приходилось склеивать вручную. Сейчас один вызов get_dd_analyzer создаёт готовый конвейер, где каждый шаг передаёт результат следующему. Для ML-инженеров, работающих с русскоязычными счетами, контрактами и актами, это означает: структура документа разбирается автоматически, а извлечение дат и сумм можно добавить собственным компонентом.

Что понадобится?

  • Python 3.9+ и среда с GPU (Google Colab подойдёт, бесплатного T4 хватает)
  • Библиотеки: deepdoctection, transformers>=5.2.0, timm, python-doctr, pdfplumber, networkx, lxml
  • Тестовые файлы: любой PDF или изображение документа (в примере используется финансовый отчёт в формате PNG и научная статья в PDF)
  • Время: около 30 минут на первый запуск (модели скачиваются при первом вызове, около 1,5 ГБ)

Пошаговая инструкция

1. Установите зависимости и настройте окружение

pip install -q "deepdoctection" "transformers>=5.2.0" "timm" "python-doctr" "pdfplumber" "networkx" "lxml"
import os
os.environ["DD_USE_TORCH"] = "True"
os.environ["DPI"] = "200"
os.environ["LOG_LEVEL"] = "INFO"

Переменная DPI задаёт разрешение растеризации PDF. Значение 200 даёт хороший баланс между качеством распознавания и скоростью. Для мелкого шрифта в договорах стоит поднять до 300.

2. Примените патч совместимости для Transformers и PEFT

import transformers.integrations.peft as _hf_peft
if _hf_peft.is_peft_available():
    _hf_peft.is_peft_available = lambda: False

Без этой строки при загрузке весов модели Transformers пытается найти PEFT-адаптеры (модули для лёгкого дообучения) и падает с ошибкой. Патч отключает эту проверку.

3. Проверьте реестр моделей

import deepdoctection as dd

dd.print_model_infos(add_description=False, add_config=False, add_categories=False)
profile = dd.ModelCatalog.get_profile("Aryn/deformable-detr-DocLayNet/model.safetensors")
print("Категории макета:", profile.categories)

Здесь вы увидите список категорий, которые детектор макета умеет находить: заголовки, параграфы, таблицы, рисунки, подписи и другие элементы документа.

4. Сконфигурируйте анализатор

config_overwrite = [
    "USE_LAYOUT=True",
    "USE_LAYOUT_NMS=True",
    "USE_TABLE_SEGMENTATION=True",
    "USE_OCR=True",
    "USE_LAYOUT_LINK=True",
    "LAYOUT.WEIGHTS=Aryn/deformable-detr-DocLayNet/model.safetensors",
    "ITEM.WEIGHTS=deepdoctection/tatr_tab_struct_v2/model.safetensors",
    "ITEM.FILTER=['table']",
    "OCR.USE_DOCTR=True",
    "OCR.USE_TESSERACT=False",
    "WORD_MATCHING.RULE=ioa",
    "WORD_MATCHING.THRESHOLD=0.3",
    "TEXT_ORDERING.PARAGRAPH_BREAK=0.035",
    "LAYOUT_LINK.PARENTAL_CATEGORIES=['figure','table']",
    "LAYOUT_LINK.CHILD_CATEGORIES=['caption']",
]

analyzer = dd.get_dd_analyzer(config_overwrite=config_overwrite)

Ключевые параметры:

  • WORD_MATCHING.RULE=ioa определяет, как слова привязываются к блокам макета (по пересечению площадей)
  • TEXT_ORDERING.PARAGRAPH_BREAK=0.035 задаёт порог разрыва абзаца как долю высоты страницы
  • LAYOUT_LINK связывает подписи с рисунками и таблицами автоматически

5. Запустите конвейер на документе

from pathlib import Path

PDF = Path("/content/docs/paper.pdf")

df = analyzer.analyze(path=PDF, max_datapoints=3)
df.reset_state()
pages = list(df)
print(f"Обработано страниц: {len(pages)}")

Параметр max_datapoints=3 ограничивает обработку тремя страницами, это удобно для отладки. Для полного документа уберите этот аргумент.

6. Извлеките текст, блоки и структуру

page = pages[0]

# Текст в порядке чтения
print(page.text[:500])

# Блоки макета с порядковыми номерами
for doc_id, img_id, pno, ann_id, order, cat, txt in page.chunks[:12]:
    print(f"[{order:>3}] {str(cat):<15} {txt[:70]}")

Объект page.chunks возвращает кортежи, где order отражает порядок чтения, а cat содержит категорию блока (параграф, заголовок, таблица). Для русскоязычных документов порядок чтения восстанавливается корректно, включая двухколоночные макеты.

7. Экспортируйте результат в JSONL для поиска и RAG

import json

out_path = Path("/content/out/chunks.jsonl")
with open(out_path, "w", encoding="utf-8") as f:
    for doc_id, img_id, pno, ann_id, order, cat, txt in page.chunks:
        record = {
            "page": pno,
            "order": order,
            "category": str(cat),
            "text": txt
        }
        f.write(json.dumps(record, ensure_ascii=False) + "\n")

Каждая строка JSONL содержит один блок документа с метаданными. Такой формат напрямую подходит для загрузки в RAG-систему (Retrieval-Augmented Generation, генерация ответов с поиском по базе знаний).

Как выглядит результат на практике?

Пример: финансовый отчёт в формате PNG

На вход подаётся скан финансовой таблицы finance.png. После обработки конвейер возвращает:

  • 1 блок категории table с распознанной структурой строк и столбцов
  • Подпись к таблице (caption), автоматически связанная с таблицей через LAYOUT_LINK
  • Текстовые блоки вокруг таблицы с восстановленным порядком чтения

Вызов page.tables[0].csv выдаёт содержимое таблицы в формате CSV, готовом для pandas. Для русскоязычного счёта с суммами и датами достаточно добавить регулярное выражение поверх извлечённого текста:

import re

for chunk in page.chunks:
    text = chunk[-1]
    dates = re.findall(r'\d{2}\.\d{2}\.\d{4}', text)
    amounts = re.findall(r'\d[\d\s]*[,\.]\d{2}', text)
    if dates or amounts:
        print(f"Даты: {dates}, Суммы: {amounts}")
Частые ошибки
  • Забыть вызвать df.reset_state() перед list(df). Без этого генератор может вернуть пустой список, и вы решите, что конвейер не работает.
  • Оставить USE_PDF_MINER=True одновременно с USE_OCR=True. PDFMiner извлекает текстовый слой напрямую, а DocTR распознаёт изображение. Оба сразу дают дублирование слов и мусор в выдаче.
  • Не настроить SEGMENTATION.THRESHOLD_ROWS для таблиц с тонкими линиями. Значение 0.4 из примера подходит для типовых PDF. Для сканов с низким качеством снижайте до 0.25.
  • Подать одиночное изображение через pipe.analyze(path=...) без параметра bytes. Библиотека требует передать байты файла явно: pipe.analyze(path=path, bytes=path.read_bytes()).
  • Использовать DPI ниже 150 для документов с мелким шрифтом (типично для российских счетов-фактур). OCR будет пропускать цифры в суммах.
Мнение редакции dzen.guru

Deepdoctection выгодно отличается от облачных сервисов распознавания тем, что работает локально и не отправляет данные наружу. Для компаний в РФ, которые обрабатывают договоры и финансовые документы, это критично с точки зрения безопасности.

По моим наблюдениям, качество OCR через DocTR на русскоязычных документах уступает Tesseract с русской языковой моделью. Если основной поток документов на русском, стоит переключить OCR.USE_TESSERACT=True и указать lang=rus. DocTR лучше справляется с латиницей и смешанными макетами.

Для извлечения сумм и дат из российских счетов и актов хватает регулярных выражений поверх распознанного текста. Полноценный NER (Named Entity Recognition, распознавание именованных сущностей) через дообучение нужен, только если документы нестандартные или рукописные.

Честная оговорка: детектор макета обучен на DocLayNet, датасете преимущественно из англоязычных документов. На нетипичных для него макетах (российские формы с печатями, рукописные акты) качество детекции падает. Перед запуском в продакшен протестируйте на реальной выборке ваших документов.

Что делать с этим прямо сейчас?

ML-инженеру и разработчику. Соберите конвейер на своих данных, начиная с трёх страниц (max_datapoints=3). Проверьте качество на русскоязычных документах и решите, нужен ли Tesseract вместо DocTR. Готовый JSONL-экспорт подключается к любой RAG-системе без промежуточных конвертаций.

Автору Дзена. Нейросеть для обработки документов пригодится, если вы работаете с большими PDF (исследования, отчёты) и хотите быстро вытащить структурированный текст для статьи. Один скрипт заменяет ручное копирование из PDF.

Предпринимателю. Конвейер работает полностью локально. Не нужны платные API, не нужно отправлять конфиденциальные документы в облако. Для старта хватает бесплатного Colab с GPU.

Deepdoctection остаётся открытой библиотекой (опенсорс), и порог входа снизился до одного вызова get_dd_analyzer. Если ваша задача распознавать российские документы в продакшене, начните с десятка реальных файлов и замерьте точность, прежде чем автоматизировать весь поток.

Научитесь использовать нейросети для контента

В dzen.guru мы разбираем практические инструменты на основе ИИ для авторов и предпринимателей

Узнать больше
Поделиться:TelegramVK
Игорь Градов
Игорь Градов

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».

Комментарии

Читайте также

NeMo Guardrails собирает безопасность ИИ в один Python-скрипт: пример для финтеха
ai

NeMo Guardrails собирает безопасность ИИ в один Python-скрипт: пример для финтеха

NVIDIA NeMo Guardrails защищает финансового ИИ-ассистента от утечек данных, мошеннических промптов и опасных советов, и вся эта многослойная система собирается…

6 мин
Vercel бесплатно покажет, что такое ИИ-агент видит на вашем сайте: 118 проверок за минуту
ai

Vercel бесплатно покажет, что такое ИИ-агент видит на вашем сайте: 118 проверок за минуту

Vercel 3 июня открыла бесплатный сервис Is Agentic, который за минуту показывает, насколько ваш сайт готов к тому, чтобы ИИ-агенты могли его найти, прочитать и…

5 мин
Стоимость API нейросетей обманчива: дешёвая модель обошлась дороже за каждую решённую задачу
ai

Стоимость API нейросетей обманчива: дешёвая модель обошлась дороже за каждую решённую задачу

Стоимость API нейросетей обманчива: в апреле 2026 года FinTech-команда перешла на дешёвую модель, чтобы сэкономить, и обнаружила, что каждая решённая задача…

5 мин