237 lines
No EOL
7.6 KiB
Markdown
237 lines
No EOL
7.6 KiB
Markdown
**Source de vérité** : https://git.gregoiremureau.com/openclassroom-ai/oc-p10-content-recommendation
|
|
|
|
```bash
|
|
git clone https://git.gregoiremureau.com/openclassroom-ai/oc-p10-content-recommendation.git
|
|
git clone https://git.gregoiremureau.com/openclassroom-ai/oc-p10-content-recommendation.git
|
|
```
|
|
|
|
Dataset : voir `fetch-data.sh` (hors git si volumineux).
|
|
|
|
# Système de Recommandation de Contenu - My Content
|
|
|
|
📘 Ce projet est également disponible en [anglais 🇬🇧](./README.md)
|
|
|
|
Projet de développement d'un système de recommandation d'articles basé sur une architecture serverless Azure Functions avec interface utilisateur Streamlit.
|
|
|
|
|
|
## Livrables du Projet
|
|
1. **Application fonctionnelle** : Streamlit + Azure Functions déployée
|
|
2. **Code source versionné** : Repository GitHub complet
|
|
3. **Présentation technique** : Support PDF (docs/presentation.pdf)
|
|
|
|
|
|
## Vue d'ensemble
|
|
|
|
Ce projet implémente un système de recommandation de contenu utilisant des algorithmes de filtrage collaboratif et basé sur le contenu. L'architecture serverless permet une mise à l'échelle automatique et un coût optimisé.
|
|
|
|
### Fonctionnalités principales
|
|
|
|
- **API de recommandation** : Azure Function retournant le top 5 des articles recommandés pour un utilisateur
|
|
- **Interface utilisateur** : Application Streamlit pour tester et démontrer le système
|
|
- **Algorithmes implémentés** : Content-Based Filtering avec embeddings pré-calculés
|
|
- **Architecture serverless** : Déploiement sur Azure Functions avec plan Consumption
|
|
|
|
|
|
## Analyse et Développement
|
|
|
|
### Notebook Jupyter
|
|
- **Exploration des données** : Analyse du dataset Kaggle Globo.com
|
|
- **Implémentation des algorithmes** : Content-Based et Collaborative Filtering
|
|
- **Comparaison des approches** : Évaluation et choix technique
|
|
- **Optimisation ACP** : Réduction dimensionnelle 250D → 50D
|
|
|
|
Localisation : `notebook/p10_notebook.ipynb`
|
|
|
|
## Architecture
|
|
|
|
### MVP Actuel
|
|
```
|
|
[Interface Streamlit] → [Azure Functions API] → [Algorithme de recommandation]
|
|
↓
|
|
[Données embeddings + historique utilisateur]
|
|
```
|
|
|
|
### Composants
|
|
- **Frontend** : Streamlit (interface de test)
|
|
- **Backend** : Azure Functions (Python 3.12, Linux)
|
|
- **Algorithme** : Content-Based Filtering avec similarité cosinus
|
|
- **Données** : Embeddings articles (50D via PCA vs 250D embeddings originaux) + historique des clics
|
|
|
|
## Structure synthétique du Projet
|
|
|
|
```
|
|
Project_10/
|
|
├── azure-app/ # Azure Function
|
|
│ ├── function_app.py # Point d'entrée Azure Function
|
|
│ ├── requirements.txt # Dépendances Python
|
|
│ ├── host.json # Configuration Azure Functions
|
|
│ ├── local.settings.json # Configuration locale (non versionnée)
|
|
│ ├── data/
|
|
│ │ ├── embeddings_azure_50d.pkl # Embeddings articles (PCA 50D)
|
|
│ │ └── clicks_sample.csv # Historique des clics utilisateurs
|
|
│ └── utils/
|
|
│ ├── data_loader.py # Chargement et cache des données
|
|
│ └── content_based.py # Algorithme de recommandation
|
|
├── notebook/
|
|
│ └── p10_notebook.ipynb # Analyse données + développement modèles
|
|
├── docs/
|
|
│ ├── presentation.pdf # Support de présentation (15-25 slides)
|
|
│ └── illustrations/ # Schémas d'architecture et captures
|
|
├── streamlit_app.py # Interface utilisateur
|
|
├── streamlit_requirements.txt # Dépendances Streamlit
|
|
└── README.md
|
|
```
|
|
|
|
## Installation et Déploiement
|
|
|
|
### Prérequis
|
|
- Python 3.12+
|
|
- Azure CLI
|
|
- Azure Functions Core Tools
|
|
- Compte Azure
|
|
|
|
### Déploiement Azure Functions
|
|
|
|
1. **Connexion à Azure**
|
|
```bash
|
|
az login
|
|
```
|
|
|
|
2. **Création de l'infrastructure**
|
|
```bash
|
|
# Groupe de ressources
|
|
az group create --name rg-content-recommender --location francecentral
|
|
|
|
# Compte de stockage
|
|
az storage account create --name [votre-nom-stockage-unique] \
|
|
--resource-group rg-content-recommender \
|
|
--location francecentral \
|
|
--sku Standard_LRS
|
|
|
|
# Function App Linux avec Python 3.12
|
|
az functionapp create \
|
|
--resource-group rg-content-recommender \
|
|
--consumption-plan-location francecentral \
|
|
--runtime python \
|
|
--runtime-version 3.12 \
|
|
--functions-version 4 \
|
|
--name contentrecommender-linux \
|
|
--storage-account stcontentrecommend2025 \
|
|
--os-type Linux
|
|
```
|
|
|
|
3. **Déploiement du code**
|
|
```bash
|
|
# Depuis le dossier azure-app
|
|
func azure functionapp publish contentrecommender-linux
|
|
```
|
|
|
|
### Interface Streamlit
|
|
|
|
1. **Installation des dépendances**
|
|
```bash
|
|
pip install -r streamlit_requirements.txt
|
|
```
|
|
|
|
2. **Lancement de l'interface**
|
|
```bash
|
|
streamlit run streamlit_app.py
|
|
```
|
|
|
|
## Utilisation
|
|
|
|
### API Azure Functions
|
|
|
|
**Endpoint** : `https://contentrecommender-linux.azurewebsites.net/api/recommend`
|
|
|
|
**Paramètres** :
|
|
- `user_id` (int) : Identifiant de l'utilisateur (0-706)
|
|
|
|
**Exemple d'appel** :
|
|
```bash
|
|
curl "https://contentrecommender-linux.azurewebsites.net/api/recommend?user_id=0"
|
|
```
|
|
|
|
**Réponse** :
|
|
```json
|
|
{
|
|
"user_id": 0,
|
|
"recommendations": [157519, 157944, 159495, 156690, 162857]
|
|
}
|
|
```
|
|
|
|
### Interface Streamlit
|
|
|
|
1. Configurer l'URL de l'API (local ou Azure)
|
|
2. Sélectionner un ID utilisateur
|
|
3. Obtenir les recommandations
|
|
4. Tester les fonctionnalités avancées
|
|
|
|
## Algorithme de Recommandation
|
|
|
|
### Content-Based Filtering
|
|
|
|
1. **Chargement des données** : Embeddings pré-calculés et historique utilisateur
|
|
2. **Calcul du profil utilisateur** : Moyenne des embeddings des articles consultés
|
|
3. **Similarité cosinus** : Calcul avec tous les articles du catalogue
|
|
4. **Filtrage** : Exclusion des articles déjà vus
|
|
5. **Sélection** : Top 5 des articles les plus similaires
|
|
|
|
### Optimisations
|
|
|
|
- **Réduction dimensionnelle** : PCA 250D → 50D pour optimiser les performances Azure
|
|
- **Cache en mémoire** : Embeddings et données utilisateur chargés une seule fois
|
|
- **Architecture serverless** : Mise à l'échelle automatique selon la demande
|
|
|
|
## Tests et Validation
|
|
|
|
### Tests locaux
|
|
```bash
|
|
# Démarrage Azure Functions local
|
|
func start
|
|
|
|
# Test de l'algorithme
|
|
python test_local.py
|
|
```
|
|
|
|
### Métriques de performance
|
|
- **Temps de réponse** : ~200ms par recommandation
|
|
- **Utilisateurs supportés** : 707 dans le dataset actuel
|
|
- **Articles disponibles** : 364,047 avec embeddings
|
|
|
|
## Problèmes Connus et Solutions
|
|
|
|
### Déploiement Azure
|
|
- **Python sur Windows** : Non supporté, utiliser Linux obligatoirement
|
|
- **Authentification** : Configurer `http_auth_level=func.AuthLevel.ANONYMOUS`
|
|
- **Erreurs "Service unavailable"** : Problèmes temporaires Azure, réessayer plus tard
|
|
|
|
### Limitations actuelles
|
|
- **Cold start** : Première requête lente après période d'inactivité
|
|
- **Nouveaux utilisateurs** : Pas de gestion du problème de démarrage à froid
|
|
- **Mise à jour des données** : Processus manuel
|
|
|
|
## Architecture Cible (Future)
|
|
|
|
### Améliorations prévues
|
|
- **Gestion cold start** : Recommandations populaires pour nouveaux utilisateurs
|
|
- **Pipeline de données** : Mise à jour automatique des embeddings
|
|
- **Base de données** : Stockage persistant des profils utilisateur
|
|
- **API hybride** : Combinaison Content-Based + Collaborative Filtering
|
|
- **Cache distribué** : Précalcul des recommandations populaires
|
|
|
|
## Technologies Utilisées
|
|
|
|
- **Backend** : Azure Functions, Python 3.12
|
|
- **Frontend** : Streamlit
|
|
- **ML/Data** : scikit-learn, pandas, numpy
|
|
- **Infrastructure** : Azure CLI, Azure Storage
|
|
- **Déploiement** : Azure Functions Core Tools
|
|
|
|
## Auteur
|
|
|
|
Projet réalisé dans le cadre d'une formation OpenClassrooms - Ingénieur IA.
|
|
|
|
## Licence
|
|
|
|
Ce projet est à des fins éducatives uniquement. |