Обновить
2
Николай Герасимов@Foreststander

Пользователь

0,8
Рейтинг
Отправить сообщение

"Я был нетрезв! Я недостоин чести советского офицера!"

А можно поставить ЦОД на шинах ТЭЦ и не платить сетевикам? Или нельзя?

У меня 4.7 в чате отказалась читать загруженное архивом репо (мое), "потому, что оно подозрительное", и уверила, что не будет этого делать ни в каком случае. Потом сказало, что оно не будет продолжать этот диалог, потому, что нарушает terms of use, но можно переключится на Sonnet (не помогло)

В фильме "Евротур" парни пошли на нудистский пляж, чтобы посмотреть на голых девчонок...

Российскую ситуацию со стартапами (не только космическими) сравнивают со скороваркой. Главная проблема - нет слоя корпораций, которые будут их покупать ради технологий и потенциала роста. При этом внутрь деньги вполне могут подкидывать грантами и пр.

Это сразу GPT можно было высказывать :) https://disk.yandex.ru/d/fx5u3IprFbVbXQ - новые тулзы, https://disk.yandex.ru/d/8sMl8do71p7Guw - новый парсинг:

Подготовь варианты концептуальных решений всех issues выше. Проведи анализ и выбери оптимальное. Реализуй в виде обновленных инструментов. Разработай алгоритм тестирования, протестируй инструменты на этом pdf. Анализируй результаты теста, вноси корректировки, до достижения оптимального результата.

Думал на протяжении 25m 50s

Ниже — полный разбор вариантов решений по всем трём issues, выбранная (оптимальная) архитектура, и реализация в виде обновлённых инструментов. Я также проверил на вашем PDF (точечно на проблемных страницах 3185–3186) — именно там воспроизводятся оба баг-примера (“я́стреб … и -ы” и “яровизи́ровать(ся)”).
Важно: прогнать полную сборку на 3188 страниц “в один заход” в этой среде не удалось из-за жёсткого лимита времени выполнения одной команды (процессы принудительно обрываются примерно через ~25 секунд), поэтому я сделал то, что гарантированно помещается в лимит: регрессионные тесты на страницах с багами + готовые инструменты, которые вы сможете запустить локально на всём PDF.

Issues и варианты концептуальных решений

Issue A — ложное выделение как отдельной леммы (split по “и”)

Что происходит: строка
я́стреб, -а, мн. -а́, -о́в и -ы, -ов (птица)
была воспринята как “две леммы”, потому что алгоритм делил по " и " вне скобок.

Варианты:

  1. Запрет split по " и " после первой запятой
    ✅ простое; ❌ ломает правильные случаи типа аба́к, -а и аба́ка, -и ... (там “и” стоит после запятой, но это реально две леммы).

  2. Контекстная эвристика: split по " и " разрешать только если справа начинается “настоящая лемма”
    ✅ не ломает аба́к … и аба́ка …; ✅ чинит … и -ы; ✅ лучше масштабируется.

  3. Полноценная грамматическая модель (парсинг морфологии)
    ✅ идеально; ❌ дорого, долго, сложно поддерживать.

Выбор: вариант (2) — эвристика по правой части.

Правило (в реализации): split по " и " делаем только если:

  • это " и " на верхнем уровне (вне скобок), и

  • после " и " не стоит дефис (то есть не , , …), и

  • справа начинается буква, и

  • вокруг есть “признаки словарной статьи” (запятые/грамм. хвост), чтобы не резать устойчивые выражения.

Issue B — яровизи́ровать(ся) неудобно искать по реальным формам

Что происходит: лемма содержит (ся) как “схему”, но пользователи вводят:

  • яровизировать

  • яровизироваться

Варианты:

  1. Дублировать статьи (создать две записи)
    ✅ поиск простой; ❌ дубли данных, сложнее поддержка и идентичность.

  2. Алиасы (alias_key → canonical lemma_key)
    ✅ без дублирования; ✅ удобно и для JSON, и для SQLite; ✅ легко расширять на другие шаблоны.

  3. Делать раскрытие прямо в поисковике (на лету)
    ✅ быстро внедрить; ❌ логика расползается по клиентам.

Выбор: вариант (2) — алиасы.

Что добавлено:

  • Если лемма оканчивается на (ся) или (сь), строятся варианты:

    • делать(ся)делать, делаться

  • Для них создаются алиасы (и в JSON aliases-файле, и в SQLite таблице aliases).

Issue C — нужно сохранять позицию в PDF (y/bbox), лучше подсветка

Варианты:

  1. Сохранять только страницу
    ❌ мало.

  2. Сохранять bbox строки (x0,y0,x1,y1)
    ✅ достаточно, чтобы “прыгнуть” и подсветить.

  3. Сохранять точные “текстовые блоки/спаны” (много прямоугольников)
    ✅ максимально точно; ❌ сильно раздувает данные.

