Image

Доклинг: Алхимик документов

Легкое извлечение данных и таблиц из PDF-документов

Делиться

5dd7bca5f432b04fbe97e7df5fea7d4e

Почему в 2025 году мы все еще боремся с документами?

Проработав какое-то время в любой организации, ориентированной на данные, вы наверняка столкнётесь с множеством PDF-файлов, файлов Word, PowerPoint, полуотсканированных изображений, рукописных заметок и, порой, неожиданных CSV-файлов, скрывающихся в папке SharePoint. Бизнес-аналитики и аналитики данных тратят часы на конвертацию, разделение и уговаривание этих форматов принять то, что их конвейеры Python примут. Даже новейшие технологии генеративного ИИ могут давать сбои, когда текст обёрнут в графику или разбросан по нерегулярным таблицам.

Docling был создан именно для решения этой проблемы. Выпущенная IBM Research Zurich как проект с открытым исходным кодом и теперь размещенная в Linux Foundation AI & Data Foundation, библиотека объединяет в себе функции анализа аннотаций, понимания макета, оптического распознавания текста (OCR), реконструкции таблиц, мультимодального экспорта и даже аудиотранскрипции с помощью одного достаточно простого API и команды CLI.

Хотя docling поддерживает обработку файлов формата HTML, MS Office, форматов изображений и других, мы в основном рассмотрим его использование для обработки PDF-файлов.

Почему мне, как специалисту по анализу данных или инженеру МО, следует обратить внимание на Docling?

Зачастую настоящее узкое место заключается не в построении модели, а в её наполнении. Мы тратим значительную часть времени на обработку данных, и ничто не снижает производительность быстрее, чем получение критически важного набора данных, заключённого в 100-страничный PDF-файл. Именно эту проблему решает Docling, выступая мостом из мира неструктурированных документов прямо в структурированную разумность Markdown, JSON или Pandas DataFrame.

Но его возможности выходят за рамки простого извлечения данных, охватывая сферу современной разработки с использованием ИИ. Представьте, что вы указываете docling на HTML-страницу спецификаций API; он без труда преобразует сложную веб-разметку в понятный, структурированный Markdown — идеальный контекст для прямой передачи в ИИ-помощники по программированию, такие как Cursor, ChatGPT или Claude.

Откуда взялся Доклинг

Проект был разработан командой IBM Deep Search, которая разрабатывала конвейеры генерации дополненной поисковой информации (RAG) для длинных патентных PDF-файлов. В конце 2024 года они открыли исходный код ядра по лицензии MIT и с тех пор выпускают еженедельные версии. Вокруг унифицированной модели DoclingDocument — объекта Pydantic, объединяющего текст, изображения, таблицы, формулы и метаданные макета, — быстро сформировалось активное сообщество.

Сегодня Docling интегрирует визуально-языковые модели (VLM), такие как SmolDocling, для создания подписей к рисункам. Он также поддерживает Tesseract, EasyOCR и RapidOCR для извлечения текста и предоставляет готовые рецепты для фрагментации, сериализации и загрузки векторных изображений. Другими словами: вы указываете папку и получаете Markdown, HTML, CSV, PNG, JSON или просто готовый к внедрению объект Python — без необходимости в дополнительном коде для построения структуры.

Что мы будем делать?

Чтобы продемонстрировать возможности Docling, мы сначала установим его, а затем используем на трёх различных примерах, которые демонстрируют его универсальность и полезность в качестве парсера и процессора документов. Обратите внимание, что использование Docling требует значительных вычислительных ресурсов, поэтому будет полезно, если в вашей системе есть доступ к графическому процессору.

Однако прежде чем приступить к кодированию, нам необходимо настроить среду разработки.

Настройка среды разработки

Я уже начал использовать менеджер пакетов UV, но вы можете использовать любой другой удобный для вас инструмент. Также обратите внимание, что я буду работать в WSL2 Ubuntu для Windows и запускать свой код с помощью Jupyter Notebook.

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

