Skip to content
FlackBoy-1Public

About

Финальный релиз НИР: создание сверхлегкой модели (75 КБ) для классификации коротких сообщений в ЧС. Доказано превосходство TF-IDF без SVD над классическим LSA. Macro F1 = 0.579.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Исследование методов сжатия текстовых сообщений в условиях ЧС (НИР)

Status Python License DOI

Репозиторий содержит исходный код, данные и научные материалы научно-исследовательской работы (НИР) по теме: «Исследование методов оптимизации размерности латентно-семантического пространства в задачах обработки текстовых сообщений в условиях чрезвычайных ситуаций».


📌 О проекте (Что это и зачем?)

В условиях чрезвычайных ситуаций (ЧС) и в туризме часто возникает необходимость передачи текстовых сообщений (SOS, запросы помощи) по узкополосным каналам связи (спутниковые мессенджеры, рации, слабый интернет). Передача полного текста может быть невозможна или слишком медленной.

Цель исследования: Создание сверхлегкой и высокоточной модели машинного обучения для классификации коротких сообщений, пригодной для развертывания на edge-устройствах (мобильных терминалах спасателей) и маршрутизации вызовов в диспетчерских службах.

Эволюция исследования:

  1. Научный этап (v1.0.2): Изначально модель классифицировала сообщения по 16 академическим классам (травма, лавина, обстрел, запрос информации и т.д.). Была эмпирически опровергнута гипотеза о том, что латентно-семантический анализ (LSA / TruncatedSVD) обеспечит оптимальное сжатие. Доказано, что для коротких текстов (3–25 слов) разреженная TF-IDF матрица без SVD превосходит LSA по всем параметрам.
  2. Прикладной этап (v1.1.0): Для реального внедрения 16 классов оказались избыточны (модель путала «погоду» и «позицию»). Классы были объединены в 4 прикладные макрокатегории по принципу маршрутизации служб. Это позволило достичь рекордных метрик безопасности.

📊 Финальные результаты (v1.1.0)

Оценка проводилась с помощью честной 5-кратной кросс-валидации (StratifiedGroupKFold с группировкой по case_id, исключающей утечку перефразов).

Прикладная 4-классовая таксономия (Финальный продукт)

  • угроза_военная (обстрелы, БПЛА, мины).
  • угроза_техногенная (взрывы, радиация, химия).
  • угроза_общая (травмы, погибшие, лавины, животные, заблудились, нет припасов).
  • не_угроза (погода, позиция, статус группы, запросы, проверка связи).
Архитектура / Таксономия Macro F1 (Intent) CWR (Безопасность) Accuracy Размер модели
TF-IDF, 4 класса (Final) 0.696 0.843 0.784 65 КБ
TF-IDF, 16 классов (v1.0.2) 0.579 0.628 0.596 75.8 КБ
LSA, 16 классов (v1.0.2) 0.483 0.556 0.524 299.1 КБ
  • Urgency Acc on Correct Intent: 0.667.
  • Феномен «Safe Failure»: Из 229 реальных специфических угроз модель пропустила в класс не_угроза всего 13 сообщений (менее 6%). Если модель сомневается, она отправляет сообщение в угроза_общая (высылаем спасателей, а спецслужбы уточнят на месте). Precision для военной угрозы достигает 0.89.

📂 Версионирование и структура репозитория

В связи с переходом на прикладную таксономию, скрипты в текущей ветке (main, тег v1.1.0) адаптированы только под 4 макрокласса.

  • Версия v1.1.0 (Текущая): Скрипт 08_validation.py содержит маппинг MACRO_MAPPING для объединения 16 классов в 4. Параметр min_df снижен до 4 для сохранения специфических маркеров.
  • Версия v1.0.2 (Архив): Если вам нужна оригинальная 16-классовая модель, скачайте этот релиз. В нем сохранены скрипты с min_df=7 и без маппинга классов.
    • Примечание: Чтобы посмотреть старый README.md (с метриками и описанием для 16 классов), зайдите в раздел Releases на GitHub, выберите тег v1.0.2 и откройте файл там. В текущей ветке main этого описания уже нет.

