Skip to content

WocherZ/Sirius_Digital_Hack

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

29 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Sirius_Digital_Hack

Репозиторий решения команды AXIOM на хакатоне Sirius Digital Hack

Задача

Постановка задачи: Проанализировать результаты выходной анкеты увольняющихся сотрудников и составить карту причин увольнения.

Команда: AXIOM

  • Зворыгин Владимир Андреевич
  • Миронов Андрей Михайлович
  • Диков Александр Евгеньевич
  • Садохин Алексей Александрович

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

  • service: streamlit приложение + fast api backend, показывающее демонстрацию работы нашего алгоритма
  • experiments: ноутбуки с экспериментами и тестированием моделей
  • presentation.pdf: презентация в рамках хакатона

Идея решения

Было решено разбить задачу на две подзадачи:

  • Суммаризация текста - выделение из ответов пользователей конкретных причин увольнения.
  • Сентиментальный анализ - определение настроения сотрудника: положительный/негативный/нейтральный.

Суммаризация

Для того, чтобы выделить из большого числа пользовательских ответов конкретных причин, необходимо эти ответы агрегировать. Агрегировать напрямую тексты различной длины проблематично. Необходимо провести предобработку текстов и преобразовать их в числа, а именно вектора, чтобы далее их объединять/кластеризовать.

В рамках предобработки все буквы приводились к нижнему регистру. Затем было проведено удаление стоп-слов (как на русском, так и на английском), а также лемматизация. Соотношение <оригинальное слово - обработанное слово> было сохранено в словарь для постобработки. Далее, чтобы вычленить главные мысли из данных было выбрано 3 основных способа:

1. Использование методов NLP

2. Использование ChatGPT для суммаризации

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 типа вопросов:

  1. "Рассматриваете ли вы возможность остаться в компании?"
  2. "Рассматриваете ли вы возможность вернуться в компанию?"
  3. "Рекомендовали бы вы компанию?"

Все модели обучались на трёхклассовую классификацию - Нейтральный/Положительный/Отрицательный ответ дал сотрудник.

В качестве метода дообучения был выбран метод LoRA - LOW-RANK ADAPTATION. Данный метод обладает преимуществами - не требует множества ресурсов(по сравнению с полным дообучением модели), а также не требует большого количества данных.

Итогом стали 3 адаптера для изначальной модели, которые легковесные и просты в использовании при инференсе - засчёт быстрого переключения (как на cpu, так и на gpu).

Модели были выложены на hugging face:

  1. sirius_hack_staying_possibility
  2. sirius_hack_returning_possibility
  3. sirius_hack_recommendation_possibility

Демо решения

Видео-демонстрации были выложены на RuTube:

Разворачивание решения

Шаг 1: Клонирование репозитория или подготовка проекта

Клонируйте репозитории Git:

git clone https://github.com/WocherZ/Sirius_Digital_Hack.git
cd Sirius_Digital_Hack

Перейдите в директорию с приложением:

cd service/app

Шаг 2: Создание виртуального окружения

Рекомендуется использовать виртуальное окружение для изоляции зависимостей проекта.

python3 -m venv venv

Активируйте виртуальное окружение:

  • На Windows:

    venv\Scripts\activate
    
  • На macOS и Linux:

    source venv/bin/activate
    

Шаг 3: Установка зависимостей из requirements.txt

Убедитесь, что файл requirements.txt находится в корне вашего проекта. Для установки зависимостей выполните:

pip install --upgrade pip
pip install -r requirements.txt

Это установит все необходимые библиотеки.

Шаг 4: Запуск Streamlit приложения

После установки зависимостей и моделей запустите ваше Streamlit приложение:

streamlit run app/app.py

После выполнения команды, Streamlit запустит локальный сервер, и в командной строке отобразится URL (обычно http://localhost:8501), по которому можно открыть приложение в браузере.

Шаг 6: Запуск Backend

Запустите ваше бэкенд приложение на FastAPI:

uvicorn backend.main:app --reload

После выполнения команды запустится веб-сервер. Далее можно переходить к интерфейсу на Streamlit http://localhost:8501 и пользоваться разработанным приложением.

About

Репозиторий решения команды AXIOM на хакатоне Sirius Digital Hack

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors