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

Нейросеть для обработки документов на базе 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, генерация ответов с поиском по базе знаний).
Как выглядит результат на практике?
На вход подаётся скан финансовой таблицы 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 будет пропускать цифры в суммах.
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 мы разбираем практические инструменты на основе ИИ для авторов и предпринимателей
Узнать больше
Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».
Читайте также

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

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

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