API: http://51.250.95.191:8080/docs
Фронтенд: http://51.250.95.191:8080/ner/
Стек:
● Frontend – Jinja2 + Materialize CSS
● Backend – FastAPI, Celery, Docker
● База данных – PostreSQL, SQLAlchemy, Alembic
● Парсер – Python
Поиск первоисточника для анализируемой статьи:
- Векторизация white-list'а и анализируемой статьи – многоязычный Sentence-Transformer.
- С помощью косинусной близости находим наиболее похожую статью из white-list'а и в дальнейшем сравниваем с ней полученную на вход
Основной метод(NER, sentiment, salience):
- Сопоставление участков рассматриваемой и истинной статьи с помощью косинусной близости.
- Получаются пары вида “участок рассматриваемой статьи” ⇔ “участок истинной статьи”. Размер участка ~12 слов.
- Пара переводится на английский язык, так как языковые модели для английского языка превосходят по качеству модели русского языка. Используем гугл API.
- Для всех пар осуществляется поиск именованных сущностей (NER) 13-и типов. Для именованных сущностей определяются важности и сентименты контекста.
- Коэффициент истинности вычисляется в зависимости от соответствия именованных сущностей в паре и их сентимента с поправкой на их важность.
Альтернативный метод. Нейронная сеть: датасет
- Перефразированные тексты, взято с https://habr.com/ru/post/564916/
Сам датасет: https://wortschatz.uni-leipzig.de/en/download/Russian
Train – 8000
Test – 2000 - Статьи с mos.ru
Train – 4584
Test – 1146
● Кластеризуем наиболее важные токены. (Получаем их векторные представления и кластеризуем с помощью библиотеки faiss методом KMeans)
● В 50% случаев оставляем правильную статью. Считаем эти данные не фейком
● В 50% случаев заменяем в перефразированном тексте ≈ 25% токенов на случайный токен из его кластера.
Альтернативный метод. Нейронная сеть: модель
Нейросеть основана на русскоязычной модели BERT от Сбербанка.
● Слой-пуллер для классификации статьи.
● Векторные представления токенов для классификации каждого токена(части слова)
● Дообучаем 2 слоя энкодера из 12 и классификаторы.
● Дообучаемых параметров ≈ 14 000 000
Альтернативный метод. Качество:
● Качество определения текстов, в которых случайно заменены слова на тесте - 98%
● F1 score определения случайно замененных слов на тесте - 0.92
● На реальных данных работает недостаточно хорошо
Разработка кластеризации: Experiments/fast_kmeans_via_faiss.ipynb
Разработка модели: Experiments/BERT_training.ipynb
Логи экспериментов с моделью на wandb.ai https://wandb.ai/diht404/ruBERT?workspace=user-diht404
Бэковые зависимости лежат в файле app/requirements.txt
pip install -r app/requirements.txt
Создайте в корне проекта файл с переменными окружения.
По умолчанию его название .env
, но можно переопределить при запуске
приложения
ENV_FILE=your_file.env python...
В этом файле объявите следующие перменные
DEBUG=True
PROJECT_NAME="FAKE NEWS"
DESCRIPTION="Распознаем фейки, проверяем новости"
APP_PORT=8080
VERSION=0.0.1
PRETRAINED_MODEL_CACHE_DIR=../.models # нужна для хранения моделей в папке проекта
POSTGRES_DB=database
POSTGRES_USER=username
POSTGRES_PASSWORD=secret
POSTGRES_PORT=5432
POSTGRES_HOST=127.0.0.1 # если запускаете через docker-compose лучше указать название сервиса
Внутри папки app
выполните
python main.py
или
ENV_FILE=.env python main.py
Внутри папки app
выполните
gunicorn gunicorn_app:app --workers 1 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.:8080
Перед запуском через Docker Compose также необходимо создать файл с перменными
окружения .env
или экспортировать их в среду.
ВАЖНО: Для правильной работы в docker-compose без внешнего порта для БД,
назначьте POSTGRES_HOST=database
.
Для запуска проекта со всеми сервисами одновременно необходимо выполнить
docker-compose up --build
Управление версиями БД осущестляется с помощью пакета alembic
.
Для автоматического создания миграции при изменении схемы нужно выполнить
alembic revision --autogenerate -m "Name of migration"
Для обновления/инициализации таблиц через миграции выполните
внутри папки app
команду
alembic upgrade head