Структура папок:

  • data/ — финальный датасет (corpus_preprocessed.csv), словари (keep_words.txt, пустой stop_words.txt) и параметры (best_min_df.txt).
  • src/ — пайплайн (от чтения данных до финальной валидации).
  • tools/ — вспомогательные скрипты для аудита и стресс-тестов.
  • plots/ — графики (матрицы ошибок, доверительные интервалы, сравнение архитектур).
  • journal_science.md — финальный научный отчет (содержит полное описание обеих итераций).
  • journal.md — лабораторный журнал (хронология, промежуточные гипотезы, ошибки).

🚀 Быстрый старт (Windows)

  1. Установите Python (версия 3.12 или выше). При установке обязательно поставьте галочку "Add Python to PATH".
  2. Скачайте этот репозиторий (нажмите Code -> Download ZIP) и распакуйте.
  3. Запустите файл start.bat двойным кликом.
    • Скрипт создаст venv, установит библиотеки из requirements.txt и запустит интерактивный пайплайн.
    • Для получения финальных метрик (4 класса) запустите src/08_validation.py.

🛠 Дополнительные инструменты (tools/)

В папке tools/ собраны скрипты, которые использовались в ходе исследования для аудита, тестирования гипотез и ручной работы с данными.

1. balance_check.py (Аудит дисбаланса корпуса)

  • Что делает: Анализирует corpus.csv и выводит статистику по классам (интентам) с разбивкой на реальные и синтетические данные.
  • Зачем нужен: Позволяет понять, не перевесит ли один класс все остальные, и достаточно ли данных для миноритарных классов.

2. edit_corpus.py (Интерактивный редактор корпуса)

  • Что делает: Консольный редактор. Позволяет фильтровать сообщения по категории, интенту, срочности. Умеет массово менять разметку и удалять мусорные строки.
  • Зачем нужен: Основной инструмент для ручной переразметки, чистки датасета и исправления ошибок LLM при генерации синтетики.

3. grid_search_k.py (Поиск оптимального k*)

  • Что делает: Выполняет Grid Search по количеству компонент SVD (k). Строит график зависимости F1_intent и CWR от k.
  • Зачем нужен: Использовался для доказательства того, что после k=73 модель начинает улавливать только математический шум.

4. interpret_axes.py (Семантический аудит латентных осей)

  • Что делает: Обучает SVD и извлекает топ-10 слов для каждой латентной оси. Сохраняет результат в .txt и генерирует .json с промптами для LLM.
  • Зачем нужен: Использовался для подтверждения того, что LSA выучила реальные семантические связи. Именно с его помощью было доказано, что LSA не формирует якорь для запроса_маршрута.

5. overfit_check.py (Стресс-тест «Потолок»)

  • Что делает: Обучает модель на 100% данных и тестирует на этих же данных (Train = Test).
  • Зачем нужен: Ключевой инструмент для доказательства оптимальности. Показал, что даже при заучивании данных линейная модель не может выдать F1 выше 0.599 (для 16 классов).

6. synthetic_test.py (Тест на смешанных данных)

  • Что делает: Обучает модель на смеси реальных и синтетических данных, а затем тестирует на отложенной выборке, куда тоже попадает синтетика.
  • Зачем нужен: Использовался для обоснования отказа от дальнейшей генерации синтетики в классах с высокой долей шаблонности.

📈 Как читать результаты (Интерпретация графиков)

После запуска 08_validation.py в папке plots/validation/ появляются три ключевых графика:

  1. Матрица ошибок (Intent): Показывает, какие классы модель путает (для 4 классов наглядно виден феномен "Safe Failure").
  2. Матрица ошибок (Urgency): Показывает, что 95% ошибок — это смежные градации (3↔4).
  3. F1 по классам с 95% CI: Показывает, каким классам можно доверять, а какие статистически нестабильны.

В папке plots/comparison/ находится главный график НИР — Сравнение LSA и TF-IDF (визуальное доказательство того, что TF-IDF одновременно точнее, легче и быстрее).


Citation

Если вы используете этот код или данные, пожалуйста, ссылайтесь: Парфенов Андрей Алексеевич (2026). Исследование методов сжатия текстовых сообщений в условиях ЧС (v1.1.0). GitHub. https://github.com/FlackBoy-1/Research


📝 Лицензия

Проект распространяется под лицензией MIT. Вы можете свободно использовать код в исследовательских и образовательных целях.

About

Финальный релиз НИР: создание сверхлегкой модели (75 КБ) для классификации коротких сообщений в ЧС. Доказано превосходство TF-IDF без SVD над классическим LSA. Macro F1 = 0.579.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages