📝 Projet 9 – Développez une preuve de concept : Amélioration d’un modèle d’analyse de sentiment de tweets
🎓 OpenClassrooms • Parcours AI Engineer | 👋 Étudiant : David Scanu
- Plan prévisionnel : Document Google
- Note méthodologique : Document Google
- Présentation : Google Slides
- Repository GitHub : oc-ai-engineer-p09-developpez-une-preuve-de-concept
- Notebook Colab - Évaluation RoBERTa : Zero-shot RoBERTa Models
- Notebook Colab - Évaluation Claude AI : Zero-shot Claude AI
- Notebook Colab - Fine-tuning ModernBERT : ModernBERT Transfer Learning
- Comparaison des modèles : Partie 4 : Comparaison des approches (zero-shot, LLM, Transfer Learning)
- ModernBERT fine-tuné : ROC AUC = 0,839 | F1 = 0,772
- Claude 3 Haiku (zero-shot) : ROC AUC = 0,852 | F1 = 0,807
- Dashboard opérationnel : Déployé sur Google Cloud Run avec interface temps réel
URL de production : https://sentiment-dashboard-511050029575.europe-west1.run.app/
Pour le Projet 9 – Développez une preuve de concept, nous avons choisi de poursuivre et d’améliorer un travail amorcé lors du Projet 7 – Réalisez une analyse de sentiments grâce au Deep Learning. Ce dernier avait abouti à la mise en place d’un pipeline complet d’analyse de sentiment de tweets, utilisant notamment un modèle DistilBERT fine-tuné sur le jeu de données Sentiment140.
L’objectif du Projet 9 est de dépasser les performances obtenues précédemment en explorant de nouvelles approches plus performantes et adaptées au contexte, avec un accent particulier sur le fine-tuning de ModernBERT. Cette démarche s’appuiera sur des comparaisons avec des modèles spécialisés RoBERTa et des LLMs généralistes en mode zero-shot, afin de valider la pertinence et la supériorité de la solution proposée.
Sentiment140 est un jeu de données composé de 1,6 million de tweets annotés automatiquement comme positifs (1) ou négatifs (0).
Ses caractéristiques principales :
- Format : CSV avec colonnes
target,ids,date,flag,user,text - Langue : Anglais
- Particularité : Capture les spécificités du langage Twitter (hashtags, mentions, abréviations, emojis).
Ce dataset est largement utilisé comme référence pour l’entraînement et l’évaluation de modèles d’analyse de sentiment.
La tâche consiste à prédire si un tweet exprime un sentiment positif ou négatif.
Dans le Projet 7, notre modèle DistilBERT fine-tuné sur Sentiment140 a atteint les performances suivantes :
| Metric | Score |
|---|---|
| Accuracy | 0.829 |
| F1-score | 0.827 |
| Precision | 0.838 |
| Recall | 0.816 |
| ROC AUC | 0.899 |
Ces résultats constituent notre baseline pour évaluer les approches du Projet 9.
La classification zero-shot est une approche où un modèle pré-entraîné peut classer un texte dans des catégories sans avoir été spécifiquement entraîné pour cette tâche ou ces labels. Elle exploite la compréhension linguistique acquise lors du pré-entraînement et repose souvent sur des modèles de type transformer ou des LLMs via des consignes (prompts).
Ces modèles sont optimisés pour l’analyse de sentiment et pré-entraînés sur de grandes quantités de données Twitter ou textuelles générales.
L’utilisation d’un LLM comme Claude AI pour la classification zero-shot consiste à exploiter ses capacités de compréhension via des prompts décrivant la tâche d'analse de sentimet et les classes que nous cherchons à prédire (positive/negative).
Nous avons testé deux modèles Anthropic :
claude-3-haiku-20240307(version rapide et économique)
Le transfer learning consiste à réutiliser un modèle pré-entraîné sur un large corpus pour l’adapter à une tâche spécifique. Pour notre tâche, nous exploitons ModernBERT, un modèle pré-entraîné sur plus de 2 000 milliards de tokens, optimisé pour la vitesse d’inférence, l’efficacité mémoire et la gestion de longues séquences. En appliquant un fine-tuning sur Sentiment140, nous adaptons ModernBERT aux particularités du langage Twitter, avec pour objectif de surpasser les performances obtenues avec DistilBERT.
ModernBERT est un encodeur transformer de dernière génération, publié en décembre 2014, offrant un équilibre optimal entre performance, vitesse d’inférence et efficacité mémoire. Il se distingue par des résultats state-of-the-art sur le benchmark GLUE pour un modèle de sa taille, surpassant notamment DeBERTaV3-base, preuve de ses capacités avancées de compréhension linguistique.
Pré-entraîné sur 2 000 milliards de tokens (texte et code) avec une longueur de séquence native de 8 192 tokens, il bénéficie d’une couverture linguistique exceptionnelle et d’une grande robustesse face au vocabulaire varié et informel des tweets. Son architecture intègre des innovations modernes — GeGLU, RoPE positional embeddings, attention locale/alternée, gestion native des séquences non paddées — optimisées pour le calcul GPU et la rapidité d’inférence.
En pratique, ModernBERT traite des batchs plus grands que ses concurrents (jusqu’à ×2 pour la version base) et est environ deux fois plus rapide que DeBERTaV3 sur des contextes courts ou longs. Cette efficacité permet de concilier précision élevée et coût de calcul réduit, un atout clé pour un déploiement en production.
Dans le cadre de notre projet, nous procédons à un fine-tuning sur le jeu de données Sentiment140 afin d’adapter le modèle à la classification binaire de sentiments sur tweets. L’objectif est de dépasser les performances obtenues lors du Projet 7 avec DistilBERT, en tirant parti du pré-entraînement massif et des optimisations structurelles de ModernBERT pour obtenir des métriques supérieures tout en maintenant une excellente efficacité opérationnelle.
| Modèle | Type | Stratégie | Points forts | Limites prévues |
|---|---|---|---|---|
| cardiffnlp/twitter-roberta-base-sentiment-latest | Transformer | Zero-shot | Spécialisé Twitter, bon équilibre précision/rapidité | Moins performant hors domaine Twitter |
| siebert/sentiment-roberta-large-english | Transformer | Zero-shot | Grande capacité, robuste sur texte général | Temps d’inférence plus élevé |
| Claude 3 Haiku 20240307 | LLM | Zero-shot (API) | Faible coût, rapidité, pas de prétraitement complexe | Dépendance API, pas optimisé pour tweets courts |
| ModernBERT (fine-tuning) | Transformer | Transfer learning | Pré-entraînement massif (2T tokens), optimisé mémoire & vitesse, séquence longue | Nécessite entraînement, tuning hyperparamètres |
Note : les performances réelles seront mesurées sur le même jeu de test Sentiment140 afin d’assurer une comparaison équitable.
-
Préparation des données
- Nettoyage et tokenisation adaptée à chaque modèle
- Split : 80% train, 10% validation, 10% test
-
Évaluation zero-shot
- RoBERTa et Claude AI évalués sans fine-tuning
- Mesures : Accuracy, F1, Precision, Recall, ROC AUC
-
Fine-tuning de ModernBERT
- Hyperparamètres optimisés (learning rate, batch size, epochs)
- Entraînement sur GPU
- Comparaison des performances sur le même set de test
-
Analyse et comparaison
- Tableau comparatif des performances
- Analyse d’erreurs et cas limites
- Go, A., Bhayani, R., & Huang, L. (2009). Twitter Sentiment Classification using Distant Supervision
- Wolf, T. et al. (2020). Transformers: State-of-the-Art Natural Language Processing
- Answer.AI. (2024). ModernBERT: Efficient Transformer for Long-Sequence NLP
Le dashboard interactif permet de valider la preuve de concept à travers quatre composants :
- Analyse exploratoire : Statistiques du dataset Sentiment140, WordClouds, distribution des sentiments
- Prédiction temps réel : Interface de classification avec scores de confiance et historique
- Métriques détaillées : Comparaison automatisée des modèles, matrice de confusion, courbe ROC
- Gestion modulaire : Détection automatique des modèles, sélection et comparaison avec baseline DistilBERT
🎯 Dashboard d'Analyse de Sentiment
├── 📊 Analyse Exploratoire
│ ├── Distribution des sentiments (graphiques interactifs)
│ ├── Statistiques textuelles (longueur, fréquence des mots)
│ └── WordClouds différenciés par polarité
├── 🤖 Prédiction en Temps Réel
│ ├── Saisie libre ou exemples prédéfinis
│ ├── Classification instantanée avec confiance
│ └── Historique des prédictions de session
└── 📈 Métriques Détaillées
├── Comparaison multi-modèles vs baseline
├── Visualisations (confusion matrix, ROC, historique)
└── Résumé exécutif adaptatif par modèle
Voici les commandes pour une installation avec environnement virtuel :
# Cloner le repository
git clone <repository-url>
cd oc-ai-engineer-p09-developpez-une-preuve-de-concept
# Installer et configurer Git LFS
sudo apt update && sudo apt install -y git-lfs # Sur Ubuntu/Debian
# brew install git-lfs # Sur macOS
# Configurer Git LFS pour ce repository
git lfs install
# Télécharger les modèles ML volumineux
git lfs pull
# Vérifier que les modèles sont bien téléchargés
ls -lh models/modernbert-sentiment-20250816_1156/model/model.safetensors
# Devrait afficher ~598MB
# Créer l'environnement virtuel
python3 -m venv venv
# Activer l'environnement virtuel
source venv/bin/activate # Sur Linux/macOS
# venv\Scripts\activate # Sur Windows
# Installer les dépendances Python
pip install -r requirements.txt
# Lancer l'application
streamlit run main.py --server.enableCORS false --server.enableXsrfProtection false# Vérifier Git LFS
git lfs version
# Voir tous les fichiers trackés par LFS
git lfs ls-files
# Vérifier l'état des fichiers LFS
git lfs statusNote importante : Si git lfs pull échoue ou que les modèles restent des fichiers pointer (~130 bytes), vous devrez peut-être :
- Vous authentifier sur GitHub avec les bonnes permissions
- Utiliser ``git lfs fetch --all
puisgit lfs checkout` - Ou télécharger manuellement les modèles depuis l'interface GitHub
cd oc-ai-engineer-p09-developpez-une-preuve-de-concept
# Activer l'environnement virtuel
source venv/bin/activate
# Lancer l'application
streamlit run main.py --server.enableCORS false --server.enableXsrfProtection falseL'application sera accessible sur http://localhost:8501. Le dashboard détecte automatiquement les modèles disponibles dans models/ et charge leurs métriques pour comparaison.
Voici la section Docker pour votre README.md :
Le dashboard peut être exécuté localement dans un conteneur Docker pour un environnement isolé et reproductible.
# Construire l'image Docker
docker build -t sentiment-dashboard .Note : La construction peut prendre 5-10 minutes lors du premier build (téléchargement des dépendances Python et modèles ML).
# Démarrer l'application sur le port 8080
docker run -p 8080:8080 --env PORT=8080 sentiment-dashboardUne fois le conteneur démarré, l'application est accessible à :
- URL locale :
http://localhost:8080 - Arrêt :
Ctrl + Cdans le terminal
Le dashboard peut être déployé sur Google Cloud Run pour un accès public sécurisé. Voici les étapes pour un déploiement simple et économique.
- Compte Google Cloud avec facturation activée
- Google Cloud SDK installé et configuré
- Docker installé localement
# Authentification et configuration du projet
gcloud auth login
gcloud config set project VOTRE_PROJECT_ID
gcloud config set compute/region europe-west1
# Activation des services Cloud Run
gcloud services enable run.googleapis.com
gcloud services enable cloudbuild.googleapis.com# Déploiement direct depuis le code source
gcloud run deploy sentiment-dashboard \
--source . \
--platform managed \
--region europe-west1 \
--allow-unauthenticated \
--memory 4Gi \
--cpu 2 \
--timeout 900 \
--max-instances 3 \
--min-instances 0 \
--concurrency 50Paramètres expliqués :
--min-instances 0: L'application s'arrête quand inutilisée (coût ~2-3€/mois)--memory 4Gi: Suffisant pour les modèles ModernBERT (~1.1GB)--concurrency 50: Permet le chargement parallèle des assets Streamlit
# Voir les logs en temps réel
gcloud logs tail "resource.type=cloud_run_revision AND resource.labels.service_name=sentiment-dashboard"
# Mettre à jour les ressources
gcloud run services update sentiment-dashboard \
--memory 4Gi \
--region europe-west1
# Supprimer le service
gcloud run services delete sentiment-dashboard \
--region europe-west1- Démarrage à froid : Première requête après inactivité prend 30-60s (chargement des modèles)
- Taille des modèles : Les 2 modèles ModernBERT (598MB chacun) nécessitent au minimum 2GB de RAM
- Git LFS : Les modèles sont gérés via Git LFS et téléchargés automatiquement lors du build
URL d'accès : Une fois déployé, l'application sera accessible via l'URL fournie par Cloud Run (format https://sentiment-dashboard-[hash].[region].run.app).
Ce projet est configuré pour fonctionner automatiquement avec GitHub Codespaces avec tous les outils nécessaires pour le développement d'applications IA.
- 🐍 Python 3.11 avec environnement de développement optimisé
- 📦 Git LFS pour la gestion des modèles de ML volumineux (598MB+)
- 🔥 Streamlit pour l'interface web interactive
- 🤖 Transformers & PyTorch pour les modèles d'IA
- Ouvrir dans Codespaces - L'environnement se configure automatiquement
- Lancer l'application : L'application se lance automatiquement mais vous pouvez la lancer manuellement avec la commande
bash start.sh(à la racine du projet) - Accéder au dashboard via le port 8501 (ouverture automatique)
├── .devcontainer/ # Configuration Codespaces
├── main.py # Point d'entrée principal
├── models/ # Modèles ML (Git LFS)
├── utils/ # Utilitaires et helpers
├── setup.sh # Script d'installation
└── start.sh # Script de lancement
- ✅ Installation automatique des dépendances au démarrage
- ✅ Gestion intelligente des fichiers volumineux via Git LFS
- ✅ Vérification automatique - évite les téléchargements inutiles
- ✅ Configuration VS Code optimisée pour Python/IA
- ✅ Déploiement prêt pour Streamlit Cloud
Note : Le premier démarrage peut prendre quelques minutes pour télécharger les modèles ML
- Langages : Python
- Librairies ML/DL : PyTorch, Transformers, Scikit-learn
- MLOps : MLFlow, GitHub Actions
- Backend/API : Streamlit
- LLM API : Claude AI
Projet développé par David Scanu dans le cadre du parcours AI Engineer d'OpenClassrooms :
Projet 9 : Développez une preuve de concept.

