Привет! На связи Валерия Елпатьевская, ментор курса «Инженер данных» 👋🏻
Делюсь кейсом, который отлично показывает, что в обработке документов нет универсального инструмента.
Для сервиса парсинга мы взяли библиотеку
LLMSherpa. Она идеально считывала заголовки, таблицы, списки и сохраняла логическую структуру текста. Это казалось идеальным решением, но со временем мы обнаружили неочевидную вещь. Часть текста просто пропадала, если фрагмент переходил на следующую страницу и был небольшим.Терять структуру нельзя. Терять содержимое — тем более. Как быть?
Пришлось писать кастомный парсер-гибрид:
➖ Взяли
LLMSherpa как источник структурного скелета.➖ Подключили сырой экстрактор (
pdfplumber/textract/python-docx) для полного покрытия текста.➖ Написали алгоритм мержа: если расхождение по длине выводов превышает порог (например,
>= 30 символов), скрипт построчно сравнивает результаты двух библиотек, находит совпадения, а пропуски заполняет текстом из сырого источника, строго сохраняя порядок строк.В результате у нас получились чанки с идеальной структурой и ~100% покрытием текста. Мы перестали терять контекст на стыках страниц, сохранив при этом представление о форматировании документа.
Какие выводы из этого можно сделать:
🔶 Ни одна библиотека не универсальна. Структурный парсер вместе с сырым экстрактором оказались надёжнее, чем по отдельности.
🔶 Нужна валидация на стыке компонентов. Сравнение длины, хэши или посимвольный чек экономят часы дебага в проде.
🔶 Кастомный мерж-алгоритм иногда проще и быстрее, чем ожидание обновления библиотеки. Не бойтесь строить обвязку самостоятельно!
А вы сталкивались с тем, что готовые инструменты теряли часть данных? Делитесь кейсами в комментариях ⬇️
📈 Симулейтив | 📱 ВК | 📱 YouTube | 📱 Канал о DS