Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

4 Commits

Folders and files

Repository files navigation

AnalyzerSA — Мультимодальный анализатор профилей ВКонтакте

Веб-сервис психографического анализа: пользователь вводит ссылку на профиль VK, система собирает посты и подписки, анализирует их с помощью нейросетей и выдаёт распределение интересов по 12 категориям.


Как это работает

Пайплайн анализа (5 шагов)

VK Profile URL
     │
     ▼
1. Сбор данных (VK API)
   ├── до 100 постов со стены (только авторские)
   ├── до 200 подписок (groups.get)
   └── аватар, имя, описание
     │
     ▼
2. Загрузка изображений + BLIP--captioning
   ├── параллельная загрузка фото из постов (макс. 20 одновременно)
   └── BLIP → английское текстовое описание каждого изображения
     │
     ▼
3. Классификация текстов (mDeBERTa)
   └── fine-tuned mDeBERTa → softmax [N, 12] + CLS-эмбеддинги [N, 768]
     │
     ▼
4. Классификация изображений (RuCLIP zero-shot)
   └── cosine(image_embed, text_embed_of_category) → softmax [N, 12]
     │
     ▼
5. Mid-level fusion + результаты
   ├── EnsembleHead MLP: CLS(768) + img(512) + engagement(1) → 12
   ├── вес каждого поста: log1p(likes + 2*reposts + 0.5*comments)
   ├── ключевые слова: YAKE (русский) + существительные из BLIP-caption
   ├── временная динамика: группировка по месяцам
   └── классификация подписок: mDeBERTa zero-shot (NLI)

ML-модели

Модель Назначение Размерность
MoritzLaurer/mDeBERTa-v3-base-xnli-multilingual-nli-2mil7 (fine-tuned) Текстовая классификация постов + CLS-эмбеддинги для fusion 768
sberbank-ai/ruclip-vit-base-patch32-224 Zero-shot классификация изображений + image-эмбеддинги 512
Salesforce/blip-image-captioning-base Captioning изображений (англ.) для отображения и извлечения тегов —
EnsembleHead (FusionClassifier) Mid-level fusion: CLS(768) + img(512) + engagement(1) → 12 1281→256→12
YAKE Извлечение ключевых слов (русский, без GPU) —

12 категорий интересов

Спорт · Технологии · Путешествия · Искусство · Бизнес · Музыка · Кино · Наука · Мода · Кулинария · Политика · Другое

Кэш и хранение

  • MongoDB (raw_profiles): сырые данные профиля — тексты постов, фото, описание
  • MongoDB (analysis_cache): кэш результатов с TTL 24 часа — повторный запрос того же профиля отдаётся мгновенно
  • PostgreSQL (analysis_reports): финальные результаты с временной меткой (для истории)

API

Единственный эндпоинт — SSE-стрим с прогресс-событиями:

GET /api/v1/analyze/vk/stream?profile_url=<vk.com/username>

Клиент получает события:

  • {"step": 0..4, "label": "..."} — прогресс
  • {"step": 5, "data": {...}} — финальный результат (или из кэша)
  • {"error": "..."} — ошибка

Стек

Слой Технологии
Frontend Vue 3 + Vite + TypeScript + Tailwind CSS + Pinia + Chart.js
Backend Python 3.12, FastAPI, Pydantic V2, SQLAlchemy 2.0 async
ML PyTorch 2.0+, HuggingFace transformers, torchvision, RuCLIP, BLIP, YAKE
Базы данных PostgreSQL 15 (asyncpg) + MongoDB 6 (motor)
Инфраструктура Docker Compose (4 сервиса), Nginx

Быстрый старт

Требования

  • Docker & Docker Compose
  • VK API токен (access_token с доступом к стене и группам)

Запуск

  1. Создайте .env в корне репозитория:

    VK_API_TOKEN=ваш_токен_здесь
    
  2. Запустите все сервисы:

    docker compose up -d
  3. Откройте http://localhost

Бэкенд доступен на http://localhost:8000, фронтенд — на http://localhost:80.

При первом запуске HuggingFace-модели скачиваются автоматически в Docker volume hf_cache. mDeBERTa (~800 MB) и RuCLIP (~300 MB) — скачиваются один раз.

Веса fine-tuned классификаторов

  • EnsembleHead (fusion_weights.pth, ~16 KB) — включён в репозиторий
  • mDeBERTa (fine-tuned, ~1.1 GB) — не в git. При отсутствии весов в backend/app/ml/weights/text_classifier/ бэкенд автоматически переходит на fallback (NLI zero-shot).
  • RuCLIP и BLIP — скачиваются из HuggingFace Hub при первом запуске.

Разработка

Backend

cd backend
pip install -r requirements.txt
# Запустить БД:
docker compose -f ../docker-compose.db.yml up -d
# Миграции:
alembic upgrade head
# Сервер:
uvicorn app.main:app --reload --port 8000

Frontend

cd frontend
npm install
npm run dev   # localhost:5173

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

AnalyzerSA/
├── backend/
│   ├── app/
│   │   ├── api/analyze.py          # SSE endpoint
│   │   ├── db/                     # postgres, mongo, cache
│   │   ├── ml/
│   │   │   ├── categories.py       # 12 категорий + описания
│   │   │   ├── text_classifier.py  # mDeBERTa классификатор + CLS embeddings
│   │   │   ├── ruclip_processor.py # RuCLIP zero-shot классификация изображений
│   │   │   ├── blip_processor.py   # BLIP captioning изображений
│   │   │   ├── keywords.py         # YAKE ключевые слова + существительные из BLIP
│   │   │   ├── fusion_classifier.py # EnsembleHead MLP (mid-level fusion)
│   │   │   ├── nli_classifier.py   # mDeBERTa zero-shot (NLI pipeline)
│   │   │   └── registry.py         # singleton загрузка моделей
│   │   ├── services/
│   │   │   ├── vk_collector.py     # VK API: посты + группы
│   │   │   └── analyzer.py         # основной пайплайн анализа
│   │   └── main.py                 # FastAPI lifespan + CORS
│   └── alembic/                    # миграции БД
├── frontend/
│   └── src/
│       ├── components/             # SearchForm, PostsFeed, InterestsChart, ...
│       ├── stores/analysisStore.ts # Pinia: SSE + состояние
│       └── views/HomeView.vue      # единственная страница
├── scripts/                        # утилиты: сбор данных, разметка, скачивание весов
├── notebooks/                      # обучение моделей (Jupyter)
├── data/                           # датасеты (raw_posts.jsonl, labeled_posts.jsonl)
└── docker-compose.yml              # 4 сервиса: postgres, mongo, backend, frontend

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages