В качестве ролей в решении хакатона были приняты бухгалтер и генеральный директор.
Модель можно разбить на несколько этапов
- С помощью предобученной языковой модели rubert-tiny мы получили эмбеддинги датасета с парсингами сайтов - массив действительных чисел с 312 столбцами. Далее весь наш рабочий процесс строился на полученных эмбеддингах. В выборе модели мы исходили из того, насколько быстро мы будем получать наши эмбеддинги, поэтому и остановились на быстрой, легковесной модели rubert-tiny
- Массив эмбеддингов использовался в качестве данных для кластеризации методом k-средних. На выходе предполагалось получить k групп текстов, близких по смыслу и несущих информацию о схожих событиях.
KMeans
из пакетаsk-learn
, гиперпараметр числа кластеровk
подбирался по методу локтя функциейKElbowVisualizer
.
Пример выхода KElbowVisualizer:
- Визуализация результатов кластеризации в tSNE
tSNE - Бухгалтеры:
tSNE - Гендиры:
Стохатическая проекция результатов кластеризации позволяет увидеть результаты работы алгоритмаKMeans
Гистограмма кластеров - Бухгалтеры:
- Выделение трендов с помощью анализа временных рядов кластеров новостей
\Временной ряд - Бухгалтеры:
\
На выходе алгоритма для определения существования тренда используется критерий, основанный на скользящей средней и скользящем СКО.
- Cуммаризация трендов
Выделенные кластеры не обладают интерпретацией, имеют только численное представление, а потому не могут в полной мере восприниматься как тренды - некоторые семантические события. Суммаризация на основе TF-IDF позволяет выделить список наиболее реевантных н-грам (слов/словосочетаний), формирующий общее представление о контенте кластера. Далее вручную каждому кластеру было дано название с наиболее близкой ассоциацией. Именно суммаризированные тренды выводятся при запросе "Тренды"
- Дайджесты
Дайджесты строятся исходя из трендов на текущий момент времени, или же на определенную дату. Мы решили реализовать этот функционал для более удобной откладки кода. Всего у нас существует две роли: бухгалтер и ген. дир. Каждой из этих ролей сопоставляется список ключевых слов, который был отобран вручную. Далее, модель, в нашем случае rubert-tiny, превращает этот список слов в эмбеддинг (вектор длины 312). Аналогичная ситуация происходит и с новостями, мы их векторизуем, т.е. получаем эмбеддинги длины 312. Пул новостей, также проходит отбор по "трендовости", из нескольких новостных кластеров берутся кластеры, которые алгоритм, описаннный в пунктах выше, определяет, как "трендовые". На данном этапе мы работаем уже со сформированном списком "трендовых" новостей. Для того, чтобы оценить актуальность новости для каждой из ролей мы смотрим на косинусную схожесть между эмбеддингами новостей и эмбеддингом роли. Исходя из этого и строится топ-3 нашего новостного дайджеста! Принцип выдачи дайджестов осно
Разработка веб-приложения велась с использованием веб-фреймворка Flask (Python)
Принимает на вход данные о новом пользователе в формате json
.
При успешной обработке возвращает id
пользователя.
Пример входных данных: {"name": "John", "role": "ceo"}
Пример ответа: {"id": 1}
При невалидных данных возвращает 400
: {"code": 400,"message": "Validation Failed"}
Принимает на вход id
пользователя и возвращает новости в формате json
.
Отвечает за получение новостей пользователями.
Пример ответа: {"title": "Заголовок", "text": "Текст"}
При невалидном id
возвращает: {"code": 404,"message": "User not found"}
Принимает на вход id
пользователя и возвращает тренды в формате json
.
Отвечает за получение трендов пользователями.
Пример ответа: {"trends": ["trend1", "trend2"]}
При невалидном id
возвращает: {"code": 404,"message": "User not found"}
Парсинг данных для обучения проводился на Python с использованием BeautifulSoup, requests, feedparser.
Были проанализированны обычные новостные сайты, а также тематические телеграм-каналы.
sudo apt install python3-venv
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
gunicorn --workers=4 --bind=127.0.0.1:5000 main:app