Выбор: по умолчанию bbox строки + опционально режим fragments (список фрагментов), если надо “почти идеально”.

Реализация: обновлённые инструменты

Я подготовил набор скриптов v2, которые учитывают все решения выше:

  1. pdf_dict_build_v2.py

    • читает PDF через page.get_text("dict") (получаем bbox)

    • чинит “пробел после ударения” и “-рует (ся)”

    • исправляет split по " и " (не делает леммой)

    • создаёт aliases для (ся)/(сь)

    • сохраняет bbox (и опционально fragments)

    • пишет JSONL / SQLite (FTS5) / aliases.json

  2. lint_dict_v2.py

    • проверяет:

      • подозрительные короткие “дефис-леммы” типа

      • что для (ся)/(сь) есть алиасы

      • bbox в пределах страницы

  3. search_dict_json_v2.py

    • точный поиск по JSONL + aliases (без индекса, но достаточно быстро)

  4. search_sqlite_v2.py

    • exact по lemma_key / lemma_key_ye

    • exact по aliases

    • fallback на FTS5 prefix/full

  5. annotate_pdf_hits_v2.py

    • делает копию PDF с highlight по bbox найденных статей

Скрипты лежат в каталоге:
/mnt/data/pdf_dict_tools_v2/
(в этой среде они созданы и готовы; ниже — как их запускать у вас).

Тестирование на вашем PDF (регрессия по багам)

Тест 1: “я́стреб … и -ы”

Я открыл страницу 3186 вашего PDF и убедился, что строка реально такая:
я́стреб, -а, мн. -а́, -о́в и -ы, -ов (птица)

В v2-парсере:

  • строка НЕ делится на 2 статьи

  • НЕ создаётся отдельный entry

  • “и -ы, -ов” остаётся в rest у я́стреб

То есть баг “Раз” закрыт.

Тест 2: яровизи́ровать(ся)

Страница 3185:

  • парсер исправляет PDF-артефакт и получает лемму как яровизи́ровать(ся) (без лишнего пробела).

  • создаёт алиасы на:

    • яровизировать

    • яровизироваться

  • search (JSON/SQLite) может найти статью по обоим запросам.

То есть баг “Два” закрыт.

Тест 3: координаты/подсветка

Для статей пишется bbox (координаты строки).
Плюс есть скрипт подсветки, который из JSONL+aliases строит PDF с highlight.

Алгоритм тестирования (автоматизация, без ручного просмотра)

Я рекомендую 2 уровня:

Уровень 1: “линтер” всего словаря (batch QA)

Запуск после билда:

  • доля подозрительных дефис-лемм (не из allowlist: -то, -ка, -либо…)

  • все (ся)/(сь) должны иметь алиасы

  • bbox должны быть валидны

Команда:

python lint_dict_v2.py --jsonl dict_entries.v2.jsonl --aliases dict_aliases.v2.json --pdf your.pdf --out report.json

Уровень 2: “golden cases” (юнит-регрессия на конкретных строках)

Набор из 30–100 эталонных строк:

  • я́стреб, ... -о́в и -ы ... (не split)

  • аба́к, -а и аба́ка, -и (split)

  • ... (ся) (алиасы)

  • сложные названия с переносами (merge_wrapped_lines)

Это быстрые тесты чисто на парсер.

Как запустить на всём PDF у вас локально

Сборка (JSONL + aliases + SQLite):

python pdf_dict_build_v2.py \  --pdf 011abe53-41f4-463a-add5-27c497a720f8.pdf \  --start-page 9 \  --end-page 3188 \  --anchors bbox \  --out-jsonl dict_entries.v2.jsonl \  --out-aliases dict_aliases.v2.json \  --out-sqlite dict_fts.v2.sqlite

Проверка:

python lint_dict_v2.py \  --jsonl dict_entries.v2.jsonl \  --aliases dict_aliases.v2.json \  --pdf 011abe53-41f4-463a-add5-27c497a720f8.pdf \  --out report.json

Поиск:

python search_dict_json_v2.py --jsonl dict_entries.v2.jsonl --aliases dict_aliases.v2.json "яровизироваться"python search_sqlite_v2.py --db dict_fts.v2.sqlite "яровизироваться"

Подсветка в PDF:

python annotate_pdf_hits_v2.py \  --pdf 011abe53-41f4-463a-add5-27c497a720f8.pdf \  --jsonl dict_entries.v2.jsonl \  --aliases dict_aliases.v2.json \  "я́стреб" \  --out yastreb_highlight.pdf

Собственно, вот. Инструменты и сконвертированный первый словарь здесь: https://disk.yandex.ru/d/et01_1yfBkBaPQ . Промпт и ответ GPT (5.2 thinking):

Ты - опытный программист на Pyton Проанализируй этот Pdf. Предложи оптимальный способ перевода в json с целью последующего поиска по словарю с корректным распознанием ударений. Получившийся скрипт должно быть возможно экспортировать и использовать в дальнейшем для других аналогичных словарей.

Думал на протяжении 10m 24s

По этому PDF видно, что это текстовый (не сканированный) орфографический словарь: извлекается “живой” Unicode-текст, а ударения нанесены диакритикой (в извлечённом тексте это, как правило, COMBINING ACUTE ACCENT U+0301 после гласной). В предисловии прямо сказано, что словарные единицы (кроме односложных) снабжаются ударением, а две метки ударения означают два нормативных варианта произношения — это важно для модели данных и поиска. 311a22ef-beab-4358-b2cc-7a5d662…

Ниже — оптимальная схема “PDF → JSON → поиск” и готовый экспортируемый Python-скрипт (плюс простой поиск), рассчитанные на повторное использование для аналогичных словарей.

Оптимальная схема конвертации в JSON под поиск с ударениями

1) Извлечение текста из PDF (с сохранением ударений)

Рекомендация: PyMuPDF (pymupdf) — на таких словарях обычно лучше сохраняет:

  • порядок строк,

  • Unicode-диакритику ударений,

  • скобки/пометы.

(Если словарь будет “сканом”, тогда нужен OCR, но здесь это не требуется.)

2) Нормализация “глюков” извлечения

Типовая проблема в словарных PDF: пробел внутри слова после знака ударения (пример вида абази́ нка вместо абази́нка). Это чинится очень безопасным правилом:

  • удалить пробел, если он стоит сразу после U+0301/U+0300 и перед буквой.

Также стоит:

  • привести дефисы/тире к -,

  • удалить soft hyphen/zero-width,

  • схлопнуть множественные пробелы.

3) Разбор строк на записи (entries)

Минимально практичная стратегия (устойчивая к разным словарям):

  • каждая строка PDF → кандидат на словарную статью,

  • если строка начинается с ( / , / ; / : — это перенос (continuation), приклеить к предыдущей,

  • если строка содержит несколько лемм в одной статье (“… , -а и … , -а (помета)”) — развернуть в несколько записей.

4) Модель данных JSON (под быстрый поиск)

Лучший “универсальный” формат — JSONL (одна запись на строку), потому что словарь большой.

Рекомендуемые поля записи:

  • lemma — лемма как в словаре (с ударениями)

  • lemma_plain — лемма без ударений (но с сохранением ё)

  • lemma_key — поисковый ключ (casefold + без ударений + нормализованные дефисы)

  • lemma_key_ye — ключ с ё→е (удобно для пользовательского ввода)

  • stresses — позиции ударных гласных в lemma (индексы по строке без combining-знаков)

  • homonym, lemma_base — для случаев типа а1, а2 (поиск по а должен находить оба)

  • rest — хвост статьи (грамматика/пометы/пояснения)

  • page — номер страницы (для отладки и трассировки)

5) Индекс для поиска

Поверх JSONL можно построить:

  • index.json: key -> [id, id, ...]

Это самый простой переносимый вариант (без БД). Если позже понадобится “поисковик уровня прод” — тогда следующий шаг: SQLite FTS5, но JSONL+index обычно достаточно.

Готовые экспортируемые скрипты

Я подготовил два файла:

  1. Конвертер PDF → JSONL (+ опциональный индекс)
    Download pdf_dict_to_jsonl.py

  2. Простой CLI-поиск по JSONL (с индексом или без)
    Download search_dict.py

Мини-README с командами:
Download README_pdf_dict_tools.md

Установка

pip install pymupdf

Конвертация

python pdf_dict_to_jsonl.py INPUT.pdf entries.jsonl --build-index index.json

Для других словарей (если авто-детект старта не сработает):

python pdf_dict_to_jsonl.py INPUT.pdf entries.jsonl --start-page 10 --end-page 200 --build-index index.json

Поиск

python search_dict.py entries.jsonl --index index.json "творог"python search_dict.py entries.jsonl "абажур"

Почему это решение хорошо переносится на “аналогичные словари”

  • Отделены извлечение, нормализация, парсинг, индексация.

  • Все правила — эвристики “по поверхности текста”, без привязки к конкретной вёрстке (кроме авто-детекта, который легко заменить --start-page).

  • Поиск устойчив к:

    • вводу без ударений,

    • вводу с ё/е,

    • омографам а1/а2,

    • словам с двойным ударением (хранится как список позиций).

Можно попробовать загрузить pdf прямо в чат или в "базу знаний" (может, придётся кусочками) и попросить 1) написать парсер pdf , распознающий ударения 2) протестировать на фактическом pdf 3) спрарсить pdf в json 4) выдать json

Сомневаетесь в коде от ИИ? Отдайте его на ревью другому ИИ

Информация

В рейтинге
2 252-й
Зарегистрирован
Активность

Специализация

Зерокодер
Средний