Репозиторий решения команды AXIOM на отборочном этапе Nuclear IT Hack 2024
В рамках хакатона команда решала задачу от МТС Линк.
Постановка задачи: Разработать систему на основе ИИ, которая анализирует список пользовательских ответов возвращает понятное и интерпретируемое облако слов.
- Зворыгин Владимир Андреевич
- Миронов Андрей Михайлович
- Диков Александр Евгеньевич
- Садохин Алексей Александрович
- app: streamlit приложение, показывающее демонстрацию работы нашего алгоритма
- datasets: сгенерированные датасеты для тестирования разработанного алгоритма
- experiments: ноутбуки с экспериментами и тестированием моделей
- demo.mp4: видео демонстрация работы приложения
- presentation.pdf: презентация в рамках хакатона
Для того, чтобы получить облако слов из большого числа пользовательских ответов, необходимо эти ответы агрегировать. Агрегировать напрямую слова проблематично. Необходимо провести предобработку слов и преобразовать их в числа, а именно вектора, чтобы далее их объединять/кластеризовать.
Для работы необходимо иметь датасеты. Для этого были сгенерировали 4 базы ответов разного размера и немного отличающегося наполнения.
При обработке данные датасета объединились в один массив. В рамках этого массива все буквы приводились к нижнему регистру. Затем было проведено удаление стоп-слов (как на русском, так и на английском), а также лемматизация. Соотношение <оригинальное слово - обработанное слово> было сохранено в словарь для постобработки.
После таких операций в массиве стало много повторяющихся слов и выражений. Мы составили словарь с подсчётом количества каждого объекта. Далее для каждого ключа получившегося словаря были получены эмбеддинги.
В качестве эмбеддинг моделей были рассмотрены предобученные bert-like модели:
И более простой метод векторизации текста word2vec - для обучения был взят корпус русских текстов. Данный метод показал наибольшую эффективность по скорости, но меньшее качество при построении векторов и дальнейшей кластеризации.
Поэтому для решения в основном были использованы bert-like модели. В рамках модели ru-en-RoSBERTa, согласно документации, при получении эмбеддингов был использован префикс "clustering: " для повышения точности.
Для кластеризации были использованы 2 алгоритма - AgglomerativeClustering и DBSCAN, так как эти алгоритмы не требуют задания числа кластеров. Для выбора алгоритма кластеризации на большом датасете были получены эмбеддинги от рассматриваемых моделей, обучены оба алгоритма для создания кластеров, подобраны параметры, чтобы кластеров было не слишком много (состоящих из одного слова) и они были не слишком большие. Для большого датасета это порядка 100 кластеров. Исходя из получаемых кластеров был выбран алгоритм AgglomerativeClustering, так как слова в получающихся кластерах были более близкими по смыслу.
С использованием этого алгоритма были проведены эксперименты с другими датасетами и другими моделями. Лучше всех себя показала ru-en-RoSBERTa. ruElectra-large показала результаты примерно на том же уровне, но данная модель работает только с русским языком, в отличие от первой. ruBert-large показал худшие результаты среди этих трёх моделей. word2vec показал сравнимые результаты.
Также для визуализации полученные на маленьком датасете эмбеддинги разных моделей мы понизили в размерности до 2 с помощью PCA и отобразили получающиеся кластеры. Их можно найти в readme экспериментов.
В результате экспериментов была выбрана модель ru-en-RoSBERTa (как наиболее точная) и алгоритм AgglomerativeClustering для кластеризации. Также была рассмотрена обученная нами модель word2vec. Для них было проведено тестирование производительности на всех датасетах - результаты представлены в экспериментах.
После кластеризации в каждом кластере выбирается самое популярное слово в рамках всех ответов. Если таких слов несколько, то среди них выбирается наиболее употребимое в языке слово. Далее идёт подсчёт суммы встречаемости в датасете слов одного кластера и приписывается выбранному слову. Получаем словарь: ключ — самое частое слово, значение — сумма частот всех слов в кластере. Однако стоит помнить, что слова в данном словаре после лемматизации и удаления стоп-слов. Для получения изначальных форм слов и выражений используем ранее созданный словарь.
В конечном итоге на основе получившихся данных строится облако слов с использованием библиотеки wordcloud.
Клонируйте репозитории Git:
git clone https://github.com/WocherZ/Nuclear-IT-hack-24.git
cd Nuclear-IT-hack-24
Перейдите в директорию с приложением:
cd 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
Это установит все необходимые библиотеки.
По умолчанию приложение использует модель ru-en-RoSBERTa. Для смены модели на другую достаточно указать нужное название модели с репозитория Hugging Face.
Для использования word2vec необходимо выставить соответсвующий флаг в файле utils/embeddings.py. А также загрузить корпус русских текстов и положить в директорию utils. Тогда при запуске модель автоматически обучится на этом корпусе.
При первом запуске будет скачиваться/обучаться модель - может потребоваться несколько минут.
После установки зависимостей и моделей запустите ваше Streamlit приложение:
streamlit run app.py
После выполнения команды, Streamlit запустит локальный сервер, и в командной строке отобразится URL (обычно http://localhost:8501), по которому можно открыть приложение в браузере.
