3,583 papers
arXiv:2508.09324 84 12 авг. 2025 г. FREE

TEN (Table Explicitization, Neurosymbolically): извлечение таблиц через структурную декомпозицию

КЛЮЧЕВАЯ СУТЬ
Два запуска на одном тексте — разные таблицы: то 7 колонок, то 5, то данные слиты. Проблема в том что LLM пытается восстановить структуру за один проход, держа всё в голове. TEN позволяет стабильно извлекать таблицы из копипасты или OCR-текста даже когда структура развалилась. Метод разбивает процесс на три явных этапа: сначала модель находит границы таблиц, потом определяет разделители строк и колонок, и только после этого генерирует структуру. Символьная проверка ловит типичные косяки (слитые ячейки, несбалансированные скобки), LLM-критик переводит ошибки в понятные инструкции — +10-40 пунктов точности vs обычная цепочка рассуждений.
Адаптировать под запрос

TL;DR

TEN — метод извлечения таблиц из неструктурированного текста через три компонента: Structural Decomposition prompting (специализированный Chain-of-Thought), символьная проверка структуры и LLM-критик. Суть в том, что модель сначала находит границы таблиц в тексте, затем определяет разделители строк и колонок, и только потом генерирует структуру. После этого символьный чекер проверяет результат на типичные ошибки (слитые ячейки, несовпадение типов, несбалансированные скобки), а LLM-критик переводит технические ошибки в понятные инструкции для исправления.

Модели теряются при извлечении таблиц из копипасты или OCR-текста без разметки. Проблема в том, что LLM пытается восстановить структуру за один проход, не имея чёткого плана. Результат — два запуска на одном тексте дают разные таблицы: то 7 колонок, то 5, то данные слиты, то разделены. Модель галлюцинирует значения (21% hallucination rate), теряет данные (coverage падает до 90%), путает заголовки с данными. Типичные косяки: слитые ячейки ("Section 143, Row 2" вместо отдельных колонок), неправильные разделители (число "12,345" разваливается на "12" и "345"), несбалансированные скобки (обрезанный текст).

TEN решает это через явное разделение на этапы: сначала модель ищет где в тексте таблицы и определяет их границы (игнорируя шум), затем выбирает разделители для строк и колонок, и только после этого генерирует JSON-структуру. Если символьный чекер находит ошибки — LLM-критик анализирует фидбек и даёт конкретные инструкции: "Разделите ячейку X на две колонки", "Объедините строки Y-Z под один заголовок". Цикл продолжается до схождения или 5 итераций. Прирост точности: +10-40 пунктов Exact Match vs обычный CoT.


🔬

Схема метода

ШАГ 1: Structural Decomposition (один промпт, но с явными подзадачами)
 1a. Найди границы таблиц в тексте
 1b. Определи разделители строк и колонок
 1c. Сгенерируй структуру таблицы в JSON

ШАГ 2: Symbolic Sanity Checker (проверка)
 → Goodness/badness score, список нарушений

ШАГ 3: Critique LLM (если есть ошибки)
 → Анализ фидбека → конкретные инструкции по исправлению

ШАГ 4: Регенерация с учётом критики
 → Повтор шагов 1-3 до схождения (макс 5 итераций)

Итеративный процесс: один вызов модели даёт первую версию, затем цикл проверка-критика-исправление до готовности.


🚀

Пример применения

Задача: Ты получил по email текст с ценами на билеты на матч. Копипаста развалила структуру — всё смешалось в кучу. Нужно восстановить читаемую таблицу для сравнения вариантов.

Промпт:

У меня есть текст с информацией о билетах, но структура потерялась при копировании. 

Сделай это в три этапа:

1. **Найди границы**: Определи где начинается и заканчивается каждый вариант билета
2. **Определи разделители**: Какие паттерны разделяют поля (секция, ряд, цена, площадка)
3. **Построй таблицу**: Создай структурированную таблицу в JSON

Вот текст:

