Репозиторий решения команды AXIOM на хакатоне Sirius Digital Hack
Постановка задачи: Проанализировать результаты выходной анкеты увольняющихся сотрудников и составить карту причин увольнения.
- Зворыгин Владимир Андреевич
- Миронов Андрей Михайлович
- Диков Александр Евгеньевич
- Садохин Алексей Александрович
- service: streamlit приложение + fast api backend, показывающее демонстрацию работы нашего алгоритма
- experiments: ноутбуки с экспериментами и тестированием моделей
- presentation.pdf: презентация в рамках хакатона
Было решено разбить задачу на две подзадачи:
- Суммаризация текста - выделение из ответов пользователей конкретных причин увольнения.
- Сентиментальный анализ - определение настроения сотрудника: положительный/негативный/нейтральный.
Для того, чтобы выделить из большого числа пользовательских ответов конкретных причин, необходимо эти ответы агрегировать. Агрегировать напрямую тексты различной длины проблематично. Необходимо провести предобработку текстов и преобразовать их в числа, а именно вектора, чтобы далее их объединять/кластеризовать.
В рамках предобработки все буквы приводились к нижнему регистру. Затем было проведено удаление стоп-слов (как на русском, так и на английском), а также лемматизация. Соотношение <оригинальное слово - обработанное слово> было сохранено в словарь для постобработки. Далее, чтобы вычленить главные мысли из данных было выбрано 3 основных способа:
Данные методы более подробно расписаны в разделе с экспериментами.
В качестве эмбеддинг моделей были рассмотрены предобученные bert-like модели:
В рамках модели ru-en-RoSBERTa, согласно документации, при получении эмбеддингов был использован префикс "clustering: " для повышения точности.
Для кластеризации были использованы 2 алгоритма - AgglomerativeClustering и DBSCAN, так как эти алгоритмы не требуют задания числа кластеров. Для выбора алгоритма кластеризации были получены эмбеддинги от рассматриваемых моделей, обучены оба алгоритма для создания кластеров, подобраны параметры, чтобы кластеров было не слишком много (состоящих из одного слова) и они были не слишком большие. Для нашего датасета это порядка 30 кластеров. Исходя из получаемых кластеров был выбран алгоритм AgglomerativeClustering, так как слова в получающихся кластерах были более близкими по смыслу.
С использованием этого алгоритма были проведены эксперименты с другими датасетами и другими моделями. Лучше всех себя показала ru-en-RoSBERTa. ruElectra-large показала результаты примерно на том же уровне, но данная модель работает только с русским языком, в отличие от первой. ruBert-large показал худшие результаты среди этих трёх моделей.
Также для визуализации полученные первые 50 эмбеддингов разных моделей мы понизили в размерности до 2 с помощью PCA и отобразили получающиеся кластеры. Их можно найти в readme экспериментов.
В результате экспериментов была выбрана модель ru-en-RoSBERTa (как наиболее точная) и алгоритм AgglomerativeClustering для кластеризации. Для них было проведено тестирование производительности на всех датасетах - результаты представлены в экспериментах.
После кластеризации в каждом кластере выбирается самая популярная фраза в рамках всех ответов. Если таких фраз несколько, то среди них выбирается наиболее употребимая в языке. Далее идёт подсчёт суммы встречаемости в датасете фраз одного кластера и эта сумма приписывается выбранной фразе. Получаем словарь: ключ — самое частое словосочетание, значение — сумма частот всех фраз в кластере. Однако стоит помнить, что слова в данном словаре - после лемматизации и удаления стоп-слов. Для получения изначальных форм слов и выражений используем ранее созданный словарь.
В конечном итоге на основе получившихся данных строится облако слов с использованием библиотеки wordcloud, а также гистограмма распределения слов.
Сентиментальный анализ Для сентиментального анализа ответов сотрудников был разработан ряд моделей классификации текста на основе RuBERT for Sentiment Analysis. Данная модель была взята за основу, как уже обученная под похожую задачу, и дообучена под классификацию ответов на 3 типа вопросов:
- "Рассматриваете ли вы возможность остаться в компании?"
- "Рассматриваете ли вы возможность вернуться в компанию?"
- "Рекомендовали бы вы компанию?"
Все модели обучались на трёхклассовую классификацию - Нейтральный/Положительный/Отрицательный ответ дал сотрудник.
В качестве метода дообучения был выбран метод LoRA - LOW-RANK ADAPTATION. Данный метод обладает преимуществами - не требует множества ресурсов(по сравнению с полным дообучением модели), а также не требует большого количества данных.
Итогом стали 3 адаптера для изначальной модели, которые легковесные и просты в использовании при инференсе - засчёт быстрого переключения (как на cpu, так и на gpu).
Модели были выложены на hugging face:
- sirius_hack_staying_possibility
- sirius_hack_returning_possibility
- sirius_hack_recommendation_possibility
Видео-демонстрации были выложены на RuTube:
Клонируйте репозитории Git:
git clone https://github.com/WocherZ/Sirius_Digital_Hack.git
cd Sirius_Digital_Hack
Перейдите в директорию с приложением:
cd service/app
Рекомендуется использовать виртуальное окружение для изоляции зависимостей проекта.
python3 -m venv venv
Активируйте виртуальное окружение:
-
На Windows:
venv\Scripts\activate -
На macOS и Linux:
source venv/bin/activate
Убедитесь, что файл requirements.txt находится в корне вашего проекта. Для установки зависимостей выполните:
pip install --upgrade pip
pip install -r requirements.txt
Это установит все необходимые библиотеки.
После установки зависимостей и моделей запустите ваше Streamlit приложение:
streamlit run app/app.py
После выполнения команды, Streamlit запустит локальный сервер, и в командной строке отобразится URL (обычно http://localhost:8501), по которому можно открыть приложение в браузере.
Запустите ваше бэкенд приложение на FastAPI:
uvicorn backend.main:app --reload
После выполнения команды запустится веб-сервер. Далее можно переходить к интерфейсу на Streamlit http://localhost:8501 и пользоваться разработанным приложением.