$ uv init docling Инициализированный проект `docling` в `/home/tom/docling` $ cd docling $ uv venv Используем интерпретатор CPython 3.11.10 в: /home/tom/miniconda3/bin/python Создаем виртуальную среду в: .venv Активируем с помощью: source .venv/bin/activate $ source .venv/bin/activate (docling) $ uv pip install docling pandas jupyter

Теперь введите команду,

(доклинг) $ jupyter notebook

В браузере должен открыться блокнот. Если это не произошло автоматически, после выполнения команды Jupyter Notebook вы, вероятно, увидите экран с информацией. Внизу вы найдёте URL-адрес, который нужно скопировать и вставить в браузер для запуска Jupyter Notebook.

Ваш URL-адрес будет отличаться от моего, но выглядеть он должен примерно так:-

http://127.0.0.1:8888/tree?token=3b9f7bd07b6966b41b68e2350721b2d0b6f388d248cc69d

Пример 1: Преобразование любого PDF или DOCX в Markdown или JSON

Самый простой вариант использования — это тот, который вы будете использовать большую часть времени: преобразовать текст документа в Markdown.

Для большинства наших примеров в качестве входного PDF-файла я буду использовать тот, который я уже несколько раз использовал для различных тестов. Это копия документа Tesla, поданного в Комиссию по ценным бумагам и биржам США (SEC) по форме 10-Q от сентября 2023 года. Он занимает около пятидесяти страниц и содержит в основном финансовую информацию, связанную с Tesla. Полный текст документа доступен на сайте Комиссии по ценным бумагам и биржам США (SEC) и может быть просмотрен/скачан по этой ссылке.

Для вашего ознакомления приводим изображение первой страницы этого документа.

16c96a19fa2b5c66c7742c9b44603a4f

Давайте рассмотрим код доклинга, необходимый для конвертации в Markdown. Он задаёт путь к входному PDF-файлу, запускает функцию DocumentConverter, а затем экспортирует результат анализа в формат Markdown, чтобы контент было легче читать, редактировать и анализировать.

из docling.document_converter импорт DocumentConverter время импорта из pathlib импорт Path inpath = «/mnt/d//tesla» infile = «tesla_q10_sept_23.pdf» data_folder = Path(inpath) doc_path = data_folder / infile converter = DocumentConverter() result = converter.convert(doc_path) # → DoclingResult # Экспорт Markdown все еще работает markdown_text = result.document.export_to_markdown()

Это результат выполнения приведенного выше кода (только первая страница).

## КОМИССИЯ ПО ЦЕННЫМ БУМАГАМ И БИРЖАМ США Вашингтон, округ Колумбия, 20549 ФОРМА 10-Q (отметьте один) — x Ежеквартальный отчет в соответствии с разделом 13 или 15(d) ЗАКОНА О БИРЖАХ ЦЕННЫХ БУМАГ 1934 ГОДА За квартальный период, закончившийся 30 сентября 2023 года ИЛИ — o ОТЧЕТ О ПЕРЕХОДЕ В СООТВЕТСТВИИ С РАЗДЕЛОМ 13 или 15(d) ЗАКОНА О БИРЖАХ ЦЕННЫХ БУМАГ 1934 ГОДА За переходный период от __________ к __________ Номер дела Комиссии: 001-34756 ## Tesla, Inc. (точное название регистранта, как указано в его уставе) Делавэр (штат или другая юрисдикция учреждения или организации) 1 Tesla Road Austin, Texas (Адрес главных исполнительных офисов) ## (512) 516-8177 (Номер телефона регистранта, включая код города) ## Ценные бумаги, зарегистрированные в соответствии с разделом 12(b) Закона: | Название каждого класса | Торговый(е) символ(ы) | Название каждой биржи, на которой зарегистрированы | |————————|———————-|———————————————| | Обыкновенные акции | TSLA | Nasdaq Global Select Market | Укажите галочкой, (1) подал ли регистрант все отчеты, которые должны быть поданы в соответствии с разделом 13 или 15(d) Закона о биржах 1934 года («Закон о биржах»), в течение предыдущих 12 месяцев (или за такой более короткий период, в течение которого регистрант был обязан подавать такие отчеты), и (2) подчинялся ли он(а) таким требованиям по подаче в течение последних 90 дней. Да x Нет o Укажите галочкой, представил ли заявитель в электронном виде каждый интерактивный файл данных, который должен быть представлен в соответствии с Правилом 405 Положения ST (§232.405 настоящей главы) в течение предыдущих 12 месяцев (или за такой более короткий период, в течение которого заявитель был обязан представить такие файлы). Да x Нет o Укажите галочкой, является ли заявитель крупной компанией, подающей отчетность по ускоренной процедуре, компанией, подающей отчетность по ускоренной процедуре, компанией, подающей отчетность по неускоренной процедуре, небольшой компанией или развивающейся компанией. См. определения «крупная компания, подающая отчетность в ускоренном режиме», «компания, подающая отчетность в ускоренном режиме», «небольшая отчитывающаяся компания» и «развивающаяся растущая компания» в Правиле 12b-2 Закона о биржах: Крупная компания, подающая отчетность в ускоренном режиме x Ускоренная подача Неускоренная подача o Небольшая отчитывающаяся компания Развивающаяся растущая компания o Если это развивающаяся растущая компания, укажите галочкой, решил ли регистрант не использовать продленный переходный период для соблюдения любых новых или пересмотренных стандартов финансового учета, предусмотренных в соответствии с Разделом 13(a) Закона о биржах. o Укажите галочкой, является ли регистрант фиктивной компанией (согласно определению в Правиле 12b-2 Закона о биржах). Да o Нет x По состоянию на 16 октября 2023 года в обращении находилось 3 178 921 391 обыкновенных акций регистранта.

С развитием редакторов кода на базе искусственного интеллекта и широким распространением LLM этот метод стал значительно более ценным и актуальным. Эффективность LLM и редакторов кода может быть значительно повышена путем предоставления им соответствующего контекста. Часто это подразумевает предоставление им текстового представления документации, API и примеров кода конкретного инструмента или фреймворка.

Преобразование PDF-файлов в формат JSON также не вызывает никаких сложностей. Просто добавьте эти две строки кода. Вы можете столкнуться с ограничениями по размеру выводимого JSON-файла, поэтому скорректируйте оператор печати соответствующим образом.

json_blob = result.document.model_dump_json(отступ=2) print(json_blob[10000], «…»)

Пример 2: Извлечение сложных таблиц из PDF-файла

Во многих PDF-файлах таблицы часто хранятся в виде изолированных текстовых фрагментов или, что ещё хуже, в виде сплющенных изображений. Модель табличной структуры Docling объединяет строки, столбцы и ячейки, создавая либо Pandas DataFrame, либо готовый к сохранению CSV-файл. В нашем тестовом PDF-файле множество таблиц. Взгляните, например, на страницу 11 PDF-файла, где мы видим следующую таблицу:

da9ee43e2688a2cfb1330cf0f8a692b9

Давайте посмотрим, сможем ли мы извлечь эти данные. Код немного сложнее, чем в нашем первом примере, но он выполняет больше работы. PDF-файл снова конвертируется с помощью функции DocumentConverter из Docling, создавая структурированное представление документа. Затем для каждой обнаруженной таблицы она преобразуется в Pandas DataFrame, а также извлекает номер страницы из метаданных о происхождении документа. Если таблица находится на странице 11, она выводится в формате Markdown и затем прерывает цикл (поэтому отображается только первая совпадающая таблица).

import pandas as pd from docling.document_converter import DocumentConverter from time import time from pathlib import Path inpath = «/mnt/d//tesla» infile = «tesla_q10_sept_23.pdf» data_folder = Path(inpath) input_doc_path = data_folder / infile doc_converter = DocumentConverter() start_time = time() conv_res = doc_converter.convert(input_doc_path) # Экспорт таблицы со страницы 11 for table_ix, table in enumerate(conv_res.document.tables): page_number = table.prov[0].page_no if table.prov else «Unknown» if page_number == 11: table_df: pd.DataFrame = table.export_to_dataframe() print(f»## Таблица {table_ix} (Страница {page_number})») print(table_df.to_markdown()) break end_time = time() — start_time print(f»Документ преобразован и таблицы экспортированы за {end_time:.2f} секунд.» )

И результаты не такие уж плохие.

## Таблица 10 (страница 11) | | | Три месяца, закончившихся 30 сентября 2023 г. | Три месяца, закончившихся 30 сентября 2022 г. | Девять месяцев, закончившихся 30 сентября 2023 г. | Девять месяцев, закончившихся 30 сентября 2022 г. | |—:|:—————————————|:—————————————-|:———————————————————|:——————————————|:—————————————-| | 0 | Продажи автомобилей | 18 582 долл. | 17 785 долл. | 57 879 долл. | 46 969 долл. | | 1 | Регулятивные кредиты для автомобилей | 554 | 286 | 1 357 | 1 309 | | 2 | Продажи генерации и хранения энергии | 1416 | 966 | 4188 | 2186 | | 3 | Услуги и прочее | 2166 | 1645 | 6153 | 4390 | | 4 | Общая выручка от продаж и услуг | 22718 | 20682 | 69577 | 54854 | | 5 | Лизинг автомобилей | 489 | 621 | 1620 | 1877 | | 6 | Лизинг оборудования для производства и хранения энергии | 143 | 151 | 409 | 413 | | 7 | Общая выручка | 23350 долларов США | 21454 долларов США | 71606 долларов США | 57144 долларов США | Документы преобразованы и таблицы экспортированы за 33,43 секунды.

Чтобы извлечь ВСЕ таблицы из PDF-файла, вам нужно будет исключить строку if page_number =… из моего кода.

Я заметил, что Docling работает небыстро. Как показано выше, извлечение одной таблицы из 50-страничного PDF-файла заняло почти 34 секунды.

Пример 3: Выполнение OCR на изображении.

Для этого примера я отсканировал случайную страницу из PDF-файла Tesla 10-Q и сохранил её в формате PNG. Посмотрим, как Docling справится с чтением этого изображения и конвертацией найденного в Markdown. Вот моё отсканированное изображение.

af6ddd6274a4e6c63c9bd6693e4bc98e

И наш код. Мы используем Tesseract в качестве OCR-движка (есть и другие).

from pathlib import Path import time import pandas as pd from docling.document_converter import DocumentConverter, ImageFormatOption from docling.models.tesseract_ocr_cli_model import TesseractCliOcrOptions def main(): inpath = «/mnt/d//tesla» infile = «10q-image.png» input_doc_path = Path(inpath) / infile # Настраиваем OCR для ввода изображений image_options = ImageFormatOption( ocr_options=TesseractCliOcrOptions(force_full_page_ocr=True), do_table_structure=True, table_structure_options={«do_cell_matching»: True}, ) converter = DocumentConverter( format_options={«image»: image_options} ) start_time = time.time() conv_res = converter.convert(input_doc_path).document # Печать всех таблиц в формате Markdown for table_ix, table in enumerate(conv_res.tables): table_df: pd.DataFrame = table.export_to_dataframe(doc=conv_res) page_number = table.prov[0].page_no if table.prov else «Unknown» print(f»n— Таблица {table_ix+1} (Страница {page_number}) —«) print(table_df.to_markdown(index=False)) # Печать полного текста документа в формате Markdown print(«n— Полный документ (Markdown) —«) print(conv_res.export_to_markdown()) elapsed = time.time() — start_time print(f»nОбработка завершена через {elapsed:.2f} секунд») if __name__ == «__main__»: main()

Вот наш результат.

— Таблица 1 (страница 1) — | | Три месяца, закончившихся в сентябре J0,. | Три месяца, закончившихся в сентябре J0,.2022 | Девять месяцев, закончившихся в сентябре J0,.2023 | Девять месяцев, закончившихся в сентябре J0,.2022 | |:————————-|————————————:|:—————————————-|:—————————————-|:—————————————-| | Себестоимость доходов | 181 | 150 | 554 | 424 | | Исследования и разработки | 189 | 124 | 491 | 389 | | | 95 | | 2B3 | 328 | | Итого | 465 | 362 | 1,328 | 1,141 | — Полный документ (уценка) — ## Примечание 8 Планы поощрения в виде акций ## Другие гранты на основе результатов («RSU») и опционы на акции непризнанные компенсации на основе акций ## Сводная информация о компенсации на основе акций | | Три месяца, закончившихся в сентябре J0, | Три месяца, закончившихся в сентябре J0, | Девять месяцев, закончившихся в сентябре J0, | Девять месяцев, закончившихся в сентябре J0, | |————————-|——————————————————|—————————————————-|—————————————————-| | | | 2022 | 2023 | 2022 | | Себестоимость доходов | 181 | 150 | 554 | 424 | | Исследования и разработки | 189 | 124 | 491 | 389 | | | 95 | | 2B3 | 328 | | Всего | 465 | 362 | 1328 | 1141 | ## Примечание 9. Обязательства и условные расходы ## Договоры операционной аренды в Буффало, Нью-Йорк, и Шанхае, Китай ## Судебные разбирательства в период с 1 сентября 2021 г. Обработка данных завершена за 7,64 секунды

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

Однако Docling предоставляет различные варианты OCR, поэтому, если вы получите плохие результаты от одной системы, вы всегда можете переключиться на другую.

Я попытался выполнить ту же задачу с помощью EasyOCR, но результаты не сильно отличались от результатов, полученных с помощью Tesseract. Если хотите попробовать, вот код.

from pathlib import Path import time import pandas as pd from docling.document_converter import DocumentConverter, ImageFormatOption from docling.models.easyocr_model import EasyOcrOptions # Импорт параметров EasyOCR def main(): inpath = «/mnt/d//tesla» infile = «10q-image.png» input_doc_path = Path(inpath) / infile # Настройка конвейера изображений с помощью EasyOCR image_options = ImageFormatOption( ocr_options=EasyOcrOptions(force_full_page_ocr=True), # использование EasyOCR do_table_structure=True, table_structure_options={«do_cell_matching»: True}, ) converter = DocumentConverter( format_options={«image»: image_options} ) start_time = time.time() conv_res = converter.convert(input_doc_path).document # Печать всех таблиц в формате Markdown for table_ix, table in enumerate(conv_res.tables): table_df: pd.DataFrame = table.export_to_dataframe(doc=conv_res) page_number = table.prov[0].page_no if table.prov else «Unknown» print(f»n— Таблица {table_ix+1} (Страница {page_number}) —«) print(table_df.to_markdown(index=False)) # Печать полного текста документа в формате Markdown print(«n— Полный документ (Markdown) —«) print(conv_res.export_to_markdown()) elapsed = time.time() — start_time print(f»nОбработка завершена через {elapsed:.2f} секунд») if __name__ == «__main__»: main()

Краткое содержание

Бум генеративного ИИ вновь оживил старую истину: мусор на входе — мусор на выходе. Магистры права могут меньше галлюцинировать только тогда, когда получают семантически и пространственно согласованные входные данные. Доклинг обеспечивает согласованность (в большинстве случаев) в различных исходных форматах, которые могут представить ваши заинтересованные стороны, причем локально и воспроизводимо.

Однако Docling может применяться не только в сфере искусственного интеллекта. Стоит учесть огромное количество документов, хранящихся в таких местах, как банковские хранилища, юридические конторы и страховые компании по всему миру. Если их необходимо оцифровать, Docling может предоставить некоторые решения для этой задачи.

Его самый большой недостаток, пожалуй, — оптическое распознавание текста на изображениях. Я пробовал использовать Tesseract и EasyOCR, и результаты обоих оказались разочаровывающими. Вам, вероятно, понадобится коммерческий продукт, например, AWS Textract, если вы хотите надёжно воспроизводить текст из таких источников.

Он также может быть медленным. У меня довольно мощный настольный компьютер с видеокартой, и большинство заданий, которые я ему задал, выполнялись довольно медленно. Однако, если вы в основном работаете с PDF-файлами, Docling может стать ценным дополнением к вашему набору инструментов для обработки текста.

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

Источник: towardsdatascience.com

✅ Найденные теги: Доклинг:, новости
Каталог бесплатных опенсорс-решений, которые можно развернуть локально и забыть о подписках

галерея

Фото сгенерированных лиц: исследование показывает, что люди не могут отличить настоящие лица от сгенерированных
Нейросети построили капитализм за трое суток: 100 агентов Claude заперли…
Скетч: цифровой осьминог и виртуальный мир внутри компьютера с человечком.
Сцена с жестами пальцами, где один жест символизирует "VPN", а другой "KHP".
‼️Paramount купила Warner Bros. Discovery — сумма сделки составила безумные…
Скриншот репозитория GitHub "Claude Scientific Skills" AI для научных исследований.
Структура эффективного запроса Claude с элементами задачи, контекста и референса.
Эскиз и готовая веб-страница платформы для AI-дизайна в современном темном режиме.
ideipro logotyp
Image Not Found
Звёздное небо с галактиками и туманностями, космос, Вселенная, астрофотография.

Система оповещения обсерватории Рубина отправила 800 000 сигналов в первую ночь наблюдений.

Астрономы будут получать оповещения о небесных явлениях в течение нескольких минут после их обнаружения. Теренс О'Брайен, редактор раздела «Выходные». Публикации этого автора будут добавляться в вашу ежедневную рассылку по электронной почте и в ленту новостей на главной…

Мар 2, 2026
Женщина с длинными тёмными волосами в синем свете, нейтральный фон.

Расследование в отношении 61-фунтовой машины, которая «пожирает» пластик и выплевывает кирпичи.

Обзор компактного пресса для мягкого пластика Clear Drop — и что будет дальше. Шон Холлистер, старший редактор Публикации этого автора будут добавляться в вашу ежедневную рассылку по электронной почте и в ленту новостей на главной странице вашего…

Мар 2, 2026
Черный углеродное волокно с текстурой плетения, отражающий свет.

Материал будущего: как работает «бессмертный» композит

Учёные из Университета штата Северная Каролина представили композит нового поколения, способный самостоятельно восстанавливаться после серьёзных повреждений.  Речь идёт о модифицированном армированном волокном полимере (FRP), который не просто сохраняет прочность при малом весе, но и способен «залечивать» внутренние…

Мар 2, 2026
Круглый экран с изображением замка и горы, рядом электронная плата.

Круглый дисплей Waveshare для креативных проектов

Круглый 7-дюймовый сенсорный дисплей от Waveshare создан для разработчиков и дизайнеров, которым нужен нестандартный экран.  Это IPS-панель с разрешением 1 080×1 080 пикселей, поддержкой 10-точечного ёмкостного сенсора, оптической склейкой и защитным закалённым стеклом, выполненная в круглом форм-факторе.…

Мар 2, 2026

Впишите свой почтовый адрес и мы будем присылать вам на почту самые свежие новости в числе самых первых