Рекомендательная система для проектов проектной деятельности на основе интересов пользователя.
Система анализирует интересы пользователей и теги проектов, используя алгоритм косинусного сходства для предоставления персонализированных рекомендаций. Проект построен на FastAPI и интегрируется с существующим бекендом на NestJS.
- 🎯 Персонализированные рекомендации - на основе интересов пользователя
- 🔍 Поиск похожих проектов - на основе тегов проекта
- 📊 Косинусное сходство - точный алгоритм сопоставления интересов и тегов
- 🏷️ Управление интересами и тегами - гибкая система категоризации
- 📝 Автоматическая документация - Swagger UI и ReDoc из коробки
- 🚀 Высокая производительность - благодаря FastAPI и асинхронности
Система состоит из следующих компонентов:
- Модели данных: User, Project, Interest, Tag, Institution
- Рекомендательный движок: Использует scikit-learn для вычисления косинусного сходства
- REST API: Эндпоинты для управления пользователями, проектами и получения рекомендаций
- Python 3.10+
- PostgreSQL 12+
- pip или poetry
- Клонируйте репозиторий:
git clone <repository-url>
cd pd-projects-recommended-system- Создайте виртуальное окружение:
python -m venv venv
source venv/bin/activate # для Linux/Mac
# или
venv\Scripts\activate # для Windows- Установите зависимости:
pip install -r requirements.txt- Создайте файл
.envна основе.env.example:
cp .env.example .env- Настройте переменные окружения в
.env:
DATABASE_URL=postgresql://user:password@localhost:5432/pd_projects
API_HOST=0.0.0.0
API_PORT=8000uvicorn app.main:app --reload --host 0.0.0.0 --port 8000uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 4После запуска сервера документация доступна по адресам:
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
POST /users/- Создать пользователяGET /users/{user_id}- Получить информацию о пользователеGET /users/- Получить список пользователейPUT /users/{user_id}/interests- Обновить интересы пользователя
POST /users/interests- Создать новый интересGET /users/interests/- Получить список всех интересов
POST /projects/- Создать проектGET /projects/{project_id}- Получить информацию о проектеGET /projects/- Получить список проектовPUT /projects/{project_id}/tags- Обновить теги проекта
POST /projects/tags- Создать новый тегGET /projects/tags/- Получить список всех тегов
GET /recommendations/{user_id}- Получить рекомендации для пользователя- Параметры:
limit- максимальное количество рекомендаций (1-50)min_score- минимальный порог оценки релевантности (0.0-1.0)
- Параметры:
GET /recommendations/similar/{project_id}- Получить похожие проекты- Параметры:
limit- максимальное количество проектов (1-20)
- Параметры:
GET /recommendations/{user_id}/suggested-interests- Получить предложенные интересы
# 1. Создать пользователя
curl -X POST "http://localhost:8000/users/" \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"first_name": "Иван",
"last_name": "Иванов"
}'
# 2. Создать интересы
curl -X POST "http://localhost:8000/users/interests" \
-H "Content-Type: application/json" \
-d '{"name": "AI", "description": "Artificial Intelligence"}'
curl -X POST "http://localhost:8000/users/interests" \
-H "Content-Type: application/json" \
-d '{"name": "Web Development", "description": "Web технологии"}'
# 3. Обновить интересы пользователя
curl -X PUT "http://localhost:8000/users/1/interests" \
-H "Content-Type: application/json" \
-d '{"interest_ids": [1, 2]}'# 1. Создать теги
curl -X POST "http://localhost:8000/projects/tags" \
-H "Content-Type: application/json" \
-d '{"name": "Python", "description": "Python programming"}'
curl -X POST "http://localhost:8000/projects/tags" \
-H "Content-Type: application/json" \
-d '{"name": "Machine Learning", "description": "ML technologies"}'
# 2. Создать проект
curl -X POST "http://localhost:8000/projects/" \
-H "Content-Type: application/json" \
-d '{
"title": "AI Chatbot",
"description": "Умный чат-бот на основе GPT",
"author_id": 1,
"tag_ids": [1, 2]
}'# Получить рекомендации для пользователя
curl "http://localhost:8000/recommendations/1?limit=10&min_score=0.3"
# Получить похожие проекты
curl "http://localhost:8000/recommendations/similar/1?limit=5"
# Получить предложенные интересы
curl "http://localhost:8000/recommendations/1/suggested-interests"Система использует следующий подход:
- Векторизация: Интересы пользователя и теги проектов преобразуются в векторы
- Косинусное сходство: Вычисляется угол между векторами интересов и тегов
- Бонус за совпадения: Добавляется дополнительный вес за количество совпавших тегов
- Ранжирование: Проекты сортируются по оценке релевантности
Формула оценки:
score = cosine_similarity(user_interests, project_tags) + (matches_count * 0.1)
Система может работать параллельно с основным бекендом на NestJS. Рекомендуется:
- Использовать одну базу данных PostgreSQL
- Настроить синхронизацию моделей между системами
- Использовать API Gateway для маршрутизации запросов
- Настроить CORS для взаимодействия между сервисами
pd-projects-recommended-system/
├── app/
│ ├── __init__.py
│ ├── main.py # Главный файл приложения
│ ├── config.py # Конфигурация
│ ├── database.py # Подключение к БД
│ ├── models/
│ │ ├── __init__.py
│ │ └── models.py # SQLAlchemy модели
│ ├── schemas/
│ │ ├── __init__.py
│ │ └── schemas.py # Pydantic схемы
│ ├── routers/
│ │ ├── __init__.py
│ │ ├── users.py # Эндпоинты пользователей
│ │ ├── projects.py # Эндпоинты проектов
│ │ └── recommendations.py # Эндпоинты рекомендаций
│ └── services/
│ ├── __init__.py
│ └── recommendation_service.py # Логика рекомендаций
├── .env.example
├── .gitignore
├── requirements.txt
└── README.md
Интересы и теги можно добавлять через API или напрямую в базу данных. Рекомендуется использовать API для обеспечения целостности данных.
# Установить pytest
pip install pytest pytest-asyncio httpx
# Запустить тесты
pytest# Установить инструменты
pip install black isort
# Форматировать код
black app/
isort app/- Использование индексов в базе данных на полях email, name
- Кэширование векторных представлений
- Асинхронные операции для улучшения отзывчивости
MIT
Для вопросов и предложений создавайте Issues в репозитории проекта.