/ai_news

Codenrock. September hack

Primary LanguageJupyter Notebook

AI News. Команда Kurenkov_AI_Misis

Задача

Существует массив данных новостей из разных источников. Некоторые каналы копируют новости друг друга или попросту рассказывают об одном и тоже. Проблема состоит в накапливании инфошума и невозможности отслеживать тип новостей, которые интересны определенному человеку.

"Набиуллина назвала плавающий курс рубля «благом» — по ее мнению, это позволяет экономике России легче переносить «внешние шоки»"

"Глава ЦБ Эльвира Набиуллина назвала плавающий курс благом. Это действительно благо, благо для экспортеров, которые существенно увеличат свою выручку в рублях"

Решение

Наш микросервис решает обе эти проблемы. Модель классифицирует новости по типам:

  • Экономика
  • Технологии
  • Политика
  • Шоубиз
  • Криптовалюты
  • Путешествия
  • Образование и познавательное
  • Развлечения и юмор
  • Новости и СМИ
  • Психология
  • Искусство
  • Спорт
  • Цитаты
  • Еда и кулинария
  • Блоги
  • Бизнес и стартапы
  • Маркетинг
  • PR, реклама
  • Дизайн
  • Право
  • Мода и красота
  • Здоровье и медицина
  • Софт и приложения
  • Видео и фильмы
  • Музыка
  • Игры
  • Рукоделие
  • Другое

Учитывая хорошую работу модели, отдельно, внутри каждого кластера слова предобрабатываются. Путём сравнения удаляются дубликаты. Так, мы получаем разобранные по типам уникальные новости

Архитектура

Проект построен на fastapi. Модель для классификации - обученный BERT, модель для удаления дубликатов - MiniLM-L12-v2.

  1. Классификация сообщений:
  • Спарсили самостоятельно 80к сообщений, из различных телеграмм каналов (если в канале новости про крипту, то после парсинга данным присваивается) категория ‘крипта’
  • очистили данные (сообщения по 3 слова, рекламные сообщения)
  • Взяли предобученную специально на новостях модель BERT - lesyar/news_genre_classifier,
  • валидация на данных с парсинга - 0.92 F1.
  • разметили вручную случайные 5к из вашего датасете, точность - 0,88 F1
  • модель мультиязычна
  1. Детекция одинаковых:
  • Одинаковые будем искать в каждой категории новостей отдельно (вряд ли новость про спорт будет похожа на новость про крипту).
  • Это сильно ускоряет инференс, ибо мы не сравниваем заведомо напожте между собой новости, иначе это бы работало за n^2. Также немного прибавляет в точности
  • получаем эмбединги новости с помощью специально предобученой модели, которая эмбединги семантчически похожих делает более схожими.
  • через косинусное расстояние на эмбедингах отбираем ближайших, удаляем дубликаты
  • Валидировались на размеченном вручную датасете из 3к сообщений
  1. Дабы сейчас на занимать Ваше время, остальные фичи и обоснование подходов презентуем на питче

Запуск

Мы храним данные(csv, xlx) в папке path/to/news-classification/data . Для корректной работы скриптов тестовые данные лучше положить туда.

Для сборки и запуска docker контейнера:

$path/to/news-classification> docker build backend/. -t backend
$path/to/news-classification> docker run -p 8000:8000 --gpus all backend

Для запуска uvicorn напрямую, предварительно установив python окружение в корне, можно прописать следующее:

$path/to/news-classification> pip install -r "backend/requirements.txt"
$path/to/news-classification> uvicorn backend.main:app --port=8000

Дождитесь загрузки модели (в терминале об этом сообщат логи). Теперь вы можете перейти по адресу http://localhost:8000/docs и увидеть работающий сервис. Во вкладке /docs можно найти документацию и ручки для тестирования. После запуска можно менять device для расположения моделей. Например с 'cpu' -> 'cuda:0'. Перед запуском убдитесь в том, что модели находяться на видеокарте с помощью ручки update_device . После загрузки и обработки *.csv (кодировка UTF-8, разделители запятые, содержит колонку text) должна появиться кнопка Download_file. Логи по работе модели можно увидеть в терминале. Файл будет называтся processed.csv

Команда

По любым вопросам вы можете писать нам, мы оперативно ответим:

Максим, ML

Тимур, ML

Артём, Fullstack Developer

Андрей, Backend

Никита, Backend