Friday Night
Dugout Box (Behind card's dugout)
Section 143, Row 2, Seat 5-8, $149ea, mlb/hub
https://www.ticketmaster.com

Redbird Club (good views, dedicated bathrooms & concessions)
Section 249, Row 1, Seat 1-10 (aisle) - $58ea, mlb/hub
https://www.ticketmaster.com

Mariners Dugout
Section 150 (should look straight in), Row 1, Seat 5-8 (aisle) - $150ea, mlb

Cardinals Club
Section 7, Row 1, Seat 1-4 (aisle) - $189ea, stubhub
https://www.ticketmaster.com

После того как создашь таблицу, проверь:
- Все ли данные из текста попали в таблицу?
- Нет ли слитых ячеек (например, "Section 143, Row 2" должно быть в разных колонках)?
- Все ли скобки и кавычки парные?
- Числа не разваливаются на части из-за запятых?

Если найдёшь проблемы — исправь и покажи финальную версию.

Результат:

Модель покажет три фазы работы:

  1. Сегментация: "Вижу 4 варианта билетов, границы: строки с Day, далее описание площадки, далее детали..."
  2. Определение структуры: "Разделители: название площадки (заголовок), Section/Row/Seat через запятые, цена через $, ссылка отдельно"
  3. JSON-таблица с колонками: Venue, Section, Row, Seats, Price, Platform, URL

Затем модель проверит себя: "Нашла слитую ячейку 'Section 143, Row 2' — разделяю на Section: 143, Row: 2". Выдаст чистую финальную таблицу где каждое поле на своём месте.


🧠

Почему это работает

Слабость LLM: Модели плохо восстанавливают структуру "в лоб" из-за отсутствия чёткого плана. Без явных инструкций модель одновременно решает: где границы таблиц, какие разделители, как выровнять колонки, куда положить каждое значение. Когнитивная перегрузка → непредсказуемый результат. Два запуска на одном тексте дают разные таблицы (см. Figure 1 в статье).

Сильная сторона LLM: Модели отлично работают пошагово и умеют следовать структурированным инструкциям. Если задача разбита на подзадачи с чёткими критериями проверки — точность резко растёт. Особенно эффективны псевдокод-подобные структуры и явные условия выхода.

Как TEN использует сильную сторону: Метод разбивает восстановление таблицы на три последовательных этапа — поиск границ, выбор разделителей, генерация структуры. Каждый этап имеет чёткий output, который становится input для следующего. Символьный чекер работает как внешний валидатор (не подвержен галлюцинациям LLM), а LLM-критик переводит технический фидбек ("badness score 0.3, merged cells detected") в понятные инструкции ("Разделите ячейку X на колонки Y и Z"). Итеративность даёт модели возможность исправить ошибки, которые она не заметила в первый проход.

Рычаги управления:

  • Глубина декомпозиции — можно добавить подэтапы (например, "определи типы данных в колонках" перед генерацией)
  • Строгость проверки — список правил символьного чекера (больше правил = меньше ошибок, но медленнее)
  • Число итераций — 2-3 дают основной прирост, дальше diminishing returns
  • Уровень детализации критики — можно просить critique LLM давать не только ЧТО исправить, но и ПОЧЕМУ ошибка возникла

📋

Шаблон промпта

У меня есть неструктурированный текст, который содержит табличные данные. Структура потерялась при копировании/OCR.

Восстанови таблицу в три этапа:

**Этап 1 — ГРАНИЦЫ:**
Найди где начинается и заканчивается каждая таблица или блок данных. 
Игнорируй шум (пустые строки, примечания, не относящиеся к данным).
Покажи границы каждого блока.

**Этап 2 — РАЗДЕЛИТЕЛИ:**
Для каждого блока определи:
- Что разделяет строки (переводы строк, пустые строки, паттерны)?
- Что разделяет колонки (запятые, пробелы, табуляция, паттерны)?
- Какие поля (колонки) ты видишь в данных?

**Этап 3 — СТРУКТУРА:**
Создай таблицу в формате {формат_вывода}.
Заполни все ячейки значениями из текста.

После построения — ПРОВЕРЬ:
1. Coverage: Все ли данные из текста попали в таблицу?
2. Слитые ячейки: Нет ли значений, которые должны быть в разных колонках, но слиты в одну?
3. Разделители: Числа с запятыми (12,345) не развалились на части?
4. Скобки: Все открывающие скобки закрыты?
5. Типы данных: Колонка с числами не содержит текст и наоборот?

Если нашёл проблемы — исправь и покажи финальную версию.

Текст:
{текст_с_данными}

Плейсхолдеры:

  • {формат_вывода} — JSON, CSV, Markdown table, или другой удобный формат
  • {текст_с_данными} — твой неструктурированный текст

🚀 Быстрый старт — вставь в чат:

Вот шаблон метода TEN для восстановления таблиц из неструктурированного текста. 
Адаптируй под мою задачу: [опиши свою задачу — что за текст, какой результат нужен].
Задавай вопросы, чтобы заполнить поля.

[вставить шаблон выше]

LLM спросит: какой формат вывода предпочитаешь, есть ли специфика в данных (например, многоуровневые заголовки), нужны ли дополнительные проверки — потому что для эффективной работы метода нужно понимать структуру ожидаемой таблицы и потенциальные источники ошибок. Она возьмёт паттерн трёхэтапной декомпозиции и встроенной проверки, адаптирует под твой кейс.


⚠️

Ограничения

⚠️ Сложность данных: Метод лучше работает на семантически богатых данных (с контекстными подсказками, описаниями). На чисто числовых таблицах без контекста или аббревиатурах, где значение зависит от позиции, точность падает. Например, финансовые таблицы с сокращениями показали худшие результаты (21.7% Exact Match vs 81.6% на других данных).

⚠️ Размер таблиц: С ростом числа строк точность снижается — большие таблицы (20+ строк) сложнее структурировать. Широкие таблицы (10+ колонок) тоже проблематичны из-за неоднозначности выравнивания.

⚠️ Токены: Итеративный процесс (2-5 итераций) требует много токенов. Каждая итерация = полная регенерация таблицы. Для больших таблиц это дорого.

⚠️ Применение принципов вручную: Полная реализация TEN требует кода (symbolic checker, critique LLM как отдельный компонент). В чате ты применяешь принципы метода (structural decomposition, самопроверка), но без автоматической валидации результат зависит от способности модели проверить себя.


🔍

Как исследовали

Исследователи взяли 1000 таблиц из четырёх датасетов (научные статьи с OCR, финансовые отчёты, Wikipedia, кривые CSV) и протестировали шесть моделей (GPT-4, DeepSeek-R1, o3-mini, DeepSeek-V3, Phi-4, Mistral-Small) на трёх видах промптинга: базовый ("построй таблицу"), CoT ("подумай step by step"), и Structural Decomposition. Сравнивали по Exact Match (идеальное совпадение), Column Match (совпадение колонок), Cell Value Match (совпадение значений ячеек), Coverage (сколько текста попало в таблицу) и Hallucination Rate (сколько модель придумала от себя).

Главное открытие: Structural Decomposition даёт +10-40 пунктов Exact Match vs CoT и базовый промпт. Особенно сильно помогает слабым моделям — o3-mini вырос с 2.2% до 14.4% (6x), GPT-4 с 8.9% до 21.7% (2.4x). Это означает, что явная структура в промпте компенсирует слабость модели.

Удивительный результат: самые "сложные" датасеты оказались легче. BrokenCSV (намеренно искажённые данные) показал 81.6% точности, а финансовые таблицы FinTabNet — только 21.7%. Почему? BrokenCSV содержит самоописываемые данные ("Price: $50", "Date: 2024-01-15") — даже без структуры модель понимает что это. Финтаблицы полны аббревиатур и чисел, где значение зависит от позиции в таблице — без разметки смысл теряется.

Итеративность работает: Основной прирост происходит в первые 2-3 итерации, дальше diminishing returns. Symbolic checker + Critique LLM вместе дают лучший результат, чем каждый по отдельности: symbolic alone — слишком строг (false positives), LLM alone — даёт общие советы вместо конкретных фиксов.

User study (21 участник): Люди оценили таблицы TEN значимо точнее чем альтернативу (5.0 vs 4.3 по шкале 1-7, p=0.021). В 7 из 20 таблиц все три независимых рецензента выбрали TEN. Интересный нюанс: хотя TEN точнее, effort на исправление статистически не отличается — потому что TEN требует фиксить alignment, а альтернатива — добавлять missing data, оба одинаково трудозатратны.


💡

Адаптации и экстраполяции

💡 Адаптация для извлечения расписания событий:

Structural Decomposition эффективен не только для таблиц. Попробуй для календарей, расписаний, программ мероприятий.

У меня программа конференции скопирована из PDF, всё слилось. 
Восстанови структуру в три этапа:

Этап 1 — ГРАНИЦЫ: Найди где начинается каждый день/секция
Этап 2 — РАЗДЕЛИТЕЛИ: Определи паттерны времени, спикеров, тем
Этап 3 — СТРУКТУРА: Создай JSON {день, время, спикер, тема, зал}

Проверь: все ли временные слоты на месте, нет ли слитых событий, 
совпадают ли имена спикеров с оригиналом.

[текст программы]

Логика та же — разбиение на подзадачи + самопроверка на типичные ошибки.


🔧 Техника: Увеличить transparency → видеть процесс мышления

Базовый шаблон просит модель показать границы и разделители, но не объясняет почему она их выбрала.

Добавь в промпт после каждого этапа:

После Этапа 1: Объясни ПОЧЕМУ ты выбрал эти границы. Какие паттерны указывают на начало/конец блока?

После Этапа 2: Объясни ПОЧЕМУ эти разделители. Приведи примеры из текста.

После Этапа 3: Покажи КАКИЕ решения ты принял при неоднозначности. Если было несколько вариантов структуры — почему выбрал этот?

Эффект: Больше контроля, видно где модель сомневается, проще отловить ошибки до финальной генерации. Минус — больше токенов.


🔧 Техника: Сужение scope → фокус на критичных данных

Если в тексте есть шум (примечания, футеры, disclaimers) — модель может их включить в таблицу.

Модификация Этапа 1:

Этап 1 — ГРАНИЦЫ:
Найди где начинается и заканчивается каждый блок ТАБЛИЧНЫХ данных.
Исключи:
- Примечания и сноски (обычно начинаются с "Примечание:", "Note:", "*")
- Даты публикации и номера страниц
- Disclaimers и legal text
- Пустые строки и разделители

Покажи только границы ДАННЫХ, игнорируй мета-информацию.

Эффект: Меньше шума в результате, модель не пытается структурировать то, что не является данными. Особенно полезно для документов с большим количеством текста вокруг таблиц.


🔗

Ресурсы

TEN: Table Explicitization, Neurosymbolically — Nikita Mehrotra, Ayush Kumar, Sumit Gulwani, Arjun Radhakrishna, Ashish Tiwari (Microsoft Research)

Исследование опубликовано в AAAI 2026. Включает эксперименты на датасетах PubTabNet, FinTabNet, WikiTables, BrokenCSV и user study с 21 участником.


📋 Дайджест исследования

Ключевая суть

Два запуска на одном тексте — разные таблицы: то 7 колонок, то 5, то данные слиты. Проблема в том что LLM пытается восстановить структуру за один проход, держа всё в голове. TEN позволяет стабильно извлекать таблицы из копипасты или OCR-текста даже когда структура развалилась. Метод разбивает процесс на три явных этапа: сначала модель находит границы таблиц, потом определяет разделители строк и колонок, и только после этого генерирует структуру. Символьная проверка ловит типичные косяки (слитые ячейки, несбалансированные скобки), LLM-критик переводит ошибки в понятные инструкции — +10-40 пунктов точности vs обычная цепочка рассуждений.

Принцип работы

Не бросай модели всю задачу сразу — разложи на последовательные шаги с явным выходом каждого этапа. Модель работает по алгоритму: Этап 1 → ищет где начинается и кончается каждая таблица в тексте. Этап 2 → определяет что разделяет строки (переносы, паттерны) и что разделяет колонки (запятые, пробелы, табуляция). Этап 3 → генерирует JSON-структуру с заполненными ячейками. После этого символьный чекер проверяет результат на ошибки (слитые ячейки "Section 143, Row 2" вместо отдельных полей, разваленные числа "12,345" → "12" и "345", незакрытые скобки). Если чекер находит косяки — LLM-критик анализирует фидбек и даёт конкретные указания: "Разделите ячейку X на две колонки", "Объедините строки Y-Z под один заголовок". Цикл повторяется до чистого результата или 5 итераций.

Почему работает

Без явных этапов модель одновременно решает 5 задач: где границы таблиц, какие разделители, как выровнять колонки, куда положить значения, какой тип у каждой ячейки. Когнитивная перегрузка — результат непредсказуемый. Исследование показало 21% галлюцинаций (модель выдумывает значения), падение покрытия до 90% (часть данных теряется), путаницу заголовков с данными. Разбивка на этапы снимает перегрузку — каждый шаг имеет чёткий выход, который становится входом для следующего. Символьный чекер работает как внешний валидатор (не подвержен галлюцинациям LLM), а итеративность даёт возможность исправить ошибки которые модель не заметила с первого раза. Прирост особенно заметен на сложных данных: с 21.7% точного совпадения до 60%+ на финансовых таблицах.

Когда применять

Извлечение таблиц → конкретно когда структура развалилась при копипасте из PDF, OCR-сканирования, email-переписки, скриншотов. Особенно эффективно для данных с контекстными подсказками (описания товаров, билеты, расписания). НЕ подходит для огромных таблиц 20+ строк (точность падает), чисто числовых данных без контекста (финансовые отчёты с аббревиатурами показали худшие результаты — много итераций, высокий расход токенов).

Мини-рецепт

1. Найди границы: Укажи модели найти где начинается и кончается каждый блок табличных данных, игнорируя шум (пустые строки, примечания)
2. Определи разделители: Попроси выявить что разделяет строки (переносы, паттерны?) и что разделяет колонки (запятые, пробелы, табуляция?), какие поля есть в данных
3. Построй структуру: Дай задачу создать таблицу в нужном формате (JSON, CSV, Markdown), заполнив все ячейки значениями из текста
4. Проверь себя: Попроси модель проверить покрытие данных, слитые ячейки, разделители в числах, парность скобок, типы данных в колонках — если есть ошибки, исправить и показать финальную версию

Примеры

[ПЛОХО] : Извлеки таблицу из этого текста: [копипаста с развалившейся структурой] (Модель получает всё разом, пытается восстановить структуру за один проход — результат непредсказуемый, два запуска дадут разные таблицы)
[ХОРОШО] : У меня текст с ценами на билеты, структура потерялась при копировании. Сделай три этапа: 1) Найди границы каждого варианта билета 2) Определи разделители для полей (секция, ряд, цена, площадка) 3) Построй таблицу в JSON. После построения проверь: все данные попали? нет слитых ячеек (например "Section 143, Row 2" должно быть в разных колонках)? числа не развалились из-за запятых? скобки парные? (Модель работает пошагово: сначала сегментация, потом выбор разделителей, потом структура, потом самопроверка — стабильный результат)
Источник: TEN: Table Explicitization, Neurosymbolically
ArXiv ID: 2508.09324 | Сгенерировано: 2026-01-12 01:27

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с