Веб-сервис психографического анализа: пользователь вводит ссылку на профиль VK, система собирает посты и подписки, анализирует их с помощью нейросетей и выдаёт распределение интересов по 12 категориям.
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)
| Модель | Назначение | Размерность |
|---|---|---|
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) | — |
Спорт · Технологии · Путешествия · Искусство · Бизнес · Музыка · Кино · Наука · Мода · Кулинария · Политика · Другое
- MongoDB (
raw_profiles): сырые данные профиля — тексты постов, фото, описание - MongoDB (
analysis_cache): кэш результатов с TTL 24 часа — повторный запрос того же профиля отдаётся мгновенно - PostgreSQL (
analysis_reports): финальные результаты с временной меткой (для истории)
Единственный эндпоинт — 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с доступом к стене и группам)
-
Создайте
.envв корне репозитория:VK_API_TOKEN=ваш_токен_здесь -
Запустите все сервисы:
docker compose up -d
-
Откройте http://localhost
Бэкенд доступен на http://localhost:8000, фронтенд — на http://localhost:80.
При первом запуске HuggingFace-модели скачиваются автоматически в Docker volume
hf_cache. mDeBERTa (~800 MB) и RuCLIP (~300 MB) — скачиваются один раз.
- 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 при первом запуске.
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 8000cd frontend
npm install
npm run dev # localhost:5173AnalyzerSA/
├── 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