diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 74ef075..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-**/mlruns
-**/downloaded_artifacts
diff --git a/README.fr.md b/README.fr.md
deleted file mode 100644
index 88345a6..0000000
--- a/README.fr.md
+++ /dev/null
@@ -1,62 +0,0 @@
-# Projet Air Paradis – Analyse de sentiments
-
-📘 Ce projet est également disponible en [anglais 🇬🇧](./README.md)
-
-Ce dépôt contient les notebooks et le code source du projet d'analyse de sentiments sur des tweets, réalisé dans le cadre du programme OpenClassrooms **"Air Paradis"**.
-
----
-
-## Contexte métier
-
-L'objectif est de prédire si un tweet (ou une courte expression écrite) est perçu comme **positif ou négatif**, dans le contexte d'une compagnie aérienne.
-Le projet repose sur le jeu de données public **Sentiment140**.
-
----
-
-## Description du projet
-
-Le projet vise à développer un système complet d'analyse de sentiments, comprenant :
-
-- Une analyse exploratoire des données textuelles,
-- Une comparaison rigoureuse de 10+ modèles de classification (classiques ML, LSTM + word embeddings, DistilBERT),
-- Le déploiement d'une API REST FastAPI exposant le meilleur modèle avancé (LSTM + Word2Vec),
-- La mise en place d'un pipeline MLOps complet : MLFlow, CI/CD (GitHub Actions), monitoring,
-- Un hébergement local sur serveur NAS pour garantir la souveraineté des données.
-
-📖 **Pour des informations détaillées sur les expérimentations menées et les résultats obtenus, consultez [docs/blog.fr.md](./docs/blog.fr.md).**
-
----
-
-## Structure du dépôt
-
-- `notebooks/` : notebooks d'analyse exploratoire et de modélisation,
-- `deployment/` : code de l'API FastAPI, tests unitaires, Dockerfile et configuration déploiement,
-- `docs/` : documentation détaillée (blog.fr.md), diagrammes, captures d'écran,
-- `presentation/` : support de présentation du projet (PDF),
-- `../.github/workflows/` : pipelines CI/CD (tests automatisés, build Docker, push DockerHub).
-
----
-
-## Entraînement des modèles
-
-Les phases d'entraînement ont principalement été réalisées sur **Google Colab**, afin de bénéficier de ressources GPU nécessaires aux modèles de deep learning.
-
----
-
-## Utilisation
-
-Les notebooks détaillent les étapes d'analyse et d'entraînement.
-L'API est disponible dans le dossier `deployment/api` avec interface Streamlit de test.
-
-Pour tester l'API en production : https://sentiment-api.greg-madman-nas.duckdns.org
-
----
-
-## Remarques
-
-- Les fichiers `requirements.txt` dans `notebooks/` proviennent des environnements Google Colab et peuvent contenir des dépendances peu optimisées pour un usage local.
-- Le fichier `.env`, exclu du dépôt, contient les variables d'environnement nécessaires (configuration MLFlow, MinIO, alerting).
-
----
-
-**Projet réalisé dans le cadre du parcours "Data Scientist – Projet 7" d'OpenClassrooms**
\ No newline at end of file
diff --git a/README.md b/README.md
deleted file mode 100644
index 7d5bb61..0000000
--- a/README.md
+++ /dev/null
@@ -1,62 +0,0 @@
-# Air Paradis Project – Sentiment Analysis
-
-📘 This project is also available in [French 🇫🇷](./README.fr.md)
-
-This repository contains the notebooks and source code for the sentiment analysis project on tweets, conducted as part of the OpenClassrooms **"Air Paradis"** program.
-
----
-
-## Business Context
-
-The objective is to predict whether a tweet (or short written expression) is perceived as **positive or negative**, in the context of an airline company.
-The project is based on the public **Sentiment140** dataset.
-
----
-
-## Project Description
-
-The project aims to develop a complete sentiment analysis system, including:
-
-- Exploratory analysis of textual data,
-- Rigorous comparison of 10+ classification models (classical ML, LSTM + word embeddings, DistilBERT),
-- Deployment of a FastAPI REST API exposing the best advanced model (LSTM + Word2Vec),
-- Implementation of a complete MLOps pipeline: MLFlow, CI/CD (GitHub Actions), monitoring,
-- Local hosting on NAS server to ensure data sovereignty.
-
-📖 **For detailed information on experiments conducted and results obtained, see [docs/blog.md](./docs/blog.md).**
-
----
-
-## Repository Structure
-
-- `notebooks/`: exploratory analysis and modeling notebooks,
-- `deployment/`: FastAPI API code, unit tests, Dockerfile and deployment configuration,
-- `docs/`: detailed documentation (blog.md), diagrams, screenshots,
-- `presentation/`: project presentation slides (PDF),
-- `../.github/workflows/`: CI/CD pipelines (automated tests, Docker build, DockerHub push).
-
----
-
-## Model Training
-
-Training phases were primarily conducted on **Google Colab** to leverage GPU resources required for deep learning models.
-
----
-
-## Usage
-
-Notebooks detail the analysis and training steps.
-The API is available in the `deployment/api` folder with Streamlit testing interface.
-
-To test the production API: https://sentiment-api.greg-madman-nas.duckdns.org
-
----
-
-## Notes
-
-- The `requirements.txt` files in `notebooks/` come from Google Colab environments and may contain dependencies not optimized for local use.
-- The `.env` file, excluded from the repository, contains necessary environment variables (MLFlow, MinIO, alerting configuration).
-
----
-
-**Project completed as part of OpenClassrooms "Data Scientist – Project 7" program**
\ No newline at end of file
diff --git a/deployment/README.fr.md b/deployment/README.fr.md
deleted file mode 100644
index 300d770..0000000
--- a/deployment/README.fr.md
+++ /dev/null
@@ -1,128 +0,0 @@
-# Déploiement de l’API – Projet Air Paradis
-
-📘 Cette documentation est aussi disponible en [anglais 🇬🇧](./README.md)
-
-Ce dossier contient le code et la configuration nécessaires au déploiement de l’API de prédiction de sentiment.
-
----
-
-## 🎯 Objectif
-
-Déployer une API REST permettant de :
-
-- Prédire le **sentiment d’un tweet** (positif ou négatif) à partir d’un modèle LSTM entraîné sur des embeddings (Word2Vec ou GloVe),
-- Signaler les erreurs de prédiction.
-
-L’API utilise le **meilleur modèle enregistré** dans MLflow et le sert via **FastAPI**.
-
----
-
-## 📦 Architecture globale
-
-Schéma :
-
-```
- ┌──────────────────────────────┐
- │ Utilisateur final (UI) │
- │ (interface Streamlit) │
- └────────────┬─────────────────┘
- │
- [Appel HTTP vers /predict]
- │
- ┌────────────▼─────────────┐
- │ API FastAPI │
- │ (serveur lancé via │
- │ Uvicorn) │
- └────────────┬─────────────┘
- │
- Chargement du modèle (MLflow)
- │
- Prétraitement du tweet
- │
- Prédiction (inférence)
- │
- Réponse JSON avec le sentiment
-```
-
----
-
-## 🧪 Fonctionnement de l’API
-
-1. **Chargement du modèle**
- - Le meilleur modèle est enregistré dans MLflow sous le nom `SentimentAnalysisLSTM`, avec le stage `Production`.
- - L’API le charge au démarrage via l’URI :
-
- ```
- models:/SentimentAnalysisLSTM/Production
- ```
-
-2. **Prétraitement du texte**
- - Nettoyage, tokenisation, lemmatisation, puis conversion en vecteurs d’embedding.
-
-3. **Prédiction**
- - Le modèle LSTM prédit le sentiment.
- - Le résultat (`positive` ou `negative`) est retourné en JSON.
-
-4. **Interface utilisateur (optionnelle)**
- - Une interface Streamlit permet une interaction visuelle avec l’API.
-
----
-
-## 🐳 Déploiement via Docker
-
-Un `Dockerfile` est fourni pour simplifier le déploiement sur tout hôte compatible Docker (NAS, cloud, etc.).
-
-L’image Docker est poussée sur DockerHub à chaque version validée (voir CI/CD plus bas).
-
-Par souci de **souveraineté des données**, le déploiement est préféré sur un **NAS équipé d’un processeur Intel N100** (peu énergivore et suffisant pour l’inférence LSTM).
-
-Le redéploiement peut être automatisé via :
-- une tâche `cron` simple, ou
-- un conteneur **Watchtower** (dans docker-compose ou kubernetes).
-
-**Commande pour test local :**
-
-```bash
-docker build -t sentiment-api .
-docker run --rm --env-file ../../.env -p 8000:8000 -p 8080:8080 sentiment-api
-```
-
-En production, les variables d’environnement doivent être définies dans le `docker-compose.yml` ou via un gestionnaire de secrets.
-
----
-
-## 🛠 Problèmes AVX2 / Déploiement cloud
-
-**Mise à jour :** au départ, le NAS ne supportait pas les instructions AVX2 nécessaires à TensorFlow.
-En réalité, les CPU N100 les prennent en charge, mais certains fabricants désactivent cette option dans le BIOS.
-
-En attendant un accès physique au NAS, nous avons opté pour un déploiement sur **Google Cloud**.
-Problème : un seul port peut être exposé publiquement sur ces services.
-
-Deux solutions possibles :
-- Séparer le backend (FastAPI) et le frontend (Streamlit) en deux conteneurs,
-- Utiliser un **reverse proxy** (ex. : nginx) pour rediriger les ports.
-
-➡️ Nous avons choisi la **deuxième solution**, pour garder une **seule image Docker**.
-
-**Mise à jour 2 :** AVX2 a été activé via le BIOS. Le déploiement est donc opérationnel **à la fois en local (NAS)** et **sur le cloud**, avec déploiement automatique pour le NAS (voir section suivante).
-
----
-
-## 🔁 CI/CD – GitHub Actions
-
-Un pipeline est défini dans `.github/workflows/` pour :
-
-- Lancer les tests unitaires à chaque `push`,
-- Vérifier la stabilité de l’API avant déploiement (NAS ou cloud),
-- Construire et pousser l’image Docker sur DockerHub.
-
-Les tests sont situés dans :
-
-```
-deployment/api/tests/
-```
-
-Le redéploiement automatique sur le NAS est géré via **Watchtower**, qui surveille les mises à jour de l’image Docker (fonctionne comme un `cron`, avec logs).
-
----
diff --git a/deployment/README.md b/deployment/README.md
deleted file mode 100644
index 01d8cdd..0000000
--- a/deployment/README.md
+++ /dev/null
@@ -1,126 +0,0 @@
-# API Deployment – Air Paradis Project
-
-📘 This documentation is also available in [French 🇫🇷](./README.fr.md)
-
-This folder contains the code and configuration necessary to deploy the sentiment prediction API.
-
----
-
-## 🎯 Objective
-
-Deploy a REST API that allows to:
-
-- Predict the sentiment of a tweet (positive or negative) using an LSTM model trained on embeddings (Word2Vec or GloVe),
-- Report prediction errors.
-
-The API uses the best-performing model registered on MLflow and serves it via FastAPI.
-
----
-
-## 📦 Overall Architecture
-
-Diagram:
-
-```
- ┌──────────────────────────────┐
- │ End user (UI) │
- │ (Streamlit interface) │
- └────────────┬─────────────────┘
- │
- [HTTP call to /predict]
- │
- ┌────────────▼─────────────┐
- │ FastAPI API │
- │ (server launched via │
- │ Uvicorn) │
- └────────────┬─────────────┘
- │
- Model loading from MLflow
- │
- Tweet preprocessing
- │
- Prediction (inference)
- │
- Sentiment response (JSON)
-```
-
----
-
-## 🧪 API Workflow
-
-1. **Model loading**
- - The best performing model is registered in MLflow under a fixed name (`SentimentAnalysisLSTM`) and a `Production` stage.
- - The API loads this model at startup using the URI:
-
- ```
- models:/SentimentAnalysisLSTM/Production
- ```
-
-2. **Text preprocessing**
- - Text is cleaned, tokenized, lemmatized, and converted into vectors (embeddings).
-
-3. **Prediction**
- - The LSTM model (loaded from MLflow) makes a prediction.
- - The result (`positive` or `negative`) is returned as JSON.
-
-4. **User interface (optional)**
- - A Streamlit interface allows visual interaction with the API.
-
----
-
-## 🐳 Deployment with Docker
-
-A `Dockerfile` is provided for easy deployment on any Docker-compatible host (NAS, cloud, etc.).
-
-This Docker image should be pushed to DockerHub with every validated version (see CI/CD below).
-
-For data sovereignty, deployment is preferably done on a **NAS with Intel N100** CPU (energy-efficient, sufficient for inference).
-Docker can be automatically redeployed using:
-- `cron` (simple), or
-- `Watchtower` in docker-compose/kubernetes setups.
-
-**Development command (local test):**
-
-```bash
-docker build -t sentiment-api .
-docker run --rm --env-file ../../.env -p 8000:8000 -p 8080:8080 sentiment-api
-```
-
-In production (e.g. via docker-compose or cloud services), environment variables must be defined in the compose file or secret manager.
-
----
-
-## 🛠 Notes on AVX2 / Cloud Deployment
-
-**Update:** the NAS initially failed due to lack of AVX2 support. Some N100-based NAS motherboards disable AVX2 in BIOS.
-
-When not accessible, fallback deployment is done on **Google Cloud**.
-Issue: public cloud services do **not allow multiple ports** to be exposed easily.
-
-Two solutions:
-- Split into two containers: FastAPI + Streamlit,
-- Use a **reverse proxy** (e.g., Nginx) to map ports.
-
-➡️ We chose the second option to keep a **single Docker image**.
-
-**Update 2:** AVX2 was enabled via BIOS. Deployment is now active **both locally (NAS)** and **on cloud**, with continuous deployment on NAS (see section below).
-
----
-
-## 🔁 CI/CD – GitHub Actions
-
-A pipeline is defined in `.github/workflows/` to:
-
-- Run unit tests on every push,
-- Check API health before deployment (local/cloud),
-- Build and push Docker image to DockerHub.
-
-Tests are defined in:
-
-```
-deployment/api/tests/
-```
-
-Docker image auto-redeployment on NAS is handled by **Watchtower**, which checks DockerHub updates (like a cron job, with logs).
-
----
diff --git a/deployment/api/.dockerignore b/deployment/api/.dockerignore
deleted file mode 100644
index e35743c..0000000
--- a/deployment/api/.dockerignore
+++ /dev/null
@@ -1,22 +0,0 @@
-# Ignorer les caches Python
-__pycache__/
-*.pyc
-
-# Ignorer les artefacts temporaires
-downloaded_artifacts/
-mlruns/
-logs/
-
-# Ignorer les tests unitaires
-tests/
-
-# Ignorer les variables d'environnement. Elles seront plutôt chargées dans la commande docker run `docker run --env-file ./deployment/api/.env -p 8000:8000 sentiment-api` en développement local, et via des variables définies dans le yaml
-*.env
-
-# Ignorer fichier conf amazon web services
-*aws*
-.elasticbeanstalk
-
-sentiment-api-*.json
-
-docker-compose.yml.example
diff --git a/deployment/api/.gitignore b/deployment/api/.gitignore
deleted file mode 100644
index 254b45a..0000000
--- a/deployment/api/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-# ssh .pem files
-*.pem
-
-*aws*
-
-sentiment-api-*.json
diff --git a/deployment/api/Dockerfile b/deployment/api/Dockerfile
deleted file mode 100644
index 93ff856..0000000
--- a/deployment/api/Dockerfile
+++ /dev/null
@@ -1,42 +0,0 @@
-FROM python:3.12-slim
-
-WORKDIR /app
-
-# # Install nginx and system packages
-RUN apt-get update && \
- apt-get install -y nginx curl && \
- # Créer l'utilisateur et le groupe www-data si ce n'est pas déjà fait par l'image de base
- # Assurer que l'utilisateur nginx (souvent www-data) a un ID consistent
- adduser --system --no-create-home --group www-data || true && \
- apt-get clean && \
- rm -rf /var/lib/apt/lists/*
-
-# Copy and install Python dependencies
-COPY requirements.txt .
-RUN pip install --no-cache-dir -r requirements.txt
-
-# Install nltk resources at build time
-RUN python3 -m nltk.downloader punkt \
- && python3 -m nltk.downloader punkt_tab \
- && python3 -m nltk.downloader stopwords \
- && python3 -m nltk.downloader wordnet \
- && python3 -m nltk.downloader omw-1.4
-
-
-# Copy app code and configs
-COPY . .
-
-# Copy nginx config - l'emplacement par défaut de Nginx est /etc/nginx/nginx.conf
-COPY nginx.conf /etc/nginx/nginx.conf
-
-# Pas besoin de créer les dossiers ici, le start.sh s'en chargera avec les bonnes permissions
-RUN mkdir -p /var/log/nginx /var/lib/nginx /run
-
-# Ensure script is executable
-RUN chmod +x /app/start.sh
-
-# Expose only NGINX port (Cloud Run utilise 8080 par défaut)
-EXPOSE 8080
-
-# Start everything via script
-CMD ["/app/start.sh"]
diff --git a/deployment/api/app.py b/deployment/api/app.py
deleted file mode 100644
index 31dbd8a..0000000
--- a/deployment/api/app.py
+++ /dev/null
@@ -1,124 +0,0 @@
-import os
-import streamlit as st
-import requests
-
-API_BASE_URL = os.getenv("API_BASE_URL", "http://127.0.0.1:8080") + "/api"
-
-
-st.set_page_config(
- page_title="Air Paradis - Tweet Prediction",
- page_icon="✈️", # optionnel, tu peux mettre un emoji ou un fichier image
-)
-st.title("Sentiment Analysis - Air Paradis")
-
-
-tweet = st.text_area("Prompt your tweet here :", height=150)
-
-# Initialisation des états
-if "prediction_result" not in st.session_state:
- st.session_state.prediction_result = None
-
-if "show_report_button" not in st.session_state:
- st.session_state.show_report_button = False
-
-if "report_sent" not in st.session_state:
- st.session_state.report_sent = False
-
-if "last_report_sent" not in st.session_state:
- st.session_state.last_report_sent = False
-
-def reset_state():
- st.session_state.prediction_result = None
- st.session_state.show_report_button = False
- st.session_state.report_sent = False
- st.session_state.last_report_sent = False
-
-# Bouton d'analyse
-if st.button("Analyze the sentiment"):
- if not tweet.strip():
- st.warning("Please type a valid tweet.")
- reset_state()
- else:
- try:
- response = requests.post(
- f"{API_BASE_URL}/predict",
- json={"tweet": tweet}
- )
- if response.status_code == 200:
- data = response.json()
- st.session_state.prediction_result = data
- st.session_state.show_report_button = True
- st.session_state.report_sent = False
- st.session_state.last_report_sent = False
- else:
- st.error(f"Erreur API : {response.status_code} - {response.text}")
- reset_state()
- except Exception as e:
- st.error(f"Error during API request : {e}")
- reset_state()
-
-# Affichage du résultat
-if st.session_state.prediction_result:
- sentiment = st.session_state.prediction_result["sentiment"].capitalize()
- prob = st.session_state.prediction_result["probability"]
- st.success(f"Sentiment : {sentiment}")
- st.info(f"Positive tweet probability: {prob:.2f}")
-
-# Gestion du bouton signalement
-if st.session_state.show_report_button and not st.session_state.report_sent:
- if st.button("Report a wrong prediction"):
- try:
- response = requests.post(
- f"{API_BASE_URL}/report_error",
- json={
- "tweet": tweet,
- "prediction": sentiment,
- "probability": st.session_state.prediction_result["probability"] # Transmettre la probabilité
- }
- )
-
- if response.status_code == 200:
- data = response.json()
- # Mettre à jour les états
- st.session_state.show_report_button = False
- st.session_state.report_sent = True
- st.session_state.last_report_sent = data.get("report_sent", False)
- # Forcer un re-run
- st.rerun()
- else:
- st.error(f"API Error : {response.status_code} - {response.text}")
- except Exception as e:
- st.error(f"Error during API request : {e}")
-
-# Message si signalement déjà fait
-elif st.session_state.report_sent:
- st.success("✅ Thanks for your report.")
-
- if st.session_state.last_report_sent:
- st.info("📩 A complete report has been sent to the website administrator.")
-
-
-st.markdown(
- """
-
-
- Reported wrong predictions help improve the model. Please avoid including personal information.
-
- """,
- unsafe_allow_html=True,
-)
diff --git a/deployment/api/docker-compose.yml.example b/deployment/api/docker-compose.yml.example
deleted file mode 100644
index a56b117..0000000
--- a/deployment/api/docker-compose.yml.example
+++ /dev/null
@@ -1,32 +0,0 @@
-services:
- api:
- build:
- context: ./deployment/api
- dockerfile: Dockerfile
- container_name: sentiment_api
- ports:
- - "8000:8000" # API FastAPI
- - "8501:8501" # Streamlit
- environment:
- MLFLOW_TRACKING_URI: "${MLFLOW_TRACKING_URI}" # ex: http://mlflow:5000
- MLFLOW_S3_ENDPOINT_URL: "${MLFLOW_S3_ENDPOINT_URL}" # ex: url MinIO ou S3
- AWS_ACCESS_KEY_ID: "${AWS_ACCESS_KEY_ID}" # clé ID S3
- AWS_SECRET_ACCESS_KEY: "${AWS_SECRET_ACCESS_KEY}" # clé secrète S3
-
- SMTP_SERVER: "${SMTP_SERVER}" # serveur SMTP
- SMTP_PORT: "${SMTP_PORT}" # port SMTP (ex: 587)
- SMTP_EMAIL: "${SMTP_EMAIL}" # email expéditeur
- SMTP_PASSWORD: "${SMTP_PASSWORD}" # mot de passe SMTP
- SMTP_FROM_ALIAS: "${SMTP_FROM_ALIAS}" # alias (optionnel)
- ADMIN_EMAIL: "${ADMIN_EMAIL}" # email admin destinataire
-
- SENTIMENT_API_BASE_URL: "${SENTIMENT_API_BASE_URL}" # public api url (used to redirect Streamlit requests to FastAPI)
-
-# only if you have a reverse proxy server
-# networks:
-# - swag
- restart: always
-# only if you have a reverse proxy server
-# networks:
-# swag:
-# external: true
diff --git a/deployment/api/email_service.py b/deployment/api/email_service.py
deleted file mode 100644
index bd2aebc..0000000
--- a/deployment/api/email_service.py
+++ /dev/null
@@ -1,111 +0,0 @@
-import smtplib
-import os
-import json
-from email.mime.text import MIMEText
-from email.mime.multipart import MIMEMultipart
-from datetime import datetime
-
-def send_error_report_email(error_reports):
- """
- Envoie un email avec le rapport d'erreurs et le JSON intégré
- """
- smtp_server = os.getenv("SMTP_SERVER")
- smtp_port = int(os.getenv("SMTP_PORT", 587))
- smtp_email = os.getenv("SMTP_EMAIL") # main email address. If smt_from_alias is not, it will also be the mail sender
- smtp_password = os.getenv("SMTP_PASSWORD")
- smtp_from_alias = os.getenv("SMTP_FROM_ALIAS", smtp_email) # mail sender if not none (alias)
- admin_email = os.getenv("ADMIN_EMAIL") # this one will receive the mail
-
-
- if not all([smtp_server, smtp_email, smtp_password, admin_email]):
- print("❌ Configuration email manquante dans .env")
- return False
-
- try:
- # Create message
- msg = MIMEMultipart()
- if smtp_from_alias is not None:
- smtp_from = smtp_from_alias
- else:
- smtp_from = smtp_email
- msg['From'] = f"Air Paradis Monitor <{smtp_from}>"
- msg['To'] = admin_email
- msg['Subject'] = f"🚨 Rapport d'erreurs - Prédictions sentiments ({datetime.now().strftime('%d/%m/%Y %H:%M')})"
-
- # Prepare JSON data
- json_data = {
- "report_generated_on": datetime.now().isoformat(),
- "reports_amount": len(error_reports),
- "reports": [
- {
- "id": i,
- "tweet": tweet,
- "incorrect_prediction": prediction,
- "tweet_length": len(tweet)
- }
- for i, (tweet, prediction) in enumerate(error_reports.items(), 1)
- ],
- "metadata": {
- "model": "SentimentAnalysisLSTM",
- "api_version": "1.0",
- "reporting_threshold": 3
- }
- }
-
- # Message body with embedded JSON
- body = f"""
-Hello,
-
-A new error report has been generated for the Air Paradis sentiment prediction API.
-
-📊 Total number of reports : {len(error_reports)}
-📅 Report date : {datetime.now().strftime('%d/%m/%Y à %H:%M')}
-
-📋 Report summary :
-
-"""
-
- for i, (tweet, prediction) in enumerate(error_reports.items(), 1):
- body += f"{i}. Tweet: \"{tweet[:100]}{'...' if len(tweet) > 100 else ''}\"\n"
- body += f" Prediction reported as incorrect: {prediction.upper()}\n\n"
-
- body += """
-📈 Recommended actions:
-- Analyze reported tweets to identify patterns
-- Consider re-training the model if necessary
-- Check quality of training data
-
-📊 COMPLETE DATA (JSON) :
-═══════════════════════════════════════════════════════════════════════════════
-
-"""
-
- # ✅ Directly add JSON inside the body
- json_string = json.dumps(json_data, ensure_ascii=False, indent=2)
- body += f"```json\n{json_string}\n```"
-
- body += """
-
-═══════════════════════════════════════════════════════════════════════════════
-
----
-Sincerely,
-🤖 API Air Paradis - Automatic monitoring system
-📧 Sent from : """ + smtp_from
-
- # Add message body
- msg.attach(MIMEText(body, 'plain', 'utf-8'))
-
- # Sending email
- with smtplib.SMTP(smtp_server, smtp_port) as server:
- server.starttls()
- server.login(smtp_email, smtp_password)
- server.send_message(msg)
-
- print(f"✅ Report email successfully sent from {smtp_from}")
- print("📊 JSON embedded in message body")
- return True
-
- except Exception as e:
- print(f"❌ Error during email sending : {e}")
- return False
\ No newline at end of file
diff --git a/deployment/api/main.py b/deployment/api/main.py
deleted file mode 100644
index 767a736..0000000
--- a/deployment/api/main.py
+++ /dev/null
@@ -1,210 +0,0 @@
-import os
-import sys
-import pickle
-from dotenv import load_dotenv
-from fastapi import FastAPI, HTTPException
-from pydantic import BaseModel
-import mlflow
-from mlflow.tracking import MlflowClient
-from tensorflow.keras.models import load_model
-from tensorflow.keras.preprocessing.sequence import pad_sequences
-import pandas as pd
-from datetime import datetime, timedelta
-
-# # TO UNCOMMENT FOR DEVELOPMENT. OTHERWISE, LEAVE AS IS
-# # Access the .env file
-# PARENT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../"))
-# sys.path.append(PARENT_DIR)
-# # 🔐 Load environment variables (.env two levels above)
-# load_dotenv()
-
-# 🔁 Import the preprocessing function (LOCAL)
-from preprocessing import preprocess_tweet
-
-# 📧 Import the email service
-from email_service import send_error_report_email
-
-# 🔗 Configure MLflow
-mlflow_tracking_uri = os.getenv("MLFLOW_TRACKING_URI")
-if mlflow_tracking_uri:
- mlflow.set_tracking_uri(mlflow_tracking_uri)
-else:
- print("⚠️ MLFLOW_TRACKING_URI not defined in .env")
-
-# 📌 Model name and stage
-MODEL_NAME = "SentimentAnalysisLSTM"
-STAGE = "Production"
-
-# 🧾 Structure of POST requests
-class TweetRequest(BaseModel):
- tweet: str
-
-class ReportRequest(BaseModel):
- tweet: str
- prediction: str
- probability: float
-
-# 🧠 Storage for error reports
-error_reports = {}
-
-# 🔍 Function to load model + tokenizer
-def load_model_and_artifacts(model_name=MODEL_NAME, stage=STAGE):
- client = MlflowClient()
- versions = client.get_latest_versions(model_name, [stage])
-
- if not versions:
- raise RuntimeError(f"No version found for model '{model_name}' in stage '{stage}'")
-
- version_info = versions[0]
- run_id = version_info.run_id
-
- if not run_id:
- raise RuntimeError("Run ID not found.")
-
- # Extract embedding tag
- model_version_info = client.get_model_version(model_name, version_info.version)
- # glove is used as default if embedding_type is not found
- embedding_type = model_version_info.tags.get("embedding_type", "glove").lower()
-
- # Determine paths to artifacts
- local_dir = "./downloaded_artifacts"
- os.makedirs(local_dir, exist_ok=True)
- base_path = "local_artifacts"
- tokenizer_file = "tokenizer.pickle"
-
- if "glove" in embedding_type:
- keras_file = "final_model_LSTM_GloVe-300d-Fige.keras"
- elif "word2vec" in embedding_type:
- keras_file = "final_model_LSTM_Word2Vec-Fige.keras"
- else:
- raise ValueError(f"Unknown embedding type: {embedding_type}")
-
- print(f"{embedding_type} model found. Downloading model associated with run_id: {run_id}")
-
- def dl(path):
- return client.download_artifacts(run_id=run_id, path=f"{base_path}/{path}", dst_path=local_dir)
-
- # 🔽 Download artifacts
- model_path = dl(keras_file)
- tokenizer_path = dl(tokenizer_file)
- print("Contents of downloaded_artifacts:", os.listdir(local_dir))
-
- # 📦 Load
- model = load_model(model_path)
- with open(tokenizer_path, "rb") as f:
- tokenizer = pickle.load(f)
-
- return model, tokenizer, embedding_type
-
-# 🚀 Launch the API
-app = FastAPI(title="Sentiment Prediction API - Air Paradis")
-# app = FastAPI(title="Sentiment Prediction API - Air Paradis",
-# root_path="/api")
-
-try:
- model, tokenizer, embedding_type = load_model_and_artifacts()
-except Exception as e:
- print(f"\n❌ Error loading artifacts: {e}")
- model, tokenizer = None, None
-
-@app.get("/")
-def root():
- return {"message": "Sentiment API - Air Paradis - online"}
-
-@app.post("/predict")
-def predict_sentiment(request: TweetRequest):
- if model is None or tokenizer is None:
- raise HTTPException(status_code=503, detail="Model or artifacts unavailable.")
-
- try:
- processed_tweet = preprocess_tweet(request.tweet)
- except Exception as e:
- raise HTTPException(status_code=500, detail=f"Preprocessing error: {e}")
-
- if not processed_tweet.strip():
- raise HTTPException(status_code=400, detail="Tweet is empty or invalid after preprocessing.")
-
- try:
- sequence = tokenizer.texts_to_sequences([processed_tweet])
- sequence_padded = pad_sequences(sequence, maxlen=model.input_shape[1])
- prediction_prob = model.predict(sequence_padded)[0][0]
- if prediction_prob >= 0.5:
- sentiment = "positive"
- else:
- sentiment = "negative"
- # prediction_prob = 1 - prediction_prob
- except Exception as e:
- raise HTTPException(status_code=500, detail=f"Inference error: {e}")
-
- return {
- "sentiment": sentiment,
- "probability": float(prediction_prob)
- }
-
-# Replace the dict with a global empty DataFrame initially
-error_reports_df = pd.DataFrame(columns=["tweet", "prediction", "probability", "timestamp"])
-
-@app.post("/report_error")
-def report_error(request: ReportRequest):
- global error_reports_df
-
- tweet = request.tweet.strip()
- prediction = request.prediction.strip().lower()
- probability = request.probability
-
- if not tweet or not prediction:
- raise HTTPException(status_code=400, detail="Missing tweet or prediction.")
- if probability < 0 or probability > 1:
- raise HTTPException(status_code=400, detail="Invalid probability. Must be between 0 and 1.")
-
- now = datetime.utcnow()
-
- # Check if tweet already exists to avoid duplicates
- existing_idx = error_reports_df.index[error_reports_df["tweet"] == tweet].tolist()
- if existing_idx:
- # Update existing row
- idx = existing_idx[0]
- error_reports_df.at[idx, "prediction"] = prediction + f' (p = {probability:.2f} ) '
- error_reports_df.at[idx, "probability"] = probability
- error_reports_df.at[idx, "timestamp"] = now
- else:
- # Add new row
- new_row = {
- "tweet": tweet,
- "prediction": prediction + f' (p = {probability:.2f} ) ',
- "probability": probability,
- "timestamp": now
- }
- error_reports_df = pd.concat([error_reports_df, pd.DataFrame([new_row])], ignore_index=True)
-
- report_sent = False
-
- # Condition: every 3 reports and max 5 min interval between the last 3
- try:
- if len(error_reports_df) % 3 == 0:
- last_three = error_reports_df.sort_values("timestamp", ascending=False).head(3)
- times = last_three["timestamp"].sort_values()
- delta = times.iloc[-1] - times.iloc[0]
- if delta <= timedelta(minutes=5):
- reports_dict = dict(zip(
- last_three["tweet"],
- last_three["prediction"]
- ))
- print(f"📧 Attempting to send email for {len(error_reports_df)} reports...")
- email_success = send_error_report_email(reports_dict)
- if email_success:
- print(f"✅ Email successfully sent for {len(error_reports_df)} reports")
- report_sent = True
- # DELETE the last 3 reports sent
- # Identify indexes to delete
- to_remove_idx = last_three.index
- error_reports_df = error_reports_df.drop(to_remove_idx).reset_index(drop=True)
- else:
- print(f"❌ Failed to send email for {len(error_reports_df)} reports")
-
- except Exception as e:
- print(f"❌ Error while sending email: {e}")
- # Continue even if it fails
-
- return {"report_sent": report_sent}
-
\ No newline at end of file
diff --git a/deployment/api/nginx.conf b/deployment/api/nginx.conf
deleted file mode 100644
index 6d95b0e..0000000
--- a/deployment/api/nginx.conf
+++ /dev/null
@@ -1,38 +0,0 @@
-# This reverse proxy configuration aims to make calls to different services running under different ports (Streamlit :8501 and FastAPI :8000) by calling only one port : the nginx one (:8080)
-# The 8080 has to be opened (Dockerfile) and used by app.py (streamlit) in order to make right calls.
-worker_processes 1;
-
-events { worker_connections 1024; }
-
-http {
- server {
- listen 8080;
-
- location /api/ {
- proxy_pass http://127.0.0.1:8000/;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Forwarded-Proto $scheme;
- }
-
- location / {
- proxy_pass http://127.0.0.1:8501/;
-
- proxy_http_version 1.1;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection "upgrade";
-
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Forwarded-Proto $scheme;
- }
-
- location /health {
- return 200 'OK';
- add_header Content-Type text/plain;
- }
-
- }
-}
diff --git a/deployment/api/preprocessing.py b/deployment/api/preprocessing.py
deleted file mode 100644
index 40e6e3a..0000000
--- a/deployment/api/preprocessing.py
+++ /dev/null
@@ -1,80 +0,0 @@
-import re
-import html
-import nltk
-from nltk.corpus import stopwords
-from nltk.tokenize import word_tokenize
-from nltk.stem import WordNetLemmatizer
-
-# Ensure that the necessary resources are available
-try:
- stopwords.words('english')
- word_tokenize("test")
- WordNetLemmatizer().lemmatize("testing")
-except LookupError:
- nltk.download('punkt')
- nltk.download('punkt_tab')
- nltk.download('stopwords')
- nltk.download('wordnet')
- nltk.download('omw-1.4')
-
-# PREPROCESSING FUNCTION FOR CLASSIC AND ADVANCED MODELS
-def preprocess_tweet(tweet):
- """
- Preprocesses a tweet for classic ML models or word embedding models (e.g., Word2Vec, GloVe).
- The text is cleaned, normalized, lemmatized, and stripped of unnecessary noise.
- """
-
- # Ensure input is a string
- if not isinstance(tweet, str):
- return ""
-
- # Decode HTML entities (e.g., & → &)
- tweet = html.unescape(tweet)
- # print(tweet + '\n')
-
- # Convert text to lowercase
- tweet = tweet.lower()
- # print(tweet + '\n')
-
- # Replace URLs with a generic token
- tweet = re.sub(r'https?://\S+|www\.\S+', '', tweet)
- # print(tweet + '\n')
-
- # Replace mentions (@username) with a generic token
- tweet = re.sub(r'@\w+', '', tweet)
- # print(tweet + '\n')
-
- # Separate hashtags from the word to preserve semantics during tokenization
- tweet = re.sub(r'#(\w+)', r'# \1', tweet)
- # print(tweet + '\n')
-
- # Remove unwanted punctuation and special characters (except useful ones like < > @ # ! ?)
- tweet = re.sub(r'[^\w\s<>@#!?]', '', tweet)
- # print(tweet + '\n')
-
- # Remove non-printable/control characters (e.g., \n, \t, emojis, corrupted unicode)
- tweet = re.sub(r'[^\x20-\x7E]', '', tweet)
- # print(tweet + '\n')
-
- # Tokenize the tweet into individual words
- tokens = word_tokenize(tweet)
- # print(tokens)
- # print('\n')
-
- # Lemmatize each token to its base form (e.g., "running" → "run")
- lemmatizer = WordNetLemmatizer()
- tokens = [lemmatizer.lemmatize(token) for token in tokens]
- # print(tokens)
- # print('\n')
-
- # Remove stopwords, but keep negation-related words (important for sentiment)
- stop_words = set(stopwords.words('english'))
- important_words = {'no', 'not', 'nor', 'neither', 'never', 'nobody', 'none', 'nothing', 'nowhere'}
- stop_words = stop_words - important_words
- tokens = [token for token in tokens if token not in stop_words]
- # print(tokens)
- # print('\n')
-
-
- # Reconstruct the cleaned tweet
- return ' '.join(tokens)
\ No newline at end of file
diff --git a/deployment/api/requirements.txt b/deployment/api/requirements.txt
deleted file mode 100644
index 14c5515..0000000
--- a/deployment/api/requirements.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-# === API FastAPI ===
-fastapi==0.115.14
-uvicorn==0.35.0
-pydantic==2.11.7
-starlette==0.46.2
-# === Interface Streamlit ===
-streamlit==1.46.1
-requests==2.32.4
-# === Machine Learning ===
-tensorflow==2.19.0
-mlflow==3.1.1
-boto3==1.39.2
-numpy==2.1.3
-pandas==2.3.0
-# === Traitement de texte ===
-nltk==3.9.1
-# === Utilitaires ===
-python-dotenv==1.1.1
-httpx==0.28.1
-# === Dépendances système ===
-protobuf==3.20.3
diff --git a/deployment/api/start.sh b/deployment/api/start.sh
deleted file mode 100644
index 9bca865..0000000
--- a/deployment/api/start.sh
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/bin/bash
-
-set -e
-
-# S'assurer que les répertoires de cache et de log Nginx sont accessibles en écriture
-mkdir -p /var/cache/nginx /var/run/nginx /var/log/nginx
-chown -R www-data:www-data /var/cache/nginx /var/run/nginx /var/log/nginx
-
-echo "Starting Streamlit..."
-streamlit run app.py \
- --server.port 8501 \
- --server.address 0.0.0.0 \
- --server.enableXsrfProtection false \
- --server.enableCORS false \
- & # Lance en arrière-plan
-
-echo "Starting FastAPI..."
-uvicorn main:app --host 0.0.0.0 --port 8000 --loop asyncio & # Lance en arrière-plan
-
-# MODIFICATION IMPORTANTE ICI: Vérifier Streamlit sur le bon chemin
-echo "Waiting for Streamlit to be ready..."
-until curl -s http://127.0.0.1:8501 > /dev/null; do
- sleep 1
-done
-echo "Streamlit is ready!"
-
-# MODIFICATION: Vérifier FastAPI sur un endpoint existant, par exemple /docs ou /health
-echo "Waiting for FastAPI to be ready..."
-until curl -s http://127.0.0.1:8000/docs > /dev/null; do # Assurez-vous que /docs est un endpoint léger
- sleep 1
-done
-echo "FastAPI is ready!"
-
-echo "Launching NGINX..."
-nginx -c /etc/nginx/nginx.conf -g 'daemon off;'
diff --git a/deployment/api/tests/test_email_service.py b/deployment/api/tests/test_email_service.py
deleted file mode 100644
index 38c4dfc..0000000
--- a/deployment/api/tests/test_email_service.py
+++ /dev/null
@@ -1,38 +0,0 @@
-# Utilisation de mock pour simuler l'envoi de mails mais sans spammer une boîte.
-
-from unittest.mock import patch, MagicMock
-import os
-import sys
-from dotenv import load_dotenv
-
-# Ajouter le répertoire parent au path pour importer email_service
-sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "../")))
-
-from email_service import send_error_report_email
-
-# Charger les variables d'environnement
-dotenv_path = '../../../.env'
-load_dotenv(dotenv_path)
-
-@patch("smtplib.SMTP")
-def test_email_service_connection(mock_smtp):
- """
- Test SMTP connection without actually sending the email
- """
- # 🔧 Configuration du mock
- mock_server = MagicMock()
- mock_smtp.return_value.__enter__.return_value = mock_server
-
- test_reports = {
- "Flight cancelled without notice": "positif"
- }
-
- # Appel de la fonction
- result = send_error_report_email(test_reports)
-
- # ✅ Assertions
- assert result is True
- mock_smtp.assert_called_with(os.getenv("SMTP_SERVER"), int(os.getenv("SMTP_PORT", 587)))
- mock_server.starttls.assert_called_once()
- mock_server.login.assert_called_once_with(os.getenv("SMTP_EMAIL"), os.getenv("SMTP_PASSWORD"))
- mock_server.send_message.assert_called_once()
diff --git a/deployment/api/tests/test_main.py b/deployment/api/tests/test_main.py
deleted file mode 100644
index ba4afe5..0000000
--- a/deployment/api/tests/test_main.py
+++ /dev/null
@@ -1,32 +0,0 @@
-import os
-import sys
-from fastapi.testclient import TestClient
-
-# Add parent directory to path to import email_service
-sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "../")))
-
-from main import app
-
-client = TestClient(app)
-
-def test_root_endpoint():
- response = client.get("/")
- assert response.status_code == 200
- assert response.json() == {"message": "Sentiment API - Air Paradis - online"}
-
-def test_predict_sentiment():
- response = client.post("/predict", json={"tweet": "I love this airline !"})
- assert response.status_code == 200
- data = response.json()
- assert "sentiment" in data
- assert "probability" in data
- assert data["sentiment"] in ["positive", "negative"]
-
-def test_missing_tweet():
- response = client.post("/predict", json={})
- assert response.status_code == 422 # Unprocessable Entity (FastAPI)
-
-def test_empty_tweet():
- response = client.post("/predict", json={"tweet": ""})
- assert response.status_code == 400
- assert response.json()["detail"] == "Tweet is empty or invalid after preprocessing."
\ No newline at end of file
diff --git a/deployment/api/tests/test_preprocessing.py b/deployment/api/tests/test_preprocessing.py
deleted file mode 100644
index d9bc3c9..0000000
--- a/deployment/api/tests/test_preprocessing.py
+++ /dev/null
@@ -1,28 +0,0 @@
-import os
-import sys
-
-# Ajouter le répertoire parent au path pour importer email_service
-sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "../")))
-from preprocessing import preprocess_tweet
-
-
-def test_preprocess_tweet_removes_hashtags():
- tweet = """
- Just flew w/ @AirParadis 🚀 & I’m in LOVE! Epic service, comfy seats, good prices at https://airparadis.com
- #bestflight #AirParadis
- """
- assert preprocess_tweet(tweet) == 'flew w < MENTION > im love ! epic service comfy seat good price < URL > # bestflight # airparadis'
-
-def test_preprocess_tweet_removes_mentions():
- tweet = """
- "Flight of dreams" w/ @AirParadis! Got food, space & smiles 😄 I’ll book again!
- #AirParadis
- """
- assert preprocess_tweet(tweet) == 'flight dream w < MENTION > ! got food space smile ill book ! # airparadis'
-
-def test_preprocess_tweet_lowercases_text():
- tweet = """
- My 3rd time w/ @AirParadis & still amazed 😍 Crew = lovely à every step!
- #flyhappy #AirParadis
- """
- assert preprocess_tweet(tweet) == '3rd time w < MENTION > still amazed crew lovely every step ! # flyhappy # airparadis'
diff --git a/docs/Basic-Models.png b/docs/Basic-Models.png
deleted file mode 100644
index 70108f4..0000000
Binary files a/docs/Basic-Models.png and /dev/null differ
diff --git a/docs/GloVe-300d_LSTM_epoch12.png b/docs/GloVe-300d_LSTM_epoch12.png
deleted file mode 100644
index 3161c6a..0000000
Binary files a/docs/GloVe-300d_LSTM_epoch12.png and /dev/null differ
diff --git a/docs/Word2Vec_LSTM_epoch9.png b/docs/Word2Vec_LSTM_epoch9.png
deleted file mode 100644
index a194b9e..0000000
Binary files a/docs/Word2Vec_LSTM_epoch9.png and /dev/null differ
diff --git a/docs/api_error_report.png b/docs/api_error_report.png
deleted file mode 100644
index be81ff9..0000000
Binary files a/docs/api_error_report.png and /dev/null differ
diff --git a/docs/api_first_error.png b/docs/api_first_error.png
deleted file mode 100644
index 8325cc2..0000000
Binary files a/docs/api_first_error.png and /dev/null differ
diff --git a/docs/api_second_error.png b/docs/api_second_error.png
deleted file mode 100644
index 6cd83a8..0000000
Binary files a/docs/api_second_error.png and /dev/null differ
diff --git a/docs/api_third_error.png b/docs/api_third_error.png
deleted file mode 100644
index a454bb4..0000000
Binary files a/docs/api_third_error.png and /dev/null differ
diff --git a/docs/bert_confusion_matrix.png b/docs/bert_confusion_matrix.png
deleted file mode 100644
index f363132..0000000
Binary files a/docs/bert_confusion_matrix.png and /dev/null differ
diff --git a/docs/bert_roc_curve.png b/docs/bert_roc_curve.png
deleted file mode 100644
index e6d8527..0000000
Binary files a/docs/bert_roc_curve.png and /dev/null differ
diff --git a/docs/bert_training_curves_epoch1.png b/docs/bert_training_curves_epoch1.png
deleted file mode 100644
index 1939e50..0000000
Binary files a/docs/bert_training_curves_epoch1.png and /dev/null differ
diff --git a/docs/blog.fr.md b/docs/blog.fr.md
deleted file mode 100644
index 8b3fb20..0000000
--- a/docs/blog.fr.md
+++ /dev/null
@@ -1,235 +0,0 @@
-# ✨ Analyse de sentiments et déploiement MLOps : retour d’expérience complet
-
-Dans le cadre du projet *Air Paradis*, nous avons mis en œuvre une chaîne complète d’analyse de sentiments à partir de tweets, depuis la modélisation jusqu’au déploiement MLOps. Ce billet de blog revient sur les étapes clés du projet : choix méthodologiques, comparaison des modèles, mise en production d’une API robuste, et déploiement sur deux environnements (local + cloud). 🧠🔧
-
----
-
-## 🔍 Trois approches de modélisation supervisée
-
-Nous avons testé trois approches complémentaires pour prédire le sentiment d’un tweet. Chacune repose sur une représentation textuelle différente et un algorithme d’apprentissage adapté :
-
-### 1. 🧱 Approche simple : Bag-of-Words (BoW) + modèles de machine learning
-
-On vectorise les tweets via BoW ou BoW + TF-IDF, qui comptent la fréquence des mots.
-Contrairement à d'autres projets NLP, nous avons évité LDA (non supervisé, orienté topic modeling).
-
-➡️ **Modèles testés** :
-- Régression Logistique
-- Naive Bayes
-- SVM
-- Random Forest
-
-Ces modèles sont entraînés avec **GridSearchCV**, en optimisant la **précision (`precision`)**, notre KPI métier. Différents KPI ont été calculés sur l'ensemble de test.
-
-
-
----
-
-### 2. 🔥 Approche avancée : Word Embeddings + LSTM
-
-Nous utilisons des vecteurs denses Word2Vec (entraînés) et GloVe 300d (préentraînés par Stanford), qui capturent les similarités sémantiques entre mots. Ces représentations ne prennent toutefois **pas en compte le contexte** exact (ex : "annulé" est probablement un mot très négatif pour un vol mais positif pour un procès contenant des charges contre vous).
-
-La classification est réalisée par un **LSTM**, capable d'exploiter la séquentialité des mots.
-Le **modèle déployé est automatiquement sélectionné** entre Word2Vec + LSTM et GloVe + LSTM, selon la **précision maximale enregistrée dans MLFlow**.
-
-Modèle `Word2Vec + LSTM` (`test_precision : 0.797 , val_precision : 0.795`):
-
-Modèle `GloVe 300d + LSTM` (`test_precision : 0.792 , val_precision : 0.798`):
-
-
-Bien que GloVe 300d + LSTM présente un score de précision légèrement supérieur à Word2Vec + LSTM sur l'ensemble de validation, il reste inférieur pour l'ensemble de test (relativement négligeable dans l'absolu).
-
----
-
-### 3. 🤖 Approche transformer : DistilBERT, embeddings contextuels allégés
-
-Nous avons utilisé **DistilBERT**, une version plus légère et plus rapide de BERT (créée par Hugging Face).
-Il conserve **95 % de la performance de BERT** tout en étant **40 % plus petit** et **60 % plus rapide**, ce qui le rend particulièrement adapté à un **entraînement sur GPU limité** (Google Colab) et à une **inférence plus rapide**.
-
-Comme BERT, DistilBERT produit des **embeddings contextuels**, c’est-à-dire que le sens des mots varie selon leur contexte. Par exemple, *"banque"* dans *"je vais à la banque"* et *"banque de données"* n’aura pas le même vecteur.
-
-Il a été **fine-tuné** ici pour une classification binaire (positif/négatif), avec un tokenizer et un encodage spécifiques à son architecture.
-
-> **Modèle `DistilBERT`** (`test_precision : 0.861 , val_precision : 0.858`)
-
-
-
-
-
-⚠️ **Limites** : comme tous les modèles préentraînés, DistilBERT **n’est pas sensible à l’ironie, aux jeux de mots, ni aux références culturelles implicites**.
-Or, Twitter est un terrain de jeu idéal pour ce genre de contenus détournés. Ces limites s’appliquent aussi à Word2Vec, GloVe et aux modèles classiques.
-
----
-
-## 🎯 Pourquoi optimiser la précision (et non l'accuracy) ?
-
-**Accuracy** = proportion de bonnes prédictions globales.
-**Precision** = proportion de tweets *prévus positifs* qui sont *vraiment positifs*.
-
-> Exemple : sur 100 tweets, si le modèle prédit 30 positifs, mais 15 sont des erreurs, la précision est de 50 %.
-
-Nous avons préféré **minimiser les faux positifs**, car dans un contexte sensible, **annoncer un tweet positif alors qu’il est négatif peut être problématique**.
-
-- Modèles classiques : **GridSearchCV optimisé sur la précision**
-- Modèles DL : **EarlyStopping sur val_loss**, mais **sélection finale sur la précision**
-
----
-
-## ⚙️ Environnement MLOps souverain
-
-### 🖥️ Serveur personnel NAS + OpenMediaVault
-
-MLFlow est installé sur un **NAS personnel (Intel N100)**, sous **OpenMediaVault (Debian)**.
-Nous utilisons **MinIO** pour stocker artefacts et modèles, garantissant une gestion locale, souveraine et compatible S3.
-
-> Les notebooks, exécutés sur Google Colab pour bénéficier de GPU, loggent dans MLFlow et envoient les modèles vers MinIO via des **variables d’environnement**.
-
-Dashboard Expériences MLFlow :
-
-
-Modèles en production (registre de modèles):
-
-
-Meilleur modèle non BERT retenu :
-
-
----
-
-## 🧪 CI, tests et versioning
-
-### ✅ Tests unitaires
-
-- Vérifient le bon fonctionnement du prétraitement, des prédictions et de la gestion d’erreurs.
-- Intégrés à **GitHub Actions**, **ils bloquent le déploiement si les tests échouent.**
-
-### 🐳 Conteneurisation & CI/CD
-
-L’API FastAPI est packagée via Docker, puis poussée sur DockerHub.
-Un [pipeline CI/CD](https://github.com/GrgMdmn/OpenClassrooms_AI_Projects/blob/main/.github/workflows/p7_ci-cd.yml) complet garantit **un déploiement reproductible**. Il assure:
-- La validation de tests unitaires
-- La construction et le push de l'api conteneurisée sur [dockerhub](https://hub.docker.com/r/grgmdmn/sentiment_api)
-
-
----
-
-## 🚀 Déploiement de l’API FastAPI (double)
-
-### 🔧 Backend : FastAPI
-
-- Expose un endpoint `/predict`
-- Charge dynamiquement le **meilleur modèle Word Embedding + LSTM** via le *Model Registry* MLFlow
-- Applique les bons embeddings selon le tag `embedding_type`
-
-### 💻 Interface Streamlit
-
-Interface locale pour tester les requêtes, debug, démonstrations.
-
-
-
----
-
-### 🌐 Double déploiement (NAS + Google Cloud)
-
-#### 🔧 Problème AVX2
-
-Initialement, l’API ne fonctionnait pas sur le NAS (processeur Intel N100), car celui-ci ne prenait pas en charge les instructions **AVX2**, requises par TensorFlow.
-
-> 🛠️ **Solution** : activation manuelle du support AVX2 dans le BIOS. Cette option est souvent désactivée par défaut sur les cartes mères orientées NAS pour des raisons de consommation énergétique ou de stabilité.
-
-Depuis cette modification, le NAS peut exécuter l’API sans erreurs.
-
----
-
-#### 🚀 API déployées
-
-Le projet propose un **double déploiement** de l’API, en local et dans le cloud :
-
-- 🏠 **NAS local** : [sentiment-api.greg-madman-nas.duckdns.org](https://sentiment-api.greg-madman-nas.duckdns.org)\
-Interface Docker Compose sur le NAS :
-
-
-- ☁️ **Google Cloud Run** : [sentiment-api-service-7772256003.europe-west1.run.app](https://sentiment-api-service-7772256003.europe-west1.run.app)\
-Interface de déploiement Google Cloud :
-
-
----
-
-#### 🔄 Déploiement continu automatisé (NAS uniquement)
-
-Pour assurer un **déploiement continu** sur le NAS, il a été choisi d'installer [**Watchtower**](https://containrrr.dev/watchtower/arguments/) pour rester dans un logique d'environnement 100% `docker`. Cet outil surveille toutes les **10 minutes** l’image Docker de l’API (`sentiment_api`) et, en cas de nouvelle version disponible sur DockerHub, redémarre automatiquement le conteneur avec la dernière image.
-
-
-Ce mécanisme garantit que la version déployée sur le NAS reste toujours synchronisée avec la dernière version validée par les tests sur GitHub Actions, **sans intervention manuelle**.
-
-
-Un **système d’alerte mail** notifie automatiquement toute mise à jour effectuée.
-
-
----
-
-## 📊 Monitoring maison
-
-Une logique d’alerte légère embarquée dans l’API :
-
-
-
-
-
-
-
-
-Si **3 erreurs de prédiction** consécutives sont détectées sur une **fenêtre de 5 min**, un rapport est généré automatiquement.
-
-
-
-
-
----
-
-## 🧠 Schéma global du pipeline MLOps
-
-### Schéma synthétique
-```
- ┌────────────┐
- │ Données │
- │ (tweets) │
- └─────┬──────┘
- │
- Prétraitement (regex, tokenisation, lemmatisation, stopwords)
- │
- ┌─────────▼──────────┐
- │ Entraînement ML │
- └─────────┬──────────┘
- │
- Log via MLFlow + artefacts MinIO
- │
- Sélection du meilleur modèle "avancé" (hors BERT) selon précision
- │
- ┌─────────▼──────────┐
- │ API FastAPI │
- │ + Streamlit │
- └─────────┬──────────┘
- │
- Déploiement :
- ├─ Google Cloud Run (manuel)
- └─ NAS local (automatisé via Watchtower)
- │
-┌──────────▼─────────────┐
-│ Monitoring léger maison│
-│ (alertes sur mauvaises │
-│ prédictions) │
-└────────────────────────┘
-```
-### Schéma détaillé
-
-
----
-
-## ✨ Conclusion
-
-Ce projet démontre comment construire une chaîne MLOps complète, autonome et reproductible pour du NLP appliqué à Twitter.
-Il souligne les **forces et limites des modèles** (y compris BERT), la nécessité d’une métrique adaptée au contexte (précision vs accuracy), et l’importance d’un **déploiement maîtrisé**, même sur une infrastructure personnelle.
-
----
-
-💬 Merci pour votre lecture !
\ No newline at end of file
diff --git a/docs/blog.md b/docs/blog.md
deleted file mode 100644
index e386f4c..0000000
--- a/docs/blog.md
+++ /dev/null
@@ -1,245 +0,0 @@
-# ✨ Sentiment Analysis and MLOps Deployment: A Complete Experience Report
-
-As part of the *Air Paradis* project, we implemented a full sentiment analysis pipeline from tweets, covering everything from modeling to MLOps deployment. This blog post reviews the key project stages: methodological choices, model comparison, deployment of a robust API, and deployment on two environments (local + cloud). 🧠🔧
-
----
-
-## 🔍 Three Supervised Modeling Approaches
-
-We tested three complementary approaches to predict the sentiment of a tweet. Each relies on a different text representation and a suitable learning algorithm:
-
-### 1. 🧱 Simple Approach: Bag-of-Words (BoW) + Machine Learning Models
-
-Tweets are vectorized using BoW or BoW + TF-IDF, which count word frequencies.
-Unlike other NLP projects, we avoided LDA (unsupervised, topic modeling oriented).
-
-➡️ **Tested models**:
-- Logistic Regression
-- Naive Bayes
-- SVM
-- Random Forest
-
-These models are trained with **GridSearchCV**, optimizing **precision (`precision`)**, our key business KPI. Various KPIs were computed on the test set.
-
-
-
----
-
-### 2. 🔥 Advanced Approach: Word Embeddings + LSTM
-
-We use dense Word2Vec vectors (trained) and GloVe 300d (pretrained by Stanford), which capture semantic similarities between words. However, these representations **do not take into account the exact context** (e.g., "cancelled" is probably very negative for a flight but positive in a legal case with charges against you).
-
-Classification is done by an **LSTM**, capable of exploiting word sequentiality.
-The **deployed model is automatically selected** between Word2Vec + LSTM and GloVe + LSTM, according to the **highest precision recorded in MLFlow**.
-
-Model `Word2Vec + LSTM` (`test_precision: 0.797, val_precision: 0.795`):
-
-Model `GloVe 300d + LSTM` (`test_precision: 0.792, val_precision: 0.798`):
-
-
-Although GloVe 300d + LSTM shows a slightly better precision score on the validation set than Word2Vec + LSTM, it remains lower on the test set (relatively negligible overall).
-
----
-
-### 3. 🤖 Transformer Approach: DistilBERT, Lightweight Contextual Embeddings
-
-We used **DistilBERT**, a lighter and faster version of BERT (created by Hugging Face).
-It retains **95% of BERT's performance** while being **40% smaller** and **60% faster**, making it especially suited for **training on limited GPUs** (Google Colab) and **faster inference**.
-
-Like BERT, DistilBERT produces **contextual embeddings**, meaning word meanings vary depending on context. For example, *"bank"* in *"I go to the bank"* and *"database bank"* will not have the same vector.
-
-It was **fine-tuned** here for binary classification (positive/negative), with a tokenizer and encoding specific to its architecture.
-
-> **Model `DistilBERT`** (`test_precision: 0.861, val_precision: 0.858`)
-
-
-
-
-
-⚠️ **Limits**: Like all pretrained models, DistilBERT **is not sensitive to irony, puns, or implicit cultural references**.
-Twitter is an ideal playground for this kind of nuanced content. These limits also apply to Word2Vec, GloVe, and classical models.
-
----
-
-## 🎯 Why Optimize Precision (Not Accuracy)?
-
-**Accuracy** = overall proportion of correct predictions.
-**Precision** = proportion of *predicted positive* tweets that are *actually positive*.
-
-> Example: out of 100 tweets, if the model predicts 30 positives but 15 are wrong, precision is 50%.
-
-We preferred to **minimize false positives**, because in a sensitive context, **announcing a tweet as positive when it is negative can be problematic**.
-
-- Classical models: **GridSearchCV optimized for precision**
-- Deep Learning models: **EarlyStopping on val_loss**, but **final selection based on precision**
-
----
-
-## ⚙️ Sovereign MLOps Environment
-
-### 🖥️ Personal NAS Server + OpenMediaVault
-
-MLFlow is installed on a **personal NAS (Intel N100)** running **OpenMediaVault (Debian)**.
-We use **MinIO** to store artifacts and models, ensuring local, sovereign, and S3-compatible management.
-
-> Notebooks, run on Google Colab to leverage GPUs, log in MLFlow and send models to MinIO via **environment variables**.
-
-MLFlow Experiments Dashboard:
-
-
-Production Models (model registry):
-
-
-Best non-BERT selected model:
-
-
-
----
-
-## 🧪 CI, Testing and Versioning
-
-### ✅ Unit Tests
-
-- Check correct preprocessing, predictions, and error handling.
-- Integrated into **GitHub Actions**, **blocking deployment if tests fail.**
-
-### 🐳 Containerization & CI/CD
-
-The FastAPI API is packaged with Docker, then pushed to DockerHub.
-A full [CI/CD pipeline](https://github.com/GrgMdmn/OpenClassrooms_AI_Projects/blob/main/.github/workflows/p7_ci-cd.yml) guarantees **reproducible deployment**, ensuring:
-- Validation of unit tests
-- Build and push of the containerized API to [DockerHub](https://hub.docker.com/r/grgmdmn/sentiment_api)
-
-
-
----
-
-## 🚀 FastAPI API Deployment (Dual)
-
-### 🔧 Backend: FastAPI
-
-- Exposes a `/predict` endpoint
-- Dynamically loads the **best Word Embedding + LSTM model** via MLFlow Model Registry
-- Applies appropriate embeddings according to the `embedding_type` tag
-
-### 💻 Streamlit Interface
-
-Local interface for request testing, debugging, demonstrations.
-
-
-
----
-
-### 🌐 Dual Deployment (NAS + Google Cloud)
-
-#### 🔧 AVX2 Issue
-
-Initially, the API did not run on the NAS (Intel N100 CPU) because it did not support **AVX2 instructions**, required by TensorFlow.
-
-> 🛠️ **Solution**: manual activation of AVX2 support in BIOS. This option is often disabled by default on NAS motherboards for power consumption or stability reasons.
-
-Since this change, the NAS can run the API without errors.
-
----
-
-#### 🚀 Deployed APIs
-
-The project offers a **dual API deployment**, locally and in the cloud:
-
-- 🏠 **Local NAS**: [sentiment-api.greg-madman-nas.duckdns.org](https://sentiment-api.greg-madman-nas.duckdns.org)
-Docker Compose interface on the NAS:
-
-
-- ☁️ **Google Cloud Run**: [sentiment-api-service-7772256003.europe-west1.run.app](https://sentiment-api-service-7772256003.europe-west1.run.app)
-Google Cloud deployment interface:
-
-
----
-
-#### 🔄 Automated Continuous Deployment (NAS only)
-
-To ensure **continuous deployment** on the NAS, we chose to install [**Watchtower**](https://containrrr.dev/watchtower/arguments/) to maintain a 100% `docker` environment. This tool checks every **10 minutes** the Docker image of the API (`sentiment_api`) and, if a new version is available on DockerHub, automatically restarts the container with the latest image.
-
-
-This mechanism ensures that the version deployed on the NAS always stays synchronized with the latest version validated by GitHub Actions tests, **without manual intervention**.
-
-
-An **email alert system** automatically notifies any update performed.
-
-
-
----
-
-## 📊 Home-made Monitoring
-
-A lightweight alert logic embedded in the API:
-
-
-
-
-
-If **3 consecutive prediction errors** are detected within a **5-minute window**, a report is automatically generated.
-
-
-
----
-
-## 🧠 Overall MLOps Pipeline Diagram
-
-### Summary Diagram
-
-```
- ┌────────────┐
- │ Data │
- │ (tweets) │
- └─────┬──────┘
- │
- Preprocessing (regex, tokenization, lemmatization, stopwords)
- │
- ┌─────────▼──────────┐
- │ ML Training │
- └─────────┬──────────┘
- │
- Logging via MLFlow + artifacts MinIO
- │
- Select best "advanced" model (excluding BERT) by precision
- │
- ┌─────────▼──────────┐
- │ FastAPI │
- │ + Streamlit │
- └─────────┬──────────┘
- │
- Deployment:
- ├─ Google Cloud Run (manual)
- └─ Local NAS (automated via Watchtower)
- │
-┌──────────▼─────────────┐
-│ Lightweight in-house │
-│ Monitoring │
-│ (alerts on bad │
-│ predictions) │
-└────────────────────────┘
-
-```
-
-### Detailed Diagram
-
-
----
-
-## ✨ Conclusion
-
-This project demonstrates how to build a complete, autonomous, and reproducible MLOps pipeline for NLP applied to Twitter.
-It highlights the **strengths and limitations of the models** (including BERT), the need for a **metric adapted to the context** (precision vs accuracy), and the importance of **controlled deployment**, even on personal infrastructure.
-
----
-
-💬 Thank you for reading!
-
-
-
-
-
-
-
-Demander à ChatGPT
diff --git a/docs/diagram.drawio b/docs/diagram.drawio
deleted file mode 100644
index bc42c3f..0000000
--- a/docs/diagram.drawio
+++ /dev/null
@@ -1,301 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/diagram.drawio.png b/docs/diagram.drawio.png
deleted file mode 100644
index d684dc8..0000000
Binary files a/docs/diagram.drawio.png and /dev/null differ
diff --git a/docs/github_ci-cd.png b/docs/github_ci-cd.png
deleted file mode 100644
index 8f28b02..0000000
Binary files a/docs/github_ci-cd.png and /dev/null differ
diff --git a/docs/google_cloud_interface.png b/docs/google_cloud_interface.png
deleted file mode 100644
index fdb7b10..0000000
Binary files a/docs/google_cloud_interface.png and /dev/null differ
diff --git a/docs/mlflolw_experiments_dashboard_best_LSTM_model.png b/docs/mlflolw_experiments_dashboard_best_LSTM_model.png
deleted file mode 100644
index 540b772..0000000
Binary files a/docs/mlflolw_experiments_dashboard_best_LSTM_model.png and /dev/null differ
diff --git a/docs/mlflow_experiments_dashboard.png b/docs/mlflow_experiments_dashboard.png
deleted file mode 100644
index 333d182..0000000
Binary files a/docs/mlflow_experiments_dashboard.png and /dev/null differ
diff --git a/docs/mlflow_models_registry.png b/docs/mlflow_models_registry.png
deleted file mode 100644
index 62fd862..0000000
Binary files a/docs/mlflow_models_registry.png and /dev/null differ
diff --git a/docs/mlflow_models_registry_2.png b/docs/mlflow_models_registry_2.png
deleted file mode 100644
index d5aad33..0000000
Binary files a/docs/mlflow_models_registry_2.png and /dev/null differ
diff --git a/docs/mlflow_models_registry_best_LSTM_model.png b/docs/mlflow_models_registry_best_LSTM_model.png
deleted file mode 100644
index c311724..0000000
Binary files a/docs/mlflow_models_registry_best_LSTM_model.png and /dev/null differ
diff --git a/docs/openmediavault_docker-compose_settings.png b/docs/openmediavault_docker-compose_settings.png
deleted file mode 100644
index 5760417..0000000
Binary files a/docs/openmediavault_docker-compose_settings.png and /dev/null differ
diff --git a/docs/streamlit_interface_google_cloud.png b/docs/streamlit_interface_google_cloud.png
deleted file mode 100644
index 445b755..0000000
Binary files a/docs/streamlit_interface_google_cloud.png and /dev/null differ
diff --git a/docs/streamlit_interface_local.png b/docs/streamlit_interface_local.png
deleted file mode 100644
index 84c35c2..0000000
Binary files a/docs/streamlit_interface_local.png and /dev/null differ
diff --git a/docs/streamlit_interface_nas.png b/docs/streamlit_interface_nas.png
deleted file mode 100644
index 8603cf5..0000000
Binary files a/docs/streamlit_interface_nas.png and /dev/null differ
diff --git a/docs/watchtower_docker.png b/docs/watchtower_docker.png
deleted file mode 100644
index d286723..0000000
Binary files a/docs/watchtower_docker.png and /dev/null differ
diff --git a/docs/watchtower_logs.png b/docs/watchtower_logs.png
deleted file mode 100644
index b37d388..0000000
Binary files a/docs/watchtower_logs.png and /dev/null differ
diff --git a/docs/watchtower_logs_by_email.png b/docs/watchtower_logs_by_email.png
deleted file mode 100644
index 9f2084d..0000000
Binary files a/docs/watchtower_logs_by_email.png and /dev/null differ
diff --git a/functions.py b/functions.py
deleted file mode 100644
index 97e2f7f..0000000
--- a/functions.py
+++ /dev/null
@@ -1,125 +0,0 @@
-import re
-import html
-import numpy as np
-import pandas as pd
-from multiprocessing import Pool
-
-# NLTK imports for NLP preprocessing
-import nltk
-from nltk.corpus import stopwords
-from nltk.tokenize import word_tokenize
-from nltk.stem import WordNetLemmatizer
-
-# Ensure necessary NLTK resources are downloaded and available
-try:
- stopwords.words('english')
- word_tokenize("test")
- WordNetLemmatizer().lemmatize("testing")
-except LookupError:
- nltk.download('punkt') # Tokenizer models
- nltk.download('punkt_tab') # Additional tokenizer support
- nltk.download('stopwords') # Stopwords lists
- nltk.download('wordnet') # WordNet lexicon for lemmatization
- nltk.download('omw-1.4') # WordNet lemmas data
-
-# Convert sentiment labels to binary: 0 for negative, 1 for all other classes
-def convert_sentiment_label(df):
- """
- Convert the 'target' column in the DataFrame to binary sentiment labels:
- - 0 for negative sentiment (label 0)
- - 1 for any other sentiment label
- Returns a new DataFrame with updated labels.
- """
- converted_target_data = df.copy()
- converted_target_data['target'] = converted_target_data['target'].apply(lambda x: 0 if x == 0 else 1)
- return converted_target_data
-
-# Downsample the dataset to balance classes by limiting samples per class
-def downsample_data(df, n_samples=50000, random_state=42):
- """
- Perform downsampling to balance dataset classes.
- Selects `n_samples` examples from both negative (0) and positive (1) classes.
- Returns a balanced DataFrame with equal number of samples per class.
- """
- negative_samples = df[df['target'] == 0].sample(n=n_samples, random_state=random_state)
- positive_samples = df[df['target'] == 1].sample(n=n_samples, random_state=random_state)
- downsampled_data = pd.concat([negative_samples, positive_samples])
- return downsampled_data
-
-# PREPROCESSING FUNCTION FOR CLASSIC AND ADVANCED MODELS
-def preprocess_tweet(tweet):
- """
- Preprocess a tweet for classic ML or word embedding models (e.g., Word2Vec, GloVe).
- Steps:
- - Normalize text (lowercase)
- - Replace URLs and mentions with tokens
- - Decode HTML entities
- - Remove unwanted special characters and non-printable chars
- - Tokenize text
- - Lemmatize tokens
- - Remove stopwords except negation words
- Returns cleaned, normalized text as a single string.
- """
-
- # Ensure input is a string
- if not isinstance(tweet, str):
- return ""
-
- # Decode HTML entities (e.g., & to &)
- tweet = html.unescape(tweet)
-
- # Convert to lowercase
- tweet = tweet.lower()
-
- # Replace URLs with placeholder token
- tweet = re.sub(r'https?://\S+|www\.\S+', '', tweet)
-
- # Replace user mentions with placeholder token
- tweet = re.sub(r'@\w+', '', tweet)
-
- # Separate hashtags from words to facilitate tokenization
- tweet = re.sub(r'#(\w+)', r'# \1', tweet)
-
- # Remove unwanted punctuation and special characters except some useful ones
- tweet = re.sub(r'[^\w\s<>@#!?]', '', tweet)
-
- # Remove non-printable and control characters (e.g., tabs, newlines, emojis)
- tweet = re.sub(r'[^\x20-\x7E]', '', tweet)
-
- # Tokenize tweet into words
- tokens = word_tokenize(tweet)
-
- # Lemmatize tokens to their base form
- lemmatizer = WordNetLemmatizer()
- tokens = [lemmatizer.lemmatize(token) for token in tokens]
-
- # Remove stopwords but keep negation-related words to preserve sentiment meaning
- stop_words = set(stopwords.words('english'))
- important_words = {'no', 'not', 'nor', 'neither', 'never', 'nobody', 'none', 'nothing', 'nowhere'}
- stop_words = stop_words - important_words
- tokens = [token for token in tokens if token not in stop_words]
-
- # Rebuild cleaned tweet text
- return ' '.join(tokens)
-
-# Parallel processing of a DataFrame using multiple CPU cores
-def process_in_parallel(df, func, n_jobs=4):
- """
- Split a DataFrame into `n_jobs` parts and apply `func` to each part in parallel,
- using multiprocessing Pool for speed-up.
- Returns the concatenated processed DataFrame.
- """
- df_split = np.array_split(df, n_jobs)
- with Pool(n_jobs) as pool:
- df = pd.concat(pool.map(func, df_split))
- return df
-
-# Apply preprocessing function on a DataFrame partition
-def apply_preprocessing(df_part):
- """
- Apply tweet preprocessing to the 'text' column of a DataFrame partition.
- Stores results in a new column 'processed_text'.
- Returns the updated DataFrame partition.
- """
- df_part['processed_text'] = df_part['text'].apply(preprocess_tweet)
- return df_part
diff --git a/notebooks/README.fr.md b/notebooks/README.fr.md
deleted file mode 100644
index 503b425..0000000
--- a/notebooks/README.fr.md
+++ /dev/null
@@ -1,46 +0,0 @@
-# Notebooks
-
-Ce dossier contient les notebooks Jupyter utilisés pour le développement des modèles et les analyses du projet.
-
-## Contenu
-
-- Analyse exploratoire des données
-- Modèles classiques (régression logistique, SVM, etc.)
-- Modèles avancés (LSTM avec embeddings GloVe)
-- Modèle BERT
-
-## Note concernant les fichiers requirements
-
-Les fichiers `*requirements.txt` ont été générés depuis un environnement Google Colab. Cet environnement inclut de nombreuses librairies préinstallées, dont toutes ne sont pas nécessaires au projet.
-
-Un nettoyage manuel ou une génération spécifique des fichiers requirements sera nécessaire pour alléger ces fichiers avant un usage en production ou un déploiement.
-
----
-
-## Résumé des performances des modèles
-
-### Modèles classiques (entraînés sur 200 000 tweets)
-
-| Modèle | Précision | Temps d'entraînement|
-|--------------------------------|-----------|---------------------|
-| Random Forest + BoW | 0,7798 | ~5 heures |
-| Régression logistique + TF-IDF | 0,7796 | <2 minutes |
-
-### Modèles avancés basés sur des embeddings (entraînés sur 200 000 tweets, accélérés GPU sur Google Colab)
-
-| Modèle | Précision | Temps d'entraînement|
-|------------------------|-----------|---------------------|
-| Word2Vec + LSTM | 0,797 | 57 secondes |
-| GloVe (300d) + LSTM | 0,792 | 47 secondes |
-
-### Modèle de pointe (entraîné sur 100 000 tweets en raison des limites RAM)
-
-| Modèle | Précision | Temps d'entraînement|
-|---------|-----------|---------------------|
-| BERT | 0,882 | 1,3 minutes |
-
----
-
-Ce résumé met en lumière les compromis entre précision des modèles et temps d’entraînement. Si les modèles classiques sont plus rapides à entraîner, les modèles avancés utilisant des embeddings et LSTM offrent une meilleure précision, avec BERT qui atteint la meilleure précision malgré un jeu de données plus restreint.
-
-L’écart de précision entre BERT et les modèles à embeddings peut s’expliquer principalement par la capacité bidirectionnelle de BERT à comprendre le contexte.
diff --git a/notebooks/README.md b/notebooks/README.md
deleted file mode 100644
index c3b0f04..0000000
--- a/notebooks/README.md
+++ /dev/null
@@ -1,46 +0,0 @@
-# Notebooks
-
-This folder contains the Jupyter notebooks used for model development and analyses in the project.
-
-## Contents
-
-- Exploratory Data Analysis
-- Classical Models (logistic regression, SVM, etc.)
-- Advanced Models (LSTM with GloVe embeddings)
-- BERT Model
-
-## Note on requirements files
-
-The `*requirements.txt` files were generated from a Google Colab environment. This environment includes many pre-installed libraries, not all necessary for the project.
-
-Manual cleanup or specific generation of requirements files will be needed to slim down these files before production use or deployment.
-
----
-
-## Model Performance Summary
-
-### Classical Models (trained on 200,000 tweets)
-
-| Model | Precision | Training Time |
-|------------------------------|-----------|-----------------|
-| Random Forest + BoW | 0.7798 | ~5 hours |
-| Logistic Regression + TF-IDF | 0.7796 | <2 minutes |
-
-### Advanced Models based on word-embeddings (trained on 200,000 tweets, GPU accelerated on Google Colab)
-
-| Model | Precision | Training Time |
-|------------------------|-----------|---------------|
-| Word2Vec + LSTM | 0.797 | 57 seconds |
-| GloVe (300d) + LSTM | 0.792 | 47 seconds |
-
-### State-of-the-art Model (trained on 100,000 tweets due to RAM limits)
-
-| Model | Precision | Training Time |
-|--------|-----------|---------------|
-| BERT | 0.882 | 1.3 minutes |
-
----
-
-This summary highlights the trade-offs between model precision and training time. While the classical models are faster to train, advanced models leveraging embeddings and LSTM yield better precision, with BERT achieving the highest precision despite being trained on a smaller dataset.
-
-The precision offset between BERT and word embeddings models may mainly be due to the BERT bidirectionnal context abilities.
diff --git a/notebooks/notebook-connexion-mlflow.ipynb b/notebooks/notebook-connexion-mlflow.ipynb
deleted file mode 100644
index 479ba6a..0000000
--- a/notebooks/notebook-connexion-mlflow.ipynb
+++ /dev/null
@@ -1 +0,0 @@
-{"cells":[{"cell_type":"markdown","metadata":{"id":"fm2J3uruLfrX"},"source":["# Connexion au serveur MLFlow - Test et Configuration Locale\n","\n","Ce notebook permet de **tester la connexion à un serveur MLFlow déployé localement via Docker sur un NAS/Serveur personnel**. Il est conçu pour vérifier que toutes les configurations sont correctes et que nous pouvons commencer à suivre nos expériences de machine learning\n",".\n","## Prérequis\n","\n","Avant d'exécuter ce notebook, assurez-vous d'avoir :\n","- Un serveur MLFlow déployé localement via Docker sur votre NAS. Il sera important d'installer dans le conteneur la librairie boto3 pour que MLFlow puisse échanger avec un serveur de type AWS pour le stockage des artefacts.\n","- Un serveur MinIO (compatible S3) déployé localement via Docker pour le stockage des artefacts et qui remplacera les Amazon Web Services (AWS).\n","- Les informations de connexion nécessaires (URI de tracking, identifiants MinIO).\n","- Les ports 5000 (MLFlow) et 9000 (MinIO API) correctement exposés et/ou gérés par un reverse proxy (SWAG).\n","\n","## Configuration des variables d'environnement dans Jupyter Notebook / Google Collab\n","\n","Pour une connexion réussie, vous devez définir les variables d'environnement dans un fichier `.env` qui sera chargé via la librairie dotenv dans le répertoire courant. Ces variables seront utilisées par la bibliothèque MLflow pour communiquer avec vos services.\n","\n","Voici les variables essentielles à configurer (urls locaux en guise d'exemple) :\n","\n","```\n","MLFLOW_TRACKING_URI=http://mlflow:5000\n","MLFLOW_S3_ENDPOINT_URL=http://minio:9000\n","AWS_ACCESS_KEY_ID=minioadmin\n","AWS_SECRET_ACCESS_KEY=minioadminpassword\n","```\n","\n","Remplacez les valeurs par vos propres informations de connexion.\n","\n","Note : minio possède deux ports :\n","- 9001 pour accéder à l'interface web et gérer le stockage / nettoyage d'artefacts\n","- 9000 qui est l'api qui sera requêté pour l'envoi de buckets S3 par la librairie mlflow\n","\n","## Étapes du test\n","\n","Ce notebook effectue les opérations suivantes :\n","1. Chargement des variables d'environnement depuis le fichier `.env`\n","2. Configuration de MLFlow avec ces variables\n","3. Tentative de connexion au serveur MLFlow\n","4. Récupération de la liste des expériences existantes\n","5. Création d'une expérience si elle n'existe pas déjà\n","6. Enregistrement de métriques test pour vérifier le bon fonctionnement\n","\n","## Résolution des problèmes courants\n","\n","Notez que si vous utilisez des notebooks Google Collab, il est **nécessaire** que votre serveur MLFlow ainsi que l'API de MinIO soient accessibles via un lien public. Vous pouvez simplement ouvrir les ports de votre modem ou, pour plus de sécurité, configurer un reverse proxy (type SWAG pour la gestion et délivrance automatique de certificats SSL). Cette étape ne sera pas développée ici.\n","\n","Notez également que si vous désactivez votre docker MLFlow et le réactivez (par exemple suite à un redémarrage), les expériences seront par défaut perdues. Pour qu'elles soient persistantes, il faudra rajouter dans le yaml du docker l'argument de commande ainsi que le volume suivants :\n","- ` - --backend-store-uri ` \\\n"," ` - sqlite:////mlflow/mlflow.db # <-- pointe vers le volume monté `\n","- ` - ./mlflow-data:/mlflow # Monte un volume local pour préserver mlflow.db`\n","\n","Si vous rencontrez des erreurs lors de la connexion, vérifiez :\n","- Que l'URI de tracking est correct et accessible\n","- Que vos identifiants AWS sont valides (si applicable)\n","- Que le serveur MLFlow est bien en cours d'exécution\n","- Vos paramètres réseau (pare-feu, VPN, etc.)"]},{"cell_type":"code","source":["!pip install mlflow boto3 dotenv --quiet"],"metadata":{"id":"wPht9-36CMzs"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["from google.colab import drive\n","drive.mount('/content/drive')\n","import os\n","drive_folder= \"/content/drive/MyDrive/Colab_Notebooks/Project_7/notebooks\"\n","os.chdir(drive_folder)\n","# os.listdir()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"XkhsbZ5Xc3De","executionInfo":{"status":"ok","timestamp":1751547034150,"user_tz":-120,"elapsed":953,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"7d340543-c848-47da-f5cd-4360a62f5571"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"]}]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"4DKFKUC8LfrY","executionInfo":{"status":"ok","timestamp":1751547035465,"user_tz":-120,"elapsed":1313,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"a2c423b4-6e57-4f78-9839-3beed6c39ea1"},"outputs":[{"output_type":"stream","name":"stdout","text":["MLflow Tracking URI: https://mlflow.greg-madman-nas.duckdns.org/\n","Identifiants AWS configurés\n","Tentative de connexion à MLflow...\n","Connexion à MLflow réussie! Nombre d'expériences existantes: 3\n"," - Demo PC (ID: 2)\n"," - OC Projet 7 (ID: 1)\n"," - Default (ID: 0)\n","Expérience existante trouvée: 'Demo PC' (ID: 2)\n","Démarrage d'un run MLflow de test...\n","Métrique de test enregistrée avec succès!\n","🏃 View run test_connexion_simple at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/2/runs/3127176c596441c48e34590d27494b56\n","🧪 View experiment at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/2\n","Test terminé avec succès. Vous pouvez vérifier les résultats sur: https://mlflow.greg-madman-nas.duckdns.org/\n"]}],"source":["import os\n","import mlflow\n","from dotenv import load_dotenv\n","\n","# Charger les variables d'environnement depuis le fichier .env\n","load_dotenv(dotenv_path='../.env')\n","\n","# Configuration de MLflow avec les variables d'environnement\n","mlflow_tracking_uri = os.getenv(\"MLFLOW_TRACKING_URI\")\n","mlflow_s3_endpoint_url = os.getenv(\"MLFLOW_S3_ENDPOINT_URL\")\n","aws_access_key_id = os.getenv(\"AWS_ACCESS_KEY_ID\")\n","aws_secret_access_key = os.getenv(\"AWS_SECRET_ACCESS_KEY\")\n","\n","print(f\"MLflow Tracking URI: {mlflow_tracking_uri}\")\n","\n","# Configuration explicite des identifiants AWS pour MLflow\n","os.environ[\"MLFLOW_S3_ENDPOINT_URL\"] = mlflow_s3_endpoint_url\n","os.environ[\"AWS_ACCESS_KEY_ID\"] = aws_access_key_id\n","os.environ[\"AWS_SECRET_ACCESS_KEY\"] = aws_secret_access_key\n","print(\"Identifiants AWS configurés\")\n","\n","# Configuration de MLflow\n","try:\n"," print(\"Tentative de connexion à MLflow...\")\n"," mlflow.set_tracking_uri(mlflow_tracking_uri)\n","\n"," # Liste des expériences pour vérifier la connexion\n"," exps = mlflow.search_experiments()\n"," print(f\"Connexion à MLflow réussie! Nombre d'expériences existantes: {len(exps)}\")\n"," for exp in exps:\n"," print(f\" - {exp.name} (ID: {exp.experiment_id})\")\n","\n"," # Définir le nom de l'expérience\n"," experiment_name = \"Demo PC\"\n","\n"," # Obtenir ou créer l'expérience\n"," experiment = mlflow.get_experiment_by_name(experiment_name)\n"," if experiment is None:\n"," experiment_id = mlflow.create_experiment(experiment_name)\n"," print(f\"Nouvelle expérience créée: '{experiment_name}' (ID: {experiment_id})\")\n"," else:\n"," experiment_id = experiment.experiment_id\n"," print(f\"Expérience existante trouvée: '{experiment_name}' (ID: {experiment_id})\")\n","\n"," # Démarrer un simple run et enregistrer une métrique\n"," with mlflow.start_run(experiment_id=experiment_id, run_name=\"test_connexion_simple\"):\n"," print(\"Démarrage d'un run MLflow de test...\")\n"," mlflow.log_param(\"test_param\", \"valeur_test\")\n"," mlflow.log_metric(\"test_metric\", 1.0)\n"," print(\"Métrique de test enregistrée avec succès!\")\n","\n"," print(f\"Test terminé avec succès. Vous pouvez vérifier les résultats sur: {mlflow_tracking_uri}\")\n","\n","except Exception as e:\n"," print(f\"Erreur lors de la connexion à MLflow: {e}\")\n"," print(\"\\nConseils de débogage:\")\n"," print(\"1. Vérifiez que l'URI de tracking est correct et accessible\")\n"," print(\"2. Vérifiez que vos identifiants AWS sont valides si vous utilisez S3\")\n"," print(\"3. Vérifiez que le serveur MLflow est en cours d'exécution\")\n"," print(\"4. Vérifiez les paramètres réseau (pare-feu, VPN, etc.)\")"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"nPI-3ULPLfrZ","executionInfo":{"status":"ok","timestamp":1751547035628,"user_tz":-120,"elapsed":159,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"fcc2197b-0474-4365-8122-f116dff4f562"},"outputs":[{"output_type":"stream","name":"stdout","text":["MLflow Tracking URI: https://mlflow.greg-madman-nas.duckdns.org/\n","Identifiants AWS configurés\n"]}],"source":["import os\n","import mlflow\n","from mlflow.models import infer_signature\n","from mlflow import MlflowClient\n","from dotenv import load_dotenv\n","\n","import pandas as pd\n","import numpy as np\n","from sklearn import datasets\n","from sklearn.model_selection import train_test_split\n","from sklearn.linear_model import LogisticRegression\n","from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix\n","import matplotlib.pyplot as plt\n","import seaborn as sns\n","\n","# Charger les variables d'environnement depuis le fichier .env\n","load_dotenv()\n","\n","# Configuration de MLflow avec les variables d'environnement\n","mlflow_tracking_uri = os.getenv(\"MLFLOW_TRACKING_URI\")\n","mlflow_s3_endpoint_url = os.getenv(\"MLFLOW_S3_ENDPOINT_URL\")\n","aws_access_key_id = os.getenv(\"AWS_ACCESS_KEY_ID\")\n","aws_secret_access_key = os.getenv(\"AWS_SECRET_ACCESS_KEY\")\n","\n","# Configuration explicite de MLflow\n","mlflow.set_tracking_uri(mlflow_tracking_uri)\n","print(f\"MLflow Tracking URI: {mlflow_tracking_uri}\")\n","\n","# Configuration explicite des identifiants AWS\n","os.environ[\"MLFLOW_S3_ENDPOINT_URL\"] = mlflow_s3_endpoint_url\n","os.environ[\"AWS_ACCESS_KEY_ID\"] = aws_access_key_id\n","os.environ[\"AWS_SECRET_ACCESS_KEY\"] = aws_secret_access_key\n","print(\"Identifiants AWS configurés\")\n","\n","# Create a new MLflow Experiment\n","mlflow.set_experiment(\"Demo PC\")\n","\n","# Define the output directory\n","output_dir = \"./content/mlflow_test/\"\n","\n","# Create the output directory if it doesn't exist\n","if not os.path.exists(output_dir):\n"," os.makedirs(output_dir)\n"," print(f\"Output directory created: {output_dir}\")"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"OC0vEu6HLfra","executionInfo":{"status":"ok","timestamp":1751547053654,"user_tz":-120,"elapsed":18024,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"10d22f5d-eb1e-47e2-ea3f-61e8307536db"},"outputs":[{"output_type":"stream","name":"stdout","text":["Chargement du dataset Iris...\n","Aperçu du dataset:\n"," sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \\\n","0 5.1 3.5 1.4 0.2 \n","1 4.9 3.0 1.4 0.2 \n","2 4.7 3.2 1.3 0.2 \n","3 4.6 3.1 1.5 0.2 \n","4 5.0 3.6 1.4 0.2 \n","\n"," target \n","0 0.0 \n","1 0.0 \n","2 0.0 \n","3 0.0 \n","4 0.0 \n","Dimensions du dataset: (150, 5)\n","Taille de l'ensemble d'entraînement: (120, 4)\n","Taille de l'ensemble de test: (30, 4)\n","Démarrage du run MLflow avec l'ID: c9e768a9ca904c55a963f03568e43ecb\n","Entraînement du modèle de régression logistique...\n","Métriques: Accuracy=1.0000, Precision=1.0000, Recall=1.0000, F1=1.0000\n"]},{"output_type":"stream","name":"stderr","text":["2025/07/03 12:50:45 WARNING mlflow.models.model: `artifact_path` is deprecated. Please use `name` instead.\n"]},{"output_type":"stream","name":"stdout","text":["Modèle enregistré: models:/m-abf8c8b98d6f4d60aa9898de7ee6a795\n","🏃 View run iris_classification at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/2/runs/c9e768a9ca904c55a963f03568e43ecb\n","🧪 View experiment at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/2\n","\n","🏃 MLflow Run Infos :\n","⚗️ run_id: c9e768a9ca904c55a963f03568e43ecb\n","⚡ artifacts: ['model/MLmodel', 'model/conda.yaml', 'model/input_example.json', 'model/model.pkl', 'model/python_env.yaml', 'model/requirements.txt', 'model/serving_input_example.json']\n","⚙️ params: {'solver': 'lbfgs', 'max_iter': '1000', 'random_state': '8888'}\n","📝 metrics: {'accuracy': 1.0, 'precision': 1.0, 'recall': 1.0, 'f1_score': 1.0}\n","🏷️ tags: {'model_type': 'LogisticRegression', 'dataset': 'Iris', 'description': 'Classification multiclasse des fleurs Iris'}\n","\n"]}],"source":["# Fonction pour afficher les informations du run MLflow\n","def print_logged_info(r):\n"," print(\"\")\n"," print(\"🏃 MLflow Run Infos :\")\n"," tags = {k: v for k, v in r.data.tags.items() if not k.startswith(\"mlflow.\")}\n"," artifacts = [f.path for f in MlflowClient().list_artifacts(r.info.run_id, \"model\")]\n"," print(f\"⚗️ run_id: {r.info.run_id}\")\n"," print(f\"⚡ artifacts: {artifacts}\")\n"," print(f\"⚙️ params: {r.data.params}\")\n"," print(f\"📝 metrics: {r.data.metrics}\")\n"," print(f\"🏷️ tags: {tags}\")\n"," print()\n","\n","# Chargement du dataset Iris\n","print(\"Chargement du dataset Iris...\")\n","iris = datasets.load_iris()\n","X, y = iris.data, iris.target\n","\n","# Conversion en DataFrame pour une meilleure visualisation\n","iris_df = pd.DataFrame(data=np.c_[iris['data'], iris['target']],\n"," columns=iris['feature_names'] + ['target'])\n","print(f\"Aperçu du dataset:\\n{iris_df.head()}\")\n","print(f\"Dimensions du dataset: {iris_df.shape}\")\n","\n","# Créer une figure pour visualiser la distribution des classes\n","plt.figure(figsize=(8, 6))\n","sns.countplot(x='target', data=iris_df)\n","plt.title('Distribution des classes du dataset Iris')\n","# Save the figure in the output directory\n","plt.savefig(os.path.join(output_dir, 'iris_class_distribution.png'))\n","plt.close()\n","\n","# Division en ensembles d'entraînement et de test\n","X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n","print(f\"Taille de l'ensemble d'entraînement: {X_train.shape}\")\n","print(f\"Taille de l'ensemble de test: {X_test.shape}\")\n","\n","# Définition des hyperparamètres du modèle\n","params = {\n"," \"solver\": \"lbfgs\",\n"," \"max_iter\": 1000,\n"," \"random_state\": 8888,\n","}\n","\n","# Démarrer un run MLflow\n","with mlflow.start_run(run_name=\"iris_classification\") as run:\n"," print(f\"Démarrage du run MLflow avec l'ID: {run.info.run_id}\")\n","\n"," # Enregistrer les hyperparamètres\n"," mlflow.log_params(params)\n","\n"," # Entraîner le modèle\n"," print(\"Entraînement du modèle de régression logistique...\")\n"," lr = LogisticRegression(**params)\n"," lr.fit(X_train, y_train)\n","\n"," # Prédire sur l'ensemble de test\n"," y_pred = lr.predict(X_test)\n","\n"," # Calculer les métriques\n"," accuracy = accuracy_score(y_test, y_pred)\n"," precision = precision_score(y_test, y_pred, average='weighted')\n"," recall = recall_score(y_test, y_pred, average='weighted')\n"," f1 = f1_score(y_test, y_pred, average='weighted')\n","\n"," # Enregistrer les métriques\n"," mlflow.log_metric(\"accuracy\", accuracy)\n"," mlflow.log_metric(\"precision\", precision)\n"," mlflow.log_metric(\"recall\", recall)\n"," mlflow.log_metric(\"f1_score\", f1)\n","\n"," print(f\"Métriques: Accuracy={accuracy:.4f}, Precision={precision:.4f}, Recall={recall:.4f}, F1={f1:.4f}\")\n","\n"," # Générer une matrice de confusion\n"," cm = confusion_matrix(y_test, y_pred)\n"," plt.figure(figsize=(8, 6))\n"," sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',\n"," xticklabels=iris.target_names,\n"," yticklabels=iris.target_names)\n"," plt.title('Matrice de confusion')\n"," plt.xlabel('Prédiction')\n"," plt.ylabel('Réalité')\n"," plt.tight_layout()\n"," # Save the figure in the output directory\n"," plt.savefig(os.path.join(output_dir, 'confusion_matrix.png'))\n"," plt.close()\n","\n"," # Enregistrer la matrice de confusion comme artifact\n"," mlflow.log_artifact(os.path.join(output_dir, \"confusion_matrix.png\"))\n"," mlflow.log_artifact(os.path.join(output_dir, \"iris_class_distribution.png\"))\n","\n"," # Définir des tags pour ce run\n"," mlflow.set_tag(\"model_type\", \"LogisticRegression\")\n"," mlflow.set_tag(\"dataset\", \"Iris\")\n"," mlflow.set_tag(\"description\", \"Classification multiclasse des fleurs Iris\")\n","\n"," # Inférer la signature du modèle\n"," signature = infer_signature(X_train, lr.predict(X_train))\n","\n"," # Enregistrer le modèle avec sa signature\n"," model_info = mlflow.sklearn.log_model(\n"," sk_model=lr,\n"," artifact_path=\"model\", # This is the path within the MLflow run artifact storage\n"," signature=signature,\n"," input_example=X_train[:5]\n"," )\n","\n"," print(f\"Modèle enregistré: {model_info.model_uri}\")\n","\n","# Récupérer et afficher les informations du run terminé\n","run_info = mlflow.get_run(run_id=run.info.run_id)\n","print_logged_info(run_info)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":116,"referenced_widgets":["5077141fe2354e538f2728680d165abd","f5679722fc2e419b9eb658ee30c3684d","a5e14ad79a71402ab6f93f67fe2894cb","0a21fa27119c467f84595be0992d481b","b1a3c1bde6854e179dd0ecba4ac0ac19","e294e746a37246f082f8bf2b70367ce3","4713d02de5c44de69db461e8ab6cade1","36e6d82d6909479d9359dd82f6d56d92","fd2489b6f3154eb988b6d987e9445dc4","c5e2cc8df51146d1b61ac06e65cbc9ec","9878155a8ac14ded9f73699160a3da0c","3f94687e5cd24458a1f8cd6b123bbdf7","d7a0ada0295647049b45e572d4167d8d","12bd24eef53d4390a6e12b89d4baa563","06490fc029bf4f1eab964d977a262c73","90eb86a1891848cba01284e60c971dcc","a4b1626a86d64e30a04552da9fda8eb1","0e190cce3832467686ab21f7a226f15b","c95599130eb44eeb98d7013340f55bef","870a99030b7541dd977e4261f025f495","e4a45ed5c60e49c9b4392012805fd903","1bf723dec07d4385b6eb2e423ac81416"]},"id":"bvmWVVraLfra","executionInfo":{"status":"ok","timestamp":1751547076141,"user_tz":-120,"elapsed":22478,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"d50a7a94-7edf-4406-bafb-5384c86a90eb"},"outputs":[{"name":"stdout","output_type":"stream","text":["Please enter your 🏃 RUN ID : c9e768a9ca904c55a963f03568e43ecb\n"]},{"output_type":"display_data","data":{"text/plain":["Downloading artifacts: 0%| | 0/1 [00:00, ?it/s]"],"application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"5077141fe2354e538f2728680d165abd"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":["Downloading artifacts: 0%| | 0/7 [00:00, ?it/s]"],"application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"3f94687e5cd24458a1f8cd6b123bbdf7"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["🚀 Model : LogisticRegression(max_iter=1000, random_state=8888)\n"]}],"source":["# %%\n","# Prompts user with the Run ID from MLflow run\n","# You can find run ID in the Tracking UI\n","while True:\n"," run_id = input('Please enter your 🏃 RUN ID : ')\n"," if run_id.strip() != '':\n"," break\n","\n","artifact_path = \"model\"\n","\n","# Download artifact via the tracking server\n","mlflow_artifact_uri = f\"runs:/{run_id}/{artifact_path}\"\n","\n","try:\n"," # Specify the local directory to download artifacts to\n"," local_path = mlflow.artifacts.download_artifacts(mlflow_artifact_uri, dst_path=output_dir)\n"," # Load the model\n"," model = mlflow.sklearn.load_model(local_path)\n","\n"," # If the model prints, everything works!\n"," print(f\"🚀 Model : {model}\")\n","except:\n"," print(\"❌ Invalid Run ID.\")"]}],"metadata":{"kernelspec":{"display_name":".venv","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.12"},"colab":{"provenance":[]},"widgets":{"application/vnd.jupyter.widget-state+json":{"5077141fe2354e538f2728680d165abd":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_f5679722fc2e419b9eb658ee30c3684d","IPY_MODEL_a5e14ad79a71402ab6f93f67fe2894cb","IPY_MODEL_0a21fa27119c467f84595be0992d481b"],"layout":"IPY_MODEL_b1a3c1bde6854e179dd0ecba4ac0ac19"}},"f5679722fc2e419b9eb658ee30c3684d":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_e294e746a37246f082f8bf2b70367ce3","placeholder":"","style":"IPY_MODEL_4713d02de5c44de69db461e8ab6cade1","value":"Downloading artifacts: 0%"}},"a5e14ad79a71402ab6f93f67fe2894cb":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"danger","description":"","description_tooltip":null,"layout":"IPY_MODEL_36e6d82d6909479d9359dd82f6d56d92","max":1,"min":0,"orientation":"horizontal","style":"IPY_MODEL_fd2489b6f3154eb988b6d987e9445dc4","value":0}},"0a21fa27119c467f84595be0992d481b":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_c5e2cc8df51146d1b61ac06e65cbc9ec","placeholder":"","style":"IPY_MODEL_9878155a8ac14ded9f73699160a3da0c","value":" 0/1 [00:00<?, ?it/s]"}},"b1a3c1bde6854e179dd0ecba4ac0ac19":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"e294e746a37246f082f8bf2b70367ce3":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"4713d02de5c44de69db461e8ab6cade1":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"36e6d82d6909479d9359dd82f6d56d92":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"fd2489b6f3154eb988b6d987e9445dc4":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"c5e2cc8df51146d1b61ac06e65cbc9ec":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"9878155a8ac14ded9f73699160a3da0c":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"3f94687e5cd24458a1f8cd6b123bbdf7":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_d7a0ada0295647049b45e572d4167d8d","IPY_MODEL_12bd24eef53d4390a6e12b89d4baa563","IPY_MODEL_06490fc029bf4f1eab964d977a262c73"],"layout":"IPY_MODEL_90eb86a1891848cba01284e60c971dcc"}},"d7a0ada0295647049b45e572d4167d8d":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_a4b1626a86d64e30a04552da9fda8eb1","placeholder":"","style":"IPY_MODEL_0e190cce3832467686ab21f7a226f15b","value":"Downloading artifacts: 100%"}},"12bd24eef53d4390a6e12b89d4baa563":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_c95599130eb44eeb98d7013340f55bef","max":7,"min":0,"orientation":"horizontal","style":"IPY_MODEL_870a99030b7541dd977e4261f025f495","value":7}},"06490fc029bf4f1eab964d977a262c73":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_e4a45ed5c60e49c9b4392012805fd903","placeholder":"","style":"IPY_MODEL_1bf723dec07d4385b6eb2e423ac81416","value":" 7/7 [00:01<00:00, 4.03it/s]"}},"90eb86a1891848cba01284e60c971dcc":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a4b1626a86d64e30a04552da9fda8eb1":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"0e190cce3832467686ab21f7a226f15b":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"c95599130eb44eeb98d7013340f55bef":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"870a99030b7541dd977e4261f025f495":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"e4a45ed5c60e49c9b4392012805fd903":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"1bf723dec07d4385b6eb2e423ac81416":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}}}}},"nbformat":4,"nbformat_minor":0}
\ No newline at end of file
diff --git a/notebooks/p07_01-notebook-analyse-exploratoire.ipynb b/notebooks/p07_01-notebook-analyse-exploratoire.ipynb
deleted file mode 100644
index 83371b8..0000000
--- a/notebooks/p07_01-notebook-analyse-exploratoire.ipynb
+++ /dev/null
@@ -1 +0,0 @@
-{"cells":[{"cell_type":"markdown","metadata":{"id":"kRoif7EaWjI6"},"source":["# Partie 1 : 🔬 Analyse exploratoire des données Sentiment140\n","\n","Dans le cadre du projet pour Air Paradis visant à développer un **système de détection de sentiment sur les tweets**, nous allons d'abord explorer et comprendre en profondeur le jeu de données **Sentiment140**. Cette analyse exploratoire est une étape fondamentale qui nous permettra de mieux appréhender les caractéristiques des données et d'orienter efficacement nos choix de prétraitement et de modélisation.\n","\n","Le jeu de données Sentiment140 contient **1,6 million de tweets annotés** avec leur polarité (négative ou positive), ainsi que des métadonnées comme l'identifiant du tweet, la date, la requête utilisée pour collecter le tweet, et l'utilisateur ayant posté le message. Cette richesse d'information nous permet non seulement d'analyser le contenu textuel des tweets, mais également d'explorer les dimensions temporelles et comportementales associées.\n","\n","Cette étape d'exploration nous guidera vers les **techniques de prétraitement** les plus adaptées et nous aidera à sélectionner les **approches de modélisation** les plus prometteuses, des méthodes classiques aux architectures de deep learning avancées comme BERT, conformément aux exigences du projet formulées par Marc."]},{"cell_type":"markdown","metadata":{"id":"HMvSNBQbWjI7"},"source":["## Importation des bibliothèques"]},{"cell_type":"code","source":["from google.colab import drive\n","drive.mount('/content/drive')\n","import os\n","drive_folder= \"/content/drive/MyDrive/Colab_Notebooks/Project_7/notebooks\"\n","os.chdir(drive_folder)\n","# os.listdir()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":0},"id":"0vLhVG6jXaib","executionInfo":{"status":"ok","timestamp":1751537385444,"user_tz":-120,"elapsed":8041,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"32f1e8c2-3863-41f2-9b0b-32c371ae7739"},"execution_count":2,"outputs":[{"output_type":"stream","name":"stdout","text":["Mounted at /content/drive\n"]}]},{"cell_type":"code","execution_count":3,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":0},"id":"-YwmQE9SWjI8","executionInfo":{"status":"ok","timestamp":1751537391119,"user_tz":-120,"elapsed":5662,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"966f92fd-9219-4836-d130-4399a8890793"},"outputs":[{"output_type":"stream","name":"stderr","text":["[nltk_data] Downloading package punkt to /root/nltk_data...\n","[nltk_data] Unzipping tokenizers/punkt.zip.\n","[nltk_data] Downloading package stopwords to /root/nltk_data...\n","[nltk_data] Unzipping corpora/stopwords.zip.\n","[nltk_data] Downloading package wordnet to /root/nltk_data...\n"]}],"source":["import pandas as pd\n","import numpy as np\n","import matplotlib.pyplot as plt\n","import seaborn as sns\n","import requests\n","import zipfile\n","import os\n","import re\n","import datetime\n","import warnings\n","import string\n","\n","# Télécharger les ressources NLTK nécessaires\n","import nltk\n","nltk.download('punkt')\n","nltk.download('stopwords')\n","nltk.download('wordnet')\n","from nltk.corpus import stopwords\n","from nltk.tokenize import word_tokenize\n","from nltk.util import ngrams\n","from collections import Counter\n","from wordcloud import WordCloud\n","from nltk.stem import WordNetLemmatizer\n","\n","plt.style.use('ggplot')\n","plt.rcParams['figure.figsize'] = (12, 8)\n","plt.rcParams['font.family'] = 'DejaVu Sans'\n","warnings.filterwarnings('ignore')"]},{"cell_type":"markdown","metadata":{"id":"JaM_tOMwWjI8"},"source":["## 💾 Jeu de données : Sentiment140\n","\n","Le jeu de données [Sentiment140 dataset with 1.6 million tweets](https://www.kaggle.com/datasets/kazanova/sentiment140) est une ressource majeure pour l'analyse de sentiment sur Twitter, comprenant **1,6 million de tweets** extraits via l'API Twitter. Ces tweets ont été automatiquement annotés selon leur polarité sentimentale, offrant une base solide pour développer des modèles de classification de sentiment.\n","\n","Le jeu de données est organisé en 6 colonnes distinctes :\n","\n","1. **target** : La polarité du sentiment exprimé dans le tweet.\n"," - 0 = sentiment négatif\n"," - 2 = sentiment neutre\n"," - 4 = sentiment positif\n","2. **ids** : L'identifiant unique du tweet (exemple : *2087*)\n","3. **date** : La date et l'heure de publication du tweet.\n","4. **flag** : La requête utilisée pour obtenir le tweet.\n"," - Exemple : *lyx*\n"," - Si aucune requête n'a été utilisée : *NO_QUERY*\n","5. **user** : Le nom d'utilisateur de l'auteur du tweet.\n","6. **text** : Le contenu textuel du tweet."]},{"cell_type":"markdown","source":["Téléchargement et extraction de l'archive."],"metadata":{"id":"JMtFQ45vA9uT"}},{"cell_type":"code","execution_count":4,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":0},"id":"71OroFSlWjI8","executionInfo":{"status":"ok","timestamp":1751537391139,"user_tz":-120,"elapsed":18,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"be17dab2-3084-45ad-e067-16f331a004f2"},"outputs":[{"output_type":"stream","name":"stdout","text":["CPU times: user 242 µs, sys: 32 µs, total: 274 µs\n","Wall time: 448 µs\n"]}],"source":["%%time\n","\n","# Define the URL and the local file path\n","url = \"https://s3-eu-west-1.amazonaws.com/static.oc-static.com/prod/courses/files/AI+Engineer/Project+7%C2%A0-+D%C3%A9tectez+les+Bad+Buzz+gr%C3%A2ce+au+Deep+Learning/sentiment140.zip\"\n","local_zip_path = \"./content/data/sentiment140.zip\"\n","extract_path = \"./content/data\"\n","\n","if not os.path.exists(extract_path):\n","\n"," # Create the directory if it doesn't exist\n"," os.makedirs(extract_path, exist_ok=True)\n","\n"," # Download the zip file\n"," response = requests.get(url)\n"," with open(local_zip_path, 'wb') as file:\n"," file.write(response.content)\n","\n"," # Extract the contents of the zip file\n"," with zipfile.ZipFile(local_zip_path, 'r') as zip_ref:\n"," zip_ref.extractall(extract_path)\n","\n"," # Delete the zip file\n"," os.remove(local_zip_path)"]},{"cell_type":"markdown","source":["Paramétrage de pandas + affichage premières lignes et informations générales"],"metadata":{"id":"z8Ul66EvBC13"}},{"cell_type":"code","execution_count":5,"metadata":{"id":"eHAXkFpMWjI9","executionInfo":{"status":"ok","timestamp":1751537391155,"user_tz":-120,"elapsed":1,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["pd.set_option('display.max_columns', None)\n","pd.set_option('display.expand_frame_repr', False)"]},{"cell_type":"code","execution_count":6,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":206},"id":"O7Kp1AD0WjI9","executionInfo":{"status":"ok","timestamp":1751537402047,"user_tz":-120,"elapsed":10891,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"ebcc83c8-de04-4a87-d5d1-fdd4da4bcce8"},"outputs":[{"output_type":"execute_result","data":{"text/plain":[" target ids date flag user text\n","0 0 1467810369 Mon Apr 06 22:19:45 PDT 2009 NO_QUERY _TheSpecialOne_ @switchfoot http://twitpic.com/2y1zl - Awww, t...\n","1 0 1467810672 Mon Apr 06 22:19:49 PDT 2009 NO_QUERY scotthamilton is upset that he can't update his Facebook by ...\n","2 0 1467810917 Mon Apr 06 22:19:53 PDT 2009 NO_QUERY mattycus @Kenichan I dived many times for the ball. Man...\n","3 0 1467811184 Mon Apr 06 22:19:57 PDT 2009 NO_QUERY ElleCTF my whole body feels itchy and like its on fire \n","4 0 1467811193 Mon Apr 06 22:19:57 PDT 2009 NO_QUERY Karoli @nationwideclass no, it's not behaving at all...."],"text/html":["\n","
\n","
\n","\n","
\n"," \n","
\n","
\n","
target
\n","
ids
\n","
date
\n","
flag
\n","
user
\n","
text
\n","
\n"," \n"," \n","
\n","
0
\n","
0
\n","
1467810369
\n","
Mon Apr 06 22:19:45 PDT 2009
\n","
NO_QUERY
\n","
_TheSpecialOne_
\n","
@switchfoot http://twitpic.com/2y1zl - Awww, t...
\n","
\n","
\n","
1
\n","
0
\n","
1467810672
\n","
Mon Apr 06 22:19:49 PDT 2009
\n","
NO_QUERY
\n","
scotthamilton
\n","
is upset that he can't update his Facebook by ...
\n","
\n","
\n","
2
\n","
0
\n","
1467810917
\n","
Mon Apr 06 22:19:53 PDT 2009
\n","
NO_QUERY
\n","
mattycus
\n","
@Kenichan I dived many times for the ball. Man...
\n","
\n","
\n","
3
\n","
0
\n","
1467811184
\n","
Mon Apr 06 22:19:57 PDT 2009
\n","
NO_QUERY
\n","
ElleCTF
\n","
my whole body feels itchy and like its on fire
\n","
\n","
\n","
4
\n","
0
\n","
1467811193
\n","
Mon Apr 06 22:19:57 PDT 2009
\n","
NO_QUERY
\n","
Karoli
\n","
@nationwideclass no, it's not behaving at all....
\n","
\n"," \n","
\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","\n","
\n","
\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"raw_data"}},"metadata":{},"execution_count":6}],"source":["# Define the path to the CSV file\n","csv_file_path = os.path.join(extract_path, 'training.1600000.processed.noemoticon.csv')\n","\n","# Define the column names\n","column_names = ['target', 'ids', 'date', 'flag', 'user', 'text']\n","\n","# Load the dataset into a pandas DataFrame\n","raw_data = pd.read_csv(csv_file_path, encoding='latin-1', names=column_names)\n","\n","# Display the first few rows of the DataFrame\n","raw_data.head()"]},{"cell_type":"code","source":["raw_data['target'].unique()"],"metadata":{"id":"6pTUMokI-Q6W","executionInfo":{"status":"ok","timestamp":1751537402048,"user_tz":-120,"elapsed":9,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"9e15e051-7e09-4848-ca8c-358ac2cb4c23","colab":{"base_uri":"https://localhost:8080/","height":0}},"execution_count":7,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([0, 4])"]},"metadata":{},"execution_count":7}]},{"cell_type":"code","execution_count":8,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":0},"id":"rIaUk5ZxWjI9","executionInfo":{"status":"ok","timestamp":1751537402069,"user_tz":-120,"elapsed":21,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"8e4f9c92-f907-468c-de97-f6edb040398c"},"outputs":[{"output_type":"stream","name":"stdout","text":["Ce dataframe contient 1600000 lignes et 6 colonnes.\n"]}],"source":["print(f\"Ce dataframe contient {raw_data.shape[0]} lignes et {raw_data.shape[1]} colonnes.\")"]},{"cell_type":"markdown","metadata":{"id":"GG5bQh5xWjI-"},"source":["## 🔬 Analyse exploratoire des données Sentiment140\n","\n","Pour bien comprendre votre jeu de données Sentiment140 et optimiser votre modèle d'analyse de sentiment, je vous propose une analyse exploratoire complète qui couvre les aspects suivants :\n","\n","- **Analyse quantitative:**\n","\n","1. **Informations générales sur le jeu de données** \n"," - Étude de la répartition des classes de sentiment \n"," - Vérification des valeurs manquantes ainsi que des doublons \n"," - Examen de la structure générale du DataFrame \n","\n","2. **Analyse de la distribution des sentiments** \n"," - Visualisation de l’équilibre ou du déséquilibre des classes \n"," - Répartition des sentiments positifs et négatifs \n","\n","3. **Analyse temporelle** \n"," - Répartition des tweets dans le temps \n"," - Identification des patterns temporels selon le sentiment \n"," - Analyse détaillée par heure, jour et mois \n","\n","4. **Analyse des mots fréquents** \n"," - Nuages de mots spécifiques à chaque classe de sentiment \n"," - Détection des mots discriminants entre sentiments positifs et négatifs \n"," - Identification des n-grammes les plus fréquents \n","\n","5. **Analyse des utilisateurs** \n"," - Étude de la distribution des tweets par utilisateur \n"," - Analyse des tendances de sentiment propres aux utilisateurs \n","\n","6. **Analyse des requêtes (flag)** \n"," - Impact des requêtes sur la distribution des sentiments \n"," - Identification des requêtes les plus fréquentes \n","\n","7. **Analyse de la longueur des tweets** \n"," - Visualisation de la distribution des longueurs des tweets \n"," - Gestion des caractères HTML dans les tweets \n"," - Nettoyage des tweets trop longs et souvent difficilement compréhensibles \n","\n","- **Analyse qualitative:**\n","\n","8. **Analyse de caracteristiques distinctives et de l'impact de tokens spécifiques** \n"," - Étude de la longueur des tweets en termes de caractères et de mots \n"," - Répartition des longueurs en fonction du sentiment \n"," - Analyse de l’utilisation de la ponctuation \n"," - Calcul du ratio de majuscules \n"," - Présence d’émoticônes et de symboles \n","\n","9. **Stratégie de prétraitement pour la détection de sentiment dans les tweets** \n"," - Nettoyage des textes \n"," - Tokenisation adaptée aux spécificités de Twitter \n"," - Gestion des mentions, hashtags et URLs \n","\n","10. **Recommandations pour la modélisation** \n"," - Approches recommandées pour la vectorisation \n"," - Modèles à privilégier \n"," - Stratégies d’évaluation adaptées \n","\n","### Points clés à explorer \n","\n","**Distribution des sentiments :** \n","La première étape consiste à vérifier si les classes sont équilibrées. En cas de déséquilibre, des techniques telles que le sur- ou sous-échantillonnage, ou la pondération des classes, pourront être envisagées.\n","\n","**Caractéristiques linguistiques :** \n","L’analyse des mots les plus fréquents et des caractéristiques propres aux tweets positifs et négatifs permettra d’identifier des features pertinentes pour le modèle.\n","\n","**Prétraitement recommandé :** \n","Le code fournit des recommandations précises concernant : \n","- La gestion des URLs, mentions et hashtags \n","- La normalisation des textes \n","- Une tokenisation adaptée au langage propre à Twitter \n","\n","**Approches de modélisation :** \n","Différentes approches sont proposées, allant des modèles classiques (SVM, Naive Bayes) aux architectures plus avancées (LSTM, BERT), chacune avec ses avantages et ses limites.\n"]},{"cell_type":"code","execution_count":9,"metadata":{"id":"SIq2dc2NWjI-","executionInfo":{"status":"ok","timestamp":1751537402191,"user_tz":-120,"elapsed":121,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["df = raw_data.copy()"]},{"cell_type":"markdown","source":["### Analyse quantitative"],"metadata":{"id":"s8Gu4vmG0pWw"}},{"cell_type":"markdown","metadata":{"id":"NCnc8jyaWjI-"},"source":["#### 1. Informations générales sur le jeu de données\n","\n","- Étude de la répartition des classes de sentiment \n","- Vérification des valeurs manquantes ainsi que des doublons \n","- Examen de la structure générale du DataFrame "]},{"cell_type":"code","execution_count":10,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":0},"id":"UkDlv1zIWjI-","executionInfo":{"status":"ok","timestamp":1751537405677,"user_tz":-120,"elapsed":3488,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"ad26c4e0-01bf-426f-fc52-4a3aaecfa2aa"},"outputs":[{"output_type":"stream","name":"stdout","text":["1. APERÇU GÉNÉRAL DU JEU DE DONNÉES\n","--------------------------------------------------\n","Nombre total d'entrées: 1,600,000\n","Nombre de colonnes: 6\n","\n","Colonnes présentes:\n","- target\n","- ids\n","- date\n","- flag\n","- user\n","- text\n","\n","Types de données:\n","target int64\n","ids int64\n","date object\n","flag object\n","user object\n","text object\n","dtype: object\n","\n","Valeurs manquantes par colonne:\n","target 0\n","ids 0\n","date 0\n","flag 0\n","user 0\n","text 0\n","dtype: int64\n","\n","Nombre de lignes dupliquées: 0 (0.00%)\n"]}],"source":["def afficher_info_generales(df):\n"," \"\"\"Affiche les informations générales sur le DataFrame\"\"\"\n"," print(\"1. APERÇU GÉNÉRAL DU JEU DE DONNÉES\")\n"," print(\"-\" * 50)\n"," print(f\"Nombre total d'entrées: {df.shape[0]:,}\")\n"," print(f\"Nombre de colonnes: {df.shape[1]}\")\n"," print(\"\\nColonnes présentes:\")\n"," for col in df.columns:\n"," print(f\"- {col}\")\n","\n"," print(\"\\nTypes de données:\")\n"," print(df.dtypes)\n","\n"," print(\"\\nValeurs manquantes par colonne:\")\n"," print(df.isnull().sum())\n","\n"," # Vérifier les doublons\n"," duplicates = df.duplicated().sum()\n"," print(f\"\\nNombre de lignes dupliquées: {duplicates:,} ({duplicates/len(df)*100:.2f}%)\")\n","\n","afficher_info_generales(df)"]},{"cell_type":"markdown","metadata":{"id":"WWbOMBHvWjI-"},"source":["#### 2. Analyse de la distribution des sentiments\n","\n","- Visualisation de l’équilibre ou du déséquilibre des classes \n","- Répartition des sentiments positifs et négatifs\n"]},{"cell_type":"code","execution_count":11,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":833},"id":"xdnAqsI9WjI-","executionInfo":{"status":"ok","timestamp":1751537411107,"user_tz":-120,"elapsed":5432,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"bdfefe03-349e-404e-e4b3-fcb263503c60"},"outputs":[{"output_type":"stream","name":"stdout","text":["\n","2. Distribution des sentiments (cible)\n","--------------------------------------------------\n","sentiment\n","Négatif 800000\n","Positif 800000\n","Name: count, dtype: int64\n","\n","Pourcentage par catégorie:\n","sentiment\n","Négatif 50.00%\n","Positif 50.00%\n","Name: proportion, dtype: object\n"]},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAat5JREFUeJzt3XlcVmX+//H3zSabgIqoiIIEuCJobmmFWrlXmk6uaW6ToznznWrKVnPSUSunmrTRUUzJKTVTyyW3Ulu0cskUXHDfDUhvEFHhlvP7wx9nvAMTkROLr+fjcT/ynOs61/25b3jMmTfXdc6xGYZhCAAAAAAAFDuXki4AAAAAAIDyitANAAAAAIBFCN0AAAAAAFiE0A0AAAAAgEUI3QAAAAAAWITQDQAAAACARQjdAAAAAABYhNANAAAAAIBFCN0AAAAAAFiE0A0AuCGbzeb0cnd3V2BgoKKjo/X444/rk08+kcPh+M3jw8LCfr+CC/Dqq6/KZrNpzpw5Tvvbtm0rm82mI0eOlEhdeY4cOSKbzaa2bduWaB03a8OGDbLZbHr88cdLuhQnixcvVpcuXRQUFGT+vjZs2FCPPfaYZs2apezs7JIusUCl5fcRAFB8CN0AgEIbNGiQBg0apL59+6pNmzZyOBxKSEhQr169VL9+ff3www+WvO+cOXNks9n06quvWjL+76E8fIayYujQoerZs6c+//xzhYSEqHv37mrbtq1yc3M1b948DR8+XGfPni2R2krDH6B+T/wRAQAkt5IuAABQdvx6lliSDh48qBdeeEELFy5Uu3bt9O233yo2Ntapz549e+Tu7v77FHkdTz75pPr06aMaNWqUaB3XU7NmTe3Zs0fe3t4lXUqZtnjxYs2ePVv+/v5auXKlWrdu7dR+5MgRxcfHq0KFCiVU4W9LSEhQVlaWatasWdKlAACKCaEbAHBL7rjjDi1YsEAVK1ZUfHy8hgwZou3btzv1qVevXglV9z+BgYEKDAws6TKuy93dvVR8T2XdJ598IunqH1l+HbglKSwsTK+99trvXVah1a5du6RLAAAUM5aXAwCKxZQpU+Tj46Mff/xR33zzjVPb9ZbUbtq0Sd27d1doaKgqVKig6tWrq0WLFhozZowyMzMlXV2eOnjwYEnSuHHjnK4tz5t5v/a64jNnzmjYsGEKCQmRm5ub3n77bUnXv6b7WvPmzdOdd94pb29vBQUFadCgQTp58mS+fo8//rhsNps2bNhQ4Di//ryF+Qw3uqb7gw8+0N133y0/Pz95e3urcePGmjhxoi5duvSb9X311Vdq3769KlasKD8/P3Xt2lW7d+++7ndwPUlJSerevbsqVaqkihUr6p577tGqVat+8xjDMPTRRx+pffv2qlSpkjw9PVW/fn29+uqrysrKytc/MzNTEydOVExMjPz9/eXr66s77rhDf/jDH7R69epC1ZmamipJqlq16k1/xrNnz+r5559XgwYN5OXlJX9/f7Vv317Lly/P1/fan9fFixc1ZswY8/c4IiJCkydPlmEYZv+8ywsk6ejRo06/A9f+zK+3HDvvd8rhcOi1115TRESEvLy8VL9+fb3//vtmvy+//FLt2rWTn5+fKlWqpIEDB+qXX34p8PM6HA79+9//1l133SU/Pz95eXkpNjZWb7/9doH3aAgLCzM/w6xZs9S4cWN5eXmpevXqeuKJJ2S32/N9Pxs3bpQk1alTx+kz58nOztZ7772n5s2bq0qVKvL29lZYWJi6deum+fPnX+cnBQBlCzPdAIBi4e/vr86dO2vRokVav3697r777t/sv2zZMnXv3l2GYahFixZq3bq17Ha79u/fr8mTJ2vEiBHy9fVVp06d5HA49O233yomJsZp6XpERITTmKmpqWrevLkcDofuvvtuXbp0qdDLtd9880299957uueee/Twww/ru+++U0JCgr788ktt3rxZISEhN/2d5LmZz1CQJ554Qv/5z3/k6emp9u3by9vbWxs2bNALL7ygZcuWad26dQV+zmXLlumdd95Rs2bN1KVLF+3YsUMrV67U999/r8TERFWvXr1Q9W/dulXt2rVTZmamGjVqpEaNGmn//v3q0qWL/vSnPxV4TG5urgYMGKCPPvpIvr6+atasmSpVqqStW7dq3Lhx+vzzz7VhwwZ5eXlJkq5cuaL7779f33//vQIDA9W2bVt5enrqxIkTWrlypXx8fNSxY8cb1lqrVi1JV5dpDx06VL6+voX6jMnJybr//vt1/PhxhYWFqWPHjjp//ry+++47Pfjgg3rjjTf0zDPP5DsuOztbHTp00O7du9W2bVtduHBBGzdu1JgxY3T+/HmNHz9e0tWf86BBgzR37lz5+PioV69e5hg3s8Lh0UcfNYP1HXfcoY0bN2rIkCGSpIoVK6pv375q1aqVOnbsqM2bN+uDDz7Q4cOH9dVXXzmF3YsXL6pr165av369KleurFatWsnT01Pff/+9/vrXv2r9+vVasmSJXFzyz888++yzeuedd9S2bVtFRETo22+/1X/+8x/t2bNHGzdulM1mk6+vrwYNGqRVq1bp559/Vs+ePQv8WfTv31+LFi0y/5Dj5+enkydP6ptvvlFmZqb69OlT6O8GAEotAwCAG5BkFOaUMX78eEOS0bdv33zHh4aGOu279957DUnGokWL8o3zww8/GBkZGeb2+++/b0gyxo4dW+D7rl+/3qyxR48exsWLF/P1GTt2rCHJeP/99532x8XFGZIMNzc3Y8WKFeb+7Oxso3///oYk4+GHH3Y6ZtCgQYYkY/369QXWU9DnvdFnOHz4sCHJiIuLc9q/aNEiQ5IRHBxsJCcnm/vtdrtx9913G5KMp59+usD6XFxcjCVLlpj7HQ6H0bNnT0OS8fLLLxdYx6/l5uYaDRo0MCQZr7zyilPbtGnTzO990KBBTm2vv/66Iclo27atcfr0aXP/5cuXjaFDhxqSjOeee87c/+WXXxqSjObNm+f7+aWnpxtbt24tVL3ffPON4eLiYkgyqlataowYMcJISEgwkpKSjNzc3AKPcTgcRnR0tCHJeP31140rV66Ybfv37zfq1KljuLq6Grt27TL35/288n5m6enpZtuWLVsMV1dXw9vb2zh//rzTexX0u3GtvN/Hw4cP5ztOktGoUSMjJSXF3J/3vdWoUcOoUqWKsXz5crMtPT3daNiwoSHJ+PLLL53GGzlypCHJ6N27t2G32839GRkZRpcuXQxJxr///W+nY0JDQw1JRvXq1Y29e/ea+1NTU42IiAhDkvHFF18U6vMYhmEcOnTI/D7S0tKc2i5evGhs2rTput8TAJQlLC8HABSbvGumz507d8O+ecuA77///nxtzZs3V8WKFW/6/StUqKB3331Xnp6eN33so48+qi5dupjb7u7ueuedd+Tt7a3PPvtMx48fv+kxi8O//vUvSdLYsWMVGRlp7vf399e0adNks9k0Y8aMApeZ9+3bV927dze3XV1d9fzzz0uSvvrqq0K9/4YNG7R7926Fh4frlVdecWobOXKkWrZsme8Yh8Oh119/XT4+Ppo/f77TjLqHh4feffddVa9eXf/5z3+Um5sr6X+/D23atMn38/Pz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AACA8qBIobthw4bauHGjrly5kq/Nbrfriy++UExMzC0XBwAAAABAWVak0N23b1+dPXtWzz//vNauXStJ2rFjh+bPn6+nn35aktSrV6/iqxIAAAAAgDLIrSgHBQcH6+9//7vmzJmjBQsWSJKWLVsmSWrQoIGGDh2qoKCg4qsSAAAAAIAyqEihW5Jq1aqll19+WZmZmTpz5owMw1C1atXk5+dXnPUBAAAAAFBmFTl05/H19VVERERx1AIAAAAAQLlSqNC9cePGIg0eFxdXpOMAAAAAACgPChW633vvvSINTugGAAAAANzOChW6p06d6rR94cIFTZs2Td7e3urcubOCg4MlSSdPntSqVat08eJFjRo1qvirBQAAAACgDClU6K5atarT9scffyw/Pz+99NJLstls5v7atWurZcuWmjBhglasWKGRI0cWb7UAAAAAAJQhRXpO95YtW9SiRQunwG0O6OKiFi1aaMuWLbdcHAAAAAAAZVmRQrdhGDp58uR120+cOFHkggAAAAAAKC+KFLqbN2+utWvXavny5bp8+bK5//Lly1q2bJnWrVunZs2aFVuRAAAAAACURUV6TvfgwYOVkpKiDz74QB9++KEqVaokSTp37pyuXLmiunXr6vHHHy/OOgEAAAAAKHOKFLq9vb01btw4bdmyRT/++KPS0tIkSTExMWratKnuvPPOAq/3BgAAAADgdlKk0J2nefPmat68eXHVAgAAAABAuVKka7oBAAAAAMCN3dJMt5WWLl2qDz/8UF26dDGvD8/OzlZCQoI2bdqknJwcxcTEaNiwYQoICDCPS0tL08yZM5WUlCRPT0/FxcWpX79+cnV1NfskJSUpISFBx48fV5UqVdSzZ0+1bdvW6f1XrVqlZcuWyW63KzQ0VEOGDFFERITZXphaAAAAAAC3t1I5033gwAGtXbtWoaGhTvvnzp2rbdu26amnntK4ceN07tw5TZkyxWzPzc3VxIkT5XA4NH78eI0aNUobNmzQggULzD4pKSmaNGmSGjZsqNdff11du3bV9OnTtWPHDrPPpk2blJCQoF69emny5MkKDQ3VhAkTlJ6eXuhaAAAAAAAodaH70qVLevfdd/XEE0/Ix8fH3J+VlaUvv/xSgwYNUqNGjRQeHq6RI0dq3759Sk5OliT99NNPOnHihEaPHq2wsDA1adJEvXv31urVq+VwOCRJ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flu1apWWLVsmu92u0NBQDRkyxOkxaYWpBQAAAABweyv0TLevr68qVqx4w9eVK1d0/PhxHTt27KaLqVy5svr166dJkyZp4sSJatSokV5//XUdP35ckjR37lxt27ZNTz31lMaNG6dz585pypQp5vG5ubmaOHGiHA6Hxo8fr1GjRmnDhg1asGCB2SclJUWTJk1Sw4YN9frrr6tr166aPn26duzYYfbZtGmTEhIS1KtXL02ePFmhoaGaMGGC0tPTzT43qgUAAAAAgELPdL/66qu/2W6327V06VLt379fLi4uuueee266mGbNmjlt9+3bV2vWrNH+/ftVpUoVffnll/rLX/6iRo0aSZJGjhypv/71r0pOTlZUVJR++uknnThxQi+//LICAgIUFham3r1767///a8effRRubm5ac2aNQoKCtLAgQMlXZ1N37t3r1asWKHY2FhJ0vLly3XfffepXbt2kqThw4dr+/btWr9+vbp3766srKwb1gIAAAAAwC3dSE36X9j+4osv5HA4dM899+iRRx5R9erVb2nc3Nxcbd68WZcvX1ZUVJQOHTqkK1euKDo62uxTs2ZNBQYGmkE3OTlZtWvXdlriHRsbq1mzZun48eOqU6eO9u/f7zSGJMXExGjOnDmSJIfDoUOHDql79+5mu4uLi6Kjo5WcnCxJhaqlIDk5OcrJyTG3bTabvLy8zH8DAHAjnC8AAOVZeTzPFTl0FxS2e/bsqWrVqt1SQceOHdOLL76onJwceXp66plnnlFISIiOHDkiNzc3+fj4OPX39/eX3W43a/r1NdX+/v5mW95/8/Zd2+fixYvKzs5WZmamcnNz840TEBCgU6dOmWPcqJaCLFmyRIsWLTK369Spo8mTJ6tq1aq/9ZUAAGCqUaNGSZcAAIBlyuN57qZD96/D9r333quePXsqKCioWAoKDg7WG2+8oaysLH333XeaNm2axo0bVyxjl7QePXqoW7du5nbeX3FSU1PlcDhKqiwAQBly+vTpki4BAADLlKXznJubW6EmUAsdus+dO2eG7StXriguLk6PPPJIsYVtsyA3N3Npenh4uA4ePKiVK1eqdevWcjgcunDhgtMMc3p6ujkrHRAQoAMHDjiNl3fzs2v7XHtDtLw+Xl5e8vDwkJ+fn1xcXPLNWF87ix4QEHDDWgri7u4ud3f3AtsMw7jucQAA5OF8AQAoz8rjea7QoXv06NHKyclRWFiYevTooaCgIGVmZiozM/O6x4SHh99ygbm5ucrJyVF4eLhcXV21a9cutWrVSpJ06tQppaWlmddQR0VFafHixUpPTzeXkO/cuVNeXl4KCQmRJEVGRurHH390eo+dO3eaY7i5uSk8PFyJiYlq0aKFWUNiYqI6depkfq4b1QIAAAAAQKFDd94NwI4cOaK33nqrUMdc+6iuwvjwww8VGxurwMBAXbp0Sd988412796tF198Ud7e3mrfvr0SEhLk6+srb29vzZ49W1FRUWbQjYmJUUhIiKZOnar+/fvLbrdr/vz56tixoznD3KFDB61evVrz5s1Tu3btlJiYqM2bN2vMmDFmHd26ddO0adMUHh6uiIgIrVy5UpcvXzaf5V2YWgAAAAAAKHTo/tOf/mRlHZKuLs+eNm2azp07J29vb4WGhurFF19U48aNJUmDBg2SzWbTlClT5HA4FBMTo2HDhpnHu7i4aMyYMZo1a5ZeeuklVahQQXFxcerdu7fZJygoSGPGjNHcuXO1cuVKValSRSNGjDAfFyZJrVu3VkZGhhYuXCi73a6wsDC98MILTkvHb1QLAAAAAAA2ozwumi9jUlNTnR4lVpr1Hhdf0iUAwG1twdihJV1Cufb4V++WdAkAcFubc+/oki6h0Nzd3Qt1IzWX36EWAAAAAABuS4RuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALOJW0gVca8mSJfrhhx908uRJeXh4KCoqSgMGDFBwcLDZJzs7WwkJCdq0aZNycnIUExOjYcOGKSAgwOyTlpammTNnKikpSZ6enoqLi1O/fv3k6upq9klKSlJCQoKOHz+uKlWqqGfPnmrbtq1TPatWrdKyZctkt9sVGhqqIUOGKCIi4qZqAQAAAADcvkrVTPfu3bvVsWNHTZgwQS+99JKuXLmi8ePH69KlS2afuXPnatu2bXrqqac0btw4nTt3TlOmTDHbc3NzNXHiRDkcDo0fP16jRo3Shg0btGDBArNPSkqKJk2apIYNG+r1119X165dNX36dO3YscPss2nTJiUkJKhXr16aPHmyQkNDNWHCBKWnpxe6FgAAAADA7a1Uhe4XX3xRbdu2Va1atRQWFqZRo0YpLS1Nhw4dkiRlZWXpyy+/1KBBg9SoUSOFh4dr5MiR2rdvn5KTkyVJP/30k06cOKHRo0crLCxMTZo0Ue/evbV69Wo5HA5J0po1axQUFKSBAwcqJCREnTp1UqtWrbRixQqzluXLl+u+++5Tu3btFBISouHDh8vDw0Pr168vdC0AAAAAgNtbqQrdv5aVlSVJ8vX1lSQdOnRIV65cUXR0tNmnZs2aCgwMNINucnKyateu7bTEOzY2VhcvXtTx48clSfv373caQ5JiYmLMMRwOhw4dOuTUx8XFRdHR0WafwtQCAAAAALi9lapruq+Vm5urOXPmqG7duqpdu7YkyW63y83NTT4+Pk59/f39ZbfbzT6/vqba39/fbMv7b96+a/tcvHhR2dnZyszMVG5ubr5xAgICdOrUqULX8ms5OTnKyckxt202m7y8vMx/AwBwI5wvAADlWXk8z5Xa0B0fH6/jx4/r73//e0mXUmyWLFmiRYsWmdt16tTR5MmTVbVq1RKsCgBQltSoUaOkSwAAwDLl8TxXKkN3fHy8tm/frnHjxqlKlSrm/oCAADkcDl24cMFphjk9Pd2clQ4ICNCBAwecxsu7+dm1fa69IVpeHy8vL3l4eMjPz08uLi75ZqyvnUUvTC2/1qNHD3Xr1s3czvsrTmpqqnm9OQAAv+X06dMlXQIAAJYpS+c5Nze3Qk2glqprug3DUHx8vH744Qe98sorCgoKcmoPDw+Xq6urdu3aZe47deqU0tLSFBUVJUmKiorSsWPHnEL1zp075eXlpZCQEElSZGSk0xh5ffLGcHNzU3h4uBITE8323NxcJSYmmn0KU8uvubu7y9vb23zlLS3P++xl4QUAKFklfR4o7y8AQMkq6fOAFeeMUjXTHR8fr2+++UbPPvusvLy8zJlmb29veXh4yNvbW+3bt1dCQoJ8fX3l7e2t2bNnKyoqygy6MTExCgkJ0dSpU9W/f3/Z7XbNnz9fHTt2lLu7uySpQ4cOWr16tebNm6d27dopMTFRmzdv1pgxY8xaunXrpmnTpik8PFwRERFauXKlLl++bD7LuzC1AAAAAABubzajFP1Z99FHHy1w/8iRI82wm52drYSEBH377bdyOByKiYnRsGHDnJZ0p6amatasWUpKSlKFChUUFxen/v37y9XV1eyTlJSkuXPn6sSJE6pSpYp69uxpvkeeVatW6bPPPpPdbldYWJgGDx6syMhIs70wtRRGamqq0w3WSrPe4+JLugQAuK0tGDu0pEso1x7/6t2SLgEAbmtz7h1d0iUUmru7e6GWl5eq0H27InQDAAqL0G0tQjcAlKzyGLpL1TXdAAAAAACUJ4RuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALOJW0gVca/fu3frss890+PBhnTt3Ts8884xatGhhthuGoYULF+qLL77QhQsXVK9ePQ0bNkw1atQw+2RmZmr27Nnatm2bbDabWrZsqcGDB8vT09Psc/ToUcXHx+vgwYPy8/NTp06d9PDDDzvVsnnzZi1YsECpqamqXr26+vfvr6ZNm95ULQAAAACA21upmum+fPmywsLCNHTo0ALbP/30U33++ecaPny4/vGPf6hChQqaMGGCsrOzzT7/+te/dPz4cb300ksaM2aM9uzZoxkzZpjtWVlZGj9+vAIDAzVp0iQNGDBAH3/8sdatW2f22bdvn9555x21b99ekydPVvPmzfXGG2/o2LFjN1ULAAAAAOD2VqpCd5MmTdSnTx+n2e08hmFo5cqVeuSRR9S8eXOFhobqySef1Llz57RlyxZJ0okTJ7Rjxw6NGDFCkZGRqlevnoYMGaJNmzbp7NmzkqRvvvlGDodDI0eOVK1atdSmTRt17txZy5cvN99r5cqVio2N1UMPPaSQkBD16dNH4eHhWrVqVaFrAQAAAACgVIXu35KSkiK73a7GjRub+7y9vRUREaHk5GRJUnJysnx8fHTHHXeYfaKjo2Wz2XTgwAGzT/369eXm9r+V9TExMTp16pQyMzPNPtHR0U7vHxMTo/379xe6FgAAAAAAStU13b/FbrdLkvz9/Z32+/v7m212u11+fn5O7a6urvL19XXqExQU5NQnICDAbMvre6P3uVEtBcnJyVFOTo65bbPZ5OXlZf4bAIAb4XwBACjPyuN5rsyE7vJgyZIlWrRokbldp04dTZ48WVWrVi3BqgAAZQk37AQAlGfl8TxXZkJ33mx0enq6KlWqZO5PT09XWFiY2ScjI8PpuCtXrigzM9M8PiAgIN9sdN72tX3S09Od+qSnpzu136iWgvTo0UPdunUzt/P+ipOamiqHw3Hd4wAAyHP69OmSLgEAAMuUpfOcm5tboSZQy8w13UFBQQoICNCuXbvMfVlZWTpw4ICioqIkSVFRUbpw4YIOHTpk9klMTJRhGIqIiDD77Nmzxynk7ty5U8HBwfL19TX7XPs+eX0iIyMLXUtB3N3d5e3tbb7ylpZLV2/OVhZeAICSVdLngfL+AgCUrJI+D1hxzihVofvSpUs6cuSIjhw5IunqDcuOHDmitLQ02Ww2denSRYsXL9bWrVt17NgxTZ06VZUqVVLz5s0lSSEhIYqNjdWMGTN04MAB7d27V7Nnz1br1q1VuXJlSdLdd98tNzc3TZ8+XcePH9emTZv0+eefO81Ad+nSRT/99JOWLVumkydPauHChTp48KA6deokSYWqBQAAAAAAm1GK/qyblJSkcePG5dsfFxenUaNGyTAMLVy4UOvWrVNWVpbq1aunoUOHKjg42OybmZmp+Ph4bdu2TTabTS1bttSQIUPk6elp9jl69Kji4+N18OBBVaxYUZ06dVL37t2d3nPz5s2aP3++UlNTVaNGDfXv319NmzY12wtTS2GlpqY63WCtNOs9Lr6kSwCA29qCsUNLuoRy7fGv3i3pEgDgtjbn3tElXUKhubu7F2p5eakK3bcrQjcAoLAI3dYidANAySqPobtULS8HAAAAAKA8IXQDAAAAAGARQjcAAAAAABYhdAMAAAAAYBFCNwAAAAAAFiF0AwAAAABgEUI3AAAAAAAWIXQDAAAAAGARQjcAAAAAABYhdAMAAAAAYBFCNwAAAAAAFiF0AwAAAABgEUI3AAAAAAAWIXQDAAAAAGARQjcAAAAAABYhdAMAAAAAYBFCNwAAAAAAFiF0AwAAAABgEUI3AAAAAAAWIXQDAAAAAGARQjcAAAAAABYhdAMAAAAAYBFCNwAAAAAAFiF0AwAAAABgEUI3AAAAAAAWIXQDAAAAAGARQjcAAAAAABYhdAMAAAAAYBFCNwAAAAAAFiF0AwAAAABgEUI3AAAAAAAWIXQDAAAAAGARQjcAAAAAABYhdAMAAAAAYBFCNwAAAAAAFiF0AwAAAABgEUI3AAAAAAAWIXQDAAAAAGARQjcAAAAAABYhdAMAAAAAYBFCNwAAAAAAFiF0AwAAAABgEUI3AAAAAAAWIXQDAAAAAGARQjcAAAAAABYhdAMAAAAAYBFCNwAAAAAAFiF0AwAAAABgEUI3AAAAAAAWcSvpAsq6VatWadmyZbLb7QoNDdWQIUMUERFR0mUBAAAAAEoBZrpvwaZNm5SQkKBevXpp8uTJCg0N1YQJE5Senl7SpQEAAAAASgFC9y1Yvny57rvvPrVr104hISEaPny4PDw8tH79+pIuDQAAAABQCrC8vIgcDocOHTqk7t27m/tcXFwUHR2t5OTkAo/JyclRTk6OuW2z2eTl5SU3t7LzY4iqVb2kSwCA25q7u3tJl1CuRVQKLukSAOC2VpbOc4XNcWUn7ZUyGRkZys3NVUBAgNP+gIAAnTp1qsBjlixZokWLFpnbbdq00V/+8hdVqlTJylKLVfxLw0u6BAAALPNex9ElXQIAoJwhdP+OevTooW7dujnty8nJKVN/zQHKsosXL+rVV1/Vq6++Ki8vr5IuBwCAYsV5DiidCN1F5OfnJxcXF9ntdqf9drs93+x3Hnd3dwI2UIIMw9Dhw4dlGEZJlwIAQLHjPAeUTtxIrYjc3NwUHh6uxMREc19ubq4SExMVFRVVgpUBAAAAAEoLZrpvQbdu3TRt2jSFh4crIiJCK1eu1OXLl9W2bduSLg0AAAAAUAoQum9B69atlZGRoYULF8putyssLEwvvPDCdZeXAyhZ7u7u6tWrF5d5AADKJc5zQOlkM7joAwAAAAAAS3BNNwAAAAAAFiF0AwAAAABgEUI3gDIvKSlJa9asKekyAAAAgHwI3QDKtJ9//lnvvvuu7rjjjt/tPUeNGqUVK1aY23a7Xa+99poee+wxPf74479bHQAAXE9SUpIeffRRXbhw4Tf7cU4DrMeN1ACUKtOmTdPGjRvVr18/de/e3dz/ww8/6M0339TChQvNfTk5OXrllVf06KOPqkmTJsVey4YNGzRnzhzNmTPHaX9GRoYqVKigChUqSJLmzZunH3/8Uc8884y8vb3l7+9f7LUAAMqnvPOeJLm6uiowMFBxcXHq0aOHXF1dizyuw+FQZmam/P39ZbPZOKcBJYhHhgEoddzd3fXpp5/q/vvvl6+v72/2mzhx4u9Y2VV+fn5O2z///LPq1KmjGjVq/O61AADKvtjYWI0cOVI5OTn68ccfFR8fL1dXV/Xo0aPIY7q5uRXqMbac0wDrEboBlDrR0dH6+eeftXTpUg0YMKDAPnv37tWHH36ogwcPys/PT82bN1e/fv3k6ekpSTp37pymT5+uxMREBQQEqG/fvvroo4/UpUsXde3aVZK0fPlyrV+/XikpKfL19dWdd96pAQMGyNPTU0lJSXrvvfckSY8++qgkqVevXnr00Uc1atQoc5xRo0YpNTVVkvTVV18pLi5Oo0aNsvorAgCUI9cG5A4dOuiHH37Q1q1b9cADD2jOnDnatm2bcnJy1KBBAw0ePNgMxKmpqYqPj9e+ffvkcDhUtWpVDRgwQE2bNlVSUpLGjRun999/X0eOHOGcBpQgQjeAUsfFxUV9+/bVO++8o86dO6tKlSpO7WfOnNGECRPUp08f/elPf1JGRoZmz56t2bNna+TIkZKkqVOn6vz583r11Vfl6uqqhIQEpaenO41js9k0ePBgBQUFKSUlRbNmzdK8efM0bNgw1a1bV48//rgWLFigd955R5LMQH+tiRMnaurUqfLy8tLgwYPl4eFh0bcCALhdeHh46Pz583rvvfd0+vRpPfvss/Ly8tJ///tfTZw4Uf/85z/l5uam+Ph4ORwOjRs3ThUqVNCJEycKPFdxTgNKFjdSA1AqtWjRQmFhYU7XcOdZunSp7rnnHnXt2lU1atRQ3bp1NXjwYG3cuFHZ2dk6efKkdu3apSeeeEKRkZEKDw/XiBEjlJ2d7TRO165d1ahRIwUFBalRo0bq06ePNm/eLOnqrIO3t7dsNpsCAgIUEBBQ4P9B8fPzk5ubmzw8PBQQECBvb29rvhAAQLlnGIZ27typn376SYGBgdq6datGjBih+vXrKywsTH/+85919uxZbdmyRZKUlpamunXrqnbt2qpWrZruvPNONWjQIN+4nNOAksVMN4BSq3///vr73/+uBx980Gn/0aNHdfToUX399ddO+w3DUEpKik6fPi1XV1fVqVPHbKtevbp8fHyc+u/cuVNLly7VyZMndfHiRV25ckU5OTm6fPmyeUMZAACstn37dj322GO6cuWKDMNQmzZt1LJlS23fvl2RkZFmv4oVKyo4OFgnT56UJHXu3FmzZs3Szp07FR0drZYtWyo0NLSkPgaA6yB0Ayi1GjRooJiYGH344Ydq27atuf/SpUu6//771aVLl3zHBAYG6vTp0zccOyUlRZMnT9YDDzygPn36yNfXV3v37tX06dPlcDgI3QCA303Dhg01fPhwubm5qVKlSnJ1ddXWrVtveNx9992nmJgYbd++XTt37tSSJUs0cOBAde7c+XeoGkBhsbwcQKnWv39/bdu2TcnJyea+OnXq6OTJk6pevXq+l5ubm4KDg3XlyhUdOXLEPObMmTNOzyo9dOiQcnNzNXDgQEVFRSk4OFjnzp1zem83Nzfl5uZa/hkBALe3ChUqqHr16goMDDQfE1azZk1duXJF+/fvN/udP39ep06dUkhIiLkvMDBQHTp00DPPPKMHH3xQX3zxRYHvwTkNKDmEbgClWu3atXXPPffo888/N/c9/PDD2rdvn+Lj43XkyBGdPn1aW7ZsUXx8vKSr/0clOjpaM2bM0IEDB3T48GHNmDFDHh4estlskq4uN79y5YpWrVqln3/+WV999ZXWrl3r9N5Vq1bVpUuXtGvXLmVkZOjy5cu/3wcHANzWatSooWbNmmnGjBnau3evjhw5onfffVeVK1dWs2bNJElz5szRjh07lJKSokOHDikpKUk1a9YscDzOaUDJYXk5gFLv0Ucf1aZNm8zt0NBQvfrqq5o/f75eeeUVGYah6tWr66677jL7PPnkk5o+fbrGjh1rPjLsxIkTcnd3lySFhYVp4MCB+vTTT/Xhhx+qfv366tevn6ZOnWqOUbduXT3wwAN6++23df78efPxKgAA/B5GjhypOXPmaNKkSXI4HKpfv76ef/55ubld/b/wubm5io+P19mzZ+Xl5aXY2FgNGjSowLE4pwElx2YYhlHSRQCA1X755Rf96U9/0ssvv6zo6OiSLgcAAAC3CWa6AZRLiYmJunTpkmrXrq1z585p3rx5qlq1qurXr1/SpQEAAOA2QugGUC45HA599NFH+vnnn+Xl5aWoqCj9+c9/NpfkAQAAAL8HlpcDAAAAAGAR7l4OAAAAAIBFCN0AAAAAAFiE0A0AAAAAgEUI3QAAAAAAWITQDQAAAACARQjdAACgWEybNk2jRo0q6TIAAChVeGAtAABl1LFjx/Txxx/r4MGDSk9Pl6+vr0JCQtSsWTN17tzZkvc8e/as1q1bpxYtWigsLMyS97DS5cuX9emnn6phw4Zq2LBhSZcDALgNELoBACiD9u3bp3HjxikwMFD33XefAgIC9Msvv2j//v1auXKlZaH73LlzWrRokYKCgvKF7ieeeEKGYVjyvsXl8uXLWrRokSQRugEAvwtCNwAAZdDixYvl7e2tiRMnysfHx6ktPT29RGpyc+P/VgAA8Gs2o7T/SRoAAOTzf//3f6pUqZLGjh17w75fffWVVqxYoRMnTsjDw0MxMTEaMGCAAgMDzT6vvvqqzp8/r7/+9a+Kj4/X/v375ePjoy5duujhhx+WJCUlJWncuHH5xh85cqTatm2radOmaffu3Zo2bZokKSUlRU8++aQGDBggDw8PLV++XHa7XfXq1dOIESNUpUoVffLJJ1q3bp3Onz+vmJgYjRw5Ur6+vk7j//jjj1qyZIkOHz4sm82m+vXra8CAAapVq5bZZ9q0afruu+/0zjvvaNasWdq1a5c8PDwUFxenAQMGyMXFxazn13r16qVHH320cF88AAA3iRupAQBQBlWtWlWHDh3SsWPHfrPf4sWLNW3aNNWoUUODBg1S165dtWvXLo0dO1YXLlxw6puZmakJEyYoNDRUAwcOVM2aNfXf//5XP/74oySpZs2aZji9//779eSTT+rJJ59U/fr1f7OGb775RmvWrFGnTp3UrVs37d69W2+99Zbmz5+vn376SQ8//LDuv/9+bdu2TQkJCU7HfvXVV5o0aZI8PT3Vv39/9ezZUydOnNArr7yilJQUp765ubmaMGGCKlasqMcee0wNGjTQ8uXLtW7dOkmSn5+fhg0bJklq0aKFWX/Lli1v8G0DAFB0rAMDAKAMevDBB/WPf/xDzz77rCIiIlSvXj1FR0erYcOG5jLv1NRULVy4UL1799YjjzxiHtuiRQs999xzWr16tdP+c+fO6cknn9S9994rSWrfvr1GjhypL7/8Uk2aNFFAQICaNGmihQsXKioqyux3I2fPntW//vUveXt7S7oajpcuXars7GxNmjRJrq6ukqSMjAx98803Gj58uNzd3XXp0iW9//77at++vZ544glzvLi4OP3f//2flixZ4rQ/JydHd911l3r16iVJ6tChg5577jl9+eWX6tChgzw9PdWqVSvNmjVLtWvXLnT9AADcCma6AQAogxo3bqzx48erWbNmOnr0qD777DNNmDBBI0aM0NatWyVJ33//vQzDUOvWrZWRkWG+AgICVL16dSUlJTmN6enpqXvuucfcdnNzU0RERL4Z5ZvVqlUrM3BLUmRkpCTpnnvuMQN33n6Hw6GzZ89Kknbu3KkLFy6oTZs2TvW7uLgoMjIyX/3S1aB9rXr16unnn3++pfoBALgVzHQDAFBGRURE6JlnnpHD4dCRI0f0ww8/aMWKFZoyZYreeOMNnTlzRoZh6M9//nOBx//6xmdVqlSRzWZz2ufj46OjR4/eUp3XXjsuyQzg19uft+z99OnTkqS///3vBY7r5eXltO3u7i4/Pz+nfT4+PvmW0QMA8HsidAMAUMblzUhHREQoODhY7733njZv3qzc3FzZbDY9//zzcnHJv7jN09PTabugPsXheuNeb3/ePV7z/vvkk08qICAgX79rZ8l/azwAAEoSoRsAgHIkPDxc0tXrs6tXry7DMBQUFKTg4OBiGf/XM+FWqlatmiTJ399fjRs3LpYxf8/6AQCQuKYbAIAyKTExUQU99TPvTuPBwcFq0aKFXFxctGjRonx9DcPQ+fPnb/p9K1SoIEm/y5LtmJgYeXl5acmSJXI4HPnaMzIybnrMvPqzsrJuuT4AAAqDmW4AAMqg999/X5cvX1aLFi0UHBwsh8Oh5ORkbdq0SVWrVlW7du3k4+OjPn366MMPP1RqaqqaN28uT09PpaSkaMuWLbrvvvv00EMP3dT7VqtWTT4+Plq7dq28vLxUoUIFRUZGKigoqNg/o7e3t4YPH653331Xzz33nNq0aSM/Pz+lpaVp+/btqlu3roYOHXpTY3p4eCgkJESbNm1SjRo15Ovrq1q1aql27drFXj8AABKhGwCAMumxxx7T5s2b9eOPP2rdunVyOBwKDAxUhw4d1LNnT/n4+EiSunfvrho1amjFihX6+OOPJV29gVnjxo3VrFmzm35fNzc3jRo1Sh9++KFmzpypK1euaOTIkZaEbkm6++67ValSJS1dulSfffaZcnJyVLlyZdWvX1/t2rUr0pgjRozQ7NmzNXfuXDkcDvXq1YvQDQCwjM0oaG0aAAAAAAC4ZVzTDQAAAACARQjdAAAAAABYhNANAAAAAIBFCN0AAAAAAFiE0A0AAAAAgEUI3QAAAAAAWITQDQAAAACARQjdAAAAAABYhNANAAAAAIBFCN0AAAAAAFiE0A0AAAAAgEUI3QAAAAAAWITQDQAAAACARf4fUAfQdQL7GGIAAAAASUVORK5CYII=\n"},"metadata":{}}],"source":["def analyser_distribution_sentiment(df):\n"," \"\"\"Analyse la distribution des sentiments\"\"\"\n"," print(\"\\n2. Distribution des sentiments (cible)\")\n"," print(\"-\" * 50)\n","\n"," # Convertir les codes (0, 4) en catégories (négatif, positif)\n"," sentiment_map = {0: 'Négatif', 2: 'Neutre', 4: 'Positif'}\n"," df['sentiment'] = df['target'].map(sentiment_map)\n","\n"," # Afficher le compte\n"," sentiment_counts = df['sentiment'].value_counts()\n"," print(sentiment_counts)\n"," print(\"\\nPourcentage par catégorie:\")\n"," print(df['sentiment'].value_counts(normalize=True).map(lambda x: f\"{x*100:.2f}%\"))\n","\n"," # Visualiser la distribution\n"," plt.figure(figsize=(10, 6))\n"," sns.countplot(x='sentiment', hue='sentiment', data=df, palette='viridis')\n"," plt.title('Distribution des Sentiments', fontsize=15)\n"," plt.xlabel('Sentiment')\n"," plt.ylabel('Nombre de Tweets')\n"," plt.tight_layout()\n"," plt.show()\n","\n","analyser_distribution_sentiment(df)"]},{"cell_type":"markdown","metadata":{"id":"dLP_05CaWjI_"},"source":["#### 3. Analyse temporelle\n","\n","- Répartition des tweets dans le temps \n","- Identification des patterns temporels selon le sentiment \n","- Analyse détaillée par heure, jour et mois "]},{"cell_type":"code","execution_count":12,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"gbTaWRiNWjI_","executionInfo":{"status":"ok","timestamp":1751537421449,"user_tz":-120,"elapsed":10341,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"7939105d-4449-4d04-f432-99a474db2e4e"},"outputs":[{"output_type":"stream","name":"stdout","text":["\n","3. ANALYSE TEMPORELLE\n","--------------------------------------------------\n","Période couverte: de 2009-04-06 22:19:45 à 2009-06-25 10:28:31\n"]},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3Xd4VGX+/vH3OZlkUmZSIQQIJFQBkaYCNqoKInbX2FbsbdctrqvsfnXVXXddu/50beCq2MDFiqLCClgAEUVQkN47pM9kkkkm5/n9EZIlJmAISSYJ9+u6uCBzzpy5p5wh85nn+TyWMcYgIiIiIiIiIiLShOxwBxARERERERERkSOPilIiIiIiIiIiItLkVJQSEREREREREZEmp6KUiIiIiIiIiIg0ORWlRERERERERESkyakoJSIiIiIiIiIiTU5FKRERERERERERaXIqSomIiIiIiIiISJNTUUpERERERERERJqcilIiItLiWZZV7U9kZCRt2rThmGOO4corr+Stt94iFAod9PqZmZlNF7gW99xzD5Zl8dJLL1W7fMSIEViWxaZNm8KSq9KmTZuwLIsRI0aENcehmjdvHpZlceWVV4Y7SjVvv/0248aNIzU1ter1evTRR/PLX/6SyZMnU1paGu6ItWour0dpeJXP7bx58w64T+X7QLjfL0VEpPVQUUpERFqNCRMmMGHCBC655BJOOukkQqEQU6ZM4cILL6R37958/fXXjXK7L730EpZlcc899zTK8ZtCa7gPLcU111zDBRdcwEcffUR6ejrnnnsuI0aMwHEcXn31Va677jpyc3PDku1IKzioyCYiIhJernAHEBERaSg/HWUEsH79ev785z/z5ptvMnLkSObPn8+AAQOq7bNy5UoiIyObJuQB/PrXv+biiy+mffv2Yc1xIB07dmTlypXExsaGO0qL9vbbb/Pvf/+bhIQEZs6cyYknnlht+6ZNm3jhhRdwu91hSnhwU6ZMIRAI0LFjx3BHERERkVZARSkREWnVunXrxrRp0/B6vbzwwgtcffXVLFmypNo+vXr1ClO6/2nTpg1t2rQJd4wDioyMbBaPU0v31ltvARVFyJ8WpAAyMzP529/+1tSx6qxz587hjiAiIiKtiKbviYjIEeGRRx4hLi6O7777ji+//LLatgNNWVqwYAHnnnsuGRkZuN1u0tLSGDx4MBMnTsTv9wMV03+uuuoqAO69995qva0qR27t39do165dXHvttaSnp+NyuXj88ceBA/eU2t+rr77KscceS2xsLKmpqUyYMIHt27fX2O/KK688aG+Yn97futyHn+sp9corr3DyyScTHx9PbGws/fr14/7776ekpOSg+T7//HNGjRqF1+slPj6eM888kx9//PGAj8GBrFixgnPPPZekpCS8Xi+nnHIKH3/88UGvY4zhjTfeYNSoUSQlJREdHU3v3r255557CAQCNfb3+/3cf//99O/fn4SEBDweD926deMXv/gFn3zySZ1y7t27F4C2bdse8n3Mzc3lT3/6E3369CEmJoaEhARGjRrFBx98UGPf/Z+v4uJiJk6cWPU67t69Ow888ADGmKr9K6dvAmzevLnaa2D/5/xA090qX1OhUIi//e1vdO/enZiYGHr37s2LL75Ytd+cOXMYOXIk8fHxJCUlccUVV5CTk1Pr/Q2FQjzzzDOccMIJxMfHExMTw4ABA3j88cdr7RGXmZlZdR8mT55Mv379iImJIS0tjRtuuIH8/Pwaj89nn30GQJcuXard50qlpaU8/fTTHH/88aSkpBAbG0tmZibjx49n6tSpB3imDvxcFBYW8tvf/pZOnTpVvd4ee+wxHMepcb2lS5dy++23c+yxx9K2bVvcbjddu3bl5ptvZseOHT97O7feeitdunQhMjKS3/3ud3XKerhWrlzJlVdeSadOnXC73bRr146LL76YFStW1Nj3597z9n8+K9XlvRRg69at/PrXv6Zbt25ER0eTnJzM+PHjWbBgQUPeXRERaQAaKSUiIkeEhIQEzjjjDKZPn87cuXM5+eSTD7r/jBkzOPfcczHGMHjwYE488UTy8/NZu3YtDzzwADfeeCMej4exY8cSCoWYP38+/fv3rzY1sHv37tWOuXfvXo4//nhCoRAnn3wyJSUldZ4O9/DDD/P0009zyimncM455/DVV18xZcoU5syZw8KFC0lPTz/kx6TSodyH2txwww08//zzREdHM2rUKGJjY5k3bx5//vOfmTFjBv/9739rvZ8zZszgiSee4LjjjmPcuHEsXbqUmTNnsmjRIpYvX05aWlqd8n/zzTeMHDkSv99P37596du3L2vXrmXcuHHcdNNNtV7HcRwuv/xy3njjDTweD8cddxxJSUl888033HvvvXz00UfMmzePmJgYAMrLyzn11FNZtGgRbdq0YcSIEURHR7Nt2zZmzpxJXFwcY8aM+dmsnTp1AiqmwV1zzTV4PJ463cc1a9Zw6qmnsnXrVjIzMxkzZgw+n4+vvvqKs846i4ceeojbbrutxvVKS0s5/fTT+fHHHxkxYgRFRUV89tlnTJw4EZ/Px3333QdUPM8TJkzg5ZdfJi4ujgsvvLDqGIcyQu6iiy6qKjx169aNzz77jKuvvhoAr9fLJZdcwtChQxkzZgwLFy7klVdeYePGjXz++efVChDFxcWceeaZzJ07l+TkZIYOHUp0dDSLFi3i97//PXPnzuWdd97Btmt+v3r77bfzxBNPMGLECLp37878+fN5/vnnWblyJZ999hmWZeHxeJgwYQIff/wxu3fv5oILLqj1ubjsssuYPn16VaEzPj6e7du38+WXX+L3+7n44ovr/NgEg0FGjRrF+vXrGTVqFKWlpXz66afceuutLFu2rEZx5p///CdvvfUW/fr1q3q/Wrp0Kc888wzvvvsu33zzDR06dKhxO8XFxQwfPpzNmzczfPhwBg0aRFJSUp1z1te7777LxRdfTDAYZMCAAQwdOpStW7fy5ptvMmPGDD766COGDRvWILd1sPfShQsXcuaZZ5KXl8dRRx3FmWeeyd69e/nkk0/4+OOPee2118jKymqQHCIi0gCMiIhICweYuvyXdt999xnAXHLJJTWun5GRUe2yYcOGGcBMnz69xnG+/vprU1hYWPXziy++aABz991313q7c+fOrcp43nnnmeLi4hr73H333QYwL774YrXLhw8fbgDjcrnMhx9+WHV5aWmpueyyywxgzjnnnGrXmTBhggHM3Llza81T2/39ufuwceNGA5jhw4dXu3z69OkGMB06dDBr1qypujw/P9+cfPLJBjB/+MMfas1n27Z55513qi4PhULmggsuMIC56667as3xU47jmD59+hjA/OUvf6m27V//+lfV4z5hwoRq2x588EEDmBEjRpidO3dWXR4MBs0111xjAHPHHXdUXT5nzhwDmOOPP77G81dQUGC++eabOuX98ssvjW3bBjBt27Y1N954o5kyZYpZsWKFcRyn1uuEQiFzzDHHGMA8+OCDpry8vGrb2rVrTZcuXUxERIT54Ycfqi6vfL4qn7OCgoKqbYsXLzYREREmNjbW+Hy+ardV22tjf5Wvx40bN9a4HmD69u1r9uzZU3V55ePWvn17k5KSYj744IOqbQUFBeboo482gJkzZ0614918880GMFlZWSY/P7/q8sLCQjNu3DgDmGeeeabadTIyMgxg0tLSzKpVq6ou37t3r+nevbsBzKefflqn+2OMMRs2bKh6PLKzs6ttKy4uNgsWLDjg47S//Z+Lfv36mb1791ZtW7dunenQoYMBqp0LxlQ8drt27ap2WXl5ubn33nsNYK666qoD3s4JJ5xg8vLy6pSvUuVjcaD3jf1v46evkY0bN5q4uDjj8XjM7Nmzq2376KOPTGRkpOnUqZMJBoNVlx/oPa9S5fO5v597Ly0oKDDt27c3ERER5tVXX622bfHixSYpKcl4PJ5qr1EREQkvFaVERKTFq2tR6tlnnzWAGTt2bI3r//RDVu/evQ1Q7QPxgdS1KOV2u822bdtq3efnilKXXnppjetkZ2eb2NhYY1mW2bJlS9XlTVmUqizePffcczWus2zZMmNZlvF4PNU+PFbmu+yyy2pc55tvvqn1dg6ksujRtWtXEwqFamwfMmRIjaJUWVmZadOmjYmLi6vxod8YYwKBgElLSzNJSUlVBaBp06YZwPzud7+rU66Def31101KSkrV67byT7t27czEiRNrvObeeecdA5gLLrig1uO9/fbbBjC/+c1vqi6rfL5s265WoKk0fvz4Wl8jh1uU+u9//1vjOgMHDjSAufzyy2tse+KJJ2q87nbv3l1VxAgEAjWus3PnThMVFWX69etX7fLKIsakSZNqXOfhhx+u9fV9sKLUokWLDGDOPffcGtsOxf7FolmzZtXY/swzzxjAjB49us7H7Nixo0lJSTng7SxevPiQc1Y+FnX589PXyG9/+1sDmCeffLLWY//mN78xgHn77berLjucotSB3ksfe+yxWgvhlR599FEDmEcfffQgj4SIiDQl9ZQSEZEjhtnXQ+enfUpqc+yxxwLwy1/+ksWLF9fa8+VQDRo0qN6rltU2TSglJYXTTz8dY0yNPllNoaysjK+++gqomOb0U/369aNfv374/X6WLl1aY/vpp59e47KePXsCsHPnzjpl+OKLLwC48MILiYiIqLH9kksuqXHZkiVLyM7O5sQTT6Rdu3Y1tsfExHDssceSl5fH2rVrARgwYAC2bfPiiy8yadKkA/ZBqotLLrmEzZs38+qrr3LVVVfRt29fLMti9+7d/POf/+S4445jz549VfvPmjULgPPPP7/W451yyikAfP311zW2ZWRkcNRRR9W4/FAf57qIjIystedY165dgdqf78pt++eYN28eZWVljB07tmr65P7S0tLo0aMHP/zwA8XFxTW2N8TrCiqmLcbFxfHhhx/y0EMP1drH6VAkJydz2mmn1bi88jW6YMGCGu8zOTk5vPjii/zhD3/gmmuu4corr+TKK6+krKyMnJwccnNzaxyvffv2HHfccfXOOWbMGCZMmFDrnwsuuKDW6xzOa7Q+DvRe2tQ5RETk8KmnlIiIHDGys7OBig+HP+cf//gHP/zwAzNmzGDGjBkkJSVx8sknc/bZZ3P55ZcTHR19yLd/OCuXZWRk1Hp5ZcPyw/3AXB85OTmUlpbSpk0b4uLiat0nMzOTZcuW1dqQvbY+WF6vF6jov1MXlff75x6f/VU26Z49e/bPFiizs7M56qij6NmzJw8++CB/+tOfuP7667nxxhvp27cvo0eP5sorr6Rfv351ylspLi6Oyy67rKqYt3v3bl588UX++te/sm7dOv7v//6PSZMmVcu7//4HyvpTB+o1dqiPc12kpaXVWhis7NVUWxGhctv+OSrv76RJk6oegwPJzc2tcdyGeF0BxMfHM2nSJK6//npuv/12br/9dnr27MnIkSP55S9/yUknnVTnY8GBX6MJCQkkJiaSn59PXl4eKSkpALzxxhtcf/31VYsq1Mbn89V4PzvcFRInTpx4wAUNNm3aVLWC5E8vh9qf4/3V9hqtjwPdx8ocP/fcNFQOERE5fCpKiYjIEeO7774DoE+fPj+7b6dOnfjmm2+YM2cOH3zwAZ999llVgerBBx9k4cKFVR8e66o+hayG1hAjvg7FwYo+tTWpbgqVj0H37t1/9sPr/s/xH/7wBy666CLeffddZs+ezRdffMFjjz3G448/zmOPPcZvf/vbemdq164dEydOJDY2lt/+9rd8+OGHNfKOHTu21pFdldq0aVPjsqZ8jH/utuqapfL+DhgwgP79+x90X7fbXe/bqYtLLrmEU089lffee49Zs2bx2Wef8dxzz/Hcc89x66238sgjjzTYbe1v8+bNXHnllQA8/vjjnHnmmXTs2LFq5NiJJ57IwoULq62gWCkc7zOVz9mECRMOut+QIUMO+Zi1OdB9rLzOhRdeeMBCORxa834REWlcKkqJiMgRoaCggE8++QSAkSNH1uk6LpeL008/vWo60ObNm7n66quZM2cODzzwAA8++GCj5f2pzZs31zoaZ/PmzQDVVuGKiooCqHWExdatWxssU0pKClFRUWRnZ1NUVFTrh8C6jqCor/bt2wP/exx+qrbLK0fS9OrV64DL0R9Ip06duOWWW7jlllsIhUJMnTqVq666ittvv50rrrjisFc5GzVqFFB9JEdl3muvvfaA06dak8r7e/LJJ/Pkk0+GOQ20bduWa6+9lmuvvRZjDJ988glZWVk8+uijXH311Rx99NF1Os6WLVtqvbywsJD8/HxiYmJITEwEYObMmZSWlnLbbbfVWuzcsGFDve9PY0hPT2f9+vU88sgjdS7WH+x9qry8nF27dtUrx+rVq5k4cWLVFGwREWne1FNKRESOCH/4wx8oKiri+OOP54QTTqjXMTIyMrjjjjsAWL58edXllR+uQqHQ4Qc9gDfffLPGZbm5ucyaNQvLsqqN+Kks1KxZs6bGdWbPnl3r8etzHyIjIxk6dCgAU6dOrbF9+fLlLFu2DI/Hw4ABA+p83ENR2SPmrbfeqnVkRW25jj/+eBISEvjss89q7clTVy6Xi8svv5zjjz+e0tLSqv5TB1PbyJb9rVu3DqhexKvsQ/TOO+/UO2tdRUZGNurruC5GjhxJREQEH3zwAWVlZY16W4f6urcsi7Fjx3LmmWcCsGLFijrfVk5ODp9++mmNyytfoyeccELV9Me8vDyg9qmIn3/+Obt3767z7TaF+rxGD/Y+NXfu3Ho99015roiISMNQUUpERFq1DRs2kJWVxQsvvEBcXBwvvPBCna732GOP1fpN/cyZM4GKETOVKkcprV69ugES127atGlVI72g4kP073//e4qKihg/fny1HivDhw8H4JlnnqnWkHvp0qX85S9/qfX49b0Pt9xyCwD33HNPtdEbPp+PX//61xhjuOGGGxptStGIESPo1asX69ev57777qu27bnnnmPhwoU1ruN2u7n99tvx+Xycf/75tY462b59O6+88krVz3PnzuW///1vjcLXxo0bWblyJZZlHbB/0/6uvfZa7rvvvlp7gK1evZo//OEPQMX0o0oXXHABffr04bXXXuNvf/tbjb5Ixhjmz5/P/Pnzf/b2f06HDh3YvXs3+fn5h32s+urYsSNXX301mzZt4pJLLqm1ALNu3bpaexsdqoO97r/77jvefvttSktLq12em5vLokWLgOrvA3Vx2223VTsnN27cyF//+lcAfvWrX1VdXtmY/dVXX6WoqKjq8u3bt3PjjTce0m02hT/84Q/ExMRw22238fbbb9fYHgwGmT59Otu2bau6bNiwYUDFfawcUQkVj8lvfvObeuW44YYbSE1N5cEHH+T555+vcb6GQiE++eSTal8qiIhIeGn6noiItBqVPVgcx6GwsJA1a9awatUqjDH06NGD119/nWOOOaZOx7r33nu57bbb6N+/Pz169MAYw7Jly1izZg3JycncdtttVfsOHTqU1NRUpk+fzogRI+jatSu2bXP11Vdz4oknNsh9u/766znjjDMYNmwY7du3Z9GiRWzcuJEOHTrw1FNPVdt35MiRDB8+nM8++4w+ffpw0kknkZ2dzaJFi/jNb37Dww8/XOP49b0PF154Iddffz3PP/88ffv2ZdSoUcTGxjJv3jz27t3L0KFDqz50NwbbtnnppZcYPXo0d999N9OnT6dv376sW7eOb775hptvvpmnn366xvUmTpzIqlWreOWVV+jduzcDBw6kS5culJaWsnr1an788Uf69evHL3/5SwCWLVvG73//e9q2bcuxxx5LSkoKe/fu5bPPPiMYDHLLLbdUm0J5IDk5Ofz73//m7rvv5uijj6Znz55ERESwefPmqlUeBw8ezF133VV1HZfLxbvvvsuYMWP4y1/+wlNPPUW/fv1ITU0lOzubpUuXsmfPHh577LFDbr79U2effTZPPvkkgwYN4sQTTyQ6OpqjjjqKP/7xj4d13EP1xBNPVDXV/vjjjxkwYACdO3emqKiIH3/8kXXr1nHOOecc9nTGs88+m5dffplLL72U008/nYSEBAAmT57M5s2bueCCC0hISOC4444jLS2N/Px8Pv/8c3w+H2edddYhjbocOnQopaWldO/enVGjRlFWVsann35KIBDg8ssvr7Zi3Nlnn83RRx/NN998U9X7rKSkhLlz5zJgwABOPPFEFixYcFj3vSF1796dN954g0svvZQLLriA7t2707t3b+Li4ti+fTtLliyhqKiI7777rqp4261bN6644gqmTJnCgAEDGDZsGIFAgK+++opx48YRCAQOOC33QBITE3nvvfc466yzuOGGG7jvvvvo27cvSUlJ7Nq1iyVLlpCfn88777xD3759G+OhEBGRQ2VERERaOKDaH5fLZZKTk03fvn3NhAkTzNtvv21CodBBr5+RkVHtsilTpphLL73UHHXUUcbr9Rqv12v69Oljbr31VrNt27Yax1i8eLE57bTTTEJCgrEsywDmxRdfNMYYM3fuXAOYCRMmHDDD3XffXe06lYYPH24As3HjRvPiiy+aAQMGmOjoaJOSkmJ++ctfmq1bt9Z6vPz8fHPjjTeadu3aGbfbbY4++mjzzDPPHPD+/tx92LhxowHM8OHDa729KVOmmBNPPNF4PB4THR1tjj76aPP3v//dBAKBGvtOmDDBAGbu3Lm1HutA+Q7m+++/N2eddZZJSEgwcXFx5oQTTjAffPDBzz727733njnzzDNNamqqiYyMNKmpqebYY481t99+u/n222+r9lu7dq258847zUknnWTat29voqKiTMeOHc3o0aPNW2+9ZRzHqVPObdu2mUmTJpkLL7zQ9OnTxyQmJhqXy2Xatm1rRo8ebZ599llTWlpa63Xz8/PNfffdZwYNGlT1OGdmZpoxY8aYf/3rX2bv3r1V+/7c83Wg15vf7ze//vWvTadOnYzL5apxjP1fj/s72HN2sOf7YM9PKBQyL7/8shk1apRJTk42kZGRpkOHDuaEE04w9957r1m9enW1/TMyMsyBfrU92O089thjpk+fPsbtdle9hxhjzM6dO819991nRo0aZdLT001UVJRp166dOemkk8y///3vAz5PP7X/c5Gfn29uvvlm06FDBxMVFWWOOuoo8/DDD9f6/pSbm2tuuukmk5mZadxut+natau54447TFFRUa3Pw8895z+n8pgHOi/3v40DPdfr1q0zN998s+nRo4eJjo42Xq/XHHXUUebiiy82b775pgkGg9X2DwaDZuLEiaZTp04mKirKdOvWzdx3330mFArV+nzW5b3UmIrn7vbbbzdHH320iY2NNbGxsaZbt27mnHPOMS+99JLx+Xx1eUhERKQJWMb8THMDERERERGpl02bNtGlSxeGDx/OvHnzwh1HRESkWVFPKRERERERERERaXIqSomIiIiIiIiISJNTUUpERERERERERJqcekqJiIiIiIiIiEiT00gpERERERERERFpcipKiYiIiIiIiIhIk1NRSkREREREREREmpyKUiIiIiIiIiIi0uRc4Q7Q2uXl5REKhcId47C0bduWvXv3hjuGSKuk80uk8ej8Emk8Or9EGo/OL2kNXC4XSUlJP79fE2Q5ooVCIcrKysIdo94sywIq7ocWahRpWDq/RBqPzi+RxqPzS6Tx6PySI42m74mIiIiIiIiISJNTUUpERERERERERJqcilIiIiIiIiIiItLkVJQSEREREREREZEmp6KUiIiIiIiIiIg0ORWlRERERERERESkyakoJSIiIiIiIiIiTU5FKRERERERERERaXIqSomIiIiIiIiISJNTUUpERERERERERJqcilIiIiIiIiIiItLkVJQSEREREREREZEmp6KUiIiIiIiIiIg0ORWlRERERERERESkyakoJSIiIiIiIiIiTU5FKTko27ar/S0iIiIiIiIi0hBc4Q4gzZPL5SIq1kNstJvcQClJKW0IlAQpDfgJhULhjiciIiIiIiLS6ti2jW3bOI6D4zjhjtPoVJSSGlwuF/FJyby8aAvTlmzDFwzhdbvIGpTOhCGdKczLVWFKREREREREpIHsPzDEVxIiMdp1RAwMUVFKaoiK9fDyoi1MXrip6jJfMFT1c9aANEKF+WHJJiIiIiIiItKaHMkDQ9QoSKqxbZvYaDfTlmyrdfu0JduIjXarx5SIiIiIiIhIA9h/YIgvWFF8qhwY8vKiLUTFesKcsPGosiDV2LaNryRUdSL8lC8YIidQxnur8vh2u5+SUOuf4yoiIiIiIiLSGI70gSHNdvreu+++y+uvv864ceO48sorAbjnnnv48ccfq+136qmncv3111f9nJ2dzaRJk1ixYgXR0dEMHz6cSy+9lIiIiKp9VqxYwZQpU9i6dSspKSlccMEFjBgxotpxP/74Y2bMmEF+fj4ZGRlcffXVdO/evdHub3PhOA6J0S68blethSmv20VidCTTl2eTX1yGy4ZebWLo3z6OAWlxdEuOJsK2wpBcREREREREpGWpy8AQfzBU1fy8tWmWRal169Yxe/ZsMjIyamwbPXo0WVlZVT9HRUVV/dtxHO6//34SExO57777yMvL46mnniIiIoJLL70UgD179vDPf/6T0047jVtuuYXly5fz7LPPkpiYyIABAwBYsGABU6ZM4brrrqNHjx58+OGH/P3vf+fxxx8nISGhce98mDmOQ6AkSNag9Go9pSplDUpnd0ERx3eIZdmuIvYUhVi+p5jle4p5bVk2niibY9rFMaB9LAPS4kjzRtW8ERERERER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MABmzpzJhg0bOHr0KDt37mTz5s2kpKTUu7+EhATKysrYtGkTBQUFlJeXN+XTEREREZFfcTgc2IoLsebnEWoxY83Pw1ZcpISUiIhcMFVKeaDm2sTzxRdfZObMmUycOBG73U6/fv1466238Pb2BmrK6GfMmEFmZiYBAQEMGjSIp59+ut599e7dmwkTJvCnP/0Jq9XKtGnTeOihh5rw2YiIiIhIfU5Oi9T0SBERuVgGl8vlcncQLVlubi5VVac2HC8uLiYoKOii9280GmuX322sCwNvb+96n0NL01Dvici5MhgMxMbGkpmZiX4VizQsnV8ijUfnl0jj0fklLYW3tzeRkZFnHadKKQ+nJp4iIiIiIiIi4onUU0pERERERERERJqcklIiIiIiIiIiItLklJQSEREREREREZEmp6SUiIiIiIiIiIg0OSWl3EQrKTQ/ek9EREREREREmo6SUm5iMpkoKytTIqQZcLlclJWVYTJpMUoRERERERGRpqK/wt3E39+fyspKSkpK3B3KWZnNZux2u7vDaFQ+Pj74+Pi4OwwRERERERGRS4aSUm7kCYkQg8FAbGwsmZmZquoSERERERERkQaj6XsiIiIiIiIiItLklJQSEREREREREZEmp6SUiIiIiIiIiIg0OSWlRERERERERESkyanReSMzmVrGS9xSnodIc6TzS6Tx6PwSaTw6v0Qaj84v8XTn+jNscGlJNRERERERERERaWKavidnVF5ezqOPPkp5ebm7QxFpcXR+iTQenV8ijUfnl0jj0fkllxolpeSMXC4X6enpqKBOpOHp/BJpPDq/RBqPzi+RxqPzSy41SkqJiIiIiIiIiEiTU1JKRERERERERESanJJSckbe3t6MGjUKb29vd4ci0uLo/BJpPDq/RBqPzi+RxqPzSy41Wn1PRERERERERESanCqlRERERERERESkySkpJSIiIiIiIiIiTU5JKRERERERERERaXJKSomIiIiIiIiISJMzuTsAab7Wrl3Lhx9+SGFhIa1bt+bOO+8kJSXF3WGJeLS0tDRWrFhRZ1tcXBwvv/yyewIS8WB79uxh1apVpKenY7Vaefjhh+nTp0/t/S6Xi7S0ND799FPKysro2LEjd999N7GxsW6MWsQznO38euWVV/jiiy/qPKZ79+7MmDGjqUMV8TgrV67km2++4cSJE5jNZtq3b8/4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2GOPnfbxQ4cOZe3atSxYsIBDhw4RGhrKxo0b8fHxadDj/JrFYqFTp06sWrWK6upqwsLC2LFjBzk5Oee8j18bP3488+bN48knn2Tw4MHY7XbWrl2LxWJhzJgxteMGDBjA22+/zQsvvMB1111HZWUl69atIzY2lvT09As+fn0sFguTJk3i73//O48++igDBgwgKCiIvLw8tm3bRocOHbjrrruAmkb6Tz31FA8//DBDhw4lKiqKoqIi9u/fT0FBAc8//3yDxiYiIiJ1KSklIiIiLcINN9xAbGwsq1evZvny5UBNU+xu3brRq1ev2nGpqancfvvtfPTRRyxevJjk5GQee+wxlixZcs7H6tKlC3PnzmXFihV88sknVFRUEBISQkpKCtdcc80ZH+vj48PMmTNZtGgRa9euxWw2c9VVV5Gamsqzzz7bYMepz9SpU1m0aBGffPIJLpeLbt268cQTT3DPPfec976A2senpaWRlpaGl5cXnTt35rbbbqvTrDwwMJBHHnmExYsXs3TpUqKiorj11lvJzMxs8KQUwJVXXkloaCgffPABq1atoqqqirCwMDp16sTgwYNrxyUkJPDcc8+xfPlyNmzYQElJCcHBwSQlJXHzzTc3eFwiIiJSl8H16xpuEREREZFfycrK4v7772fKlCn85je/cXc4IiIi0gKop5SIiIiInFVhYSEAQUFB7g1EREREWgxN3xMRERGRM/rss8/4/PPP8fHxoV27du4OR0RERFoIVUqJiIiIyBn97//+L6WlpTz44IP4+/u7OxwRERFpIdRTSkREREREREREmpwqpUREREREREREpMkpKSUiIiIiIiIiIk1OSSkREREREREREWlySkqJiIiIiIiIiEiTU1JKRERERERERESanJJSIiIiIiIiIiLS5JSUEhERERERERGRJqeklIiIiIiIiIiINDklpUREREREREREpMn9f/DT27dY5KVHAAAAAElFTkSuQmCC\n"},"metadata":{}}],"source":["def analyser_temporalite(df):\n"," \"\"\"Analyse la distribution temporelle des tweets\"\"\"\n"," print(\"\\n3. ANALYSE TEMPORELLE\")\n"," print(\"-\" * 50)\n","\n"," # Convertir la colonne 'date' en format datetime\n"," df['date_obj'] = pd.to_datetime(df['date'], errors='coerce')\n","\n"," # Extraire les composantes de date\n"," df['year'] = df['date_obj'].dt.year\n"," df['month'] = df['date_obj'].dt.month\n"," df['day'] = df['date_obj'].dt.day\n"," df['hour'] = df['date_obj'].dt.hour\n"," df['weekday'] = df['date_obj'].dt.dayofweek\n","\n"," # Afficher la plage temporelle\n"," print(f\"Période couverte: de {df['date_obj'].min()} à {df['date_obj'].max()}\")\n","\n"," # Distribution par mois\n"," plt.figure(figsize=(12, 6))\n"," monthly_counts = df.groupby(['month', 'sentiment']).size().reset_index(name='count')\n"," sns.barplot(x='month', y='count', hue='sentiment', data=monthly_counts)\n"," plt.title('Distribution des Tweets par Mois', fontsize=15)\n"," plt.xlabel('Mois')\n"," plt.ylabel('Nombre de Tweets')\n"," plt.tight_layout()\n"," plt.show()\n","\n"," # Distribution par jour de la semaine\n"," plt.figure(figsize=(12, 6))\n"," weekday_sentiment = df.groupby(['weekday', 'sentiment']).size().reset_index(name='count')\n"," sns.barplot(x='weekday', y='count', hue='sentiment', data=weekday_sentiment)\n"," plt.title('Distribution des Sentiments par Jour de la Semaine', fontsize=15)\n"," plt.xlabel('Jour de la Semaine')\n"," plt.ylabel('Nombre de Tweets')\n"," plt.xticks(ticks=[0, 1, 2, 3, 4, 5, 6], labels=['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche'])\n"," plt.tight_layout()\n"," plt.show()\n","\n"," # Distribution par heure de la journée\n"," plt.figure(figsize=(12, 6))\n"," hourly_sentiment = df.groupby(['hour', 'sentiment']).size().reset_index(name='count')\n"," sns.lineplot(x='hour', y='count', hue='sentiment', data=hourly_sentiment, marker='o')\n"," plt.title('Distribution des Sentiments par Heure', fontsize=15)\n"," plt.xlabel('Heure de la journée')\n"," plt.ylabel('Nombre de Tweets')\n"," plt.tight_layout()\n"," plt.show()\n","\n","analyser_temporalite(df)"]},{"cell_type":"markdown","metadata":{"id":"lETyJsrVWjI_"},"source":["#### 4. Analyse des mots fréquents\n","\n","- Nuages de mots spécifiques à chaque classe de sentiment \n","- Détection des mots discriminants entre sentiments positifs et négatifs \n","- Identification des n-grammes les plus fréquents "]},{"cell_type":"code","execution_count":13,"metadata":{"id":"E3WHO2pgWjI_","executionInfo":{"status":"ok","timestamp":1751537421459,"user_tz":-120,"elapsed":4,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["def analyser_mots_frequents(df, sentiment, n_range=(1, 2, 3)):\n"," \"\"\"\n"," Analyse les mots et N-grammes les plus fréquents pour un sentiment donné.\n","\n"," Paramètres:\n"," - df: DataFrame contenant les tweets\n"," - sentiment: valeur de sentiment à filtrer ('Positif' ou 'Négatif')\n"," - n_range: tuple indiquant les valeurs de N à analyser (par défaut: unigrammes, bigrammes et trigrammes)\n"," \"\"\"\n"," # Filtrer par sentiment\n"," texts = df[df['sentiment'] == sentiment]['text'].astype(str)\n","\n"," # Télécharger les stopwords si nécessaire\n"," stop_words = set(stopwords.words('english'))\n","\n"," # Fonction pour nettoyer et tokenizer le texte\n"," def preprocess_text(text):\n"," # Convertir en minuscules et supprimer caractères spéciaux\n"," text = re.sub(r'[^\\w\\s]', '', text.lower())\n"," # Tokenizer manuellement\n"," tokens = text.split()\n"," # Supprimer les stopwords\n"," tokens = [word for word in tokens if word not in stop_words and len(word) > 1]\n"," return tokens\n","\n"," # Traiter tous les textes (liste de liste de tokens)\n"," all_tokens = []\n"," for text in texts:\n"," all_tokens.append(preprocess_text(text))\n","\n"," # Analyser les unigrammes (liste de mots individuels)\n"," all_words = []\n"," for tokens in all_tokens:\n"," all_words.extend(tokens)\n","\n"," # Compter les occurrences des mots (liste de couples)\n"," word_counts = Counter(all_words)\n"," most_common_words = word_counts.most_common(20)\n","\n"," # Créer un nuage de mots pour les unigrammes\n"," wordcloud = WordCloud(width=800, height=400, background_color='white').generate_from_frequencies(dict(word_counts))\n","\n"," plt.figure(figsize=(12, 8))\n"," plt.imshow(wordcloud, interpolation='bilinear')\n"," plt.axis('off')\n"," plt.title(f'Nuage de mots pour les tweets {sentiment.lower()}s', fontsize=15)\n"," plt.tight_layout()\n"," plt.show()\n","\n"," # Afficher les résultats pour les unigrammes\n"," # print(f\"\\nMots les plus fréquents pour les tweets {sentiment.lower()}s:\")\n"," # for word, count in most_common_words:\n"," # print(f\"- {word}: {count:,}\")\n","\n"," # Visualiser les mots les plus fréquents avec un barplot\n"," plt.figure(figsize=(12, 8))\n"," word_df = pd.DataFrame(most_common_words, columns=['Mot', 'Fréquence'])\n"," sns.barplot(x='Fréquence', y='Mot', data=word_df, palette='coolwarm')\n"," plt.title(f'Mots les plus fréquents pour les tweets {sentiment.lower()}s', fontsize=15)\n"," plt.xlabel('Fréquence', fontsize=12)\n"," plt.ylabel('Mot', fontsize=12)\n"," plt.tight_layout()\n"," plt.show()\n","\n"," for n in range(n_range[0] + 1, n_range[1] + 1): # Commencer à 2-grammes si n_range commence à 1\n"," all_ngrams = []\n"," for tokens in all_tokens:\n"," if len(tokens) >= n: # Vérifier que le texte est assez long pour former un n-gramme\n"," all_ngrams.extend(list(ngrams(tokens, n)))\n","\n"," # Convertir les tuples en chaînes pour une meilleure lisibilité\n"," all_ngrams_str = [' '.join(gram) for gram in all_ngrams]\n","\n"," # Compter les occurrences des n-grammes\n"," ngram_counts = Counter(all_ngrams_str)\n"," most_common_ngrams = ngram_counts.most_common(20)\n","\n"," # Afficher les résultats pour les n-grammes\n"," # print(f\"\\n{n}-grammes les plus fréquents pour les tweets {sentiment.lower()}s:\")\n"," # for ngram, count in most_common_ngrams:\n"," # print(f\"- \\\"{ngram}\\\": {count:,}\")\n","\n"," # Visualiser les n-grammes les plus fréquents avec un graphique à barres\n"," plt.figure(figsize=(12, 8))\n","\n"," # Créer un DataFrame pour le graphique\n"," ngram_df = pd.DataFrame(most_common_ngrams, columns=['N-gramme', 'Fréquence'])\n","\n"," # Créer un graphique à barres horizontales\n"," color = 'royalblue' if sentiment == 'Positif' else 'red'\n"," sns.barplot(x='Fréquence', y='N-gramme', data=ngram_df.sort_values('Fréquence', ascending=False), color=color)\n"," plt.title(f'Top {n}-grammes pour les tweets {sentiment.lower()}s', fontsize=15)\n"," plt.xlabel('Fréquence', fontsize=12)\n"," plt.ylabel('N-gramme', fontsize=12)\n"," plt.tight_layout()\n"," plt.show()\n"]},{"cell_type":"code","execution_count":14,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"GgsXlsTqWjI_","executionInfo":{"status":"ok","timestamp":1751537440633,"user_tz":-120,"elapsed":19173,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"eaa7039b-0008-469e-8702-d95e02f9a239"},"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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f39/TZkyRR999FGx+8zPz9e3335bJNy40r188MEHOnDgQLH933zzjaSyj82y+Mc//qGCggINHjxY27ZtK3b8+PHj+vjjj63bnp6eeuCBB5Sfn68nn3yyyDPbvn27pk2bVmI/jRs31smTJ/Xll18W2T916lTrBy5c6mrGQFlNnTpVR44cKbbfFs8aAKoqXt8DAOASH374oTp37qzPPvtMSUlJ6tixo44dO6bExERdvHhR//rXv6wzVf4qODhYLVq0ULNmzXT77bfL2dlZa9asUXZ2trp3714sGCjN9OnTrTMl6tSpU+prX2+//XaR9Wgu54EHHtCiRYu0ePFiRURE6Pbbb5ejo6PWrl2r8PBw3XLLLfrxxx/LFH45OTlp/PjxevHFF9W1a1f16NFDtWrV0k8//aSjR49qzJgxio+Pv+rrVRYNGzbUF198ofvvv1+DBw9Ww4YN1bRpU9WoUUPp6enaunWrzp49q19++UX16tVTXl6ennzyST377LNq06aNQkNDlZeXp82bN+v3339XaGioHnnkkTLV8OCDD6pDhw7q0aOHatasqe+//15HjhxRs2bN9OqrrxZpO2nSJP34449atWqVwsLC1LVrV509e1Zr1qxRbm6uxo0bp759+xY55/nnn9fChQv17rvvKjExUeHh4dq5c6d+//13jR49WjNmzCj3c7waL7zwglJTUzVnzhw1bdpUrVu3VoMGDZSXl6c9e/YoJSVFLVq0sH6K4Pbt2/W3v/1Nfn5+atOmjWrXrq1jx44pKSlJFy5c0BNPPHFVr8iGhoaqRYsW+vnnn9W+fXs1a9ZMjo6O6tevX5FPF+zatavWrVun3NzcYq/nFa4rVfjvSzk5Oemrr75Sr1699PLLL2v69Olq0aKF/P39lZWVpW3btumPP/7Q1KlTrWtq+fj46Ouvv1bfvn316KOP6rXXXlPz5s3l6+urI0eOaOvWrcrOztbixYutn2h3pXv54IMP9PjjjysyMlJNmzaVk5OTUlNTtX37drm5uenll1++lm/dVbn//vuVnJysN954Q23atFGrVq0UHh4uwzC0f/9+7dixQ56ennr44Yet57z55ptKSkrSV199pfDwcHXq1EnZ2dlas2aNHn30UU2fPr3Y76kJEybowQcf1NChQxUfH6969epp+/btSk1N1d/+9jdNnTq1WG19+/bVP//5Tz37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AAAAqCyqbCjl4eGh0NBQJScnKzw8XMnJyerTp48WLlyo3NxcnTt3TkeOHFFkZGSJ52dlZalv374KCgqSpGLB0MWLF/Xwww8rICBAktS7d28tXLiw1HpWrlwpDw8PPfXUU3Jy+vOxBgYGWo8vXbpU/fv312233SZJevDBB5WcnKzly5dr1KhR1/QMvvnmG3Xv3l09evSQJA0dOlQ7d+5UXl5eqedYLBZZLBbrtslkkru7+zX1DwAAAAAAcK2qbCglSZGRkUpJSVHfvn2Vmpqq+++/Xxs3blRqaqpycnLk6+tb6iykPn366MMPP9QPP/ygm266Sbfccos1gJIkV1fXItu+vr46ffp0qbUcPHhQERER1kDqr86dO6eTJ08qIiKiyP4mTZro4MGDZb1tq/T0dPXs2bPIvkaNGik5ObnUcxYvXlwkXGvQoIEmT558zTUAAAAAAABciyodSjVr1kxr167VwYMH5ejoqKCgIDVr1kzJyck6e/ZsqbOkJCk6OlqdOnXS1q1btW3bNi1YsEBPPfWU2rdvL0lFXuUrZBhGqddzdnYu172YTKZifeTn55frmiUZOHCgoqKiivULAAAAAABgSw72LqA8IiIidP78eS1btswaQBXOnkpOTlazZs0ue35gYKCioqL00ksvqX379lq7du011xISEqLU1NQSgyQPDw/5+voqNTW1yP49e/aoXr16kmRdoDw7O9t6PC0t7bJ9BgUFad++fUX2Xbp9KWdnZ3l4eFi/eHUPAAAAAADYQ5UOpTw9PRUSEqJ169YVCaV+++03ZWZmljpTKi8vT59++qmSk5N17Ngxpaamav/+/db1pa5F7969df78eb377rvav3+/MjMz9f333ysjI0OS1K9fP3399dfasGGDMjIyNG/ePKWlpenuu++WJAUEBKh27dpasGCBMjMztXXrVi1btuyyfd59991au3at1q5dq4yMDC1YsECHDx++5nsAAAAAAACwlSr9+p70ZwiVlpZmnRXl6empevXq6dSpU0UWGv8rBwcHnTlzRtOnT9epU6fk5eWlDh06KDo6+prr8PLy0ssvv6y5c+cqLi5ODg4OCg0NVZMmTSRJd911l86dO6fPPvtMp06dUr169fT8889b17xycnLSk08+qU8++UTPPvusGjZsqKFDh+qdd94ptc9bb71VR44c0dy5c2WxWNShQwf1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AAAAAAD+qlxrSrm6uqpx48ZasmSJ/ve//5Xa7ssvvyxPNwAAAAAAALjBlCuU+vTTT7V69Wo1btxYDRs25NP3LiMuLk6hoaGKiYmxdykAAAAAAAB2V65QauPGjerSpYvGjBlTUfVUSgRKAAAAAAAAFatca0o5OjqqUaNGFVULAAAAAAAAqolyzZS69dZbtWXLFt15550VVU+ZFRQUaOnSpfruu+90/Phx1axZUz179tSgQYMkSXPnztXmzZt1/Phx+fj4qFOnThoyZIicnP689QULFmjz5s3q27evvvzyS+Xk5Kh169Z69NFH5e7urvj4eKWkpCglJUXffPONJGn69Ony9/cvVsu3336r5cuX6/jx4/Lw8FBERISeeeaZEuu2WCz64osvtH79ep07d07169fXAw88oGbNmlnbpKam6vPPP9f+/fvl7e2tdu3a6f7775ebm5skacyYMerevbsOHz6sLVu2yMPDQwMHDlTv3r0r9BkDAAAAAABUtHKHUrNmzdKkSZPUvXt31alTRw4OxSdfhYWFlaeby/r888+1evVqjRgxQhEREcrOzlZ6err1uLu7u0aPHi1fX18dOnRIH374odzd3dW/f39rm6NHj2rTpk16/vnndfbsWU2dOlVfffWV7rvvPsXGxiozM1P169fXvffeK0ny9vYuVsf+/fs1a9YsjR07Vk2aNFFOTo52795dat2ffvqp0tPT9dRTT8nX11ebNm3SG2+8obfffltms1lHjhzR66+/rqFDh+rxxx/X6dOnNXPmTM2cOVOjR4+2Xmfp0qUaOHCgoqOjtX37diUkJCgwMFAtWrSoiMcLAAAAAABwXZQrlJo4caL139u2bSu13fX69L3z589rxYoVeuihh9StWzdJUkBAgCIiIqxtBg8ebP23v7+/MjIytGHDhiKhlGEYGjNmjNzd3SVJXbp00a5duyRJHh4ecnJykqurq3x8fEqtJSsrS66urmrTpo3c3d3l5+enBg0alNo2MTFRM2bMUK1atSRJ/fr10/bt27V27Vrdf//9+uqrr9S5c2f16dNHkmQ2mxUbG6uJEydq1KhRcnFxkSQ1adJEAwYMkCQFBgZqz549Wr58eamhlMVikcVisW6bTCbrfQMAAAAAANhKuUKpxx9/vKLquCbp6emyWCy66aabSm2zYcMGrVixQkeOHFFubq4KCgqKhTB+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sm5XppluAAAAAACg+ihXKJWUlHTZ4yaTSc7Ozqpdu7YaNGhQ4npTFa1Zs2Zau3atDh48KEdHRwUFBalZs2ZKTk7W2bNnrbOkJGnJkiVasWKFRowYoeDgYLm5uSkhIUH5+flFrunkVPwxGYZRZNvR0bHItslksrZZv3695syZo+HDh6tx48Zyd3fXkiVLtG/fvoq67avm7Oxsk+8DAAAAAADA5ZQrlJoxY8ZVt/Xw8NCAAQOs6zldLxERETp//ryWLVtmDaAiIyP19ddfKycnp8gi4KmpqWrbtq26dOki6c+ZU5mZmQoKCqrQmvbs2aMmTZqoV69e1n1Hjx697DmBgYH65Zdfiuz79ddfi2wHBQVpz549xfoKDAwscZYUAAAAAABAZVGuUGrKlCmKj4+Xl5eXevXqpYCAAElSZmamvv32W509e1YjR45Udna2Vq5cqc8//1zu7u668847K6T4knh6eiokJETr1q3TQw89JOnPUGrq1Km6ePFikZlSZrNZP/74o/bs2aMaNWpo2bJlys7OrvBQKiAgQElJSdq2bZv8/f31/fff69dff5W/v3+p5/Ts2VPLli3T3Llz1aNHD6WlpVlnphW+chcVFaUJEyZo4cKF1oXOV65cqVGjRlVo/QAAAAAAABWtXKHU8uXLVbNmTb344otF9gcHB6t9+/Z64403tGbNGj322GNq27atJk6cqG+//fa6hlLSnyFUWlqamjVrJunPoKpevXo6deqUAgMDre0GDx6so0eP6vXXX5erq6tuv/12tWvXTufOnavQenr27Km0tDS9++67MplMuu2229SrV69iM6H+yt/fX88884w+++wzrVixQo0bN9bAgQP1ySefWF8nDAsL09/+9jctWLBA//3vf+Xr66vo6OhSFzkHAAAAAACoLEzGpYsjlUFsbKzuu+++UkOmb7/9VvPnz9esWbMk/flpcV988YXmzZt3rV1Wa4sWLdKqVav073//u8KvnREVpbzk5Aq/LgAAKM5l/Xp7l1ClmUwmmc1mZWZmFlvnE7gU4wVlwXhBWTFmSubs7Cw/P78rtivXTKmCggJlZGSUejw9Pb3IN8XJyanYJ9uhdN9++63Cw8Pl5eWlPXv2aMmSJerdu7e9ywIAAAAAACi3coVSbdu21bfffquAgAD16NHDGjjl5eVp9erVWrVqlW699VZr+71791rX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mTJF//3vf91dFmqYoqIizZ49W88//3yt/iCOP+70FyZIUtOmTZ0h1bp16+ghnMFut6tZs2bO9XwiIyOVm5urzz//nIWlcU5ffvml2rRpowYNGri7lFqD2/dqIX9/f3l4eDhT29OqSnhRu5z++x89etRl/9GjR53HrFarjh075nL85MmTOnHihMuYqvrrt9fAlWPmzJnavHmzXnzxRV1zzTXO/VarVZWVlSopKXEZ//t++X0vnO6v346pqucsFgv/R+MKZDabFRwcrKioKPXr108RERFavnw5/QIXe/bs0dGjR/XMM8+oT58+6tOnj7KysrRixQr16dNH9evXp19wTnXr1lVoaKgKCwt5f8EZAgICFBYW5rIvLCzMecsnn3lRlV9++UU//fSTunTp4tzH+8vlRyhVC5nNZkVFRSkjI8O5z263KyMjQy1atHBjZXC3oKAgWa1Wbd261bmvtLRUu3btcvZGixYtVFJSoj179jjHZGRkyOFwKDo62jlm27ZtqqysdI756aefFBoayjTmK4jD4dDMmTO1ceNGvfDCC2dMT4+KipKnp6dLv+Tn56uoqMilX3Jzc13+Ef7pp59ksVicHxabN2/uco7TY3g/ujrY7XbZbDb6BS7i4+M1YcIEvfLKK86fZs2aqUOHDs7f6RecS3l5uTOQ4v0FvxcTE3PGsiT5+fkKDAyUxGdeVO3LL79U/fr1dd111zn38f5y+RFK1VIJCQlavXq11qxZo/3792vGjBn69ddfmc5aC5SXlysnJ0c5OTmSTt1zn5OTo6KiIplMJt1xxx36+OOP9d133yk3N1eTJ09WQECA/vKXv0g69V+Z2rRpo+nTp2vXrl3avn273n33Xd10003Oaa4dOnSQ2WzWtGnTtG/fPq1du1YrVqxQQkKCu542LsDMmTP1zTff6NFHH5XFYlFxcbGKi4tVUVEh6dSCoJ07d9bcuXOVkZGhPXv2aOrUqWrRooXzH9jWrVsrLCxMkydPVk5Ojn744QfNnz9ft912m7y8vCRJ3bp108GDB5WSkqK8vDx9+umnWrdunbp37+62544L8/777ysrK0sHDx5Ubm6uc/vmm2+mX+DCYrEoPDzc5adOnTry8/NTeHg4/YIzzJ071/n+kp2drVdffVUeHh7q0KED/YIzdO/eXTt37tTHH3+swsJCffvtt1q9erVuu+02SeIz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\n"},"metadata":{}}],"source":["analyser_mots_frequents(df, 'Négatif')"]},{"cell_type":"markdown","metadata":{"id":"yvXJwMNOWjJA"},"source":["#### 5. Analyse des utilisateurs\n","\n","- Étude de la distribution des tweets par utilisateur \n","- Analyse des tendances de sentiment propres aux utilisateurs "]},{"cell_type":"code","execution_count":16,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":0},"id":"K2GstxOKWjJA","executionInfo":{"status":"ok","timestamp":1751537469471,"user_tz":-120,"elapsed":4209,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"c9a0bd79-380b-4049-ed32-e62a48d8aa3f"},"outputs":[{"output_type":"stream","name":"stdout","text":["\n","6. ANALYSE DES UTILISATEURS\n","--------------------------------------------------\n","Nombre d'utilisateurs uniques: 659,775\n","\n","Top 10 des utilisateurs par nombre de tweets:\n","- lost_dog: 549 tweets\n","- webwoke: 345 tweets\n","- tweetpet: 310 tweets\n","- SallytheShizzle: 281 tweets\n","- VioletsCRUK: 279 tweets\n","- mcraddictal: 276 tweets\n","- tsarnick: 248 tweets\n","- what_bugs_u: 246 tweets\n","- Karen230683: 238 tweets\n","- DarkPiano: 236 tweets\n","\n","Parmi les utilisateurs avec au moins 5 tweets:\n","Ratio positif moyen: 51.23%\n","Ratio négatif moyen: 48.77%\n","\n","Utilisateurs les plus positifs:\n","- 007wisdom: 100.00% positif (6 tweets)\n","- LongandLoud: 100.00% positif (6 tweets)\n","- LoopNashville: 100.00% positif (8 tweets)\n","- Looyda: 100.00% positif (5 tweets)\n","- LoraNorton: 100.00% positif (5 tweets)\n","\n","Utilisateurs les plus négatifs:\n","- zombiemovies: 100.00% négatif (5 tweets)\n","- zombiecommand: 100.00% négatif (5 tweets)\n","- zzkim: 100.00% négatif (5 tweets)\n","- 1284forever: 100.00% négatif (6 tweets)\n","- 123katie123: 100.00% négatif (5 tweets)\n"]}],"source":["def analyser_utilisateurs(df):\n"," \"\"\"Analyse la distribution des utilisateurs\"\"\"\n"," print(\"\\n6. ANALYSE DES UTILISATEURS\")\n"," print(\"-\" * 50)\n","\n"," # Nombre total d'utilisateurs uniques\n"," unique_users = df['user'].nunique()\n"," print(f\"Nombre d'utilisateurs uniques: {unique_users:,}\")\n","\n"," # Top utilisateurs par nombre de tweets\n"," top_users = df['user'].value_counts().head(10)\n"," print(\"\\nTop 10 des utilisateurs par nombre de tweets:\")\n"," for user, count in top_users.items():\n"," print(f\"- {user}: {count} tweets\")\n","\n"," # Distribution des sentiments par utilisateur (pour les utilisateurs avec plus de X tweets)\n"," min_tweets = 5\n"," user_sentiment = df.groupby('user')['sentiment'].value_counts().unstack().fillna(0)\n"," user_sentiment = user_sentiment[user_sentiment.sum(axis=1) >= min_tweets]\n","\n"," # Calculer les ratios\n"," user_sentiment['total'] = user_sentiment.sum(axis=1)\n"," user_sentiment['pos_ratio'] = user_sentiment['Positif'] / user_sentiment['total']\n"," user_sentiment['neg_ratio'] = user_sentiment['Négatif'] / user_sentiment['total']\n","\n"," # Afficher quelques statistiques\n"," print(f\"\\nParmi les utilisateurs avec au moins {min_tweets} tweets:\")\n"," print(f\"Ratio positif moyen: {user_sentiment['pos_ratio'].mean():.2%}\")\n"," print(f\"Ratio négatif moyen: {user_sentiment['neg_ratio'].mean():.2%}\")\n","\n"," # Utilisateurs les plus positifs/négatifs\n"," most_positive = user_sentiment.sort_values('pos_ratio', ascending=False).head(5)\n"," most_negative = user_sentiment.sort_values('neg_ratio', ascending=False).head(5)\n","\n"," print(\"\\nUtilisateurs les plus positifs:\")\n"," for user, row in most_positive.iterrows():\n"," print(f\"- {user}: {row['pos_ratio']:.2%} positif ({int(row['total'])} tweets)\")\n","\n"," print(\"\\nUtilisateurs les plus négatifs:\")\n"," for user, row in most_negative.iterrows():\n"," print(f\"- {user}: {row['neg_ratio']:.2%} négatif ({int(row['total'])} tweets)\")\n","\n","analyser_utilisateurs(df)"]},{"cell_type":"markdown","metadata":{"id":"FFo_xU7uWjJA"},"source":["#### 6. Analyse des requêtes (flag)\n","\n","- Impact des requêtes sur la distribution des sentiments \n","- Identification des requêtes les plus fréquentes "]},{"cell_type":"code","execution_count":17,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":146},"id":"mfq4kgglWjJA","executionInfo":{"status":"ok","timestamp":1751537469612,"user_tz":-120,"elapsed":141,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"e6d59106-48f9-4043-f59a-1ec3ac4e836c"},"outputs":[{"output_type":"execute_result","data":{"text/plain":["flag\n","NO_QUERY 1600000\n","Name: count, dtype: int64"],"text/html":["
\n","\n","
\n"," \n","
\n","
\n","
count
\n","
\n","
\n","
flag
\n","
\n","
\n"," \n"," \n","
\n","
NO_QUERY
\n","
1600000
\n","
\n"," \n","
\n","
"]},"metadata":{},"execution_count":17}],"source":["df['flag'].value_counts()"]},{"cell_type":"markdown","metadata":{"id":"u6Ux57gmWjJA"},"source":["#### 7. Analyse de la longueur des tweets (caractères et mots)\n"," - Visualisation de la distribution des longueurs des tweets \n"," - Gestion des caractères HTML dans les tweets \n"," - Nettoyage des tweets trop longs et souvent difficilement compréhensibles "]},{"cell_type":"code","execution_count":18,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":567},"id":"c4zSoFysWjJA","executionInfo":{"status":"ok","timestamp":1751537483698,"user_tz":-120,"elapsed":14085,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"f80a862b-e45d-416c-966c-524de732b6c5"},"outputs":[{"output_type":"stream","name":"stdout","text":["Longueur moyenne des tweets: 74.09 caractères\n","Nombre moyen de mots par tweet: 13.18 mots\n"]},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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3FPiPsPCwtS5c2e9/fbbxe6TvJq8usowQAWQZEpzug0aNMhIMs8//3yR5zdp0sRj24cffmjsdrux2WymU6dOZsiQIeaOO+4wzZs3N5LMjz/+aIwxZurUqebmm282kkxcXJwZPny49d9XX31ljDHmyy+/NJJM7969TcOGDU29evXMoEGDTN++fc0///lPY4wxzz33nJFk3nzzTY84unbtaiSZcePGGZvNZm699VYzZMgQEx0dbSSZhg0bmgMHDng8Z/jw4UaS+fLLL0t8vy483tIcw48//mgkma5duxbZ3+jRo40kExwcbHr37m0GDRpkHA6HkWRuvPFGc+rUqWLje+yxx4yfn5/p1KmTSUxMNE6n00gytWrVMocPHy429uKsX7/ehIWFGUmmbdu2ZsiQISYhIcHYbDYzduxYI8kMHz682PfV/Tle6GLHWpImTZoYSeaJJ54wgYGBpmfPnqZ///6mTp06RpK55ZZbjMvl8njOwYMHTbNmzYwk07hxYzN48GDTvXt34+fnZySZ1157rcjruD+7/v37m4iICHPPPfeYnj17mqCgICPJvPHGG2bBggXG39/fdOnSxQwaNMhERUUZSaZLly5FYijL+eU+Vx988EETEBBg2rRpY4YMGWJuvfVWs3nzZmOMMTNmzDB2u93Y7XbTqVMnc++995rY2FgjydSuXdts37691O9tWT7fc+fOmaFDhxpJJiwszHTr1s3079/fNGrUyEgyHTt2NHl5eaV6fff5cOONN5pOnTqZOnXqmEGDBplu3boZu91u/Pz8zIoVK8xrr71m/P39zW233Wb69+9vatWqZSSZYcOGFdlnamqq9TvSsmVLM2TIEHPTTTcZScbf398kJydbfRcvXmwGDhxoJJm6det6/H7OmjXLGGPM/v37Tc2aNY0kc91115mBAweae+65x8THxxubzVbkulIS92c7atQoExgYaFq3bm2GDBlirr/+eiPJBAYGms8++8zjOadPn7Z+b2+55RYzePBgc/vtt5vQ0NBiP5sLX+di51BxZs2aZXr16mUkmebNm3u8F4sXLzbGGHPrrbcW+d0+d+6cqVGjhnUMF16TsrOzjd1uN23atPF4rV27dlnnS3R0tOnXr5/p3r27dVyvvvpqkfi++eYb63VatmxpBgwYYG655Rbj7+9v/Pz8zPvvv39ZxwLAt5Bvkm+Sb5Jv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mjNnTqme99e//lVHjhwpsn3ZsmWS/vvNovTfb8d27dpVDhEXb/78+dbIDen8xeh3v/udTp06pb59+3rMYeO+UM6cOVM///yztX3Tpk169tlni91/WY9hwoQJkqTJkyd7fPt34sQJjR8/XsYYPfLII1f1do2YmBj98MMPevHFFz3a/vnPf+rbb78t9nnu92jatGnKy8uztq9cuVJ/+9vfrkqsF2rWrJn69OmjEydO6Le//a0KCgqstm+//VYzZ86Un5+fxo0bd9VjkS7v/LqUiRMnym6368EHH/SYmN7t5MmTeuONN4qdj+qXyvL5BgUF6cknn9SJEyc0YMCAYr+VzsjI0Lx580p9TOWpW7duateunfbu3atnn33WIyldvHixFi1apLCwMD300EPWdofDoYCAAP3www/FJn3z5s0rNoH85JNPZIzxuF6Vxt69ezVlyhSPbf/617/07bffqm7duh7fkrsXPvnHP/7h0X/hwoWaO3fuZb1uaZTmWuWef2vfvn1avny5Ne+WW7du3bRu3Tpt2rRJMTExRW7VGjhwoFq3bq13331XL7zwQpG5+Ywx+vrrr/X1119b2x555BHVqVNHr7zyiv71r38V+aOvsLBQn332mcfnVBH/dgCoGOSb5JvFId/0RL5ZspEjR8rhcOiTTz7R3/72tyJFy++++04//fSTpPNTMtjtdq1cudJjUaozZ87o0UcfLXMRuSw53VNPPSVJeuyxx5SamurRdubMmSIF5AYNGujo0aPFfonQqVMn9ejRQ+vXr9eoUaOK7ZOSkqKPP/64tIdk7fPrr7/WuHHjlJubW6TP5s2b9emnn1qPyas9kVdf4wxQASQZSWb48OFm+PDh5oEHHjD9+vUzrVq1MjabzUgy1113nVm/fn2Jz2/SpInHtoiICGO32018fLxJTEw09957r3E6nUaSqVmzpklLS7P6nj592tSpU8dIMl27djUPPvigefjhh83XX39tjDHmyy+/tOIryXPPPWckmTfffNNje9euXY0kM27cOGOz2UzXrl3NkCFDTNOmTY0k06BBA7Nv3z6P57hcLut5derUMf379ze33HKLCQwMNI8//nixx3upY/jxxx+ttl8aPXq0kWRCQkJMnz59zL333mtq165tJJnOnTubU6dOefQfPny4kWS+/PLLYt+L4uK7mO+++85Uq1bNSDLt2rUz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grR//35t3rzZaqtRo4ZCQkJ09uxZa0ojwBso2gIAAOCa98UXX6hr164aNmyYTpw4UaS9SZMm2rRp02XvNzk5+aLtDodDU6ZMueR+ateuraeffvqyXx+42tzzPtarV0+HDh3Sli1brLZatWqpXr16OnLkiHbt2qVWrVp5MVIAKL309HS5XC6dPn1ap0+f9mg7fvy4Rz/mtIW3lGvR9ujRoyooKGDuLQAAAPiUn3/+WU6ns8T2oKAg5eXlVWBEQOWwc+dOSecXzouLi9MjjzyiqKgoZWRkaOnSpdbotJ07d1K0BVBpXFiYLY9+wNVQpqLtsmXLlJaWpv/5n/+xtr3++utavXq1JKlp06Z6+umnmfsDAIBrTGFhoVauXKnMzEzVrl1b3bt3l78/N+7A94WHh3ssoPRLe/bskcPhqMCIgMrBGCNJat68ucaPH29NgeB+PHXqVO3Zs8fqBwCVQW5urvWzn5+frr/+ekVHR2vv3r3asGGDzp07V6QfUNHKNOnQypUrPQqymzZt0urVq3X77bfroYce0tGjR7VgwYJyCxIAAHhfcnKyxowZo/nz52vlypWaP3++xowZc8nbwwFf0KlTJ61YsUJHjx4t0rZ582atWrVKN954oxciA3xbtWrVJElnz54ttt293d0PACqDC4uxr732mqKjo5WZmano6Gi99tprxfYDKlqZhsZkZmYqKirKevztt9+qTp06GjVqlCQpOztb//nPf8onQgAA4HXJycn67LPPFB4erv79+ys2NlapqalavHixPvvsM0lSYmKil6MESpaYmKht27bpySeftOamW7JkiebPn6+0tDQ1bdpU/fv393KUgO8JDw+XJB08eFBJSUnq3bu3NT3CsmXLlJGR4dEPACqD7du3Wz//9re/9WibP39+sf2AilYu9zOmpqbq+uuvtx7Xrl1b2dnZ5bFrAADgZYWFhVqxYoXCw8P16quvWtMh3Hrrrbrpppv0xBNPaMWKFRowYABTJcBnhYaG6qWXXtJHH32k7777ToGBgdq+fbvq1aune++9V3fffbcCAwO9HSbgc2rUqGH9vGPHDo8V1i/8nbmwHwD4OpvN5vHzhVO8XPj4wn5ARSvTX1b169fX+vXr1bNnT23atEnHjh1TfHy81X7s2DFujwEA4BqxcuVKuVwu9e/fv0hR1t/fX/369dO8efO0cuVK9ezZ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7bJG2P7www86d+6cGjVqpLZt2yoxMZE7YYBiuFyucu0HAL7gwi+dYmJidOLECZ06dUrVqlVT9erVtXPnziL9gIpWpqJtv3799Le//U1PP/20evXqZY1OOHTokFasWKF9+/bpd7/7XbkGCvg6p9Mph8OhpUuXesxpK51PYpctWyaHw8E3dQAqncTERH355Zdavny57rrrLo8pEvLz861byxMTE70VInBJDz/8sCSpWbNmatWqle6++27FxMQoLCzMy5EBvm3Xrl3Wz23btrVWXA8NDVV+fr62bt1q9WvTpo23wgSAy7JixQrr5z179ig/P1/S+WlfLsx1V6xYodjY2AqPD5DKWLS98cYbdfbsWb377ruaNWuWR1t4eLjGjBmjzp07l0uAQGVht9uVmJiomTNnKikpSb1791ZUVJQyMjK0bNkypaamasyYMSxCBqDSCQwMVPv27bVp0yaNHz9eLVq0UGRkpLKzs5Wenq5z586pffv2LEIGnxYUFKTTp08rJydH2dnZysnJUW5uLkVb4BLcc9a2atVK27dv9xhRa7fbFRMTo507d3osUAYAvs698FjPnj21YcMGHTt2zGoLCwtTQkKCVqxYUeICZUBFsBljTFmffO7cOf3www/W/F8Oh0PNmzcvMkG9L8rMzFRBQYG3w8A1KCUlRcnJyR7z4jkcDiUmJiohIcGLkQHAlXnqqaeUmZlZZHvt2rX15z//2QsR4VoXEBCg2rVrl8u+jDHat2+fdu7caU2RkJ2drfDwcLVs2VKtWrVSTExMsVMcVSbkuChvH3zwgZYtWyZJio2NVbt27RQYGKj8/Hxt2bJFqampkqTevXsXO4UOAPiiefPmadWqVdb17Jfc27t166YHHnjACxHiWlbaHLdMI23d/Pz85HQ6ud0buEBCQoLi4+OVlpamnJwcRUREyOl0MsIWQKWWnJyszMxMhYWFeSy4mJGRoczMTCUnJzM9AnyazWZTdHS0oqOjdccdd0iSjhw5oi1btmjZsmVav369bDab3n//fS9HCviWmJgYq2grSY0bN7buJtuyZYtHPwCoLAYPHqxVq1YVW7CVZG0fPHhwRYYFeCh10fbkyZOXvXNuN0NV5b5VDACuBYWFhVqxYoXCw8P16quveixCWlhYqCeeeEIrVqzQgAEDiixQCviaM2fOKC0tTTt27NCOHTuUnp6ugoIC2e12NW3a1NvhAT7nwoEH27dvt0bWSvK45jNAAQCA8lXqv6zcizdcjvnz51/2cwAAgG9ZuXKlXC6X+vfvX6Qo6+/vr379+mnevHlauXKlevbs6aUogaIGDx6sCRMmqEuXLpo7d6527NihvXv3yuVyKTAwUNddd53uvvtutWrVSk6nU0FBQd4OGfA5ubm51s+FhYUebRc+vrAfAPi69957r9T9hg8ffpWjAYp3WcNhAgMDFR8fr0aNGl2teAAAgI9xz2Nb0sq5cXFxmjdvXrHz3QK+YvXq1WrZsqVuuukmtWrVSk2bNq0U6zAA3hYREWH9HBAQ4DFn8oVzQV7YDwB83Y4dO6yfq1WrJn9/f+Xn5yswMFCFhYXWAmQX9gMqWqmLtvfcc4+++eYbrV27VocPH1aXLl108803y+FwXM34AACAl7knyU9NTdWtt95apH3z5s0e/QBfNGfOHG+HAFRKLVq0kN1uV1hYmKZOnar//Oc/yszMVO3atXXrrbfq6aef1smTJ9WiRQtvhwoApZaTk2P97C7QStLp06dL7AdUtFIXbYcOHaqhQ4dq165dWrNmjT7++GO99957atmypbp06aIbb7yROWyB/y8/P1/Jyck6evSo6tatq8TERAUGBno7LAAok+7du2vBggVavHixbrrppiJz2i5ZskR2u13du3f3YpQAgKshPT1dLpdLubm5+t3vfuexaM/ixYutx+np6azpAKBSstlsatSokXX3wIEDB2SM8XZYwOVNjyBJLVu2VMuWLfXggw9q06ZNWrNmjebNm6c333xTsbGxGjhwoK677rqrEStQKUyfPl2bNm2yHm/fvl1ffvml2rdvrwkTJngvMAAoI39/f/Xo0UOfffaZnnjiCfXr109xcXHavHmzlixZotzcXPXq1YtFyOCTFi1apC+++KJUfW02m5599tmrHBFQuZR2lBmj0QBUJtWqVbO+dDLGaP/+/SX2A7ylzH9d2e12dejQQR06dFBWVpZmzJih77//Xi1atKBoiyrLXbD19/dXz5491aVLF61Zs0bLly/Xpk2bNH36dAq3ACqlxMRESdKKFSs0b948zZs3T9L5fKBXr15WO+BrTp8+LZvN5u0wgEorPDxc0vlpEp544gmlp6crJydHERERatGihV599VWlp6db/QCgMoiIiNDx48dL1Q/wljIXbc+ePav169drzZo12rJli/z9/XXLLbfohhtuKM/4gEojPz/fKthOnz7dmg5h4MCBuuuuuzRhwgRt2rTJmtwcACqbxMREDRgwQCtXrrTmM+zevTsjbOHT7rvvPnXp0sXbYQCVlvsWYZvNJrvd7jEFgsvlKtIPACqDoKCgcu0HXA2X9VfWuXPn9P3332vNmjVKSUmRy+VSXFycxo0bp+uvv55CFKq05ORkSVLPnj2L/C4EBgbq9ttv16effqrk5GTdf//93ggRAK6Y+04CAEDVcOLECUnn56xNSkpSmzZtrHkft23bph9++MGjHwBUBrm5ueXaD7gaSl20/ec//6m1a9fq9OnTatWqlUaMGKHOnTszvwfw/x09elSSShzN06VLF3366adWPwAAAMDXuW8N7tixo9avX6/NmzdbbXa7XR07dtTatWu5hRhApXLu3Lly7QdcDaUu2q5cuVKBgYFKSEhQzZo1tW/fPu3bt6/E/jabTQ8++GC5BAlUBnXr1tX27du1Zs0aDRw4sEj7mjVrrH4AAABAZeB0OlW9enWtXbtWbdu2Vb169VRQUKCAgAAdOXJEa9euVXh4uJxOp7dDBYBSK+30XkwDBm+6rLMvPz9f69evL3V/iraoShITE/Xll19q+fLl6tGjh95++21rzsfhw4fr888/t/oBQGV15swZzZo1y7q+jRo1SsHBwd4OCyjWc889p6ioKG+HAVwzdu3apa1bt1qPAwICJDGfLYDKJzo6WocOHSpVP8BbSl20nT9//tWMA6j0AgMD1b59e23atEm/+93vrO0ZGRnatGmTJKl9+/bM/Qyg0nrhhRe0d+9e63FGRobGjRun6OhoTZo0yXuBASVo3bq1t0MAKr20tDRrvlqbzebR5n584sQJpaWleSxSBgC+7MCBAx6Pg4OD5e/vr8LCQp05c6bEfkBFsns7AOBakp2dfUXtAOCr3AVbm82mG2+8Uc8995xuvPFG2Ww27d27Vy+88IK3QwQAXAXHjx+XJLVr105///vfNXjwYHXv3l2DBw/W3//+d7Vt29ajHwBUBllZWR6Pz5w5o5MnT3oUbIvrB1QkJucAysmZM2esgsZrr72mDz/8UEePHlXdunV1991367HHHtPevXt15swZbiUGUKlceH1LSkqyrmEjR47U/fffr/Hjx3N9A4BrlHuUba1atTRp0iSPAsYXX3yhNm3aePQDAADlg6ItUE5mzZolSercubPCw8N1//33e7S7V9adNWuWJkyY4I0QAaBMLry+/bIoGxwczPUNAK5h1atXlyStWrVKsbGx6tWrlwIDA5Wfn68tW7Zo9erVHv0AoDKoW7eux7RfF+sHeAtFW6CcZGZmSpJ69uxZbHvPnj21du1aqx8AVBZc3wCg6oqIiLB+3r59u1JTU63HF66qfmE/APB14eHh5doPuBqY0xYoJ7Vr15YkLV++vNh293Z3PwCoLLi+AUDVdeHiY4WFhR5tFz7+5SJlAODLjDHl2g+4GhhpC5STUaNGady4cfruu+90//33e9xCfObMGa1bt87qBwCVyYXXt759++rll19WXl6eQkND9Yc//IHrGyqFwYMHl6rf/Pnzr3IkQOVy4UK6YWFhiomJUVBQkM6ePaudO3fq5MmTRfoBgK87cOBAufYDroYrLtoeP35cOTk5qlevHouPoEoLDg5WdHS09u7dq/Hjx6tjx47q2bOnli9frnXr1skYo+joaH5PAFQ6F17fJk6caG3Pzc21HnN9g68bOHBgkZGALpdLmZmZWr9+vRo0aKAOHTp4KTrAd+Xm5ko6X7DNy8vThg0brDa73a6wsDCdPHnS6gcAlcEv7xy40n7A1VDmou369ev17rvv6vDhw5KkSZMmqW3btsrNzdWLL76oQYMGqWPHjuUWKFAZTJo0SS+88IL27t2rtWvXau3atVZbdHS0Jk2a5MXoAKDsDh06dEXtgLclJiaW2Hb8+HFNnDhR9evXr8CIgMrh1KlTkqSTJ08qNjZW7dq181iIzD3HrbsfAFQGISEh1p0Cl+oHeEuZ5rTdsGGD/vKXv6h69eq69957PdrCw8NVs2ZNrVq1qjziAyqdSZMmacaMGWrfvr2ioqLUvn17zZgxg4ItgEorOztb+fn5kqSXXnrJ4/r20ksvSZLy8/O5NRaVVo0aNdSjRw998MEH3g4F8Gk2m02NGzdWQkKCGjduzDy2ACqtuLi4cu0HXA1lGmn7wQcfqHXr1nruued04sQJLViwwKPd6XRqxYoV5RIgKr+zZ8/qyJEj3g6jwt19993Wz0ePHvViJN5Tr149BQUFeTsMAFdoypQpkiSHw6F69eppwoQJHu01a9bUsWPHNGXKFP31r3/1RojAFQsKCtJPP/3k7TAAn1OtWjVJUq1atXTw4EFNnTrVanM4HNa/Ae5+AFAZlPZv9Kr6tzx8Q5mKtvv379fw4cNLbI+IiGBOI1iOHDmi559/3tthwAueffZZNWnSxNthALhCeXl5ks7PCVqc/v37a86cOVY/oLLZv3+/PvnkEzVo0MDboQA+Jzw8XJL0888/q02bNmrSpIm1GOXZs2e1bds2j34AUBmU9otavtCFN5WpaBsUFKQzZ86U2H706FGFhYWVOShcW+rVq6dnn33W22FUuMOHD2vWrFkaNWpUlZ0jr169et4OAUA5CA0NVW5urj744INi56tfvHix1Q/wVePGjSv2Vu5Tp04pLy9PQUFBGj169GXvd/HixVq3bp0yMjIUGBgop9Op+++/36MAnJ+fr7lz5+qbb75RQUGB4uLiNHLkSEVGRlp9srKyNGvWLG3btk3BwcHq2rWrhg0bJj8/vzIdL1BeatSoYf3sLtBeqh8A+Dq7vXSzhZa2H3A1lKlo26ZNG61evVp9+vQp0padna0vvvhCCQkJVxwcrg1BQUFVerRl/fr1q/TxA6j8nnvuOf3+979XVlaWsrOzPQpN2dnZOnbsmNUP8FWtW7cutmgbFhamunXr6uabby7ToIPt27erV69eat68uc6dO6f33ntPL774ol577TUFBwdLkt5++21t3LhRjz32mEJDQzVnzhxNmzZNL7zwgiTJ5XJp6tSpioyM1Isvvqjjx48rKSlJfn5+GjZs2JUdOHCFnE6ngoODLzpoJyQkRE6nswKjAgDg2lemou3QoUM1ceJEPf300+rcubMkadOmTdq6das1l+2gQYPKL0oAAOA1kZGR1krhv//971WzZk31799fixcvtgq2gYGBHsVcwNeMGzfuqux34sSJRV5n5MiR2rNnj1q3bq28vDytXLlSv/3tb9W2bVtJ0tixY/W73/1OaWlpcjqd2rx5sw4ePKhJkyYpMjJS0dHRGjx4sN59910lJibK379MKTtQLlwul86ePSvp/JccN910k+rUqaOffvpJ33zzjU6ePKkzZ87I5XIxIg0AgHJUpn9VGzRooOeff17Vq1fX/PnzJUkfffSRFi9erMaNG2vKlCmqU6dOuQYKAAC8Z+bMmQoMDJQkHTt2THPmzPEo2M6cOdOb4QE+wz23s3vU7p49e3Tu3Dm1a9fO6hMVFSWHw6G0tDRJUlpamho3buzxxUf79u11+vRpHThwoOKCB4rxxRdfyBijmjVrKigoSMuXL9c777yj5cuXKygoSDVr1pQxRl988YW3QwWAUivu7psr6QdcDWX+2r5Ro0aaNGmSTp48qSNHjsgYo7p16zIBPQAA16iZM2cqOztbU6ZMsRahee655xhhC5+0cOHCMj3vSu4Wc7lceuutt9SyZUs1btxY0vkpRPz9/VWtWjWPvhEREcrOzrb6/PL3KCIiwmorTkFBgQoKCqzHNptNISEh1s9Aedm9e7ckKTo6Wt9//71H27Fjx9S+fXsdO3ZMu3fv1h133OGNEAHgskVHR+vQoUOl6se/q/CWK77XKiwsTC1atCiPWAAAqDTOnj2rI0eOeDsMr/if//kf6+ecnBzl5OR4LxgvqFevnoKCgrwdBi5hwYIFZXrelRRt58yZowMHDuj5558v8z5Ka/HixR6F6aZNm+rll19W7dq1r/pro2pxLzC2ceNGRUZG6te//rU6deqktWvXau7cuVYht0aNGlV28V0AlU9p72Q5cOAA1zZ4TamKtqtXry7Tzrt27Vqm5wEA4OuOHDlSIYUZ+J5nn32WBSYrAfcUXm7Hjh3T1KlT1ahRI/Xp00cNGjSQJGVkZGjZsmU6ePCgnnrqqTK/3pw5c7Rx40ZNmTJFtWrVsrZHRkaqsLBQp06d8hhtm5OTY42ujYyMVHp6usf+3F+GlDSSvX///urbt6/12D0KKDMzU4WFhWU+DuCX2rZtq5UrV0qS/vSnPyk4OFhnz55V+/btFRMTo7Fjx1r9Dh8+7M1QAaDUTp06Vep+XNtQ3vz9/Uv1RXupiravv/56mYKgaAsAuFbVq1dPzz77rLfD8IrDhw9r1qxZGjVqVJUceVCvXj1vh4AymD17turXr6/f/OY3HttbtGih3/zmN5o2bZrmzJmjJ5544rL2a4zRG2+8oXXr1mny5MlF1nVo1qyZ/Pz8tGXLFmsB30OHDikrK0tOp1OS5HQ6tWjRIuXk5FjTIqSmpiokJEQNGzYs9nUDAgIUEBBQYkxAebnwrpKnnnpK/fr1U1xcnDZv3qwlS5Z49OPcA1BZuFyuUvfj2gZvKVXRNikpyePxqVOnNGPGDIWGhurOO+/0GKnw6aef6vTp01dthV4AAHxBUFBQlR9tWb9+/Sr/HqDy2LZtm+67774S29u1a6d33333svc7Z84crVmzRk8++aRCQkKsOWhDQ0MVGBio0NBQde/eXXPnzlVYWJhCQ0P1xhtvyOl0WkXbuLg4NWzYUElJSbrvvvuUnZ2t999/X7169SqxMAtUlKysLOvn3NxczZs3T/PmzbtoPwDwdXXq1Clx3vhf9gO8pVRF218O2V2wYIHCw8P1xz/+0WNC5saNG6tTp0566aWXtHTpUutWGQAAAMCbAgIClJaWpp49exbbvmvXrjIVSJcvXy5Jmjx5ssf2sWPHqlu3bpKk4cOHy2azadq0aSosLFRcXJxGjhxp9bXb7Xrqqac0e/Zs/fGPf1RQUJC6du2qwYMHX3Y8QHlz/y3YrVs3paam6tixY1ZbzZo11a5dO61evZr5lAFUKj/++GO59gOuhjItRLZ+/XoNGTKk2BX07Ha7OnbsqPfff/+KgwMAAADKQ5cuXfTJJ59Yd4rVrVtXknT06FF98sknWrNmje68887L3m9ycvIl+wQGBmrkyJEehdpfql27tp5++unLfn3gauvevbsWLFigjRs36uWXX9aePXusqTyaNWumP/zhD7Lb7erevbu3QwWAUisoKCjXfsDVUKairTFGGRkZJbYfPHiwzAEBAAAA5e3+++/XiRMn9Nlnn+mzzz6T3W6X9N857W6++Wbdf//93gwR8En+/v7q0aOHPvvsM/3hD3/wmNP2n//8p3Jzc9WrVy/5+5fpT0sAAFCCMv3LesMNN2jFihWqU6eOevTooaCgIEnS2bNntXz5cn3++efq0qVLuQYKAAAAlJW/v78mTJigu+++W99//70yMzMlnR/h2r59e0VHR3s3QFQ6Z8+e9Vik61rWqVMn5ebmau3atR5z2trtdt14443q1KmT9u3b5+UoK069evWsv4EBVE4RERHKyckpVT/AW8pUtH3wwQf1008/ad68efr3v/+tGjVqSJKOHz+uc+fOqWXLlhoxYkR5xgkAAABcsSZNmrCAHsrFkSNH9Pzzz3s7DK9yuVz69ttv9e2333o7lAr17LPPch0BKrnmzZtr48aN1uPQ0FA1btxY+/fvV15enkc/wFvKVLQNDQ3VlClTtH79en3//ffWSqFxcXHq0KGDEhISip3vFgAAAACuBfXq1dOzzz7r7TAq3OHDhzVr1iyNGjVK9evX93Y4XlGvXj1vhwDgChUWFno8zsvL086dOy/ZD6hIVzTx0A033KAbbrihvGIBAAAAgEohKCioSo+2rF+/fpU+fuBaVVWmfjlx4kSp+1WV6V+Y+sX3MFs8AAAAAAAAmPrlF3788ccq834w9YvvoWgLAAAAAACAKjP1S35+vv785z/LbrcrLCxMubm5VltERIROnDghl8ulp556SoGBgV6MtOIw9YvvoWgLAACAa1phYaEyMjIUFhamWrVqeTscAAB8VlWa+qV9+/batGmTTp06pTZt2mjbtm1q06aNdu7cKZfLpfbt2+u6667zdpiowuzeDgAAAAC4mux2u5566imtXbvW26EAAAAfMWHCBLVv317nzp3Ttm3bJEnbtm3TuXPn1L59e02YMMHLEaKqY6QtAAAArml2u10Oh4MVoAEAgIcJEyYoPz9fc+bM0YYNG3T99dfr4YcfrjJTIsC3XfFI2+PHj2vv3r06c+ZMecQDAAAAlLs777xTn3/+uU6ePOntUAAAgA8JDAxU7969JUm9e/emYAufUeaRtuvXr9e7776rw4cPS5ImTZqktm3bKjc3Vy+++KIGDRqkjh07llugAAAAQFm5XC4FBARowoQJ6tSpk+rUqVPsH2V9+/b1QnQAAACApzIVbTds2KC//OUvcjqd6tKlixYsWGC1hYeHq2bNmlq1ahVFWwAAAPiEefPmWT9/+eWXJfajaAsAAABfUKai7QcffKDWrVvrueee04kTJzyKtpLkdDq1YsWKcgkQAAAAuFJJSUneDgEAAAAotTIVbffv36/hw4eX2B4REaHc3NwyBwUAAACUp9q1a3s7BAAAAKDUyrQQWVBQ0EUXHjt69KjCwsLKHBQAAAAAAAAAVFVlGmnbpk0brV69Wn369CnSlp2drS+++EIJCQlXHBwAAABQHsaNGyebzXbRPjabTdOnT6+giAAAAICSlaloO2TIEP3xj3/U008/rc6dO0uSNm3apK1bt1pz2Q4aNKj8ogQAAACuQOvWrYsUbV0ulzIzM7Vr1y41atRITZs29VJ0AAAAgKcyFW2joqL0wgsv6M0339T8+fMlSR999JGk8wnxww8/rDp16pRflAAAAMAVGDduXIlte/fu1UsvvaQuXbpUYEQAAABAyS67aFtYWKiMjAyFhYVp0qRJOnnypI4cOSJjjOrWravw8PAyB7N8+XItX75cmZmZkqSGDRtq0KBBio+PlyTl5+dr7ty5+uabb1RQUKC4uDiNHDlSkZGRZX5NAAAAVG3R0dHq0aOH3n33XcXGxno7HAAAAODyFyKz2+166qmntHbtWklSWFiYWrRooeuuu+6KCraSVLNmTQ0bNkx//vOfNXXqVLVt21avvPKKDhw4IEl6++23lZKSoscee0xTpkzR8ePHNW3atCt6TQAAACAiIkIHDx70dhgAAACApDIWbR0OhwoLC8s9mOuvv14dOnRQ/fr11aBBAw0dOlTBwcHavXu38vLytHLlSg0fPlxt27ZVs2bNNHbsWO3atUtpaWnlHgsAAACqhhMnTmjlypWqVauWt0MBAAAAJJVxTts777xTn376qbp3766wsLDyjknS+YUhvv32W509e1ZOp1N79uzRuXPn1K5dO6tPVFSUHA6H0tLS5HQ6r0ocAAAAqPymTJlS7Pa8vDxlZGSosLBQ48ePr+CoAAAAgOKVqWjrcrkUEBCgCRMmqFOnTqpTp44CAwOL9Ovbt+9l73v//v2aOHGiCgoKFBwcrMcff1wNGzbU3r175e/vr2rVqnn0j4iIUHZ2don7KygoUEFBgfXYZrMpJCTE+hm4Wtznl81m41wDcE3h+obKyBhT7Plau3ZttWvXTr/61a8UFRXlhcgAAACAospUtJ03b57185dfflliv7IUbRs0aKBXX31VeXl5+u677zRjxowSR0aUxuLFi7Vw4ULrcdOmTfXyyy+rdu3aZd4nUBqnTp2SJDkcDtWvX9/L0QBA+eH6hspo8uTJ3g4BAAAAKLUyFW2TkpLKOw6Lv7+/6tWrJ0lq1qyZfvjhBy1btkw33XSTCgsLderUKY/Rtjk5OYqMjCxxf/379/coHrtHWGRmZl6VeXkBt6ysLOv/vxwhDgCVGdc3VBR/f3++aAcAAECVVKaibUUmzy6XSwUFBWrWrJn8/Py0ZcsWde7cWZJ06NAhZWVlXXQ+24CAAAUEBBTbZoy5KjED0n/PL2MM5xqAawrXN1RWWVlZWrRokbZt26bc3Fw98cQTat26tXJzc7Vw4UL96le/UtOmTb0dJgAAAFC2oq3byZMnlZqaqszMTEn/nROsevXqZdrfv//9b7Vv314Oh0NnzpzRmjVrtH37dk2cOFGhoaHq3r275s6dq7CwMIWGhuqNN96Q0+lkETIAAABc1MGDB/Xss8/KGKMWLVroyJEjcrlckqTw8HDt2rVLZ8+e1ZgxY7wcKQAAAHAFRdvk5GQtWbKkyBQD/v7+uvvuuzV48ODL3mdOTo5mzJih48ePKzQ0VE2aNNHEiRMVGxsrSRo+fLhsNpumTZumwsJCxcXFaeTIkWU9BAAAAFQR77zzjqpVq6aXXnpJkjRq1CiP9vj4eH377bfeCA0AAAAookxF24ULF+qDDz5QfHy87rjjDjVo0EDS+ekKPv30Uy1atEh+fn4aNGjQZe33UiMbAgMDNXLkSAq1AAAAuCw7duzQwIEDFR4erhMnThRpdzgcOnbsmBciAwAAAIoqU9F2xYoVSkhI0JNPPumxvU6dOmrfvr3+/Oc/a8WKFZddtAUAAACuBpfLpaCgoBLbc3Nz5e9/RTOHAQAAAOXGXpYn5eXlqX379iW2d+jQQadPny5rTAAAAEC5atasmTZu3Fhs27lz5/TNN9+wTgIAAAB8RpmKtjExMdq9e3eJ7bt371bLli3LHBQAAABQnu655x5t2rRJs2bN0oEDByRJ2dnZSk1N1YsvvqiMjAz169fPy1ECAAAA55XpHrBRo0bppZde0ltvvaU77rhDderUkST99NNP+vTTT7V7924988wz5RooAAAAUFbx8fEaN26c3nzzTX3++eeSpOnTp0uSQkJCNG7cOLVu3dqbIQIAAACWUhVtf/3rX8tms3lsO3funD755BN98sknstvPD9h1uVySpICAAD3xxBN6++23yzlcAAAAoGxuvfVWdezYUampqTpy5IhcLpfq1aunuLg4hYSEeDs8AAAAwFKqom2nTp2KFG0BAACAyiY4OFgdO3b0dhgAAADARZWqaDtu3LirHQcAAABw1WRlZZWqn8PhuMqRAAAAAJdWpjltAQAAgMqktIMQ5s+ff5UjAQAAAC7tioq227dv108//aSTJ08W2963b98r2T0AAABQLsaMGVNkm8vlUmZmpv7zn/8oPDxcvXr18kJkAAAAQFFlKtru3btXf/3rX3XkyJGL9qNoCwAAAF/QrVu3Etv69euniRMnKi8vr+ICAgAAAC6iTEXbf/zjH8rNzdWoUaN03XXXKTQ0tLzjAgAAACpEcHCwunXrpqVLl6p3797eDgcAAAAoW9H2wIEDGjx4sG6//fbyjgcAAACocMYYZWdnezsMAAAAQFIZi7b169cv7zgAAACACpeXl6cdO3boww8/VNOmTb0dDgAAACCpjEXbe++9V3PnzlWXLl1Us2bN8o4JAAAAKFeDBw++aLvD4dDIkSMrKBoAAADg4spUtO3UqZMKCgr029/+Vu3atVPNmjVlt9s9+thsNj344IPlEiQAAABwJQYOHCibzeaxzWazqVq1aqpbt67i4uLk5+fnpegAAAAAT2Uq2m7fvl2zZs1Sfn6+UlJSSuxH0RYAAAC+IDEx0dshAAAAAKVWpqLtG2+8odDQUP3+979XixYtFBoaWt5xAQAAAAAAAECVVKai7ZEjRzRs2DDFxsaWdzwAAABAuXv99dcv2m6z2RQQEKBatWqpTZs2cjqdFRQZAAAAUFSZiraNGjVSXl5eeccCAAAAXBXbtm1Tfn6+cnNzJUnVqlWTJJ06dUqSFB4eLpfLpZMnT0qS2rdvr8cee0xBQUHeCRgAAABVWpmKtg888ID+93//V+3bt1eLFi3KOyYAAACgXD399NN66aWXdO+99+qOO+5QWFiYJOnkyZP65JNPtGrVKk2cOFGRkZH6+OOP9cEHH2j+/Pn69a9/7eXIAQAAUBWVqWj70UcfKSQkRBMnTlTDhg3lcDhkt9s9+thsNj355JPlEiQAAABwJd544w3Fx8dr0KBBHtvDwsJ077336vjx43rjjTf0xz/+UYmJiTp8+LC+++47irYAAADwijIVbffv3y9JcjgcOnPmjA4ePFikj81mu7LIAAAAgHKye/dude7cucT26OhoffXVV9bjVq1aad26dZfc7/bt2/Xhhx/qxx9/1PHjx/X444+rY8eO/6+9e4+Kus7/OP4amBkFJhgVCNAEDREzRHcV28zFzNyt6FeaqRXm2sKpwK1+e/zV6WZqkXk2d7vZyVOYcboihV2sts222n72W6/l7eQls35eEFAGBANmYH5/+HNWVlSEYb5fmOfjnI58L/P9vofDfObda77z+fq2L1myRF988UWLx6Snp+vBBx/0LdfW1mrZsmXasGGDLBaLRo8erVmzZqlnz57n8hQBAADQjbQrtF2yZIm/6wAAAAA6TXh4uL799ltNnDix1e3ffPONwsPDfcv19fUKCws763EbGhqUlJSk8ePH68knn2x1n+HDhysvL8+3bLW2bMGfeeYZVVVV6aGHHlJTU5Oef/55LV26VHfffXdbnhoAAAC6oXaFtgAAAEBXcsUVV+jtt9/W4sWLNXHiRMXFxUmSysrK9Mknn2jDhg264YYbfPtv2rRJSUlJZz3uiBEjNGLEiDPuY7Va5XQ6W922b98+ffPNN1q4cKEuvPBCSdJtt92mhQsXasaMGerdu3fbniAAAAC6lQ6Fttu3b9fGjRtVUVEhSYqJidEvfvELXXTRRX4pDgAAAPCHG2+8UY2NjVq1atUp0x6EhIQoKytLN954oySpsbFRmZmZSkxM9Mu5t2/frpycHEVEROjiiy/W9OnTdd5550mSdu7cqYiICF9gK0lpaWmyWCzavXt3i6kWTuZ2u+V2u33LFovFd2Uw05ShM534+7JYLPytAeg2GNtgRu0KbT0ej5566imtW7dOknxfJTt27Jjef/99ZWRk6O677z7lq18AAACAESwWi7Kzs3Xttddqy5YtqqyslHT8Hg1paWmKiory7Wu32zVu3Di/nHf48OEaPXq0YmNjVVZWpjfeeEOPP/64CgoKFBISIpfLpcjIyBaPCQ0NlcPhkMvlOu1xS0tLVVJS4lseMGCAFi1apJiYGL/UDZxOXV2dpOOvnfj4eIOrAQD/YGyDGbUrVV2xYoXWrVuna6+9VllZWb6ve1VXV+v999/X+++/r5KSEk2fPt2ftQIAAAAdEhUVpcsuuyxg5xszZozv5/79+ysxMVF/+MMftG3bNqWlpbX7uJMmTVJWVpZv+cRVQRUVFfJ4PO0vGDiLEx94VFZWKiIiwuBqAMA/GNsQSFartU0ftLcrtP3qq6+UmZmp7OzsFuujoqKUnZ2t6upq/eMf/yC0BQAAgKn8/PPPqqioUF1dnbxe7ynbO3uar/PPP1/nnXeeysrKlJaWJqfTqZqamhb7NDU1qba29rTz4EqSzWaTzWZrdVtrzwvwlxN/X16vl781AN0GYxvMqF2hrcvlUnJy8mm3Dxo0SGvWrGl3UQAAAIA/HT16VIWFhfrnP/+p5ubm0+731ltvdWodhw8fVm1trXr16iVJSklJUV1dnfbs2aOBAwdKkrZu3Sqv13vGfhsAAADdW7tC2969e2v79u2aOHFiq9u3b9/OnW4BAABgGkuXLtWGDRt01VVXKTU1VQ6Hwy/Hra+vV1lZmW+5vLxce/fulcPhkMPh0IoVKzR69Gg5nU4dOnRIr776quLi4pSeni5J6tevn4YPH66lS5cqNzdXHo9Hy5Yt06WXXko/DQAAEMTaFdpmZmZqxYoVCg8PV1ZWluLi4iRJZWVlWrVqlb7++mtNnTrVr4UCAAAA7fXtt9/qmmuuOWV6r476/vvvNX/+fN9yUVGRpOP9cm5urn766Sd98cUXqqurU+/evTVs2DBNmzatxdQGd911lwoLC7VgwQJZLBaNHj1at912m1/rBAAAQNfSrtB28uTJOnTokFavXq3Vq1crJCREknxfNcvMzNSkSZP8VyUAAADQAT169GjTDR/O1dChQ1VcXHza7Q8++OBZj+FwOHT33Xf7sywAAAB0ce0KbUNCQpSfn6+srCxt2rRJFRUVkqSYmBiNGDFCiYmJfi0SAAAA6IixY8dq7dq1+s1vfmN0KQAAAMBZtSu0PSExMZGAFgAAAKZ3ySWXaPv27SooKNCECRPUp08f37fFTnbiZmAAAACAkToU2gIAAABdwdy5c30/b968+bT7vfXWW4EoBwAAADijNoe2c+bMOacDWywW/elPfzrnggAAAAB/u/POO40uAQAAAGizNoe2DodDFovlrPu5XC4dOHCgQ0UBAAAA/jRu3DijSwAAAADarM2h7bx588643eVyaeXKldq1a5dCQkI0duzYjtYGAAAA+F19fb0qKyslSdHR0erZs6fBFQEAAAAtdXhO2xNh7erVq+XxeDR27FhNnjxZcXFx/qgPAAAA8Ivdu3frtdde03fffafm5mZJUkhIiFJTU5Wdna0LL7zQ4AoBAACA49od2rYW1t5www06//zz/VkfAAAA0GG7du3SvHnzZLVaNX78ePXt21eStH//fv33f/+3HnnkEc2bN0/JyckGVwoAAAC0I7T997D217/+tW644QbFxsZ2Rn0AAABAh7355pvq3bu3Hn30UTmdzhbbbrzxRj388MN644039PDDDxtTIAAAAHCSNoe2VVVVvrC2qalJmZmZmjx5MmEtAAAATG/Xrl2aMmXKKYGtJDmdTk2YMEFvv/124AsDAAAAWtHm0PYPf/iD3G63kpKSNGnSJMXGxqq2tla1tbWnfczAgQP9UiQAAADQERaLRU1NTafd3tzcLIvFEsCKAAAAgNNrc2jrdrslSXv37tVf/vKXNj3mrbfeal9VAAAAgB8NHjxYf/3rX3XZZZcpJiamxbbKykp98sknSk1NNag6AAAAoKU2h7Z33nlnZ9YBAAAAdJqbbrpJjzzyiO655x5lZGQoPj5eknTgwAGtX79eoaGhuummmwyuEgAAADiuzaHtuHHjOrEMAAAAoPMMGDBAjz/+uN544w2t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MJEQowsAAAAAAAAAAPwLoS0AAAAAAAAAmAihLQAAAAAAAACYCKEtAAAAAAAAAJgIoS0AAAAAAAAAmAihLQB0QUuWLFF+fr7RZQAAAAB+Q48LAP9iNboAAOgKfvrpJ61YsULff/+9qqur5XA41K9fP40cOVJXXXVVp5zzyJEj+vTTT5WRkaGkpKROOUdnamho0LvvvquhQ4dq6NChRpcDAACAf0OPe+7ocQEECqEtAJzFjh07NH/+fEVHR+uKK66Q0+nU4cOHtWvXLn344Yed1tBWVVWppKREsbGxpzS0t99+u7xeb6ec118aGhpUUlIiSTS0AAAAJkOP2z70uAAChdAWAM7inXfeUXh4uBYuXKiIiIgW26qrqw2pyWpl+AYAAED70eMCgLlZvGb/GAsADHbPPfeoV69eeuSRR86675dffqlVq1Zp3759stvtSk9PV3Z2tqKjo337zJs3T0ePHtV//ud/qrCwULt27VJERISuvvpqXXfddZKkbdu2af78+accPy8vT+PGjdOSJUu0fft2LVmyRJJUXl6u2bNnKzs7W3a7XR988IFcLpdSU1N1xx13qE+fPnr77bf16aef6ujRo0pPT1deXp4cDkeL42/atEmlpaX64YcfZLFYNGTIEGVnZ+uCCy7w7bNkyRL9z//8j55++mm99NJL2rJli+x2uzIzM5Wdna2QkBBfPf9uypQpmjp1att+8QAAAOg09Lj0uADMjRuRAcBZxMTEaM+ePfrpp5/OuN8777yjJUuWKD4+XjNnztQ111yjLVu26JFHHlFdXV2LfWtra1VQUKDExETdeuut6tu3r1577TVt2rRJktS3b19f4zdhwgTNnj1bs2fP1pAhQ85Yw1dffaVPPvlEv/3tb5WVlaXt27frL3/5i9588019++23uu666zRhwgRt2LBBRUVFLR775Zdf6oknnlDPnj11yy236IYbbtC+ffs0d+5clZeXt9i3ublZBQUFOu+88zRjxgxddNFF+uCDD/Tpp59KkiIjI5WTkyNJysjI8NU/evTos/y2AQAAEAj0uPS4AMyN7x4AwFlce+21evzxx3XvvfcqOTlZqampSktL09ChQ31f4aqoqFBxcbGmTZumyZMn+x6bkZGh++67T3/9619brK+qqtLs2bP161//WpI0fvx45eXl6bPPPtOIESPkdDo1YsQIFRcXKyUlxbff2Rw5ckTPPPOMwsPDJR1vPFeuXKnGxkY98cQTCg0NlSTV1NToq6++Um5urmw2m+rr6/Xyyy9r/Pjxuv32233Hy8zM1D333KPS0tIW691ut371q19pypQpkqSJEyfqvvvu02effaaJEyeqZ8+euuSSS/TSSy+pf//+ba4fAAAAgUGPS48LwNy40hYAzmLYsGF67LHHNHLkSP3444967733VFBQoDvuuEPr16+XJP3zn/+U1+vVpZdeqpqaGt9/TqdTcXFx2rZtW4tj9uzZU2PHjvUtW61WJScnn/Jp/7m65JJLfM2sJA0aNEiSNHbsWF8ze2K9x+PRkSNHJEmbN29WXV2dxowZ06L+kJAQDRo06JT6peNN7MlSU1N16NChDtUPAACAwKDHpccFYG5caQsAbZCcnKw5c+bI4/Fo7969Wrt2rVatWqXFixfrT3/6k8rKyuT1enXXXXe1+vh/v6lCnz59ZLFYWqyLiIjQjz/+2KE6T55XTJKvuT3d+hNfaTt48KAkacGCBa0eNywsrMWyzWZTZGRki3URERGnfEUOAAAA5kWPS48LwLwIbQHgHJy4WiA5OVkJCQl6/vnn9fXXX6u5uVkWi0X333+/QkJO/RJDz549Wyy3to8/nO64p1t/4l6UJ/6dPXu2nE7nKfudfAXDmY4HAACAroce98zHAwAjENoCQDsNHDhQ0vG5u+Li4uT1ehUbG6uEhAS/HP/fr1LoTOeff74kKSoqSsOGDfPLMQNZPwAAAPyDHvfM6HEBBAofIwHAWWzdutX3Kf3JTtwFNyEhQRkZGQoJCVFJSckp+3q9Xh09evScz9ujRw9JCsjXsdLT0xUWFqbS0lJ5PJ5TttfU1JzzMU/Uf+zYsQ7XBwAAAP+ix6XHBWBuXGkLAGfx8ssvq6GhQRkZGUpISJDH49HOnTu1Zs0axcTE6PLLL1dERISmT5+u119/XRUVFRo1apR69uyp8vJyrVu3TldccYX+4z/+45zOe/755ysiIkJ/+9vfFBYWph49emjQoEGKjY31+3MMDw9Xbm6unn32Wd13330aM2aMIiMjVVlZqY0bN2rw4MH6/e9/f07HtNvt6tevn9asWaP4+Hg5HA5dcMEF6t+/v9/rBwAAwLmhx6XHBWBuhLYAcBYzZszQ119/rU2bNunTTz+Vx+NRdHS0Jk6cqBtuuEERERGSpOuvv17x8fFatWqVVqxYIen4zRGGDRumkSNHnvN5rVar8vPz9frrr+vFF19UU1OT8vLyOqWhlaTLLrtMvXr10sqVK/Xee+/J7Xard+/eGjJkiC6//PJ2HfOOO+7QsmXL9Morr8jj8WjKlCk0tAAAACZAj0uPC8DcLN7Wvg8BAAAAAAAAADAEc9oCAAAAAAAAgIkQ2gIAAAAAAACAiRDaAgAAAAAAAICJENoCAAAAAAAAgIkQ2gIAAAAAAACAiRDaAgAAAAAAAICJENoCAAAAAAAAgIkQ2gIAAAAAAACAiRDaAgAAAAAAAICJENoCAAAAAAAAgIkQ2gIAAAAAAACAiRDaAgAAAAAAAICJENoCAAAAAAAAgIn8H9tk6dtSUiotAAAAAElFTkSuQmCC\n"},"metadata":{}}],"source":["def analyser_texte_tweets(df):\n"," \"\"\"Analyse les caractéristiques textuelles des tweets\"\"\"\n"," # Calcul de la longueur des tweets\n"," df['text_length'] = df['text'].apply(len)\n"," df['word_count'] = df['text'].apply(lambda x: len(str(x).split()))\n","\n"," print(f\"Longueur moyenne des tweets: {df['text_length'].mean():.2f} caractères\")\n"," print(f\"Nombre moyen de mots par tweet: {df['word_count'].mean():.2f} mots\")\n","\n"," # Afficher word_count et text_length côte à côte avec seaborn\n"," plt.figure(figsize=(14, 6))\n","\n"," # Distribution de la longueur des tweets par sentiment\n"," plt.subplot(1, 2, 2)\n"," sns.boxplot(x='sentiment', y='text_length', data=df, hue='sentiment')\n"," plt.title('Distribution du nombre de caractères par tweet', fontsize=15)\n"," plt.xlabel('Sentiment')\n"," plt.ylabel('Longueur du Tweet')\n","\n"," # Distribution du nombre de mots par sentiment\n"," plt.subplot(1, 2, 1)\n"," sns.boxplot(x='sentiment', y='word_count', data=df, hue='sentiment')\n"," plt.title('Distribution du nombre de mots par tweet', fontsize=15)\n"," plt.xlabel('Sentiment')\n"," plt.ylabel('Nombre de Mots')\n","\n"," plt.tight_layout()\n"," plt.show()\n","\n","analyser_texte_tweets(df)"]},{"cell_type":"code","source":["more_than_140_ch_before_htmlunescape = df[df['text_length'] > 140]['text']\n","print('More than 140 characters before html process:', len(more_than_140_ch_before_htmlunescape))\n","more_than_140_ch_before_htmlunescape.head(10).values"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":0},"id":"vjIRh70ycDG1","executionInfo":{"status":"ok","timestamp":1751537483733,"user_tz":-120,"elapsed":32,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"bfd13510-3f50-4460-b2f9-6a99f23a1574"},"execution_count":19,"outputs":[{"output_type":"stream","name":"stdout","text":["More than 140 characters before html process: 17174\n"]},{"output_type":"execute_result","data":{"text/plain":["array([\"Awwh babs... you look so sad underneith that shop entrance of "Yesterday's Musik" O-: I like the look of the new transformer movie \",\n"," 'Tuesday�ll start with reflection �n then a lecture in Stress reducing techniques. That sure might become very useful for us accompaniers ',\n"," \"Whinging. My client&boss don't understand English well. Rewrote some text unreadable. It's written by v. good writer&reviewed correctly. \",\n"," '@TheLeagueSF Not Fun & Furious? The new mantra for the Bay 2 Breakers? It was getting 2 rambunctious;the city overreacted & clamped down ',\n"," \"#3 woke up and was having an accident - "It's pushing, it's pushing!" he was crying because he couldn't stop from wetting his pants. \",\n"," 'My bathtub drain is fired: it haz 1 job 2 do, & it iz FAIL. I got all Drano on its ass, & iz STILL NOT DRAINING. I wanna shower, dangit!! ',\n"," \"pears & Brie, bottle of Cabernet, and "Win a Date With Tad Hamilton"... oh gawwd my life flashed forward to when I'm 40 with my 75 cats \",\n"," 'Have an invite for "Healthy Dining" session at Ashok Hotel today with Exec Chef R.Chopra but damn workload - will have to skip it! ',\n"," 'Damnit I was really digging this season of Reaper http://www.tv.com/story/13720.html?ref_story_id=13720&ref_type=1101&ref_name=story',\n"," \"Why do I keep looking...I know that what I read is gonna hurt but I still look! I guess it's just a girl thing & I need to get over him. \"],\n"," dtype=object)"]},"metadata":{},"execution_count":19}]},{"cell_type":"markdown","source":["Il est assez clair que l'on rencontre un problème d'encodage html ce qui augmente artificiellement la longueur des tweets dans notre dataset."],"metadata":{"id":"jU4bygO9hhXj"}},{"cell_type":"code","source":["import html\n","# Exemple de nettoyage d'une colonne 'text' dans votre DataFrame\n","df[df['text_length'] > 140]['text'].apply(html.unescape).head(10).values"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":0},"id":"7fvM0aAUfZ_l","executionInfo":{"status":"ok","timestamp":1751537483811,"user_tz":-120,"elapsed":77,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"29977ed3-8334-43cd-fc8b-4b111fbb66ed"},"execution_count":20,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array(['Awwh babs... you look so sad underneith that shop entrance of \"Yesterday\\'s Musik\" O-: I like the look of the new transformer movie ',\n"," 'Tuesday�ll start with reflection �n then a lecture in Stress reducing techniques. That sure might become very useful for us accompaniers ',\n"," \"Whinging. My client&boss don't understand English well. Rewrote some text unreadable. It's written by v. good writer&reviewed correctly. \",\n"," '@TheLeagueSF Not Fun & Furious? The new mantra for the Bay 2 Breakers? It was getting 2 rambunctious;the city overreacted & clamped down ',\n"," '#3 woke up and was having an accident - \"It\\'s pushing, it\\'s pushing!\" he was crying because he couldn\\'t stop from wetting his pants. ',\n"," 'My bathtub drain is fired: it haz 1 job 2 do, & it iz FAIL. I got all Drano on its ass, & iz STILL NOT DRAINING. I wanna shower, dangit!! ',\n"," 'pears & Brie, bottle of Cabernet, and \"Win a Date With Tad Hamilton\"... oh gawwd my life flashed forward to when I\\'m 40 with my 75 cats ',\n"," 'Have an invite for \"Healthy Dining\" session at Ashok Hotel today with Exec Chef R.Chopra but damn workload - will have to skip it! ',\n"," 'Damnit I was really digging this season of Reaper http://www.tv.com/story/13720.html?ref_story_id=13720&ref_type=1101&ref_name=story',\n"," \"Why do I keep looking...I know that what I read is gonna hurt but I still look! I guess it's just a girl thing & I need to get over him. \"],\n"," dtype=object)"]},"metadata":{},"execution_count":20}]},{"cell_type":"code","source":["df['text'] = df['text'].apply(html.unescape)"],"metadata":{"id":"BoGtOFgUg-en","executionInfo":{"status":"ok","timestamp":1751537484338,"user_tz":-120,"elapsed":527,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"execution_count":21,"outputs":[]},{"cell_type":"code","source":["analyser_texte_tweets(df)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":567},"id":"nE0cJqRHhq1c","executionInfo":{"status":"ok","timestamp":1751537498442,"user_tz":-120,"elapsed":14105,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"1fad0b6a-c11d-46d7-83c6-272bd0d03a6d"},"execution_count":22,"outputs":[{"output_type":"stream","name":"stdout","text":["Longueur moyenne des tweets: 73.70 caractères\n","Nombre moyen de mots par tweet: 13.18 mots\n"]},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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y9xncHCwunTporfffrvUfTKuZlxdYxigCkgy5TndBg8ebCSZF154ocT9mzVr5rbto48+Mlar1VgsFtO5c2czdOhQc/vtt5vo6Ggjyfz888/GGGOmTp1qbrjhBiPJxMfHmxEjRrj+W7t2rTHGmC+++MJIMn369DGNGzc2kZGRZvDgwaZfv37m//7v/4wxxjz//PNGknnzzTfd4ujevbuRZMaPH28sFou56aabzNChQ03z5s2NJNO4cWOzf/9+t/uMGDHCSDJffPFFmc/X+cdbnmP4+eefjSTTvXv3EvsbM2aMkWQCAwNNnz59zODBg43NZjOSzPXXX29OnjxZanyPPfaY8fHxMZ07dzZJSUnGbrcbSaZevXrml19+KTX20mzcuNEEBwcbSaZdu3Zm6NChJjEx0VgsFjNu3DgjyYwYMaLU59X5Op7vQsdalmbNmhlJ5oknnjD+/v6mV69eZsCAAaZ+/fpGkrnxxhuNw+Fwu8+BAwdMy5YtjSTTtGlTM2TIENOzZ0/j4+NjJJnXX3+9xOM4X7sBAwaYsLAwc/fdd5tevXqZgIAAI8m88cYbZsGCBcbX19d069bNDB482ERFRRlJplu3biViqMj55TxXH3jgAePn52fatm1rhg4dam666SazefNmY4wxM2bMMFar1VitVtO5c2dzzz33mLi4OCPJREREmG3btpX7ua3I63v27FkzbNgwI8kEBwebHj16mAEDBpgmTZoYSaZTp06moKCgXI/vPB+uv/5607lzZ1O/fn0zePBg06NHD2O1Wo2Pj49ZuXKlef31142vr6+55ZZbzIABA0y9evWMJDN8+PAS+0xPT3e9R1q1amWGDh1qunbtaiQZX19fk5qa6uq7ePFiM2jQICPJNGjQwO39OWvWLGOMMfv27TN169Y1ksw111xjBg0aZO6++26TkJBgLBZLic+Vsjhf29GjRxt/f3/Tpk0bM3ToUHPttdcaScbf3998+umnbvc5deqU63174403miFDhphbb73VBAUFlfranP84FzqHSjNr1izTu3dvI8lER0e7PReLFy82xhhz0003lXhvnz171tSpU8d1DOd/JuXm5hqr1Wratm3r9lg7d+50nS/Nmzc3/fv3Nz179nQd12uvvVYivq+//tr1OK1atTIDBw40N954o/H19TU+Pj7m/fffv6RjAeBdGG8y3mS8yXjz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OXPmqHbt2pozZ0657ve3v/1Nhw4dKrF92bJlkv77y6L031/Hdu7cWQkRl27+/PmumRvSuQ+jP/7xjzp58qT69evnVsPG+UGZkpKiI0eOuLZv2rRJzz33XKn7r+gxPProo5KkyZMnu/36d/z4cU2YMEHGGD388MNX9HKN2NhY7dq1Sy+99JJb2//93//pm2++KfV+zudo2rRpKigocG1ftWqV/v73v1+RWM/XsmVL9e3bV8ePH9cf/vAHFRUVudq++eYbpaSkyMfHR+PHj7/isUiXdn5dzMSJE2W1WvXAAw+4FaZ3OnHihN54441S61H9VkVe34CAAD355JM6fvy4Bg4cWOqv0llZWZo3b165j6ky9ejRQ+3bt9eePXv03HPPuQ1KFy9erEWLFik4OFgPPviga7vNZpOfn5927dpV6qBv3rx5pQ4gP/nkExlj3D6vymPPnj2aMmWK27Z//etf+uabb9SgQQO3X8mdC5/885//dOu/cOFCzZ0795IetzzK81nlrL+1d+9erVixwlV3y6lHjx7asGGDNm3apNjY2BKXag0aNEht2rTRu+++qxdffLFEbT5jjL766it99dVXrm0PP/yw6tevr1dffVX/+te/SnzpKy4u1qeffur2OlXFvx0AqgbjTcabpWG86Y7xZtlGjRolm82mTz75RH//+99LJC2//fZb/frrr5LOlWSwWq1atWqV26JUp0+f1iOPPFLhJHJFxnRPPfWUJOmxxx5Tenq6W9vp06dLJJAbNWqkw4cPl/ojQufOnXXbbbdp48aNGj16dKl90tLStGTJkvIekmufX331lcaPH6/8/PwSfTZv3qzly5e7bjOudse4+ipngCogyUgyI0aMMCNGjDD333+/6d+/v2ndurWxWCxGkrnmmmvMxo0by7x/s2bN3LaFhYUZq9VqEhISTFJSkrnnnnuM3W43kkzdunVNRkaGq++pU6dM/fr1jSTTvXt388ADD5iHHnrIfPXVV8YYY7744gtXfGV5/vnnjSTz5ptvum3v3r27kWTGjx9vLBaL6d69uxk6dKhp0aKFkWQaNWpk9u7d63Yfh8Phul/9+vXNgAEDzI033mj8/f3N448/XurxXuwYfv75Z1fbb40ZM8ZIMrVq1TJ9+/Y199xzj4mIiDCSTJcuXczJkyfd+o8YMcJIMl988UWpz0Vp8V3It99+a2rXrm0kmfbt25thw4aZ6667zlgsFjNu3LhSn/uCggLTqlUrI8k0bdrUDBo0yHTu3NlYrVbXc1TasZalWbNmpqyPvLJe/wMHDrhex2bNmpmhQ4eaW265xfj4+BhJZtq0aSX2daHn5kLPa1kxVOT8KutcPV9KSorrONq1a2cGDhxohgwZYjp37mwCAgKMJHPs2LEy73++iry+Z8+eNffff7+RZPz9/U3nzp3N0KFDzcCBA03btm2NxWIx8fHx5Xr8C537xvz3Ofz5559LtL355ptGknn++efdtqenp5t69eoZSaZ169Zm2LBh5oYbbjCSjK+vr5k/f36Jfd15551Gkmnbtq25//77zUMPPWTeeOMNY4wx/fv3N5JMdHS0ufvuu82wYcNMly5djMViMVar1aSmppbrWJ2v7ejRo42fn59p27at6/mWZPz8/Mwnn3zidp81a9a4XuvExEQzbNgwc+211xpJZb6XynMOXUhcXJyRZK677jozcuRI89BDD5kPP/zQrc/EiRNd/za89tprbm3O10WSeeSRR0p9jIyMDNf7oH79+ubWW281w4cPN7169XJ9Vv7tb39zu88333xjbDabkWSaNGli7rjjDjN8+HDTs2dPEx4ebiSZxYsXX/KxAPAOjDcZbzLeZLx5vsocbxpz7vkLCQkxkkyLFi1MUlKSufPOO01MTIyRZH744QdX39GjR7u9HwYPHmwaNGhgbDabGTlyZKnP3YXOH2MqNqYzxphHH33USDI+Pj6mW7duZtiwYaZHjx4mPDy8xPE7+7Zo0cLce++95qGHHjKvvvqqq/3w4cMmISHBSDJhYWGme/fuZvjw4aZv376mcePGRpL5wx/+4LbPi72Xz99neHi46dGjh2ufTZo0KbFPxtWMq2sSkraoEs4PCed/vr6+pm7duqZdu3ZmxIgRZtGiRaa4uPiC9//tB/3cuXPN8OHDTatWrUxISIgJCQkxbdq0MY899pg5cOBAiX1s3LjR3HbbbSYsLMw1cHd+cFbGIPrnn382b775punQoYMJDAw09erVM/fff7/Zv39/qfvLzc01jzzyiGnQoIEJCAgwbdu2NSkpKWUe78WO4WKJq7lz55quXbua4OBgExgYaNq2bWtefvllU1BQUKJvZQ+ijTmXBLvzzjtNWFiYqV27trn++uvNkiVLLvjcHzhwwAwbNszUqVPH1KpV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9PR0JSUluRYoA4DqoLyLj7JIKTypQjNtb7jhBoWEhOj7779X7dq11bt3b/n4+EiSTpw4oeDgYN14442VGigAAPCMiIgISefKId10000l2jdv3uzWD/BWGzdu1LvvvqtffvlFkjRp0iS1a9dO+fn5eumllzR48GB16tTJw1EC3icxMVG9evXSypUrXZ/50rmEbq9evZSYmOjB6ADg0u3evbtS+wFXQoULz8XFxZU64yY4OFiPP/74ZQUFAAC8R8+ePbVgwQItXrxYXbt2dSuRUFxcrA8//FBWq1U9e/b0YJTAhX333Xf661//Krvdrm7dumnBggWuttDQUNWtW1erV68maQuUIi0tTStWrFC7du3UoEEDFRUVyc/PT4cPH9aKFSsUHR1N4hZAtXLmzJlK7QdcCRW6hmXIkCFat25dme1ff/21hgwZUuGgJOk///mPkpKS9NZbb7m2FRYWavbs2XrwwQd1//33669//SsLngEAcIX5+vrqtttuU35+vp544gmtXr1ax44d0+rVq/XEE08oPz9ft912G4uQwat98MEHatOmjV588UX17t27RLvdbtfPP//sgcgA7+ZwOJSamqqmTZvq4MGD+uyzz7RmzRp99tlnOnjwoJo2barU1FQ5HA5PhwoA5fbbkp6BgYHy8/NTYGDgBfsBVemKfLtyOByXtcJeZmamVq5cWaLg89tvv63vv/9ejz32mIKCgjRnzhxNmzZNL7744uWGDAAALiApKUmStHLlSs2bN0/z5s2TdO7S2N69e7vaAW+1b98+jRgxosz2sLAw5efnV2FEQPWQkZGhnJwc5eTkKD4+Xg8//LCioqKUlZWlpUuXusolZGRkKDY21sPRAkD51KpVy+22s859UVHRBfsBVanSq8UXFBRo06ZNCgkJqdD9T58+renTp+vhhx9W7dq13fa7atUqjRgxQu3atVPLli01btw47dy5UxkZGZUVPgAAKENSUpJSUlI0ZMgQ9ezZU0OGDFFKSgoJW1QLAQEBF1x47PDhwwoODq7CiIDq4dixY5Kk9u3ba8KECYqOjlZgYKCio6M1YcIEtWvXzq0fAFQH27dvr9R+wJVQ7pm2CxYs0MKFC123p0+frunTp5fZ/4477qhQQLNnz1ZCQoLi4uK0aNEi1/bdu3fr7Nmzat++vWtbVFSUbDabMjIyZLfbS91fUVGR2y8lFovF9UvJ5cwGBgCgJvLz8yv10nLA27Vt21Zr1qxR3759S7Tl5ubq888/pyYnUIrjx49Lkjp27CiHw6HPPvtM2dnZioiIUM+ePZWQkKCtW7e6+gFAdVDezyw+2+BJ5U7axsTEqHfv3jLGaMWKFYqLi1PDhg1L9AsMDFTLli0rtIjDV199pZ9//llTp04t0ZabmytfX1+32bfSuUvZLlTXdvHixW7J5hYtWuiVV15hhWsAAIAaZNiwYZo4caKefvppdenSRZK0adMmbd26VStXrpQkDR482JMhAl7JeQXlkiVLNG/ePLfatQsWLFCdOnXc+gFAdXDq1KlK7QdcCeVO2iYkJCghIUHSudXzbrvtNl1zzTWVFkhOTo7eeustPfvss/L396+0/Q4YMED9+vVz3XbOrs3OzlZxcXGlPQ4AAAAql6+vb6X90N6oUSO98MILeuuttzR//nxJ0scffyxJatOmjR566CHVr1+/Uh4LuJo4k7JHjhyRj4+POnXqpObNm2vPnj1KS0vTkSNH3PoBQHVw/gK6sbGxioqKUlFRkfz8/JSVlaUdO3aU6AdUtQqdfePGjavsOLR7927l5eXpz3/+s2ubw+HQ9u3btXz5ck2cOFHFxcU6efKk22zbvLw8hYeHl7lfPz8/+fn5ldpmjKm0+IHzORwOZWRkKC8vT2FhYbLb7bJaK72ENABUucLCQqWmpurw4cNq0KCBkpKSKvXHVuBKatKkiSZNmqQTJ07o0KFDMsaoQYMGCg0N9XRogNdq2bKlpHOTXxwOhzZs2KANGza4tlksFhljXP0AoDo4fxLfjh07XEnaC/UDqlqFfzIoKCjQ0qVL9f333ysnJ0eSZLPZlJiYqD59+igoKOiS9te+fXv99a9/dduWkpKiRo0aqX///rLZbPLx8dGWLVtcl7QdPHhQOTk5ZdazBTwhLS1NqamprveFdO69kZSURK08ANXa9OnTtWnTJtftbdu26YsvvlCHDh306KOPei4woBzOnDmjgIAASVJwcLBiYmI8HBFQPaxevVrSuQkvoaGh6tKliyIiIpSdna1vv/1W+fn5rn69evXyYKQAUH7169d3XSlwsX6Ap1QoaXv06FE9//zz+vXXX9WoUSO1atVK0rkk6oIFC7RmzRq98MILl3SJTK1atdS0aVO3bQEBAQoJCXFt79mzp+bOnavg4GAFBQXpjTfekN1uJ2kLr5GWlqaUlBTFxcVpzJgxioqKUlZWlpYuXaqUlBSNHTuWxC2AasmZsPX19VWvXr3UrVs3rVu3TitWrNCmTZs0ffp0ErfwaiNHjlSLFi0UGxur1q1bKzY2lhqcQDn8+uuvkqTGjRuroKBAK1ascLXVq1dPjRs31oEDB1z9AKA6aNCggbZv3+66Xb9+fdWuXVsnT550+zxr0KCBJ8IDJFUwafvuu+8qNzdXf/7zn9WxY0e3th9++EGvv/663n33XU2YMKFSgnQaMWKELBaLpk2bpuLiYsXHx2vUqFGV+hhARTkcDqWmpiouLk4TJkxwlUOIjo7WhAkTlJycrNTUVCUkJFAqAUC1UlhY6ErYTp8+3VUOYdCgQbrzzjv16KOPatOmTSosLKRUArzWkCFDtGPHDn3xxRdaunSpJCkqKkqtW7d2JXFtNpuHowS8V0REhPbu3eu2zRgjm82mAwcOeCgqAKiYhIQE15UEksr84cm5thPgCRVK2m7atEl9+vQpkbCVzp3Qd9xxhz7//PPLDm7y5Mlut/39/TVq1CgStfBKGRkZysnJ0ZgxY0okZa1Wq/r06aOpU6cqIyNDsbGxHooSAC5damqqJKlXr14lkrL+/v669dZbtXz5cqWmpuq+++7zRIjARd19992SziWZ9u3bp+3bt2vHjh1KS0vTZ599JulcOaMZM2Z4MErA+7Ro0UJffPGFfvjhB/n4+Li15eXlucrmtGjRwgPRAUDFnDx5slL7AVdChab7nTlzRmFhYWW2h4eH68yZMxUOCqiO8vLyJJ2btVMa53ZnPwCoLg4fPixJ6tatW6ntzu3OfoA3s1gsatasmW699Vb17t1bvXr1UsOGDSXJrR49gHPq1q3r+vvs2bNubeffPr8fAHi7C+W0KtIPuBIqNNO2cePG+uqrr9SrVy/5+rrvori4WF999ZUaN25cKQEC1YXzwzwrK0vR0dEl2rOystz6AUB10aBBA23btk3r1q3ToEGDSrSvW7fO1Q/wVgUFBdq5c6drhu2uXbt09uxZNWnSRO3atVNSUhJXwgClcDgcldoPALxB8+bNJZ37Mff111/XRx99pMOHD6tBgwa666679Nhjj8kY4+oHeEKFkrb9+/fX3//+dz399NPq3bu3a3bCwYMHtXLlSu3du1d//OMfKzVQwNvZ7XbZbDYtXbrUraatdG4Qu2zZMtlsNhbOA1DtJCUl6YsvvtCKFSt05513upVIKCwsdF1anpSU5KkQgYt66KGHJEktW7ZU69atdddddyk2NlbBwcEejgzwbjt37nT93a5dO/n7+6ugoEBBQUEqLCzU1q1bXf3atm3rqTAB4JIsXLhQ0rmySW+99Zb69OnjWkj8rbfekjHG1Y/yX/CUCiVtr7/+ep05c0bvvvuuZs2a5dYWGhqqsWPHqkuXLpUSIFBdWK1WJSUlKSUlRcnJyW4f+suWLVN6errGjh3LImQAqh1/f3916NBBmzZt0oQJExQTE6Pw8HDl5uYqMzNTZ8+eVYcOHViEDF4tICBAp06dUl5ennJzc5WXl6f8/HyStsBFHDlyRJLUunVrbdu2zW1GrdVqVWxsrHbs2OHqBwDVgbOs1/Dhw7V8+XJNnTrV1Va3bl0NGzZM7733HuW/4FEW4/z5oALOnj2rXbt2uep/2Ww2RUdHlyhQ742ys7NVVFTk6TBwFUpLS1NqaqpbXTybzaakpCQlJiZ6MDIAuDxPPfWUsrOzS2yPiIjQX/7yFw9EhKudn5+fIiIiKmVfxhjt3btXO3bscJVIyM3NVWhoqFq1aqXWrVsrNja21BJH1QljXFS2Dz74QMuWLZMkxcXFqX379vL391dhYaG2bNmi9PR0SVKfPn1KLaEDAN7onXfe0RdffKFatWrp1KlTJdqd22+++WZm2qLSlXeMW6GZtk4+Pj6y2+1c7g2cJzExUQkJCcrIyFBeXp7CwsJkt9uZYQugWktNTVV2draCg4PdFlzMyspSdna2UlNTKY8Ar2axWNS8eXM1b95ct99+uyTp0KFD2rJli5YtW6aNGzfKYrHo/fff93CkgHeJjY11JW0lqWnTpq6rybZs2eLWDwCqC2f5r9IStpJc2xnfwpPKnbQ9ceLEJe+cy81QUzkvFQOAq0FxcbFWrlyp0NBQvfbaa26LkBYXF+uJJ57QypUrNXDgwBILlALe5vTp08rIyND27du1fft2ZWZmqqioSFarVS1atPB0eIDXOX/iwbZt21wzayW5feYzQQFAdVJcXFzufpQAg6eU+5uVc/GGSzF//vxLvg8AAPAuq1atksPh0IABA0okZX19fdW/f3/NmzdPq1atUq9evTwUJVDSkCFD9Oijj6pbt26aO3eutm/frj179sjhcMjf31/XXHON7rrrLrVu3Vp2u10BAQGeDhnwOvn5+a6/f5vkOP/2+f0AwNv9/e9/L3e/Z5555soGA5ThkqbD+Pv7KyEhQU2aNLlS8QAAAC/jrGMbFxdXant8fLzmzZtXar1bwFusWbNGrVq1UteuXdW6dWu1aNGiWqzDAHhaWFiY628/Pz+3msnO2ra/7QcA3u7AgQOuv2vXri1fX18VFhbK399fxcXFOnnyZIl+QFUrd9L27rvv1tdff63169frl19+Ubdu3XTDDTfIZrNdyfgAAICHOYvkp6en66abbirRvnnzZrd+gDeaM2eOp0MAqqWYmBhZrVYFBwdr6tSp+vLLL5Wdna2IiAjddNNNevrpp3XixAnFxMR4OlQAKLfzf4ByJmgllahxy+Ke8KRyJ22HDRumYcOGaefOnVq3bp2WLFmi9957T61atVK3bt10/fXXU8MW+P8VFhYqNTVVhw8fVoMGDZSUlEQdHADVVs+ePbVgwQItXrxYXbt2LVHT9sMPP5TValXPnj09GCUA4ErIzMyUw+FQfn6+/vjHP7pm1krS4sWLXbczMzNZ0wFAteGcWevUtGlT19UD+/btc+sHeMoln32tWrVSq1at9MADD2jTpk1at26d5s2bpzfffFNxcXEaNGiQrrnmmisRK1AtTJ8+XZs2bXLd3rZtm7744gt16NBBjz76qOcCA4AK8vX11W233aZPP/1UTzzxhPr376/4+Hht3rxZH374ofLz89W7d28GtfBKixYt0ueff16uvhaLRc8999wVjgioXvLy8iq1HwB4g+DgYB09etR1+/xE7W/7AZ5S4W9XVqtVHTt2VMeOHZWTk6MZM2bohx9+UExMDElb1FjOhK2vr6969eqlbt26ad26dVqxYoU2bdqk6dOnk7gFUC0lJSVJklauXKl58+Zp3rx5ks6NB3r37u1qB7zNqVOnZLFYPB0GUG2FhoZKOlcm4YknnlBmZqby8vIUFhammJgYvfbaa8rMzHT1A4DqIDQ01C1pe6F+gKdUOGl75swZbdy4UevWrdOWLVvk6+urG2+8Udddd11lxgdUG4WFha6E7fTp013lEAYNGqQ777xTjz76qDZt2uQqbg4A1U1SUpIGDhyoVatWueoZ9uzZkxm28Gr33nuvunXr5ukwgGrLGCPp3Ex0q9XqVgLB4XCU6AcA1UFAQECl9gOuhEv6lnX27Fn98MMPWrdundLS0uRwOBQfH6/x48fr2muvJRGFGi01NVWS1KtXrxLvBX9/f916661avny5UlNTdd9993kiRAC4bM4rCQAANcPx48clnatZm5ycrLZt27rqPv7444/atWuXWz8AqA7y8/MrtR9wJZQ7aft///d/Wr9+vU6dOqXWrVtr5MiR6tKli2rXrn0l4wOqjcOHD0tSmbN5unXrpuXLl7v6AQAAAN4uLCxMktSpUydt3LhRmzdvdrVZrVZ16tRJ69evd/UDgOrg7NmzldoPuBLKnbRdtWqV/P39lZiYqLp162rv3r3au3dvmf0tFoseeOCBSgkSqA4aNGigbdu2ad26dRo0aFCJ9nXr1rn6AQAAANWB3W5XSEiI1q9fr3bt2ikyMlJFRUXy8/PToUOHtH79eoWGhsput3s6VAAot/KW96IMGDzpks6+wsJCbdy4sdz9SdqiJklKStIXX3yhFStW6LbbbtPbb7/tqvk4YsQIffbZZ65+AFBdnT59WrNmzXJ9vo0ePVqBgYGeDgso1fPPP6+oqChPhwFcNXbu3KmtW7e6bvv5+Umini2A6qdFixY6ePBgufoBnlLupO38+fOvZBxAtefv768OHTpo06ZN+uMf/+janpWVpU2bNkmSOnToQO1nANXWiy++qD179rhuZ2Vlafz48WrevLkmTZrkucCAMrRp08bTIQDVXkZGhqtercVicWtz3j5+/LgyMjLcFikDAG+Wk5PjdjswMFC+vr4qLi7W6dOny+wHVCWrpwMAria5ubmX1Q4A3sqZsLVYLLr++uv1/PPP6/rrr5fFYtGePXv04osvejpEAMAVcOzYMUlS+/bt9Y9//ENDhgxRz549NWTIEP3jH/9Qu3bt3PoBQHVw6NAht9unT5/WiRMn3BK2pfUDqhLFOYBKcvr0aVdC4/XXX9dHH32kw4cPq0GDBrrrrrv02GOPac+ePTp9+jSXEgOoVs7/fEtOTnZ9ho0aNUr33XefJkyYwOcbAFylnLNs69Wrp0mTJrnNOvv888/Vtm1bt34AUB04HI5K7QdcCSRtgUoya9YsSVKXLl0UGhqq++67z63dubLurFmz9Oijj3oiRACokPM/336blA0MDOTzDQCuYiEhIZKk1atXKy4uTr1795a/v78KCwu1ZcsWrVmzxq0fAFQHNputXD822Wy2KogGKB1JW6CSZGdnS5J69epVanuvXr20fv16Vz8AqC74fAOAmissLMz19/bt25Wenu667VyI7Lf9AMDblfeHJn6QgidR0xaoJBEREZKkFStWlNru3O7sBwDVBZ9vAFBz/XbxscvtBwDewBhTqf2AK4GZtkAlGT16tMaPH69vv/1W9913n9slxKdPn9aGDRtc/QCgOjn/861fv3565ZVXVFBQoKCgIP35z3/m8w3VwpAhQ8rVb/78+Vc4EqB6OX8h3datW6tdu3au8ghbt251zbxlwV0A1cn+/fsrtR9wJVx20vbYsWPKy8tTZGQki4+gRgsMDFTz5s21Z88eTZgwQZ06dVKvXr20YsUKbdiwQcYYNW/enPcJgGrn/M+3iRMnurbn5+e7bvP5Bm83aNCgEjMBHQ6HsrOztXHjRjVq1EgdO3b0UHSA93LWfOzRo4dbklY6V+uxe/fuWrNmDQuRAahWiouLK7UfcCVUOGm7ceNGvfvuu/rll18kSZMmTVK7du2Un5+vl156SYMHD1anTp0qLVCgOpg0aZJefPFF7dmzR+vXr9f69etdbc2bN9ekSZM8GB0AVNzBgwcvqx3wtKSkpDLbjh07pokTJ6phw4ZVGBFQPTjrOR45ckQvv/yyMjMzlZeXp7CwMMXExGj69Olu/QCgOqhVq5ZOnDhRrn6Ap1Sopu13332nv/71rwoJCdE999zj1hYaGqq6detq9erVlREfUO1MmjRJM2bMUIcOHRQVFaUOHTpoxowZJGwBVFu5ubkqLCyUJL388stun28vv/yyJKmwsJBLY1Ft1alTR7fddps++OADT4cCeJ06depIkrZs2aKZM2fK19dXcXFx8vX11cyZM7V161a3fgBQHcTHx1dqP+BKqNBM2w8++EBt2rTR888/r+PHj2vBggVu7Xa7XStXrqyUAFH9nTlzRocOHfJ0GFXurrvucv19+PBhD0biOZGRkQoICPB0GAAu05QpUySduww2MjJSjz76qFt73bp1dfToUU2ZMkV/+9vfPBEicNkCAgL066+/ejoMwOvY7XbZbDbVrl1bBw4c0NSpU11tNptNzZo108mTJ2W32z0YJQBcmvJ+R6+p3+XhHSqUtN23b59GjBhRZntYWJjy8/MrHBSuLocOHdILL7zg6TDgAc8995yaNWvm6TAAXKaCggJJ52qClmbAgAGaM2eOqx9Q3ezbt0+ffPKJGjVq5OlQAK9jtVqVlJSklJQUtWvXTh06dFBRUZH8/Pz066+/auvWrRo7dqys1gpdxAkAHlHeH2r5QReeVKGkbUBAgE6fPl1m++HDhxUcHFzhoHB1iYyM1HPPPefpMKrcL7/8olmzZmn06NE1tkZeZGSkp0MAUAmCgoKUn5+vDz74oNR69YsXL3b1A7zV+PHjSyxEJkknT55UQUGBAgICNGbMmEve7+LFi7VhwwZlZWXJ399fdrtd9913n1sCuLCwUHPnztXXX3+toqIixcfHa9SoUQoPD3f1ycnJ0axZs/Tjjz8qMDBQ3bt31/Dhw+Xj41Oh4wUqU2Jionr16qWVK1dqy5Ytru1Wq1W9evVSYmKiB6MDgEtX3n9f+XcYnlShpG3btm21Zs0a9e3bt0Rbbm6uPv/8c/7hhktAQECNnm3ZsGHDGn38AKq/559/Xn/605+Uk5Oj3Nxct0RTbm6ujh496uoHeKs2bdqUmrQNDg5WgwYNdMMNN1Ro0sG2bdvUu3dvRUdH6+zZs3rvvff00ksv6fXXX1dgYKAk6e2339b333+vxx57TEFBQZozZ46mTZumF198UZLkcDg0depUhYeH66WXXtKxY8eUnJwsHx8fDR8+/PIOHKgEaWlp+vTTT+Xn5yeHw+Ha7uPjo08//VTR0dF8/wNQrdSrV6/MhXQtFouMMa5+gKdUKGk7bNgwTZw4UU8//bS6dOkiSdq0aZO2bt3qqmU7ePDgyosSAAB4THh4uPz9/VVYWKg//elPqlu3rgYMGKDFixe7Erb+/v5uyVzA24wfP/6K7HfixIklHmfUqFHavXu32rRpo4KCAq1atUp/+MMf1K5dO0nSuHHj9Mc//lEZGRmy2+3avHmzDhw4oEmTJik8PFzNmzfXkCFD9O677yopKUm+vhUasgOVwuFwaN68eZKk1q1bq1+/foqKilJWVpaWLFmi9PR0vfPOO0pISKBEAoBqo27dumW2ORO2F+sHXGkV+le1UaNGeuGFFxQSEqL58+dLkj7++GMtXrxYTZs21ZQpU1S/fv1KDRQAAHhOSkqK/P39JUlHjx7VnDlz3BK2KSkpngwP8BrO2s7OWbu7d+/W2bNn1b59e1efqKgo2Ww2ZWRkSJIyMjLUtGlTtx8+OnTooFOnTmn//v1VFzxQip07d+r48eOKiYnR+PHjVVRUpM2bN6uoqEjjx49XTEyM8vPztXPnTk+HCgDlVt4fmfgxCp5U4Z/tmzRpokmTJunEiRM6dOiQjDFq0KCBQkNDKzM+AADgJVJSUpSbm6spU6aooKBAQUFBev7555lhC6+0cOHCCt3vcq4Wczgceuutt9SqVSs1bdpU0rkSIr6+vqpdu7Zb37CwMOXm5rr6/PZ9FBYW5morTVFRkYqKily3LRaLatWq5fobqCw7duyQdK5E3sSJE5WTk+Nqs9ls6tq1qzIzM7Vjxw61adPGU2ECwCVp3Lhxufvx7yo85bKvtQoODlZMTExlxAIAQLVx5swZHTp0yNNheMT/+3//z/V3Xl6e8vLyPBeMB0RGRiogIMDTYeAiFixYUKH7XU7Sds6cOdq/f79eeOGFCu+jvBYvXuyWmG7RooVeeeUVRUREXPHHRs0SEhIiSfroo4907bXX6oYbblBhYaH8/f118OBBffzxx65+NXXxXQDVz3fffed229/fX2fPnpWPj48KCwvd+lFfHp5SrqTtmjVrKrTz7t27V+h+AAB4u0OHDlVJYgbe57nnnmOByWrAWcLL6ejRo5o6daqaNGmivn37qlGjRpKkrKwsLVu2TAcOHNBTTz1V4cebM2eOvv/+e02ZMsVt0ZLw8HAVFxfr5MmTbrNt8/LyXLNrw8PDlZmZ6bY/548hZc1kHzBggPr16+e67ZwFlJ2dreLi4gofB/BbzkSsj4+P0tLStHHjRleb1WqVj4+PiouL1bBhQ/3yyy+eChMALklWVpbbbWei9uzZsyX68dmGyubr61uuH9rLlbSdOXNmhYIgaQsAuFpFRkbqueee83QYHvHLL79o1qxZGj16dI2cVRUZGenpEFABs2fPVsOGDfX73//ebXtMTIx+//vfa9q0aZozZ46eeOKJS9qvMUZvvPGGNmzYoMmTJ5dY16Fly5by8fHRli1bXAv4Hjx4UDk5ObLb7ZIku92uRYsWKS8vz1UWIT09XbVq1Srz8k0/Pz/5+fmVGRNQWZz1HEv7McDhcMjhcLj6ce4BuBrx2QZPKVfSNjk52e32yZMnNWPGDAUFBemOO+5wm6mwfPlynTp16oqt0AsAgDcICAio8bMtGzZsWOOfA1QfP/74o+69994y29u3b6933333kvc7Z84crVu3Tk8++aRq1arlqkEbFBQkf39/BQUFqWfPnpo7d66Cg4MVFBSkN954Q3a73ZW0jY+PV+PGjZWcnKx7771Xubm5ev/999W7d+8yE7NAVXEuOllZ/QDAG7Ro0UKbN28uVz/AU8qVtP3tlN0FCxYoNDRUzz77rFtB5qZNm6pz5856+eWXtXTpUo0bN65yowUAAAAqwM/PTxkZGerVq1ep7Tt37qxQgnTFihWSpMmTJ7ttHzdunHr06CFJGjFihCwWi6ZNm6bi4mLFx8dr1KhRrr5Wq1VPPfWUZs+erWeffVYBAQHq3r27hgwZcsnxAJVt165dkqTQ0FD5+vq6JWfr1q2r4uJi5efna9euXbrhhhs8FSYAXJJ9+/ZVaj/gSqjQQmQbN27U0KFDS11Bz2q1qlOnTnr//fcvOzgAAACgMnTr1k2ffPKJ60qxBg0aSJIOHz6sTz75ROvWrdMdd9xxyftNTU29aB9/f3+NGjXKLVH7WxEREXr66acv+fGBK81ZX7levXp66qmnlJmZ6SrlERMTo6lTpyo/P7/GLUoJoHrLz8+v1H7AlVChpK0xpkTR5vMdOHCgwgEBAAAAle2+++7T8ePH9emnn+rTTz911el01uO84YYbdN9993kyRMArBQYGSpJ+/vlnzZw5U3369FFcXJyysrI0c+ZM7dmzx60fAFQHzn//K6sfcCVUKGl73XXXaeXKlapfv75uu+02BQQESJLOnDmjFStW6LPPPlO3bt0qNVAAAACgonx9ffXoo4/qrrvu0g8//KDs7GxJ52a4dujQQc2bN/dsgKh2zpw5o0OHDnk6jCuuZcuW+vbbb+Xn56c9e/Zo6tSprrawsDD5+fmpqKhILVu21N69ez0YadWJjIx0fQcGUD3Vrl1bJ06cKFc/wFMqlLR94IEH9Ouvv2revHn697//rTp16kiSjh07prNnz6pVq1YaOXJkZcYJAAAAXLZmzZqxgB4qxaFDh/TCCy94OowqU1RUVKIEwvm3//3vf1d1SB7z3HPP8TkCVHM2m61cSVubzVYF0QClq1DSNigoSFOmTNHGjRv1ww8/KCcnR9K5lW87duyoxMTEUuvdAgAAAMDVIDIyUs8995ynw6gS27dv14IFC8psv+eee9S6desqjMizIiMjPR0CgMtU3pwVuS14UoWStk7XXXedrrvuusqKBQAAAACqhYCAgBoz27JZs2aKiIjQ+++/r6NHj7q216tXT0OGDFFiYqIHowOAS3f8+PFK7QdcCZeVtAUAAAAAXP0SExOVkJCgtWvXau7cufrd736nG2+80bWoHwBUJ8aYSu0HXAkkbQEAAAAAF2W1Wl2L9jVv3pyELXAVqimLLDZo0EBHjhyRdK4EwvnJ2fNvN2jQgEUW4TEkbQEAAHBVKy4uVlZWloKDg1WvXj1PhwMAgNeqaYssSiVn055/e9u2bTXm+WCRRe9D0hYAAABXNavVqqeeekr333+/+vTp4+lwAADwWjVlkUWHw6HXXntNZ86cKbNPQECAnnjiiRpzVQGLLHofkrYAAAC4qlmtVtlsNhUXF3s6FAAAvFpNWmTxoYce0syZMy/Y3qJFiyqMCHB32T8XHDt2THv27NHp06crIx4AAACg0t1xxx367LPPdOLECU+HAgAAvEBiYqLGjRtXonSSzWbTuHHjlJiY6KHIgHMqPNN248aNevfdd/XLL79IkiZNmqR27dopPz9fL730kgYPHqxOnTpVWqAAAABARTkcDvn5+enRRx9V586dVb9+ffn7+5fo169fPw9EBwAAPCExMVEJCQlau3at5s6dq9/97ne68cYba0xJBHi3CiVtv/vuO/31r3+V3W5Xt27dtGDBAldbaGio6tatq9WrV5O0BQAAgFeYN2+e6+8vvviizH4kbQEAqFmsVquaN28uSWrevDkJW3iNCiVtP/jgA7Vp00bPP/+8jh8/7pa0lSS73a6VK1dWSoAAAADA5UpOTvZ0CAAAAEC5VShpu2/fPo0YMaLM9rCwMOXn51c4KAAAAKAyRUREeDoEAAAAoNwqNOc7ICDggguPHT58WMHBwRUOCgAAAAAAAABqqgrNtG3btq3WrFmjvn37lmjLzc3V559/zip7AAAA8Brjx4+XxWK5YB+LxaLp06dXUUQAAABA2SqUtB06dKieffZZPf300+rSpYskadOmTdq6daurlu3gwYMrL0oAAADgMrRp06ZE0tbhcCg7O1s7d+5UkyZN1KJFCw9FBwAAALirUNI2KipKL774ot58803Nnz9fkvTxxx9LOjcgfuihh1S/fv3KixIAAAC4DOPHjy+zbc+ePXr55ZfVrVu3KowIAAAAKNslJ22Li4uVlZWl4OBgTZo0SSdOnNChQ4dkjFGDBg0UGhpa4WBWrFihFStWKDs7W5LUuHFjDR48WAkJCZKkwsJCzZ07V19//bWKiooUHx+vUaNGKTw8vMKPCQAAgJqtefPmuu222/Tuu+8qLi7O0+EAAAAAl74QmdVq1VNPPaX169dLkoKDgxUTE6NrrrnmshK2klS3bl0NHz5cf/nLXzR16lS1a9dOr776qvbv3y9Jevvtt5WWlqbHHntMU6ZM0bFjxzRt2rTLekwAAAAgLCxMBw4c8HQYAAAAgKQKJm1tNpuKi4srPZhrr71WHTt2VMOGDdWoUSMNGzZMgYGB+umnn1RQUKBVq1ZpxIgRateunVq2bKlx48Zp586dysjIqPRYAAAAUDMcP35cq1atUr169TwdCgAAACCpgjVt77jjDi1fvlw9e/ZUcHBwZcck6dzCEN98843OnDkju92u3bt36+zZs2rfvr2rT1RUlGw2mzIyMmS3269IHAAAAKj+pkyZUur2goICZWVlqbi4WBMmTKjiqAAAAIDSVShp63A45Ofnp0cffVSdO3dW/fr15e/vX6Jfv379Lnnf+/bt08SJE1VUVKTAwEA9/vjjaty4sfbs2SNfX1/Vrl3brX9YWJhyc3PL3F9RUZGKiopcty0Wi2rVquX6G7hSnOeXxWLhXANwVeHzDdWRMabU8zUiIkLt27fXzTffrKioKA9EBgAAAJRUoaTtvHnzXH9/8cUXZfarSNK2UaNGeu2111RQUKBvv/1WM2bMKHNmRHksXrxYCxcudN1u0aKFXnnlFUVERFR4n0B5nDx5UpJks9nUsGFDD0cDAJWHzzdUR5MnT/Z0CAAAAEC5VShpm5ycXNlxuPj6+ioyMlKS1LJlS+3atUvLli1T165dVVxcrJMnT7rNts3Ly1N4eHiZ+xswYIBb8tg5wyI7O/uK1OUFnHJyclz//+0McQCozvh8Q1Xx9fXlh3YAAADUSBVK2lbl4NnhcKioqEgtW7aUj4+PtmzZoi5dukiSDh48qJycnAvWs/Xz85Ofn1+pbcaYKxIzIP33/DLGcK4BuKrw+YbqKicnR4sWLdKPP/6o/Px8PfHEE2rTpo3y8/O1cOFC3XzzzWrRooWnwwQAAAAqlrR1OnHihNLT05WdnS3pvzXBQkJCKrS/f//73+rQoYNsNptOnz6tdevWadu2bZo4caKCgoLUs2dPzZ07V8HBwQoKCtIbb7whu93OImQAAAC4oAMHDui5556TMUYxMTE6dOiQHA6HJCk0NFQ7d+7UmTNnNHbsWA9HCgAAAFxG0jY1NVUffvhhiRIDvr6+uuuuuzRkyJBL3mdeXp5mzJihY8eOKSgoSM2aNdPEiRMVFxcnSRoxYoQsFoumTZum4uJixcfHa9SoURU9BAAAANQQ77zzjmrXrq2XX35ZkjR69Gi39oSEBH3zzTeeCA0AAAAooUJJ24ULF+qDDz5QQkKCbr/9djVq1EjSuXIFy5cv16JFi+Tj46PBgwdf0n4vNrPB399fo0aNIlELAACAS7J9+3YNGjRIoaGhOn78eIl2m82mo0ePeiAyAAAAoKQKJW1XrlypxMREPfnkk27b69evrw4dOugvf/mLVq5ceclJWwAAAOBKcDgcCggIKLM9Pz9fvr6XVTkMAAAAqDTWitypoKBAHTp0KLO9Y8eOOnXqVEVjAgAAACpVy5Yt9f3335fadvbsWX399deskwAAAACvUaGkbWxsrH766acy23/66Se1atWqwkEBAAAAlenuu+/Wpk2bNGvWLO3fv1+SlJubq/T0dL300kvKyspS//79PRwlAAAAcE6FrgEbPXq0Xn75Zb311lu6/fbbVb9+fUnSr7/+quXLl+unn37SM888U6mBAgAAABWVkJCg8ePH680339Rnn30mSZo+fbokqVatWho/frzatGnjyRABAAAAl3IlbX/3u9/JYrG4bTt79qw++eQTffLJJ7Jaz03YdTgckiQ/Pz898cQTevvttys5XAAAAKBibrrpJnXq1Enp6ek6dOiQHA6HIiMjFR8fr1q1ank6PAAAAMClXEnbzp07l0jaAgAAANVNYGCgOnXq5OkwAAAAgAsqV9J2/PjxVzoOAAAA4IrJyckpVz+bzXaFIwEAAAAurkI1bQEAAIDqpLyTEObPn3+FIwEAAAAu7rKSttu2bdOvv/6qEydOlNrer1+/y9k9AAAAUCnGjh1bYpvD4VB2dra+/PJLhYaGqnfv3h6IDAAAACipQknbPXv26G9/+5sOHTp0wX4kbQEAAOANevToUWZb//79NXHiRBUUFFRdQAAAAMAFVChp+89//lP5+fkaPXq0rrnmGgUFBVV2XAAAAECVCAwMVI8ePbR06VL16dPH0+EAAAAAFUva7t+/X0OGDNGtt95a2fEAAAAAVc4Yo9zcXE+HAQAAAEiqYNK2YcOGlR0HAAAAUOUKCgq0fft2ffTRR2rRooWnwwEAAAAkVTBpe88992ju3Lnq1q2b6tatW9kxAQAAAJVqyJAhF2y32WwaNWpUFUUDAAAAXFiFkradO3dWUVGR/vCHP6h9+/aqW7eurFarWx+LxaIHHnigUoIEAAAALsegQYNksVjctlksFtWuXVsNGjRQfHy8fHx8PBQdAAAA4K5CSdtt27Zp1qxZKiwsVFpaWpn9SNoCAADAGyQlJXk6BAAAAKDcKpS0feONNxQUFKQ//elPiomJUVBQUGXHBQAAAAAAAAA1UoWStocOHdLw4cMVFxdX2fEAAAAAlW7mzJkXbLdYLPLz81O9evXUtm1b2e32KooMAAAAKKlCSdsmTZqooKCgsmMBAAAArogff/xRhYWFys/PlyTVrl1bknTy5ElJUmhoqBwOh06cOCFJ6tChgx577DEFBAR4JmAAAADUaBVK2t5///363//9X3Xo0EExMTGVHRMAAABQqZ5++mm9/PLLuueee3T77bcrODhYknTixAl98sknWr16tSZOnKjw8HAtWbJEH3zwgebPn6/f/e53Ho4cAAAANVGFkrYff/yxatWqpYkTJ6px48ay2WyyWq1ufSwWi5588slKCRIAAAC4HG+88YYSEhI0ePBgt+3BwcG65557dOzYMb3xxht69tlnlZSUpF9++UXffvstSVsAAAB4RIWStvv27ZMk2Ww2nT59WgcOHCjRx2KxXF5kAAAAQCX56aef1KVLlzLbmzdvrrVr17put279/7V371FR1/kfx18DMygwwahAgCZoiJghuqvYZi5m5m5Fv9JMrTDXFk4FbvXb469ON1OLzLO5281OnsKM0xUpzLLaNttq+9lvvZYXTl5S6+cFAWVAMGAG5veHP2ZlxRsM8/3CPB/ndOR7me/3PRzmM+9e853Pd4jWrVt31uOWlpZq1apV2rt3r6qqqjRnzhylp6d7ty9ZskRffvllq8ekpaXp4Ycf9i7X1tZq2bJl2rhxoywWi0aPHq1Zs2apZ8+e5/MUAQAA0I20K7RdsmSJr+sAAAAAOk1YWJi+++47TZw4sc3t3377rcLCwrzL9fX1Cg0NPetxGxoalJiYqPHjx+vpp59uc5/hw4crNzfXu2y1tm7Bn3vuOVVVVemRRx5RU1OTXnzxRS1dulT33nvvuTw1AAAAdEPtCm0BAACAruSqq67Su+++q8WLF2vixImKjY2VJJWVlenTTz/Vxo0bddNNN3n337x5sxITE8963BEj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pia5XC41NDR4Jy0HgM60adMmzZgxQ01NTfJ4PBozZoxGjx6tTZs2adCgQd79LrjgAsXHx+vAgQOSpGuuuUavvPKKtmzZotTUVI0ePVoJCQlGPQ0AwHmgxwXQ3dHjorsitAX+3yWXXKK0tDS9+eabGjdunHd9fX29JkyYoGuvvfaUx0RFRenQoUNnPXZ5ebkWLVqkq6++WtOnT5fdbtf333+vl156SW63m4YWgF8MHTpUOTk5slqt6tWrl4KDg7Vhw4azPu6qq65SWlqaNm3apC1btqikpES33367rrnmGj9UDQDoCHpcAN0dPS66K6ZHAE5y2223aePGjdq5c6d33YABA3TgwAHFxsae8p/ValV8fLyampq0b98+72PKyspUV1fnXd6zZ4+am5t1++23Kzk5WfHx8aqqqmp1bqvVqubm5k5/jgACV48ePRQbG6uoqCgFBwdLkvr27aumpibt2rXLu9+xY8d08OBB9evXz7suKipKEydO1Jw5c3T99ddrzZo1bZ6DsQwAzIceF0B3Ro+L7orQFjhJ//79NXbsWH388cfedTfccIN27NihgoIC7du3T4cOHdL69etVUFAg6cSbQWpqqpYuXardu3dr7969Wrp0qUJCQmSxWCSd+CpZU1OTPvnkEx0+fFhfffWV/va3v7U6d3R0tOrr67V161bV1NSooaHBf08cQMCKi4vTyJEjtXTpUn3//ffat2+fnn/+efXu3VsjR46UJC1fvlzffvutysvLtWfPHm3fvl19+/Zt83iMZQBgPvS4AAINPS66A6ZHAP7N1KlTtXbtWu9yQkKC5s2bp7fffltz586Vx+NRbGysfvWrX3n3mT17tl566SU99thjcjgcuuWWW7R//37ZbDZJUmJiom6//Xa9//77evPNNzVkyBDdeuuteuGFF7zHGDx4sK6++mo988wzOnbsmKZMmaKpU6f674kDCFi5ublavny5nnrqKbndbg0ZMkQPPvigrNYTbUJzc7MKCgp09OhRhYaGavjw4Zo5c2abx2IsAwBzoscFEGjocdHVWTwej8foIoDu5siRI7r77rv16KOPKjU11ehyAAAAgA6jxwUAwH+40hbwgW3btqm+vl79+/dXVVWVXn/9dUVHR2vIkCFGlwYAAAC0Cz0uAADGIbQFfMDtduutt97S4cOHFRoaquTkZN1zzz3er10AAAAA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\n"},"metadata":{}}]},{"cell_type":"code","source":["print('More than 140 characters after html process:', len(df[df['text_length'] > 140]['text']))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":0},"id":"oqTsuGn1qcXa","executionInfo":{"status":"ok","timestamp":1751537498443,"user_tz":-120,"elapsed":8,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"eb34b09c-d1dc-4ebd-aff9-409f13d10cf4"},"execution_count":23,"outputs":[{"output_type":"stream","name":"stdout","text":["More than 140 characters after html process: 687\n"]}]},{"cell_type":"code","source":["df[df['text_length'] > 140]['text'].head(10).values"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":0},"id":"DH_s2HfR1EED","executionInfo":{"status":"ok","timestamp":1751537498450,"user_tz":-120,"elapsed":7,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"ce2ab598-c2cc-4e9b-bad7-d0e2e2ff6609"},"execution_count":24,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array(['Tuesday�ll start with reflection �n then a lecture in Stress reducing techniques. That sure might become very useful for us accompaniers ',\n"," \"When I get mine I�m going to do a tour of Copenhagen with it �;) Hmmph I can't top that .. must get thinking .. http://tinyurl.com/c2trgj\",\n"," 'http://tr.im/imOv �i, b�c H?i Tho?i th? l� gi� t? cu?c ??i r?i ( M�nh v?n c�n nh? c�i nh� t?p th? b� t� c?a b�c � ? ch? Tr?i ',\n"," '@NguyenNoir ??c h?t c? b? r?i. Th?ng Starr ?y l�c ??u m�nh r?t tr�ng ??i n� s? l� lo?i villain c?ng c?a, ai d� c�ng v? sau c�ng pathetic. ',\n"," 'Saturday�s Graze box finally arrived today. The grapes were mouldy after 3 days in GPO I�m considering cancelling my account altogether.',\n"," 'Buzz.vn: \\tTin t?c - ??c B�o : hjxhjx l�m th?t kh? n?y nh�n th�i l� m�n �i r?i ch? ??ng n�i g� ?.. http://tinyurl.com/dztqfo',\n"," 'Photo: ???? (Sweetness in the Salt) C� ai coi phim n�y ch?a, hay v� c?m ??ng ghia. Lyrics c?a nh?c th?t... http://tumblr.com/xmi1mmhzu',\n"," 'evdeyim cumartesi g�n� biraz hastay?m grip , at home at saturday cuz I m ill , flu , hapshuuuu , I cleaned my home eat lunch hi everybody',\n"," '@leokun87 Tao c?ng ?� v? BK, d� kh�ng y�u, nh?ng v?n c�n h?n Th??ng-H?i-s�nh-?i?u. M?t ?t z?i L?i h?t $ l�m t�c z?i. ??u t�c x?u qu�!!!',\n"," '1 ng�y m?t m?i v?t l?n v?i c�i Eclipse. Cu?i c�ng c?ng xong. Ch�n m?y b�c plugin, update m� kh�ng th�m test hay sao l�m queo m�y m�nh '],\n"," dtype=object)"]},"metadata":{},"execution_count":24}]},{"cell_type":"code","source":["# Filtrer les lignes où 'text_length' est supérieur à 140 et supprimer ces lignes\n","df = df[df['text_length'] <= 140].copy()\n","\n","# Afficher la nouvelle taille du DataFrame pour confirmation\n","print(f\"Nouvelle taille du DataFrame après suppression: {df.shape[0]} lignes, {df.shape[1]} colonnes.\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":0},"id":"WoIRCbHWqz8W","executionInfo":{"status":"ok","timestamp":1751537499391,"user_tz":-120,"elapsed":940,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"fe74a02f-f104-41df-f5bb-08f207a6aad4"},"execution_count":25,"outputs":[{"output_type":"stream","name":"stdout","text":["Nouvelle taille du DataFrame après suppression: 1599313 lignes, 15 colonnes.\n"]}]},{"cell_type":"markdown","source":["### Analyse Qualitative"],"metadata":{"id":"J8p054tk0X-B"}},{"cell_type":"markdown","metadata":{"id":"cnrONvWyWjJA"},"source":["#### 8. Analyse de caractéristiques distinctives et de l’impact de tokens spécifiques\n","\n","Cette section met en évidence plusieurs éléments textuels pouvant aider à différencier les sentiments exprimés dans les tweets. Ces observations peuvent être utilisées **à la fois comme features explicites** dans les modèles classiques ou **comme éléments à conserver dans les phases de prétraitement** pour les modèles profonds.\n","\n","---\n","\n","##### **1. Majuscules**\n","- Le ratio de majuscules est généralement [plus élevé/plus faible] dans les tweets [positifs/négatifs]. \n"," → Peut indiquer de l’**intensité émotionnelle** (ex. colère, enthousiasme). \n"," ✅ **À exploiter comme feature explicite** ; ne pas convertir systématiquement en minuscules.\n","\n","---\n","\n","##### **2. Ponctuation expressive**\n","- `!` plus fréquents dans les tweets [positifs/négatifs] \n","- `?` plus fréquents dans les tweets [positifs/négatifs] \n","- `...` plus fréquents dans les tweets [positifs/négatifs] \n"," ✅ **À conserver dans le texte**, et/ou compter comme feature.\n","\n","---\n","\n","##### **3. Symboles spécifiques à Twitter**\n","- `#hashtags`, `@mentions`, `http` apparaissent avec des fréquences différentes selon le sentiment. \n"," ✅ Peuvent être **encodés comme des indicateurs binaires** ou **remplacés par des tokens spéciaux** (``, ``, etc.)\n","\n","---\n","\n","##### **4. Émoticônes**\n","- Émoticônes positives (`:)`, `:D`) bien plus fréquentes dans les tweets positifs \n","- Émoticônes négatives (`:(`, `:(`) plus fréquentes dans les tweets négatifs \n"," ✅ **Fort pouvoir discriminant** : à traiter comme **tokens spécifiques**, voire à compter comme **features auxiliaires**.\n","\n","---\n","\n","##### **5. Pronoms personnels**\n","- \"I\" (je) et \"we\" (nous) ont des fréquences différenciées selon le sentiment \n"," ✅ Peut être un **signal intéressant sur le ton ou l’implication personnelle** → feature textuelle potentielle.\n","\n","---\n","\n","##### **6. Lexique émotionnel**\n","- Mots comme \"love\", \"hate\", \"lol\", \"omg\" sont fortement corrélés à certaines classes \n"," ✅ **Indicateurs lexicaux directs** : peuvent être **utilisés comme features ou marqués via une lexicon-based approach.**\n","\n","---\n","\n","##### **En résumé : stratégies recommandées**\n","- ✅ **Ne pas supprimer** systématiquement la ponctuation expressive ni convertir les majuscules \n","- ✅ **Traiter** les émoticônes et tokens spécifiques comme des signaux explicites \n","- ✅ **Enrichir** la vectorisation (TF-IDF, embeddings) avec des **caractéristiques structurelles** (ponctuation, casse, ratio d’émoticônes, etc.)\n"]},{"cell_type":"code","execution_count":26,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":0},"id":"ctBSKs_QWjJA","executionInfo":{"status":"ok","timestamp":1751537506318,"user_tz":-120,"elapsed":6919,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"bfd821ea-c8ba-4fe7-c5f5-c279d0f4b26e"},"outputs":[{"output_type":"stream","name":"stdout","text":["Moyenne des caractéristiques par sentiment:\n","Caractéristique 'text_length':\n"," - Tweets négatifs: 73.96\n"," - Tweets positifs: 73.38\n"," - Différence relative: -0.79%\n","\n","Caractéristique 'word_count':\n"," - Tweets négatifs: 13.58\n"," - Tweets positifs: 12.77\n"," - Différence relative: -5.92%\n","\n","Caractéristique 'capitals_ratio':\n"," - Tweets négatifs: 0.04\n"," - Tweets positifs: 0.05\n"," - Différence relative: 16.98%\n","\n","Caractéristique 'exclamation_count':\n"," - Tweets négatifs: 0.48\n"," - Tweets positifs: 0.66\n"," - Différence relative: 38.19%\n","\n","Caractéristique 'question_count':\n"," - Tweets négatifs: 0.15\n"," - Tweets positifs: 0.16\n"," - Différence relative: 7.62%\n","\n","Caractéristique 'ellipsis_count':\n"," - Tweets négatifs: 0.21\n"," - Tweets positifs: 0.15\n"," - Différence relative: -26.07%\n","\n","Caractéristique 'hashtag_count':\n"," - Tweets négatifs: 0.02\n"," - Tweets positifs: 0.03\n"," - Différence relative: 42.58%\n","\n","Caractéristique 'mention_count':\n"," - Tweets négatifs: 0.41\n"," - Tweets positifs: 0.60\n"," - Différence relative: 46.87%\n","\n","Caractéristique 'url_count':\n"," - Tweets négatifs: 0.03\n"," - Tweets positifs: 0.06\n"," - Différence relative: 88.16%\n","\n","Caractéristique 'positive_emoticon':\n"," - Tweets négatifs: 0.00\n"," - Tweets positifs: 0.00\n"," - Différence relative: inf%\n","\n","Caractéristique 'negative_emoticon':\n"," - Tweets négatifs: 0.00\n"," - Tweets positifs: 0.00\n"," - Différence relative: 100.00%\n","\n","Caractéristiques structurelles des tweets par sentiment :\n"," Négatif (moyenne) Positif (moyenne) Différence Relative\n","Emoticone Positive 0.0 0.00001 inf\n","Emoticone Negative 0.00024 0.00048 100.0\n","Nombre URLs 0.03014 0.05671 88.155275\n","Nombre Mentions 0.40579 0.59599 46.871535\n","Nombre Hashtags 0.0233 0.03322 42.575107\n","Nombre Exclamations 0.47932 0.66237 38.189518\n","Ratio Majuscules 0.042984 0.050284 16.984226\n","Nombre Questions 0.14796 0.15924 7.623682\n","Longueur Texte 73.96162 73.37764 -0.789572\n","Nombre Mots 13.57711 12.77396 -5.915471\n","Nombre Ellipses 0.20901 0.15453 -26.065738\n"]}],"source":["def analyser_caracteristiques_distinctives(df):\n"," \"\"\"Analyse les caractéristiques distinctives et les tokens spécifiques dans les tweets\"\"\"\n","\n"," # Créer un échantillon équilibré pour l'analyse\n"," sample_size = min(100000, df[df['sentiment'] == 'Négatif'].shape[0], df[df['sentiment'] == 'Positif'].shape[0])\n"," neg_samples = df[df['sentiment'] == 'Négatif'].sample(sample_size, random_state=42)\n"," pos_samples = df[df['sentiment'] == 'Positif'].sample(sample_size, random_state=42)\n","\n"," balanced_df = pd.concat([neg_samples, pos_samples])\n","\n"," # Calculer des caractéristiques supplémentaires\n"," balanced_df['capitals_ratio'] = balanced_df['text'].apply(\n"," lambda x: sum(1 for c in str(x) if c.isupper()) / len(str(x)) if len(str(x)) > 0 else 0\n"," )\n","\n"," balanced_df['exclamation_count'] = balanced_df['text'].apply(\n"," lambda x: str(x).count('!')\n"," )\n","\n"," balanced_df['question_count'] = balanced_df['text'].apply(\n"," lambda x: str(x).count('?')\n"," )\n","\n"," balanced_df['ellipsis_count'] = balanced_df['text'].apply(\n"," lambda x: str(x).count('...')\n"," )\n","\n"," balanced_df['hashtag_count'] = balanced_df['text'].apply(\n"," lambda x: str(x).count('#')\n"," )\n","\n"," balanced_df['mention_count'] = balanced_df['text'].apply(\n"," lambda x: str(x).count('@')\n"," )\n","\n"," balanced_df['url_count'] = balanced_df['text'].apply(\n"," lambda x: 1 if 'http' in str(x).lower() else 0\n"," )\n","\n"," balanced_df['positive_emoticon'] = balanced_df['text'].apply(\n"," lambda x: str(x).count(':)') + str(x).count(':-)') + str(x).count(':D') + str(x).count('=)')\n"," )\n","\n"," balanced_df['negative_emoticon'] = balanced_df['text'].apply(\n"," lambda x: str(x).count(':(') + str(x).count(':-(') + str(x).count(':(') + str(x).count('=(')\n"," )\n","\n"," # Comparer les moyennes\n"," features = ['text_length', 'word_count', 'capitals_ratio', 'exclamation_count',\n"," 'question_count', 'ellipsis_count', 'hashtag_count', 'mention_count',\n"," 'url_count', 'positive_emoticon', 'negative_emoticon']\n","\n"," # Calculer les statistiques par sentiment\n"," stats = balanced_df.groupby('sentiment')[features].mean().round(4)\n","\n"," # Renommer les colonnes en français\n"," stats.columns = ['Longueur Texte', 'Nombre Mots', 'Ratio Majuscules', 'Nombre Exclamations',\n"," 'Nombre Questions', 'Nombre Ellipses', 'Nombre Hashtags', 'Nombre Mentions',\n"," 'Nombre URLs', 'Emoticone Positive', 'Emoticone Negative']\n","\n"," print(\"Moyenne des caractéristiques par sentiment:\")\n"," for feature in features:\n"," neg_mean = balanced_df[balanced_df['sentiment'] == 'Négatif'][feature].mean()\n"," pos_mean = balanced_df[balanced_df['sentiment'] == 'Positif'][feature].mean()\n"," diff = (pos_mean - neg_mean) / neg_mean * 100 if neg_mean != 0 else float('inf')\n","\n"," print(f\"Caractéristique '{feature}':\")\n"," print(f\" - Tweets négatifs: {neg_mean:.2f}\")\n"," print(f\" - Tweets positifs: {pos_mean:.2f}\")\n"," print(f\" - Différence relative: {diff:.2f}%\")\n"," print()\n","\n","\n"," # Créer un DataFrame pour stocker les différence relatives\n"," diff_df = pd.DataFrame(index=features, columns=['neg_mean', 'pos_mean', 'diff_pct'])\n","\n"," for feature in features:\n"," neg_mean = balanced_df[balanced_df['sentiment'] == 'Négatif'][feature].mean()\n"," pos_mean = balanced_df[balanced_df['sentiment'] == 'Positif'][feature].mean()\n","\n"," # Éviter division par zéro\n"," if neg_mean != 0:\n"," diff_pct = (pos_mean - neg_mean) / abs(neg_mean) * 100\n"," else:\n"," diff_pct = float('inf') if pos_mean > 0 else 0\n","\n"," diff_df.loc[feature, 'neg_mean'] = neg_mean\n"," diff_df.loc[feature, 'pos_mean'] = pos_mean\n"," diff_df.loc[feature, 'diff_pct'] = diff_pct\n","\n"," # Trier par différence relative\n"," diff_df_sorted = diff_df.sort_values('diff_pct', ascending=False)\n","\n"," # Renommer les index en français avec des espaces et des majuscules\n"," feature_mapping = {\n"," 'text_length': 'Longueur Texte',\n"," 'word_count': 'Nombre Mots',\n"," 'capitals_ratio': 'Ratio Majuscules',\n"," 'exclamation_count': 'Nombre Exclamations',\n"," 'question_count': 'Nombre Questions',\n"," 'ellipsis_count': 'Nombre Ellipses',\n"," 'hashtag_count': 'Nombre Hashtags',\n"," 'mention_count': 'Nombre Mentions',\n"," 'url_count': 'Nombre URLs',\n"," 'positive_emoticon': 'Emoticone Positive',\n"," 'negative_emoticon': 'Emoticone Negative'\n"," }\n"," diff_df_sorted.index = diff_df_sorted.index.map(feature_mapping)\n","\n"," # Renommer les colonnes en français avec des majuscules et des espaces\n"," diff_df_sorted.columns = ['Négatif (moyenne)', 'Positif (moyenne)', 'Différence Relative']\n","\n"," return stats, diff_df_sorted\n","\n","stats, diff_df_sorted = analyser_caracteristiques_distinctives(df)\n","\n","print(\"Caractéristiques structurelles des tweets par sentiment :\")\n","print(diff_df_sorted)"]},{"cell_type":"code","execution_count":27,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":708},"id":"sZawfr7CWjJA","executionInfo":{"status":"ok","timestamp":1751537506881,"user_tz":-120,"elapsed":550,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"91164da9-80a3-4fde-eed4-b244c6c87a4d"},"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"iVBORw0KGgoAAAANSUhEUgAABW0AAAMWCAYAAACKoqSLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAg1pJREFUeJzs3Xl4VdXZP+4nIQlhCmGeZXRCcMQJQUCcQUVAi6CFamm11qHa0qqvlTq8LVqnOrR9tXWuilisKOJQQUFUHHDAalFRUREFMVLmhOzfH/7I1zRBwyGQLbnv6+p1cdZea+1nn7OzPf1kZ+2sJEmSAAAAAAAgFbJrugAAAAAAAP4foS0AAAAAQIoIbQEAAAAAUkRoCwAAAACQIkJbAAAAAIAUEdoCAAAAAKSI0BYAAAAAIEWEtgAAAAAAKSK0BQAAAABIkZyaLgAAoCb84Q9/iC+++CJ++tOfRrNmzWq6HAAAgDLutAUAap0bb7wxzjrrrCguLhbYAgAAqSO0BYBt1MqVK+Oqq66KAQMGRKtWrSIvLy+aNGkS+++/f/z617+OhQsX1nSJNWLevHlx7rnnxrBhw+KSSy7JaI4ZM2ZEVlZWjBkzpnqL+5pbb701srKyYvz48VtsH99FW+O9h+8iPxsAsG0R2gLANmj27NnRrVu3OPfcc2POnDnRo0ePGD58ePTu3TvefffduOSSS2KHHXaIJ554oqZL3WxZWVnRqVOnKvVdvXp1jBgxInbZZZe4/fbbIysra8sW9w3GjBkTWVlZMWPGjBqrgc23LQVl29KxbIvGjx8fWVlZceutt9Z0KVuF8xGA2s6atgCwjXnllVdi4MCBsWbNmvjlL38ZF154YTRo0KBse2lpaTzwwAMxbty4+Oijj2qw0q3vjTfeiOHDh8ePfvSjqF+/fsbz7LPPPvHmm29G48aNq7G68o499tjYb7/9onnz5ltsH8C2Y2tclwCArUdoCwDbkCRJ4qSTToo1a9bE+PHj46KLLqrQJzs7O4YOHRoDBw6MDz/8sAaqrDm9evWKXr16bfY89evXj5122qkaKtq4xo0bC1+AKtsa1yUAYOuxPAIAbEOmTZsW8+bNi/bt28cFF1zwjX0bN24cPXr0KHv9ySefxOWXXx79+vWLdu3aRV5eXrRu3TqGDh0aL7zwQqVzdOrUKbKysiJJkrjuuutit912i/r168fuu+8eEV+FyHfffXeMGDEidthhh2jQoEE0atQo9tlnn7jxxhujtLT0G4/l6KOPjlatWkXdunWjQ4cOMXjw4Lj//vsj4v+t+RoR8cEHH0RWVlbZ//r3719urlWrVsVvf/vb2GOPPaJhw4bRsGHD2G+//eK2226rdN8bllxYt25dXHzxxbHTTjtF3bp1Y8iQIRGx8T/bTZIk7rrrrujTp0+0atUq8vPzo0OHDnHwwQfHDTfcUG7+DfseMGBAudrff//9csdX2Zq2y5Yti5/+9KfRtm3byM/Pj+7du8e1114bSZJUulzEt/1Z9YbPsTJvvvlmjBkzJjp06BB169aNVq1axYgRI+KNN96otP/UqVPjkEMOiXbt2kXdunWjbdu20adPn/jNb35Taf+NeeONN2LIkCHRpEmTaNSoUfTt2zemTZv2jWM2nG8HHXRQNGnSJPLz82PnnXeO8ePHx6pVqyr0X7FiRfz2t7+N3XbbLRo3bhwNGzaMrl27xnHHHRePPvrot9Y4ZsyYGDBgQERE3HbbbeU+x/Hjx8eaNWsiPz+/0uU7hgwZEllZWdGnT58K23r16hXZ2dmxZMmScu3Lli2L8847L7p37x716tWLxo0bx0EHHRQPPfTQRmv88MMP46c//Wl07do18vPzo2nTpjF48OCYPXv2Jh3LBvPmzYsTTzwxunTpEvn5+dGiRYvYfffd4+yzz45PPvnkW9+zDfvasDTII488En369ImGDRtGkyZNYujQofHWW29VGLNmzZr4y1/+Esccc0x06dIl6tWrF4WFhXHggQfGPffc8637efTRR2PAgAFRWFgYWVlZUVRU9K11buq5PG3atBg0aFC0aNEi6tatG126dIlzzjknPv/882+s7emnn46DDjooGjVqFAUFBTFo0KD417/+Va5/p06dyvb7gx/8oNzns2GJlY1dl77+8//SSy/FEUccEYWFhdG0adM4/vjjy/7iYuXKlTFu3Ljo1KlT5OfnR48ePWLSpEkbfX825drw9evZwoULY+TIkdGiRYuoV69e9OrVK6ZMmVLh/anK+QgA2zJ32gLANuThhx+OiIjjjjsucnI27T/z//jHP+KXv/xl7LjjjrHrrrtGQUFBvP322zF58uR46KGH4qGHHopDDz200rGnnnpq3HLLLdGvX7/YeeedY926dRERsXbt2hg5cmQ0a9YsunfvHnvuuWd8/vnnMXv27Dj99NNjzpw5lQaJ5557blx11VWRnZ0d+++/f2y33XaxaNGieOaZZ+Kjjz6KYcOGRbdu3WL06NFx2223RYMGDWL48OFl479+t9lnn30WhxxySLz22mvRunXr6NevXyRJErNnz44xY8bEiy++GNddd12FGkpLS2PIkCHx9NNPR79+/WLXXXeNZs2afeN7OG7cuPj9738fdevWjQMPPDCaN28eixcvjtdeey3eeeedOP300yMiYvTo0TFr1qx4991347DDDovWrVuXzdGwYcNv3McXX3wRffr0iTfffDNat24dxxxzTCxbtix+/vOfxzvvvPONYzfVAw88ECNGjIi1a9fG7rvvHvvtt198+OGHMXHixJgyZUo88sgjceCBB5b1v+GGG+KnP/1p1KlTJw444IDo169fLF26NN58882N3vldmRdffDEGDBgQK1asiB49ekSPHj3i7bffjiOPPDJOO+20SseUlpbGiSeeGHfffXc0bNgwevXqFU2aNIkXX3wxfvOb38QjjzwSM2bMiHr16kVExPr16+Pggw+O559/Ppo3bx79+/eP/Pz8+Oijj2Lq1KnRoEGDOOyww76xzj59+sTixYvj0Ucfja5du5YLYHfffffIz8+PfffdN55++ul4//33y8Lb0tLSePrppyMi4oUXXohVq1aVLdfx5Zdfxty5c6N79+7RokWLsvnmz58fBx98cHz44YfRqVOnOOyww+I///lPPPfcc3HUUUfFFVdcET//+c/L1ffss8/GoEGD4osvvogdd9wxBg0aFEuWLIlHH300pk2bFnfddVd873vfq9KxRES89NJL0adPn1izZk3suuuuccwxx8SqVatiwYIFce2118aQIUOiTZs23/bxlrnvvvvij3/8Y/Tq1SuOOuqoeO2112Ly5Mnx5JNPxlNPPRW77bZbWd/3338/fvjDH0bbtm1jxx13jH322ScWL14cs2fPjpkzZ8Zbb7210TDvb3/7W9x8883Rq1evOOKII+Ldd9/91vWsN/Vc/tWvfhUTJkyIvLy82HvvvaNNmzbx6quvxtVXXx0PPvhgPPPMM9GqVasK+5kyZUpce+210atXrzjyyCPjlVdeialTp8bzzz8f8+bNK7s2DB8+PJ544ol49dVX44ADDohu3bqVzfH168c3ef755+PUU0+NHj16xGGHHRYvv/xy3HffffHqq6/GnDlz4pBDDokPPvggDjzwwFi6dGk89dRTcfzxx8cjjzxS4WdhU68NG7z//vux9957R6NGjWLgwIGxcOHCePbZZ2PIkCHxyCOPlP03pirnIwBs8xIAYJtxwAEHJBGR3HHHHZs89rXXXkvmzZtXoX3atGlJXl5e0rVr16S0tLTcto4dOyYRkTRv3rzSscXFxcnkyZOTdevWlWv/7LPPkl69eiURkTz11FPltt1xxx1JRCRt27ZN5s6dW27bqlWrkscee6xcW0QkHTt23OhxHXnkkUlEJGeddVayZs2asvbFixeX1fDII49UmDMikm7duiUfffRRhTmnT5+eREQyevTosrbVq1cndevWTRo1apQsWLCgwvvw9NNPl2sbPXp0EhHJ9OnTK637lltuSSIiueiii8q1n3rqqUlEJIcffniycuXKsvbnn38+adiwYaXvx0UXXZRERHLLLbdUuq8Nn+PXvffee0mDBg2Shg0bJo8//ni5bY888kiSm5ubdOjQIVm7dm1Z+3bbbZdkZWUlL7zwQrn+paWlGz3O/1ZaWpp07949iYjk17/+dbltN9xwQ9ln8/X3PkmS5PLLL08iIunfv3/yySeflLWvXbs2OeWUU5KISH75y1+WtT/55JNJRCR77713snr16nJzffnll8mLL75YpXorOxe+7te//nWF9/7ll19OIiLZZZddkogo9/4++OCDSUQkp59+ellbSUlJ0rNnzyQikssvvzxZv3592ba333476dy5c1KnTp3k9ddfL3cMbdq0SerUqZPceeed5Wp64YUXkiZNmiQNGzZMPvvssyofy/e///0kIpLf//73Fba9+eabyaJFiyod9982nPsRkfzf//1fWXtpaWnyy1/+MomIZPfddy83ZunSpcnjjz9e4Rq0YMGCpFOnTkl2dnby3nvvbXQ/99xzT5Vq22BTzuWJEycmEZH06NEjefvtt8v13fD5f+9736u0tuzs7GTy5Mll7SUlJcmwYcOSiEguvPDCcmO+7ed4Y5/fhnERkfzxj38sa1+3bl1y8MEHJxGRdO/ePTnooIOSFStWlG2/+eabk4hIDjzwwHLzZXJt2HA9i4jk3HPPLXcOX3311UlEJH379q3S8QBAbSG0BYBtyE477ZRERDJt2rRqnXfUqFFJRCSvvfZaufYNYd8VV1yxyXM+/vjjSUQk55xzTrn2nXfeeZNClm8KbefOnVsWzH09JNhgQ3h29NFHV5gzIpL77ruv0nkrCxM+/fTTSsOmjckktF2xYkVSr169JDs7O3nnnXcqjNkQeFVHaHvWWWclEZFcd911lY4588wzk4hI/v73v5e11atXL2nSpEml/atqQ5japUuXpKSkpML2fffdt8J7X1xcnDRv3jxp0KBBsnjx4gpjVq1albRu3Tpp0qRJ2Xlw7733JhGRnH322ZtV77cFSxuO5+vbr7rqqiQiymq44IILyradc845SUQkEydOLGubPHlyEhHJsGHDKt3H3//+9yQikjPPPLOsbUMQdu6551Y6ZkMNV111VZWP5YgjjkgiInnllVcq3V5VG8793r17V9i2bt26pH379klEJDNnzqzSfDfddFMSEckf/vCHSvczaNCgTa5xU87l3XbbLYmIcqH5BqWlpcnuu++e1KlTJ1myZEmF2kaNGlVhzIsvvphERNKvX79y7Zsb2vbp06fCmH/84x9l4fG///3vcttKSkqS5s2bJ7m5ueV+8ZbJtWHD9axz587lwtwk+ernt0mTJklubm65bUJbAGo7a9oCAGXWrl0b//jHP+KCCy6IH/3oRzFmzJgYM2ZMvP766xER8fbbb1c67uijj/7GeV955ZW4/PLL4/TTT48f/OAHMWbMmPjjH/9YYc5FixbFm2++GYWFhXH88cdv9vE89thjEfHV+qHZ2RW/9mxY43bOnDkVtmVlZcVRRx1V5X21bNky2rdvH6+88kr86le/igULFmRe+Ea89NJLsXr16ujVq1d07dq1wvYTTjih2va14b0bOnRopdv79u0bEVHuvdtrr73iiy++iFNOOWWja95+m5kzZ0bEV38OXqdOnQrbKzvGl19+OZYuXRq9e/eu9E/Q69WrV1bbhvNt9913j+zs7LjlllvipptuqnTd0eqw3377Rd26dcvWHY34au3RRo0axbBhw6Jjx44VtkVEuXWZM/ksMhnzbfbaa6+IiDj99NNjxowZUVJSUuWxlRkxYkSFttzc3LKlTjacC183a9asuPTSS+O0004ru5bcd999EZH59akyVT2XP/vss3j11Vdj++23L7dG+AZZWVlxwAEHxPr16+Oll16qsL2yJWd22GGHiIgqrxFcVZXtq0uXLhHx1Zq5G/a7QZ06daJjx45RXFwcS5cuLWvfnHOrf//+kZeXV64tJycnOnfuHMXFxVvs5xAAvousaQsA25ANa67+9wOMquL111+Po48+uuxBWJX5z3/+U2n7dtttV2n7unXrYsyYMXH33XdXac4PP/wwIr4KEr5tzcmq2HAsF1xwwTc+mG3NmjUV2lq2bBl169bdpP3ddtttMWLEiJgwYUJMmDAhOnbsGP369YsRI0bEEUccsUlzVWbRokUREdGxY8dKt1f2wKtMbXjv2rVr9439vh7m3HDDDTFkyJD461//Gn/961+jVatW0a9fvxg6dOhGQ9j/lskxbqj18ccf/9bzZunSpbHjjjvGDjvsEJdffnmcd9558aMf/ahsrc+BAwfGmDFjYtddd/3WWquiXr16sc8++8TMmTPj/fffj+222y5mzpwZffv2jTp16kT//v3j7rvvjlWrVkVxcXG88sorFdaz3XB8o0aNilGjRn3jsf33mAMOOOAb6/v6mG/zi1/8ImbNmhUzZsyIAQMGRMOGDWP//fePQYMGxZgxY6Jx48ZVnivi2z/jDedCxFdr/Q4dOjSefPLJjc63qdenb1LVc3nD+/z2229X6dz7b+3bt6/Q1qhRo4j46pdo1amyn+UNa2hv7Od8w/av15LJtWGDyo43YssdMwB8lwltAWAbsvvuu8czzzwTL7/8cpx44olVHpckSRx//PHx/vvvx6mnnhqnnnpqdOnSJRo2bBhZWVlx/vnnx29/+9tIkqTS8fn5+ZW2X3XVVXH33XdHz5494/LLL48999wzmjRpErm5uTF//vzYcccdNzpndSgtLY2Irx5qU9mdqd9kY8f0TQ466KB455134qGHHopp06bFjBkz4vbbb4/bb789hg0b9o1PYq9JG96nytpGjx79jWP33Xffsn/vuuuu8a9//SumTZsWU6dOjRkzZsTEiRNj4sSJsf/++8eMGTMq3GVXHTbU2q1bt28NKb/+MLlzzz03jj/++HjggQfi8ccfj5kzZ8bVV18d11xzTVx99dVx1llnVUt9/fv3j5kzZ8aMGTNit912iy+++KLsTtr+/fvHbbfdFrNnz47Vq1dHaWlp9OvXr9LjO/zwwyu9k3iD5s2bVxgzfPjwaNCgwUbHfP2hfd+moKAgnnzyyXjmmWdiypQpMWPGjHjyySfj8ccfj9/+9rcxc+bM2H777as836b45S9/GU8++WT069cvfvOb30SPHj2isLAw6tSpE4899lgcdthhm3x9+iZVPZc3vM+tW7f+1gfXVRZSV/YXAFvKN+1rU+rI5NqQyX4AoLYT2gLANmTQoEFxww03xH333ReXX3555ORU7T/1b731Vrz11lvRq1evsmULvi7TP/WfPHlyRETcfffdscsuu3zrnB06dCjbliTJZt9tu+GuriFDhsS55567WXNVVUFBQYwcOTJGjhwZERHPPfdcHHfccXH//ffH1KlT48gjj8x47jZt2kRExAcffFDp9o21bwhKV6xYUWHb+vXrY/HixRXa27dvH++++25ceeWV5YLOb5Ofnx9DhgyJIUOGRETEG2+8ESNHjoxnn302br755vjJT37yjeMzOcYNn/NOO+0Ut956a5VrjfjqnDvjjDPijDPOiJKSkrjnnnviBz/4QYwbNy6+//3vR5MmTTZpvsr069cvLrnkkpgxY0Z88cUXERHlQtuIr5ZFWL16dbm2DTYc3w9/+MMYNmxYlfbZvn37+Pe//x2/+tWvypY1qA5ZWVnRp0+f6NOnT0R8tTzA2WefHXfffXdccMEFMXHixCrP9W2fcdu2bcvaJk+eHHXq1IkHH3wwCgoKyvXfEkuRRFTtXN7w2TRv3nyTz73vqkyvDQDApvGrTgDYhhx++OGxyy67xEcffRSXXXbZN/Zdvnx52VqNG4Kkyv509YsvvojHH388o3q+ad7Kwp22bdvGzjvvHEVFRWXrVH6b3Nzcja6tecghh0TE/wuPa8J+++0XJ510UkREzJs3r6x9Q5C6KeuC7rXXXlGvXr146aWXKg2q7rnnnkrHbQhC58+fX2Hb9OnTo7i4uEJ7db13u+yyS5x++ukRUf74N2bDepj3339/pXcAV3aMe++9dzRu3DieeuqpWLZsWca15uTkxIknnhh77713rFu3bqNrpH5dVT7H3r17R15eXsyYMSNmzJgRBQUFseeee0bEV0sBbFjXdsN6tv99p20mn0UmYzI5J1u2bBnjx4+PiKp9vl9X2TWgpKQk7r///oiIsmA44qtrSUFBQYXAdmPzbAmVncvt27ePnXbaKf71r39V+vNVnTL5fLaErXVdTcvxAkBNEdoCwDYkKysr7rzzzsjPz4/x48fHeeedFytXrizXJ0mSePDBB6NXr17xwgsvRMRXf1aenZ0dTz75ZLmgas2aNXHqqadmHIRteLDNn/70p3LtkyZNittvv73SMb/61a8iIuKcc86J1157rdy2NWvWVAiQ27ZtG59++mkUFRVVmGvfffeNQw45JJ555pk4/fTTY/ny5RX6vPrqqzFt2rQqH9PGLFy4MG699dZYtWpVhZqnT58eEf/vTuINdUdE/Pvf/67yPho2bBgnnXRSrF+/Ps4444yyOzMjIl588cW4/vrrKx134IEHRkTEnXfeWW7N4vfeey/OPPPMSsece+65Ua9evfj5z38ef//73ytsX7t2bUyaNCk++uijiIhYtWpV/OEPf6jwOZSWlpa9v18//o3p379/7LTTTvHuu+/GpZdeWm7bn//853j22WcrjKlbt26MGzcu/vOf/8TQoUMrDbQ//vjjuOOOO8peT58+PZ544okKwfB7770Xb775ZmRlZW10/c2vq8rnuGFd2w8++CAee+yxsvVsv37Mc+bMiVdeeSV22mmnCksgDBs2LLp37x533XVXXHLJJRXW/UySJJ555pl45plnytp+/OMfR8uWLePyyy+P//u//6twnCUlJfHoo4+WC1q/7Vj+9Kc/xXvvvVehferUqRFRtc/362bNmhV//etfy7VddNFFsXDhwth1113LAvyIr64lX3zxRdx7773l+l999dVlP1/VZVPP5QsvvDBKS0tj2LBh8corr1SY7/PPP4+bbrpps+vK5JqxJWzqtSFTaTleAKgxCQCwzZk1a1bSqlWrJCKS+vXrJwMHDkxGjhyZDBo0qKw9Pz8/eeKJJ8rGjB07NomIpF69esmgQYOS4cOHJ61atUqaN2+ejBkzJomI5JZbbim3n44dOybf9HXiqaeeSurUqZNERLLXXnslJ5xwQtKrV68kIpKf//znSUQk/fr1qzDujDPOSCIiqVOnTtKnT5/khBNOSPr3758UFhYmu+22W6V9O3funIwaNSo55ZRTkssvv7xs+6effprsscceSUQkhYWFSf/+/cveiw4dOiQRkZx11lnl5oyIpGPHjhs9runTpycRkYwePbqsbe7cuWXv94EHHpiMHDkyOeaYY5IWLVokEZH06tUrWbNmTVn/F198McnKykry8/OTY445JjnllFOSU045JVm6dGmSJElyyy23JBGRXHTRReX2/fnnnyc77rhjEhFJmzZtku9973vJoYcemuTk5CSnn376Rmv//ve/n0RE0rhx4+Soo45KBg4cmDRo0CA57rjjNvo5PvDAA0n9+vWTiEi6deuWHHXUUcmIESOSvn37Jg0aNEgiIpk7d26SJEnyxRdfJBGR5ObmJvvtt18yYsSIZOjQoWXvcadOncqO7ds899xzZfP37NkzOeGEE5K99947ycrKSn7yk59UeO+TJEnWr1+fnHTSSUlEJHl5ecm+++5bVsMuu+ySZGVllTt3rr766iQikhYtWiSHH354MmrUqOTQQw9N6tatm0REcsYZZ1Sp1iRJkl133TWJiGTvvfdOxowZk5xyyinJP/7xj3J9LrjggiQikohIrrjiinLbNnzWEZGceuqple5j/vz5SefOnZOISFq2bJkcfPDByciRI5NDDz00admyZRIRydVXX11uzLPPPps0b948iYikQ4cOyRFHHJGMHDkyOeigg5LCwsIkIpLJkydX+Vh22223JCKS7t27J8OGDUu+973vlbXl5+cns2bNqtL7NXr06CQiktNOOy3JyspK9tlnn+SEE05IdtlllyQikoKCguTll18uN+bOO+8se4/69u2bnHDCCUn37t2T7Ozs5Gc/+1ml58SG/UyfPr1KdW2Qybl8/vnnJxGRZGdnJ3vuuWdy3HHHJcOHD0/22GOPpE6dOknjxo03qbbKfo4//vjjJD8/P6lTp05y+OGHJyeffHJyyimnJG+99VaSJJVfl5IkSS666KJKr99JkiTvvffeRq/DSZIk/fr1SyIiee+998q1b8q1IUk2fj37tv1U5WcLALZVQlsA2Eb95z//SX7/+98n/fr1S1q0aJHk5OQkhYWFyb777ptcdNFFyYcffliuf0lJSXLllVcm3bt3T/Lz85NWrVolo0aNSt5///2N/p/+bwttk+Sr4Oiggw5KmjRpkjRq1Cjp3bt3cv/9939rWPCPf/wjOeyww5KmTZsmeXl5Sfv27ZPBgwcnf//738v1W7FiRfLTn/406dChQ5KTk1PpnKtXr07+8Ic/JL17904aN26c5OXlJR06dEj69euXXHHFFRXei0xC2+XLlydXXnllcuSRRyadOnVK8vPzk2bNmiW9evVKrr766mTlypUV5rnrrruSPffcM6lXr15ZILUhtPimkGPp0qXJaaedlrRu3TqpW7dustNOOyW///3vk9LS0o3Wvnbt2uRXv/pV0qFDhyQvLy/p2rVrcumllyYlJSXf+Dm+8847yU9+8pNk++23T/Lz85NGjRolO+64YzJixIhk4sSJydq1a5MkSZLi4uLkhhtuSIYOHZp07do1qV+/flJYWJjsuuuuyW9+85vk888/3+j7WZnXXnstOeqoo5LGjRsnDRo0SPbff//koYce2mgwtcE//vGPZNCgQUnLli2T3NzcpGXLlslee+2VjBs3LnnppZfK+r399tvJ//zP/yQHHHBA0qZNmyQvLy9p165dMnDgwOT+++9PSktLq1zr22+/nQwZMiRp1qxZkp2dXenn9vjjj5d9xi+88EK5bRt+FiIiueeeeza6n6KiouTSSy9N9txzz6Rhw4ZJfn5+0qlTp+Swww5LbrjhhmTJkiUVxnzyySfJuHHjkl122SWpX79+Ur9+/aRr167JMccck9x6663Jf/7znyofy4MPPpicfPLJyS677JIUFhYm9evXT3bYYYfkhz/8YVlwWBVfDyynTJmS7L///kn9+vWTxo0bJ8ccc0zyxhtvVDru4YcfTvbbb7+kUaNGSWFhYXLwwQcnM2bM2Og5kWlom+m5/NRTTyXHHXdc0rZt2yQ3Nzdp1qxZsuuuuyY//elPk6eeemqTatvYz/Gjjz6aHHDAAUnDhg3LzpkNc2zN0DZJqn5tSJLMQ9uq/GwBwLYqK0m24CObAQDYqrKysqJjx47llkGANBkzZkzcdtttMX369AoPXQMA4CvWtAUAAAAASBGhLQAAAABAightAQAAAABSxJq2AAAAAAAp4k5bAAAAAIAUEdoCAAAAAKSI0BYAAAAAIEWEtgAAAAAAKZJT0wWkxRdffBElJSU1XQYAAAAAsI3KycmJJk2afHu/rVDLd0JJSUkUFxfXdBkAAAAAQC1neQQAAAAAgBQR2gIAAAAApIjQFgAAAAAgRYS2AAAAAAAp4kFkAAAAAPAdV1JSEqtWrarpMoiI+vXrR07O5sWuQlsAAAAA+A4rKSmJlStXRqNGjSI72x/W16TS0tL4z3/+Ew0aNNis4NanCAAAAADfYatWrRLYpkR2dnY0atRos+969kkCAAAAwHecwDY9quOz8GkCAAAAAKSI0BYAAAAAqBGzZ8+Odu3axZdfflnTpaSK0BYAAAAAarnPP/88fvWrX8Xee+8dnTt3jt133z1GjhwZL7zwQrXtY/jw4fHrX/+6XFuvXr1i7ty5UVBQUG37ydTZZ58dJ598ck2XERERmT/CDAAAAADYJowdOzbWrVsX11xzTXTs2DGWLFkSs2bNii+++GKL7jcvLy9atmy5RffxXeROWwAAAACoxb788st4/vnn44ILLogDDjgg2rdvH3vssUecccYZceihh5b1+fnPfx49e/aMHXfcMY477rh44403yua48sor45BDDolJkybFvvvuGzvttFOcdtppsWLFioj46i7WZ599Nv7yl79Eu3btol27dvHhhx9WWB7h3nvvjZ133jkef/zx6Nu3b3Tt2jXGjh0bq1evjokTJ8a+++4b3bt3jwsvvDDWr19ftv+1a9fGxRdfHHvttVd069YtBg8eHLNnzy7bvmHeGTNmRL9+/WL77bePUaNGxaefflpW/3333RePPvpoWX1fH7+1CW0BAAAAoBZr0KBBNGjQIKZNmxZr166ttM+Pf/zjWLp0adx5553xyCOPRM+ePeN73/teuTtxP/jgg3j00Ufjtttui9tuuy2ee+65uP766yMiygLVUaNGxdy5c2Pu3LnRtm3bSve1evXq+Otf/xp//OMf46677opnn302TjnllHjyySfjjjvuiGuvvTbuvPPOeOihh8rG/M///E+89NJLceONN8YTTzwRgwcPjhNPPDEWLFhQbt4//elP8Yc//CH+/ve/x8cffxyXXHJJRESceuqpcdRRR8WAAQPK6uvVq9dmv7eZsjwCAAAAANRiOTk5cfXVV8e4cePizjvvjB49esR+++0XxxxzTHTv3j3mzJkTr7zySrz66qtRt27diIj49a9/HY8++mg8/PDDceKJJ0ZERGlpaVx99dXRsGHDiIgYNmxYzJo1KyIiCgoKIi8vL/Lz8791OYTi4uL47W9/G506dYqIiEGDBsX9998fr776ajRo0CB22GGH6N27d8yePTuOOeaY+Pjjj+Pee++NOXPmROvWrSPiqxB2+vTpce+998Z5551XNu/vfve7snnHjBkT11xzTUR8FVzn5+fHunXrUrFcg9AWAAAAAGq5QYMGxcCBA2POnDnx0ksvxfTp0+OPf/xjXHHFFbF69epYuXJl9OjRo9yYNWvWxAcffFD2ukOHDmWBbUREy5Yt4/PPP9/kWurVq1cWrEZEtGjRIjp06BANGjQoa2vevHnZ3G+++WasX78++vbtW26edevWRZMmTTY6b6tWrWLp0qWbXN/WILQFAAAAACI/Pz8OPPDAOPDAA+NnP/tZ/PznP48rr7wyRo8eHS1btoxJkyZVGNO4ceOyf+fklI8as7KyorS0dJPryM3NrTDPN829cuXKqFOnTjzyyCNRp06dcv2+HvRWNm+SJJtc39YgtAUAAAAAKth+++1j2rRp0bNnz1iyZEnk5OREhw4dMp4vNzc3oxD32/To0SPWr18fn3/+eey7774Zz5OXl1fu4WY1yYPIAAAAAKAWW7ZsWRx33HFx//33x7/+9a9YuHBhTJkyJf74xz/GYYcdFn379o299torTj755Hjqqafiww8/jBdeeCF+97vfxauvvlrl/XTo0CHmzp0bH374YSxbtqzaAtyuXbvG0KFD46yzzoqpU6fGwoULY+7cuXHdddfFE088UeV52rdvH2+++Wa88847sWzZsiguLq6W+jLhTlsAAAAAqMUaNGgQe+65Z9x0003xwQcfRHFxcbRt2zZGjhwZZ5xxRmRlZcUdd9wREyZMiHPOOSc+//zzaNGiRey3337RvHnzKu/nxz/+cZx99tnRv3//WLNmTTz33HPVdgxXXXVVXHvttXHxxRfH4sWLo2nTprHnnnvGwQcfXOU5Ro0aFc8++2wceeSRsXLlyrjvvvuid+/e1VbjpshK0rpww1a2ZMmSGk3PAQAAACATy5cvj4KCgpoug6/Z2GeSm5sbLVq0+NbxlkcAAAAAAEgRoS0AAAAAQIoIbQEAAAAAUkRoCwAAAACQIkJbAAAAAIAUEdoCAAAAAKSI0BYAAAAAIEWEtgAAAAAAKSK0BQAAAABIkZyaLgCoPcbc9mxNl7DV3Dp6/5ouAQAAALY5s2fPjrfffjtGjx5d06VsUe60BQAAAABS74MPPogzzjgjdt999622z3333TduuummstefffZZjBgxIrp16xY777zzFtuvO20BAAAAYBv0yS9+uFX31+aKmzep/9lnnx333XdfnHfeefHTn/60rH3atGlxyimnxMcff1zWtnbt2vjJT34SV1xxRey2227VVvMG9957b4wfPz7efPPNcu1Tp06N+vXrl72+6aab4rPPPovHHnssCgoKqr2ODYS2AAAAAECNyM/PjxtvvDFOPPHEKCws3Gi/unXrxsMPP7z1Cvv/NWvWrNzr999/P3r27BldunTZovu1PAIAAAAAUCP69OkTLVq0iOuvv36jfebMmRPHHntsdO3aNXr16hUXXnhhrFq1qmz7p59+GieddFJ07do19ttvv5g8eXKFZQ3+/Oc/x8CBA6Nbt27Rq1evOO+882LlypUR8dU6ueecc04sX7482rVrF+3atYsrr7wyIsovj7DvvvvG1KlTY9KkSdGuXbs4++yzt8A78hWhLQAAAABQI+rUqRO/+tWv4pZbbolFixZV2P7+++/HqFGj4sgjj4zHH388/vjHP8acOXPiggsuKOtz1llnxaeffhr33Xdf3HTTTXHXXXfF0qVLy82TnZ0dF198cUyfPj2uueaaeOaZZ+LSSy+NiIhevXrFb37zm2jUqFHMnTs35s6dG6eeemqFWqZOnRoDBgyIo446KubOnRsXX3xxNb8bX6t3i80MAAAAAPAtjjjiiOjevXvZ3a1fd/3118exxx4bY8eOjS5dusTee+8dl1xySUyaNCnWrFkT77zzTsycOTOuuOKK2HPPPaNnz55xxRVXxJo1a8rNM3bs2DjggAOiQ4cO0adPnxg3blxMmTIlIiLy8vKiUaNGkZWVFS1btoyWLVtGgwYNKtTSrFmzyMvLi/z8/GjZsqU1bQEAAACAbdcFF1wQxx9/fIU7XP/1r3/Fm2++GZMnTy5rS5IkSktL48MPP4wFCxZETk5O9OzZs2x7586dK6yP+/TTT8f1118f7777bvznP/+J9evXx5o1a2L16tVRr169LXpsmRDaAgAAAAA1ar/99ot+/frFb3/72zj++OPL2leuXBknnnhinHzyyRXGtGvXLhYsWPCtc3/44YcxZsyYOOmkk+KXv/xlFBYWxgsvvBDnnnturFu3TmgLAAAAAFCZ888/Pw499NDo2rVrWVvPnj1j/vz50blz50rHdO3aNUpKSmLevHmx6667RkTEe++9F0VFRWV9XnvttSgtLY2LLroosrO/Wi12w9IIG+Tl5cX69eur+YgyZ01bAAAAAKDG7bzzznHsscfGX//617K2n/zkJ/Hiiy/GBRdcEPPmzYsFCxbEo48+WvYgsm7dukXfvn1j3LhxMXfu3Jg3b16MGzcu8vPzIysrKyIiOnXqFMXFxfHXv/41Pvjgg5g0aVLccccd5fbdvn37WLlyZcycOTOWLVsWq1ev3noHXgmhLQAAAACQCr/4xS+itLS07HX37t3j/vvvjwULFsTQoUPjsMMOiyuuuCJatWpV1ufaa6+NFi1axLBhw+KUU06JUaNGRcOGDaNu3boREbHLLrvERRddFDfeeGMcdNBBMXny5DjvvPPK7XfvvfeOk046KU477bTo2bNn3HjjjVvngDciK0mSpEYrSIklS5ZEcXFxTZcB27Qxtz1b0yVsNbeO3r+mSwAAAKCWWL58eRQUFNR0GamxaNGi2HvvveOee+6Jvn371kgNG/tMcnNzo0WLFt863pq2AAAAAMB31qxZs2LVqlWx0047xaeffhqXXXZZdOjQIfbbb7+aLi1jQlsAAAAA4DurpKQkfve738UHH3wQDRs2jF69esX1118fubm5NV1axoS2AAAAAMB3Vv/+/aN///41XUa18iAyAAAAAIAUEdoCAAAAAKSI0BYAAAAAIEWEtgAAAAAAKSK0BQAAAABIEaEtAAAAAECKCG0BAAAAgG3G7Nmzo127dvHll19+Y7999903brrpprLXn332WYwYMSK6desWO++885Yu8xvl1OjeAQAAAIAtYsxtz27V/d06ev9N6n/22WfHfffdFxERubm50a5duxg+fHicccYZkZOTeWzZq1evmDt3bhQUFERExL333hvjx4+PN998s1y/qVOnRv369cte33TTTfHZZ5/FY489Vja2pghtAQAAAIAaMWDAgLjqqqti3bp18c9//jMuuOCCyMnJiTPOOCPjOfPy8qJly5bf2q9Zs2blXr///vvRs2fP6NKlS8b7ri6WRwAAAAAAasSGgLV9+/YxevTo6Nu3bzz22GNRVFQUZ555ZnTv3j26du0aJ554YixYsKBs3EcffRSjR4+O7t27R7du3WLAgAHxz3/+MyLKL48we/bsOOecc2L58uXRrl27aNeuXVx55ZURUX55hH333TemTp0akyZNinbt2sXZZ5+91d+Lr3OnLQAAAACQCvn5+fHFF1/Ez372s3jvvffilltuiYYNG8b//u//xkknnRQzZsyI3NzcOP/886O4uDjuv//+qF+/fsyfPz8aNGhQYb5evXrFb37zm/j9738fTz/9dEREpf2mTp0aZ511VjRs2DAuvvjiyM/P3+LH+k2EtgAAAABAjUqSJGbOnBlPPfVUDBgwIKZNmxYPPPBA7L333hERcd1118Xee+8d06ZNi6OOOioWLVoURx55ZNkDwzp27FjpvHl5edGoUaPIysr6xiUTmjVrFnl5eZGfn1+lpRW2NKEtAAAAAFAjnnjiidh+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Z8Vee+1VYXuXLl3iww8/3OziAAAAAABqm4xC28WLF8cee+yx0e0NGzaMFStWZFwUAAAAAEBtlVFoW79+/Vi+fPlGt3/00UdRWFiYaU0AAAAAALVWRqHtHnvsEf/85z9j5cqVFbZ9+OGH8c9//rPSZRMAAAAAAPhmOZkMGjFiRFxwwQVx7rnnloWzM2bMiCeffDKef/75aNKkSQwfPrxaCwUAAAAAqA0yCm2bNm0av/vd7+Luu++O2bNnR0TEzJkzIz8/Pw444IAYNWpUFBQUVGuhAAAAAAC1QUahbURE48aN49RTT41TTz01li9fHqWlpVFQUBDZ2RmtuAAAAAAAQGS4pu3s2bNj3bp1Za8LCgqisLBQYAsAAAAAsJkyutP22muvjXr16sW+++4bffv2jR49elR3XQAAAAAAtVJGoe3FF18cM2fOjOeeey5mzJgRTZs2jT59+kTfvn1ju+22q+4aAQAAAABqjYxC2x133DF23HHH+MEPfhCvvPJKzJw5M6ZNmxYPPvhgbLfddnHggQdGnz59okmTJtVdLwAAAADANi3jB5FFRNSpUyf22muv2GuvvWLNmjUxZ86cmDFjRtx5553xt7/9Lbp37x79+vWL3r17R07OZu0KAAAAAKBWqLYnhy1cuDDeeeedWLhwYUREtG3bNlasWBE33HBDnHHGGfHWW29V164AAAAAALZZm3X766JFi2LWrFkxa9as+PTTT6OgoCD69OkTBx54YHTp0iUiIt59993405/+FDfddFNceeWV1VI0AAAAAMC2KqPQdurUqTFz5sxYsGBB5Obmxl577RVjxoyJ3XffPbKzy9+827Vr1xg0aFD86U9/qpaCAQAAAAC2ZRmFtrfddlvsuOOOMXbs2Ojdu3fUr1//G/t37do1hg0bllGBAAAAAAC1SUah7XXXXRctW7ascv8OHTpEhw4dMtkVAAAAAECtklFo+/XAds2aNbF06dKIiGjevHnk5+dXT2UAAAAAALVQxg8ie+edd+Kuu+6Kt956K0pLSyMiIjs7O3baaac48cQTo2vXrtVWJAAAAABAbZFRaPv222/H+PHjIycnJw466KBo165dRER8/PHH8cwzz8RFF10U48ePj27dulVrsQAAAAAA27qMQtt77rknmjZtGpdcckkUFhaW23bcccfFhRdeGHfffXdceOGF1VEjAAAAAECtkZ3JoLfffjsOOeSQCoFtRERhYWEcfPDB8fbbb29ubQAAAAAAtU5GoW1WVlasX79+o9tLS0sjKysr46IAAAAAAGqrjELbHXfcMR599NFYsmRJhW1Lly6Nxx57LHbaaafNLg4AAAAAoLbJaE3bE044IS666KI4++yzY5999ok2bdpERMSiRYvixRdfjDp16sQJJ5xQrYUCAAAAANQGGYW2nTt3jv/93/+Nu+++O1588cVYt25dRETk5eXF7rvvHiNGjIj27dtXa6EAAAAAALVBRqFtRET79u3jF7/4RZSWlsby5csjIqKgoCCyszNacQEAAAAAgNiM0HaD7OzsKCwsrIZSAAAAAADIOLRds2ZNPP/88/Hpp5/GypUrI0mSctuzsrLiBz/4wWYXCAAAAABQm2QU2r7++utx1VVXxapVq76xn9AWAAAAAGDTZBTa/uUvf4n8/Pz42c9+Ft26dYv69etXd10AAAAAALVSRk8NW7p0aRx99NGx6667CmwBAAAAAKpRRqFtx44dv3VpBAAAAAAANl1Goe2oUaPisccei3fffbe66wEAAAAAqNUyWtO2e/fuMXr06Pif//mfaNeuXTRr1iyys8vnv1lZWTFu3LhqKRIAAAAAoLbIKLR97rnn4rrrrovS0tL4/PPPY/Xq1RX6ZGVlbXZxAAAAAAC1TUah7d/+9rdo27ZtnHvuudG2bdvqrgkAAAAAoNbKaE3bL774Ig499FCBLQAAAABANcsotO3atWssXbq0umsBAAAAAKj1MgptTz755Jg9e3bMnj27uusBAAAAAKjVMlrT9g9/+EOsX78+rr322vjzn/8czZo1i+zs8vlvVlZWXHHFFdVSJAAAAABAbZFRaNuwYcNo1KhRtGnTprrrAQAAAACo1TIKbcePH1/NZQAAAAAAEJHhmrYAAAAAAGwZQlsAAAAAgBQR2gIAAAAApIjQFgAAAAAgRYS2AAAAAAApssmh7bp162Lq1Knxr3/9a0vUAwAAAABQq21yaJuXlxd33XVXLFq0aEvUAwAAAABQq2W0PMJ2220XS5Ysqe5aAAAAAABqvYxC2xEjRsQTTzwRr732WnXXAwAAAABQq+VkMmjatGnRsGHDuOyyy6Jly5bRsmXLyMvLK9cnKysrxo0bVy1FAgAAAADUFhmFtgsXLoyIiObNm0dpaWksXry4Qp+srKzNqwwAAAAAoBbKKLS94YYbqrsOAAAAAAAiwzVtAQAAAADYMjK603bp0qVV6te8efNMpgcAAAAAqLUyCm1PP/30KvW79957M5keAAAAAKDWyii0Pe200yq0lZaWxpIlS+Lpp5+OgoKCOOywwza7OAAAAACA2iaj0LZ///4b3XbMMcfEBRdcEKtWrcq0JgAAAACAWqvaH0SWn58f/fv3j4cffri6pwYAAAAA2OZVe2gbEZEkSRQVFW2JqQEAAAAAtmkZLY+wMatWrYo333wzHnzwwejcuXN1Tg0AAAAAUCtkFNp+73vf+8btzZs3jx/+8IcZFQQAAAAAUJtlFNoOGzYssrKyyrVlZWVFgwYNolWrVrHbbrtFnTp1qqVAAAAAAIDaJKPQ9vjjj6/uOgAAAAAAiGp4ENkXX3wR77//fqxZs6Y66gEAAAAAqNUyDm1feOGFOPvss+PUU0+NX/7yl/HOO+9ERMTy5ctj3LhxMWfOnGorEgAAAACgtsgotH3xxRfj97//fTRq1CiOO+64ctsKCgqiadOmMWPGjOqoDwAAAACgVskotL3//vuje/fucckll8Rhhx1WYfsOO+wQ77333mYXBwAAAABQ22QU2i5cuDD233//jW5v3LhxLF++POOiAAAAAABqq4xC27p1637jg8c+/fTTaNiwYcZFAQAAAADUVhmFtrvssks89dRTsX79+grbioqK4p///Gfstttum10cAAAAAEBtk1Foe8IJJ8SyZcvivPPOi8cffzwiIl555ZW455574txzz42IiOHDh1dflQAAAAAAtUROJoPatm0bF198cdx6661x7733RkTElClTIiKie/fuccopp0TLli2rr0oAAAAAgFoio9A2IqJDhw5x4YUXxooVK2Lx4sWRJEm0atUqCgoKNruoadOmxZQpU6KoqCg6duwYJ598cnTr1q3Svs8//3xMnjw5Fi9eHOvXr4/WrVvHUUcdFQceeOBm1wEAAAAAsLVlHNpu0LBhw40GqpmYPXt23H777TF27NjYfvvt4+GHH47LLrssrrnmmmjcuHGl+x86dGi0bds2cnJy4uWXX44bb7wxCgoKYvfdd6+2ugAAAAAAtoYqhbZPPfVURpP369dvk8c89NBDMXDgwBgwYEBERIwdOzZefvnlmD59egwZMqRC/1122aXc6yOPPDKeeuqpeOutt4S2AAAAAMB3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g4MRERGB//znP7C0tMSkSZMgEomwe/fuTj2Pvb19p/uYOHEiRCIRjh49iu+//x6GhoZ4/PHHMXXqVHWbSZMmIScnB3K5HDExMbCxsYG7uzsEAgFWrlyJmJgYnDp1ComJiTA2NoZEIsFzzz0HOzu7Lr9HJiYmmDx5MpKTk5GQkACVSgWpVIpFixZh0qRJHWZqy8iRIxEcHIxDhw7h22+/hUQiQVBQEBITE5Genq7R9tVXX0VjYyOOHz8OoVCIcePGYf78+Vi+fLlGOwcHB3z00Uf47rvvIJfLcefOHVhYWMDJyQkvvPBCl183EREREXWNQVPLa8OIiIiIiOihEBYWhvT0dISFhek6ChERERF1Ede0JSIiIiIiIiIiItIjLNoSERERERERERER6REWbYmIiIiIiIiIiIj0CNe0JSIiIiIiIiIiItIjnGlLREREREREREREpEdYtCUiIiIiIiIiIiLSIyzaEhEREREREREREekRFm2JiIiIiIiIiIiI9AiLtkRERERERERERER6hEVbIiIiIiIiIiIiIj3Coi0RERERERERERGRHmHRloiIiIiIiIiIiEiPsGhLREREREREREREpEf+D33efUw7nwIXAAAAAElFTkSuQmCC\n"},"metadata":{}}],"source":["# Plot the statistics with bar plots and hue 'sentiment'\n","plt.figure(figsize=(14, 8))\n","\n","cols = ['Ratio Majuscules', 'Nombre Exclamations', 'Nombre Questions', 'Nombre Ellipses',\n"," 'Nombre Hashtags', 'Nombre Mentions', 'Nombre URLs', 'Emoticone Positive', 'Emoticone Negative']\n","\n","# Melt the DataFrame to long format for easier plotting with seaborn\n","stats_melted = stats[cols].reset_index().melt(id_vars='sentiment', value_name='Valeur', var_name='Caractéristique')\n","\n","# Rename columns for better readability\n","stats_melted['Caractéristique'] = stats_melted['Caractéristique'].replace({\n"," 'Nombre Exclamations': '!',\n"," 'Nombre Questions': '?',\n"," 'Nombre Ellipses': '...',\n"," 'Nombre Hashtags': '#',\n"," 'Nombre Mentions': '@',\n"," 'Nombre URLs': 'http',\n"," 'Emoticone Positive': ':)',\n"," 'Emoticone Negative': ':('\n","})\n","\n","# Create the bar plot\n","sns.barplot(x='Caractéristique', y='Valeur', hue='sentiment', data=stats_melted)\n","\n","# Customize the plot\n","plt.title('Caractéristiques des tweets par sentiment', fontsize=15)\n","plt.xlabel('Caractéristique', fontsize=12)\n","plt.ylabel('Valeur moyenne', fontsize=12)\n","plt.legend(title='Sentiment')\n","plt.tight_layout()\n","plt.show()"]},{"cell_type":"code","execution_count":28,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":806},"id":"81wLmor1WjJB","executionInfo":{"status":"ok","timestamp":1751537507241,"user_tz":-120,"elapsed":358,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"1b3d59be-0754-4802-d825-299053434ed0"},"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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sGnTJtO/f39TqVIlRw0jRowwv/32W46/nX2b+O6770zPnj1NRESEkWR++OEHY0zOddnu0KFDZvTo0aZOnTomMDDQlC1b1jRo0MD86U9/Mr/88otT+7n9N2TIEEdb9vnLzcKFC02rVq1MYGCgiYiIMPHx8WbPnj15bs9X7++zy96PV8vIyDD//ve/TatWrUyZMmVMQECAadq0qZkyZYrJyMjIMf2pU6fM+PHjTf369U1wcLAJDQ01derUMffdd5/57rvvcv37eXG1z3788UfTq1cvEx4eboKCgky7du3M+vXrnaa3919en3fGGLNq1SpHnxw/ftyMGDHCVKlSxXh7e5spU6Y42jp8+LAZM2aMqVmzpvH39zdly5Y1PXv2zPE3ryWvWuzrWF59dObMGWOz2Ywk89577zmN27lzp5FkevbseUPL1i6/nyvXmxdj/tgvffLJJ6ZNmzYmMjLS+Pv7m+joaHPHHXeYN998s0DLLSYmxqSnp5tnn33W0Qc1atQwzzzzjLl48WKu7zt9+rR57LHHTO3atR191q1bN/P111/nOn1+tuura7K71rFV9v4syPvsy9ET21tB9ru5yb7vnD9/vmnZsqUJCgoyZcuWNQkJCeb333/P9X0F/cw3xpiDBw+agQMHmvLly5ugoCBz8803m88//9wcPHgwx/GJMcacO3fOvP7666Zr166mWrVqxs/Pz0RERJhu3bqZZcuW5Wj7Wuu63dX75Gu9L/v+/8svvzSdO3c2lStXNn5+fiYqKsq0adPGTJw48brLGCgOCKOAYi4/YZQxxvTv399IMn//+99zvD/7gc97771nhgwZ4givhgwZ4vhv7dq1ZsiQIaZp06ZGkmnTpo1jnP1LpzHGjB8/3kgyfn5+pk2bNqZ///6mTp06RpKpVauWOXHihFMN9oOtUaNGGZvNZlq0aGESEhJMixYtTFJS0g21+de//tV4e3ubli1bmnvuucfExsYaSaZcuXLm+PHjOZbTX//6VyPJeHl5mTZt2piBAwea9u3bm/DwcNO0aVOnaffs2WOqVq1qJJnq1aub3r17m06dOpmgoCAjybz88stO02/dutUEBAQYSaZJkybmnnvuMXFxcaZBgwb5PoArrOWV15fX8ePHG5vNZho3bmzi4uJMv379TP369Y0kExoaanbs2OGY1r5+SDLBwcFO684///lPx3S5fYHv3r27kZQjGLEbMGCAkWTmzp3rGHblyhUzcOBAI8mEhISYDh06mL59+zr65NZbbzVpaWmO6TMzM03Lli2NJFO+fHlz1113mXvuuce0bt3aBAUFOR0AXo99+fr6+pquXbuau+++20RGRppq1aqZXr165dqfnlpfMjMzzd133+1YHzp27GgSEhJMmzZtTFBQkOndu7fT9BUrVjShoaGmdevW5p577jHdunUzZcuWNZJMp06dTGZmptP09i/ICQkJJjQ01NSoUcMMGDDAdO3a1SxevNixvPK7Htn99NNPJjo62kgylSpVMn379jV9+/Y1DRs2NJIc+5xHH300133SkCFDzM8//+xo76233jJeXl7Gy8vLtGzZ0tx9992mSZMmRpKpUKGC+emnn5z+vn2bGDZsmPH19TUNGzY0CQkJpl27do56c1uXDx8+7Ait6tSpY/r162f69Oljmjdvbmw2m2Mbmz9/vunXr5+R5Agz7f9lDxTyCqPefvttI8nYbDbTrl07M2DAABMTE2PCwsLMvffe67YwKi0tzXTs2NFIMhEREaZLly6OsF6Sueuuu5xC5JSUFFOjRg0jyVStWtX06dPH9O/f39x6663G19c317ArL6722ZgxY0xQUJBp3LixGTBggGP9CAgIMDt37nRM/89//tO0adPGSDJNmzbN8XlnzP/CqB49epjo6GhTqVIl079/fxMXF2feeecdY4wxGzZscGwjdevWNfHx8eb22283Pj4+xtvb28ycOTNf8ztkyBBTq1YtI8l069bNqZ7ExERz4MCBXL88z5s3z3EsMHjwYKdxr7/+eq77l4IuW2MK9rlyvXkxxpjHHnvMSDL+/v6mS5cuZuDAgaZjx46mQoUKea6nuZFkqlWrZuLi4kxgYKCJi4sz8fHxjh9p7rjjjhz7rSNHjpiaNWs63jtgwADTqVMn4+3tbSSZ1157zWn6/G7X2Wu6+tiqW7dujmWVfXlkP34qyDFZYmKix7a3/O5382Lfd/7tb38z3t7epkOHDqZ///6Oz8g6deo4fX4bU/DPfGP++CGkQoUKRpKpXbu2Yx9us9nMQw89lOv29NVXXzk+p7t06WIGDBhgbrvtNmOz2YzNZjPTpk1zTJuYmGiGDBliKlasaCSZfv36OS0Lu6uPsezvy23/Y9//v/nmm0aS8fb2Nu3atTMDBw40Xbp0cXwuAiUBazJQzOU3jHruueeMJDNw4MAc78/toO9av8bnFVwYY8zs2bONJNOoUSOzb98+x/CsrCzz7LPPGklmwIABTu/J/stfbgftN9Kml5eX04FeZmam4wvgM8884/Sejz/+2EgylStXdpz5YJeWlub0i1hmZqZp3LixkWReeuklpy9j+/btMzVq1DDe3t5OX3zuv/9+I8m88sorOebx559/LvCZUe5cXnn16caNG82BAwdy/I0PPvjASDIdO3bMMe5aX3iNyf0LvH3ZDx8+PMf0KSkpJjAw0ISFhTmdmfPSSy8ZSaZDhw5OwWJ6eroZMWKEkWTGjx/vGP7NN98YSaZFixY5filPTk42W7duzbPm7DZu3GhsNpsJCwsz33//vWP4+fPnTadOnRx9kz0s8uT68o9//MNIMg0aNMjRl0lJSWb16tVOwxYsWJDjgD4lJcXExcUZSWbGjBlO47KfETd27NgcX/qMKfh6lJGRYerWrWskmYcfftikp6c7jd+1a5fZv3+/4/W19kn2v+/t7W2qVKmSo5/ff/99I8m0bNnSaXj2M5cmT56ca7u5rcv2bWzs2LE5pv/tt9+c6s7rl/nsctsXHzp0yAQEBBhfX1+nM/ouX75sBg8e7KjbHWHUAw884Nhn2MNuY/5YJ3r06GEkmbffftsx3N6nV4dUxvxxBkf2dfxabrTP/vWvfzmNe/jhh40kc9999+Vrvu3sYZT0x5mZue07oqKijLe3t/nkk0+cxm3ZssWULVvWhISEmFOnTuVrvq91ZqUxf6wP/v7+TnX83//9n5FkGjZsaKKjo52mj4+PN5LMli1bHMNcWbY38jmc27xcvHjR+Pv7mzJlyuTYN2RkZJhvv/021/nPjb1/oqOjza+//uoYfurUKdOoUSMjyeksNmOMY382aNAgp/3L2rVrTVBQkPH29nY6DijIdm2v6eptLftZdteal4IckxWF7S2v/e612PedQUFBZsOGDY7hFy5cMK1btzaSnEIfYwr+mW+MMXfccYeRZEaPHu302bR06VLj6+ub6/73wIEDZuPGjTlq/v777014eLgJDQ0158+fz3V+rj5L1i6vZXWt/U+1atWMzWZz2naN+WOby++PUUBRRxgFFHP5DaP+85//GEmme/fuOd7vzjDK/ktZbgdAWVlZplmzZsbb29vxy6gx/ztgze0yghtt8+pfiY35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4YcfJP1x5kZhycrKkvTHr+V5/bpml9uXqICAALe36eVVOCeA2uvq3r17rr/S2WV/lG9oaKi++eYbrV+/XosWLdLq1av1zTffaPny5frnP/+ptWvXqk6dOvmuoTCWV3apqam65557dPbsWT377LNKSEhQTEyMAgMDZbPZNGjQIH3++ed5hhYF1bVrV1WoUEFffvmlkpOTFRYWppkzZ+rKlSsaOHCgU1/a57N27drX/RJYrlw5x78fffRR3XPPPVqwYIGWL1+utWvXasqUKZo6daqmTJmihx56yC3zcrWisL7kx6xZs/Taa6+patWqmjJlim677TZVqFBBvr6+unz5svz9/fPs79zWR8n69ehq9mUfEhKifv36XXPahg0b5hiW13zlxdvbW7NmzdLjjz+uhQsX6ptvvtF3332ntWvX6sUXX9TSpUvVunXrArVpBftyym1Ys2bNcj3jLzt/f3/Hv1977TX9+c9/1sKFC7VixQqtX79emzdv1ksvvaTPP//8uv1wo31WGPv9vNYDe639+/dXcHBwnu+vV6+eW+qoWbOmqlatqk2bNunSpUtOgVNAQIBatWqlNWvWSPpfYGU/myp7vQVZtu78XMmuU6dO2r9/vxYvXqylS5dq9erV+uijj/TRRx+pX79+mjNnTr7bcqfcwo6ivF17enu7EfndVl39zHfFyJEjtWPHDvXr10/jxo1T3bp1VaZMGXl5eendd9/Vn//850L7vMquSZMm+umnn7R06VItWbJEq1ev1uzZszV79mzddtttWr169XXDQ6CoI4wCSoHk5GR9/fXXkqSOHTsW2t+x/8JVvnx5TZ8+vci2mRv7L2cHDhyQMea6v7zZ6xo5cuR1D96ys9lsatu2rdq2bSvpj8sfHn74YX3++ed66qmnNHv2bBfnwLkudyyvtWvX6syZM+rfv78mTZqUY7w7LqvIzsfHRwMGDNCbb76puXPnavjw4bleoif9bz7r1atX4PmsWrWqHnzwQT344IPKzMzUzJkzNWzYMI0bN07333+/ypYte833R0VF6dChQ/rtt99Uv379HON/++23HMM8tb7Y1+v8Xko5f/58SdLbb7+tnj17Oo1ztb9dWY8KWve1lC9fXgEBAY5LNAvzUuXsmjdvrubNm2vixIlKSUnRxIkTNWXKFD388MM3fKlLVFSU9uzZo99++y3XHxhyWwcl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5s2bl2PapKQk89xzz5mbbrrJhISEmICAAFO9enXTrVs389Zbb5nExETHtF988YUZPny4adiwoQkPDzdBQUEmNjbWjBw5Ml8Hb/mdN7uCLK+8+jQtLc089dRTpk6dOsbf399UrVrVjB492pw+fTrPOlJTU83YsWNN1apVjY+PT46DyuuFUXv27HGsz+3atbvu8li4cKHp2bOniYyMNL6+viYyMtLcfPPNZty4cWbbtm2O6fbt22eefvpp06ZNGxMVFWX8/PxMlSpVzB133GHmzp1rsrKyrvu3snvvvfdMkyZNjL+/v4mMjDT33nuvOXr06DX7xxPrizF/HMRPnz7dtGvXzoSFhRl/f39TvXp1c8899+So8+effza9evUykZGRJigoyDRv3ty8++67xpjct5v8hFGurEfGGHPy5Enz2GOPmdjYWBMQEGDCwsJM48aNzfjx483x48edpv36669NmzZtTEhIiGP9ubrNH374wQwZMsTExMQYPz8/Ex4ebho2bGiGDx9uFi9e7LQOuBpGrVmzxowZM8Y0a9bMlCtXzgQEBJiaNWuahISEXH8UOHnypLnvvvtMpUqVHF8Eswcf19oXz58/37Rs2dIEBgaasmXLmt69e5uff/75mrVv3LjRdOjQwQQFBZnQ0FBz5513mu3bt1+zHzMzM82MGTNMp06dTEREhPH19TWVK1c2t912m5k0aZLZs2eP0zJ+9NFHTYsWLUxkZKTx9/c3MTExplevXmbFihV5Lsu8uLPP8lqWW7ZsMV26dDFhYWGOH3HsbeQnjDLGmOPHj5tx48aZhg0bmqCgIBMUFGRq1aplevfubaZPn27Onz+f73n+9NNPzU033eQIDnPbX9oDx4YNG+Z4v305hISE5AhhsivIsrUryOfKteYlJSXFvPrqq6ZHjx6mevXqJiAgwJQrV87ccsstZsqUKebChQv5Xl72/dKlS5fMk08+aapXr278/PxMTEyMeeqpp0xaWlqu7zt9+rR59NFHTa1atRzz37VrV/P111/nOt8F2a7zOsbYt2+f6dOnjylXrpzx8vLKsc0V9JjMk9ubMfnb7+bGlTDKLr+f+XYHDhwwAwcONOXKlTOBgYGmefPm5uOPPzbr1q0zkkxCQkKO98yYMcM0b97cBAUFmXLlypnevXubHTt2XHM/OWXKFNOgQQNHcJe9vwoaRmVkZJi3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jz7KAW4Rk5mZqcDAQNWqVUspKSlatWqVfvjhBx08eFDVq1dXfHw8l4LfgKSkJEVFRSkmJkbHjx/X999/r2XLlikrK0s333yzhg4dyjZRBKSlpTnOEvn555/1448/avny5fL19VXr1q1133330U8uunLliry9vR2vjTHy9vZWbGysNm7cqLffflvDhg1T+/btlZ6erl27dqlu3br8IHiDsgdK2fvg/Pnz8vf3V9u2bXXlyhWtXr1a69at05EjR1S3bl099thjrOtFhL+/v7y9vXXixAnt3r1bq1at0m+//SYvLy8dOXJEaWlp6tatm9v+HmEULGffUdl3UpcvX1a5cuWUnp6uSZMmqXnz5ho5cqQkafv27Tp06JC6du1aaNeq4n/sX/JOnTqlyMhIpaen6+LFi1q6dKlmzZqlQYMGOc7mOXDggNauXauKFSsSRhVAeHi4Dh8+rGnTpungwYOqVq2a6tevry5duujDDz9Uy5YtCaOKqCtXrsjf319z587VoUOHVKtWLTVt2lSNGjXSu+++q02bNumuu+7ydJklVvZ7RK1bt06NGjVSeHi4GjVqpO+//14ffvih4uLi1KxZM8XGxuqzzz7T2bNnOcAtggIDA3XmzBl9/vnn+v3331WvXj01b95cd999tz744AMdPXqUMCqfcjubwM/PT8nJyZo6daoOHz6smJgYtWnTRqGhoZozZ446derE54zFrg7Ss7KyFBAQoNOnT+vvf/+7zp07p3r16ikhIUFpaWn6+uuvdeedd6p8+fIerLp4yszMdFxCv3v3btWoUUNXrlzRpUuXtHr1as2YMcPpeHbfvn2O41nCKNfZ90UpKSkKCAiQn5+ffvzxRwUHB8vf318+Pj56/fXXdfLkSVWoUEFVq1ZVr169NHnyZK1bt05t27b19CyUOrmdERgQEKCqVavq22+/1cGDB3XnnXdq8ODBqlevnl5//XW3P2yBMAqWs9ls2rFjh86cOaNOnTopOjpa7733njZt2qQ777xT9957r2ParVu3Kjk5mS8TFtq4caPef/99vf/++6pdu7YaNWqkDz/8UAMGDFD37t0l/XG6/8KFC+Xl5cVNUa9y9Y49+xeFrKwslS9fXv/4xz+0bNkytW/fXu3atXOcTbNs2TKlp6d7pG44s/fb2bNndenSJVWuXFnR0dFKSEjQ/v37Vb9+fbVv315ly5aVJIWFhRGYF6Ls21VSUpLeeOMNtWzZUqNHj1aPHj3Upk0bZWRkOH1xO3DgAJd7FQH2benUqVPKysqSj4+PYz/47bffqkWLFmrbtq3KlCkjm82miIgIXblyxdNlFwvZt4vk5GSlp6crMjJSHTt21KVLl7R3717FxcWpYcOGqlixovbt26fIyEgFBgZ6uPLSJXs/nT59WpJUvnx5de/eXQEBATp06JD69OmjatWqKTw8XFu2bFG5cuXk5+fnybKLpe3bt2vmzJl68cUX9dFHH2nXrl169tlnFRsbq+rVq+vtt9/Wfffd53Q8u3jxYvn4+HDz+BtkD6Jef/111ahRQzExMXrjjTf0xBNPqFmzZurevbv27t2r5s2bq127doqOjtbly5dVr149QkAPuPppxCdPnpSvr68aN26sMWPG6Pfff1dmZqZq1qzpeM/58+fl6+vr1joIo+ARP//8s5YuXapbbrlF9erV0+DBgzV79mxVrlxZly9fVkpKipYtW6aNGzdq0qRJHDhZqGnTpgoNDdUXX3yh3r17q3fv3kpOTtbChQvl5+enixcv6pdfflFSUpImT54sLy8vrrXPxsvLS8ePH9eqVas0aNAgp+vgvby8ZIxRbGysateu7bTMPvvsMx0/fpynixQRNptNmzZt0owZMyT98UvRiBEj1KhRIzVp0sQxXUZGhubOnatjx46pUaNGniq3RMt+RtSsWbOUnJysyMhIxyV5Y8eOdZydmZaWpiNHjui///2vkpKS9MQTTzja4EcNz7DfuPb9999XYGCg0tPT9ac//Uk333yz+vfv7+jbzMxMzZ49W4cOHdKIESM8XHXRl327mD17tnbv3u243LtBgwa66667HJ/NxhhdunRJ8+bNU3BwsMqVK+fh6kuP7P00depU/f7770pMTFSPHj0UFxenHj16OKbNysrS6dOn9d///lc1a9bMcUNzXJt9WWdkZGjs2LG6cOGCJk+e7Ag6+vfvr/Pnz2vRokUKCAhQWlqafvzxR507d47jWTfx8/NTbGys1q9fry+//FJ//vOf1axZM0lS586d1alTJ8fyNcZowYIFSkxMVHR0tAerLp2yP+xi7dq1io2NVWpqquMJt507d5Ykpaen68yZM/rwww+Vnp6uXr16ubUOwih4RIcOHbR7925t3rxZnTt3VqtWrZSamqp33nlH8+fPV0BA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jTcURImIiIj8hhRGSb1h2dGwffv2HDhwgK1btwKwcOFCsrKyWLRoEXZ2dto1T0REDCaTiby8PF588UX27dtnLOd2d3fH09OTxMREY6yNjQ2tW7fG1taWc+fOGWMdHBysUruIiIjI7UphlNQrlhlS7dq1Iy4ujokTJ3L27FkWLlxoBFG2trbWLlNERG4hJpOJgIAA/vGPfxAXFwdcDp7atWtHQkICBw8erDa2cePGODs7U1VVpd6DIiIiIjeBekZJvZSbm8tHH31EQUEBM2fOVBAlIiKGmgKkvLw8IiMj2bFjB9OnT6dnz54UFBSwdOlSiouLufvuu+nQoQNHjx7lq6++4s0336Rly5ZWegQiIiIitzeFUVJvFRYW4uzsjI2NjYIoEREBMHZWLS0txWw24+zsbBzLyclh8+bNfP7550ydOpXevXtTUFBAVFQUycnJFBQU4O7uzrPPPlutl5SIiIiI/LYURkm9Z3njISIiApCRkcHixYtxdHQkKCgId3d3unbtCkBFRQUffvghO3fu5OWXX6ZPnz5cunQJk8lEYWEhDg4OODo6WvkRiIiIiNze7KxdgMj/SkGUiIhYmM1mYmJiSE1Nxd7enqKiIsrLy3F1daVt27YMHDiQwMBAGjZsyJIlS3BycqJbt24AuLm5Wbd4ERERkTuEZkaJiIjIbSU3N5eoqCiysrJo3rw5wcHB7N27l6NHj5KWloarqyvNmjXj5MmT5OfnM2fOHPz9/a1dtoiIiMgdQzOjRERE5Lbi7u7O8OHD2bx5M0lJSbRo0YLHHnsMgOPHj5OTk8Pu3btp1KgR+fn5mhElIiIiUsc0M0pERERuS5aG5cePH6dHjx6MHDnSOFZZWUlVVRXFxcU0atTIilWKiIiI3HkURomIiMhtKzc3l8jISFJSUujRowehoaEA2oVVRERExIoURomIiMhtzRJInTp1invuuYewsDBrlyQiIiJyR9M2ZCIiInJbc3d3Z+TIkbRo0YLk5GQKCgqsXZKIiIjIHU0zo0REROSOkJubC1wOp0RERETEehRGiYiIiIiIiIhIndEyPRERERERERERqTMKo0REREREREREpM4ojBIRERERERERkTqjMEpEREREREREROqMwigREREREREREakzCqNERERERERERKTOKIwSERERuQV99913REVFUVlZae1SRERERH5TCqNEREREbjEpKSksWbKE5s2bY2dnV+vbhYWFsWHDht+khvPnzxMWFkZMTMxvcj4RERERi9q/uhERERG5hWRmZrJ161bi4+PJycnBzs6OVq1a0adPHwYNGoSDg4O1S7zK3r17ycvLY9iwYdccU1RUxOLFixkzZgy9e/e+JWoSERER+S2ZqqqqqqxdhIiIiMiNOHz4MH//+9+xt7enf//++Pr6UllZSVJSEgcPHuTBBx/kueees3aZV3nrrbdIT09n2bJl1xzz008/kZWVxcCBA2/4/OXl5dja2mJra/s/11RVVUVFRQV2dnbY2GgyvYiIiPx2NDNKRERE6pXz58+zZMkSmjZtymuvvYaHh4dxLCQkhMzMTA4fPvw/3YcliLHG7KrOnTvTuXPnWo83m81UVlbi4ODwm9ZrMpluydllIiIiUv9pZpSIiIjUKytWrGDXrl3MmzePDh06/OLYPXv28PXXX5Oenk5xcTFeXl4MGTKEwYMHVxv34osv4uvrS0hICJ988gnp6emMGTOGYcOG1focAN9//z1RUVGcOnUKk8mEt7c3w4YNo1+/fvz1r38lMTGx2vimTZsaM5IqKirYvHkz33zzDRcvXqRRo0b07duX0aNHY29vb9wmLCyM4OBg2rdvz+bNm8nIyGDq1Kn07NmTsLAwHnvsMcLCwgAoKSlh/fr1xMXFkZOTg7OzM61bt+bJJ5/Ez8/vF2s6f/48U6ZM4YUXXuDBBx80jsfGxrJ+/XoyMzNp3rw5o0ePJi4ujsTEROOx/PTTT8ydO5c5c+ZUC9audc6zZ8/yySefkJCQQHl5Ob6+vjz22GMEBAQYYyorK6t9fRo0aEDLli15/PHHuffee3/x/4GIiIjcWjQzSkREROqVQ4cO4eXldd0gCmDnzp34+voSEBCAra0thw4d4l//+hdms5mQkJBqY8+dO8c777zDQw89RFBQEN7e3jd0jpiYGJYvX46Pjw+hoaG4uLhw6tQpfvjhB/r168fIkSMpLi7m4sWLjBs3DgBHR0fg8uymt99+m6SkJIKCgvDx8SEtLY3o6GjOnTvHn/70p2q1JiQksH//fkJCQmjYsCHNmjWr8fGvWLGCAwcOEBISgo+PDwUFBSQlJXH27Fn8/Px+saaaHDlyhEWLFuHj48MTTzxBYWEh//znP2nSpMl1vxfXkp6ezuzZs2ncuDGhoaE0aNCA/fv3s2DBAqZPn07Pnj0B2LhxI1FRUQwcOJB27dpRUlJCSkoKJ0+eVBglIiJSzyiMEhERkXqjuLiY7OzsajNmfsncuXOrLTULCQlh/vz5REdHXxVGZWZm8pe//IVu3brd8DmKi4v54IMPaNeuHXPmzKk23jIJ/d5776Vx48YUFRXRv3//avexd+9e4uPjmTt3Lh07djQ+7+vry4oVK0hOTq4Wvp07d84IhX7J4cOHCQoK4umnnzY+9+ijjxr//qWaarJ27Vrc3d2ZN28ezs7OAPj7+/PGG2/QtGnT696+JqtWrcLT05OIiAhjBlhwcDCvvfYaa9euNcKow4cP071791uyF5iIiIjcGHWjFBERkXqjpKQEACcnp1qNvzIUKi4uJj8/H39/f7KysiguLq42tlmzZlcFUbU9R3x8PCUlJTz66KNX9VkymUzXrfPAgQP4+Pjg7e1Nfn6+8adLly7A5WVvV/L3979uEAXg4uLCiRMnyM7Ovu7Y68nJyeH06dMMGDDACKLgcqBVm1pqUlhYSEJCAn369KGkpMR43AUFBXTt2pWMjAyjdhcXF9LT08nIyPifH4uIiIhYl2ZGiYiISL1hCaEsodT1JCUlsXHjRo4dO0ZZWVm1Y8XFxdVClWstdavNOTIzMwFo1apVrR/LlTIyMjh79iwTJkyo8XheXl61j69V63978sknWbZsGZMnT8bPz4/u3bszYMAAvLy8brjGCxcuANC8efOrjnl7e3Pq1KkbPmdmZiZVVVWsX7+e9evX1zgmLy+Pxo0bExYWxoIFC3jppZfw9fWlW7du9O/fn9atW9/w/YqIiIh1KYwSERGResPZ2RkPDw/S09OvOzYzM5N58+bh7e3N008/TZMmTbCzs+P7778nOjoas9lcbXxNO8fd6Dl+raqqKlq1alVtOd2VPD09r1trTe6//346depEbGwsR44cYdu2bWzZsoUZM2bQvXv3/7nua7nWbLD//npZPn7kkUfo2rVrjbexhF/+/v68++67xMXFceTIEb788kuio6OZOHEiQUFBv2H1IiIicrMpjBIREZF65b777mP37t0cO3aM9u3bX3PcoUOHqKio4JVXXqkW5vz3krdfUttzWAKTtLS0GmcOXY+Xlxepqancc889tVrWdyM8PDwIDg4mODiYvLw8XnnlFSIjI284jLL0hLLMArvSuXPnqn3s4uICQFFRUbXP//zzz9U+tszQsrW1rVUTcldXVwIDAwkMDKS0tJQ5c+awceNGhVEiIiL1jHpGiYiISL0yfPhwGjRowHvvvUdubu5VxzMzM/nss8+wsbn8MsfSQBwuL6uLiYmp9X3V9hz33nsvTk5OREVFUV5eXu3Ylbd1dHS8qlcVQJ8+fcjOzuaLL7646lh5eTmlpaW1rtnCbDZfdV+NGjXCw8ODysrK69b03zw8PGjTpg1fffVVtfHx8fGcOXOm2timTZtiY2PD0aNHq33+888/v6qezp07s3v3bnJycq66z/z8fOPfBQUF1Y45Ojri5eVFRUXFdWsXERGRW4tmRomIiEi90rx5c1566SUWL17M1KlTGTBgAL6+vlRWVpKcnMyBAwd48MEHefjhh7Gzs+Nvf/sbgwYNorS0lC+++AI3N7cag4+adO3atVbncHZ2Zty4cbz33nu8+uqr9OvXDxcXF1JTUykrK2PKlCkA+Pn5sW/fPlavXk3btm1xdHQkICCA/v37s3//flasWEFCQgIdO3bEbDZz9uxZ9u/fz6xZs2jbtu0NfZ1KSkp4/vnn6d27N61bt8bR0ZEff/yRlJSUassBr1VTTcaMGUNERASzZ88mMDCQwsJCduzYga+vb7XAzNnZmd69e7Njxw5MJhNeXl4cPnz4qt5XAOPHj2f27NnMmDGDoKAgmjVrRl5eHseOHSM7O5sFCxYAMG3aNPz9/fHz88PV1ZWUlBQOHjxIcHDwDX1dRERExPoURomIiEi9ExAQwMKFC9m6dStxcXHs3LkTe3t7o+9SUFAQ9vb2TJs2jfXr17NmzRrc3d0ZPHgwbm5uLF++vFb34+3tXetzDBw4EDc3N7Zs2cKmTZuwtbWlZcuWDBs2zBgzePBgTp8+TUxMDNHR0TRt2pSAgABsbGyYOXMm0dHRfP3118TFxeHg4ICXlxdDhw6lRYsWN/w1atCgAcHBwRw5coTY2FjMZjPNmzdnwoQJDB48+Lo11aRbt25MmzaNTz75hHXr1uHl5cULL7xAXFwciYmJ1cb+/ve/59KlS+zatQs7Ozv69OnD2LFjmT59erVxPj4+vPXWW2zcuJGYmBgKCgpo1KgRbdq0YdSoUca4IUOG8N133xEfH09FRQVNmzZl9OjRDB8+/Ia/NiIiImJdpqor546LiIiIiNygZcuWkZiYyLJly6xdioiIiNQD6hklIiIiIiIiIiJ1RmGUiIiIiIiIiIjUGYVRIiIiIiIiIiJSZ9QzSkRERERERERE6oxmRomIiIiIiIiISJ1RGCUiIiIiIiIiInVGYZSIiIiIiIiIiNQZhVEiIiIiIiIiIlJnFEaJiIiIiIiIiEidURglIiIiIiIiIiJ1RmGUiIiIiIiIiIjUGYVRIiIiIiIiIiJSZ/4fvEWk/CaKyqwAAAAASUVORK5CYII=\n"},"metadata":{}}],"source":["# Plot the differences in characteristics between positive and negative tweets\n","plt.figure(figsize=(12, 8))\n","sns.barplot(x=diff_df_sorted.index, y='Différence Relative', data=diff_df_sorted, palette='coolwarm')\n","plt.title('Différences relatives des caractéristiques entre tweets positifs et négatifs', fontsize=15)\n","plt.xlabel('Caractéristiques')\n","plt.ylabel('Différence Relative (%)')\n","plt.xticks(rotation=45)\n","plt.tight_layout()\n","plt.show()"]},{"cell_type":"code","execution_count":29,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":2656},"id":"73Tukj7VWjJC","executionInfo":{"status":"ok","timestamp":1751537533960,"user_tz":-120,"elapsed":26718,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"3394f45a-f5b7-41c6-c942-749fd25bd662"},"outputs":[{"output_type":"stream","name":"stdout","text":["Analyse de 63 tokens spécifiques...\n","\n","Tokens les plus discriminants entre tweets positifs et négatifs:\n","Token 'I':\n"," - Dans tweets positifs: 35.47%\n"," - Dans tweets négatifs: 49.62%\n"," - Différence absolue: 14.15%\n"," - Orientation: Négatif (-33.3%)\n","\n","Token 'you':\n"," - Dans tweets positifs: 19.80%\n"," - Dans tweets négatifs: 10.60%\n"," - Différence absolue: 9.21%\n"," - Orientation: Positif (60.6%)\n","\n","Token 'my':\n"," - Dans tweets positifs: 14.27%\n"," - Dans tweets négatifs: 21.13%\n"," - Différence absolue: 6.86%\n"," - Orientation: Négatif (-38.7%)\n","\n","Token 'not':\n"," - Dans tweets positifs: 3.94%\n"," - Dans tweets négatifs: 9.00%\n"," - Différence absolue: 5.06%\n"," - Orientation: Négatif (-78.2%)\n","\n","Token 'good':\n"," - Dans tweets positifs: 7.48%\n"," - Dans tweets négatifs: 3.56%\n"," - Différence absolue: 3.92%\n"," - Orientation: Positif (71.0%)\n","\n","Token 'no':\n"," - Dans tweets positifs: 2.67%\n"," - Dans tweets négatifs: 6.51%\n"," - Différence absolue: 3.83%\n"," - Orientation: Négatif (-83.5%)\n","\n","Token 'love':\n"," - Dans tweets positifs: 5.62%\n"," - Dans tweets négatifs: 2.05%\n"," - Différence absolue: 3.58%\n"," - Orientation: Positif (93.3%)\n","\n","Token 'sad':\n"," - Dans tweets positifs: 0.18%\n"," - Dans tweets négatifs: 3.38%\n"," - Différence absolue: 3.21%\n"," - Orientation: Négatif (-180.0%)\n","\n","Token 'can't':\n"," - Dans tweets positifs: 2.46%\n"," - Dans tweets négatifs: 5.51%\n"," - Différence absolue: 3.05%\n"," - Orientation: Négatif (-76.5%)\n","\n","Token 'don't':\n"," - Dans tweets positifs: 2.76%\n"," - Dans tweets négatifs: 5.52%\n"," - Différence absolue: 2.75%\n"," - Orientation: Négatif (-66.5%)\n","\n","Token 'your':\n"," - Dans tweets positifs: 5.17%\n"," - Dans tweets négatifs: 2.44%\n"," - Différence absolue: 2.73%\n"," - Orientation: Positif (71.6%)\n","\n","Token 'so':\n"," - Dans tweets positifs: 7.65%\n"," - Dans tweets négatifs: 10.27%\n"," - Différence absolue: 2.62%\n"," - Orientation: Négatif (-29.3%)\n","\n","Token 'me':\n"," - Dans tweets positifs: 8.54%\n"," - Dans tweets négatifs: 10.90%\n"," - Différence absolue: 2.36%\n"," - Orientation: Négatif (-24.3%)\n","\n","Token 'great':\n"," - Dans tweets positifs: 3.03%\n"," - Dans tweets négatifs: 1.03%\n"," - Différence absolue: 2.00%\n"," - Orientation: Positif (98.6%)\n","\n","Token 'bad':\n"," - Dans tweets positifs: 0.71%\n"," - Dans tweets négatifs: 2.63%\n"," - Différence absolue: 1.92%\n"," - Orientation: Négatif (-114.6%)\n","\n"]},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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kdVqdep35swZbd68WdK1YUky48knn3R62OChQ4f00ksvScrYMenj46NGjRrpzJkzeuuttxztSUlJGjt2rA4dOpRmnuzarsOGDZMkxcTEON11nvq8yqipU6e6vAP0q6++kuS8XceNGyeLxaLY2Fh9++23Tv2TkpIc8xRk9gc3/vvf/3Y6v9evX68pU6Zk23rsd4G7Km5L0rvvvuvyGHO139Jj/0Jv69atLqfbh8EYM2aM00MTT5w44TjWXD2PIivGjh0rf39/Pfnkk1qyZEma6VevXtXixYvdDs+VUTfatlnZxzdapjv27fvCCy843eV+4cIFjRw5UsYYPfbYY1keEulmlStXToMHD9bhw4fVt29f/fXXX2n67N+/X5999tkNl2Xfru+//77TZ4i4uDjHl3bXy+p2tevXr58sFos+/fRTt0O5SDf33nrlyhXt3LlTFSpUUERERJbiBAAgwwwAALhlDBw40EgyMTExTu3Hjh0zERERRpIJDw83ffr0Mffcc4/x9PQ0kszrr7+eZlmSzG233WY6depkAgICTOfOnU337t1NcHCwkWRatmxpbDZbhuKaNm2akWQkmW7dupmBAwe6/Dl58mSaeUePHm0kmYCAANOlSxfTvn174+XlZTw9Pc3SpUsztX1GjRplJJmIiAjzwAMPmIcffti8+uqrjuk7duwwJUqUMJJMtWrVTN++fU2TJk2MJOPl5WUWLFjgtLxDhw4ZSaZ58+ZO7fHx8SYqKspIMs8++6yj/a+//jJ169Y1kkxwcLBp0aKF6devn+nYsaOpUKGCkWRGjx7ttCz7PnNlzpw5afa3fXuVK1fOdOrUyfTr18+0aNEi3X3tyrfffmskmYEDB6aZNn78eCPJeHh4mDvuuMP07NnT9OjRw9StW9d4enqaYsWKOfouXbrUSDLFihUz99xzj3nggQdMx44dTVBQkJFkOnfunKF47Nu6YcOG5o477jDBwcGme/fupnPnziYgIMBIMv37908zX/PmzY0kc+jQIaf21atXGw8PDyPJNGrUyHTr1s3cdtttpmTJko7zaM6cOY7+2bVdjTGmZ8+eRpIpUqSIue+++xzn1R133GEaNmzoMl5Xx0GxYsWMh4eHqVu3runVq5fp2bOniYyMNJJMSEiI2bt3r1P/KVOmGIvFYiSZO++80/Tt29e0adPGlC5d2mmfGWNMeHi4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Vrt375Z07W7zOnXqKCgoSM2bN9eRI0ckSUuXLlWpUqXUtGnT3EkIKGQoogMAAAAAAAA5bObMmapatapq166tuLg4DR482GW/oUOHavHixUpMTNSJEye0YsUKtWnTRpIUHR2t7du369y5c1q/fr2io6OVkJCgGTNmaMKECbmZDlCo5OsHi8bFxWnZsmU6dOiQzp49qyeffFINGjRwTDfGaOHChVq7dq0uXbqk6OhoDRkyRKGhoY4+Fy9e1OzZs/Xzzz/LYrHorrvu0qBBg/jTFwAAAAAAAGSbkSNHauTIkdq3b5+WLFmiUqVKuezXsmVLjRkzRpGRkUpOTla7du3Up08fSVJUVJSGDBmiHj16KCwsTJMmTdLEiRM1fPhw7du3T6+99posFkuaGhmAm5Ov70S/evWqKlasqIcfftjl9C+++EIrVqzQI488okmTJsnX11exsbFOD2548803dfToUT333HN65plntHv3bs2aNSu3UgAAAAAAAEAhUrVqVVWvXl3/+Mc/0kxLSEhQnz591K9fPx04cEBnzpxRQECARo0a5egzaNAgrV69WnPnztXRo0d1/Phxde/eXSNGjNBrr72mV199VSNHjpQxJjfTAgq0fH0net26dVW3bl2X04wx+uqrr9S9e3fVr19f0rVv/B555BFt3bpVTZo00bFjx7Rt2za98sorqly5siRp8ODBeuWVVzRgwACFhITkWi4AAAAAAAAoHJKSklyOiX7kyBFduXJFDz/8sDw8PFS8eHENGDBADzzwQJq+VqtVMTExevfdd3X69GklJycrPDxckmSz2XT69GmVLFkyx3MprNq3X5kr6/H29pbNZsvRdaxY0S5Hl18Q5Os70dPz999/KyEhQbVr13a0BQQEqEqVKtq7d68kae/evSpSpIijgC5JtWrVksVi0f79+3M9ZgAAAAAAABQsly5d0oIFC3Tu3DkZY7R7925Nnz5dLVq0SNO3SpUqKlKkiObOnaukpCRduHBBn3zyiWrWrJmm78yZM9WpUydFREQoJCREVqtVu3btUlxcnKxWq4oXL54L2QGFQ76+Ez09CQkJkqRixYo5tRcrVswxLSEhQUWLFnWa7unpqcDAQEcfV2w2m9M3QBaLRf7+/tkSNwAAAAAAAAoOi8WipUuX6qWXXpLValXJkiXVoUMHPfnkk5Kk/v37q0GDBnr88cdV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AAAAAAAAAAB5JctjokdGRmrVqlUqV66ctm3bJqvVqvr16zumx8fHO92pDgAAAAAAAABAfpPlO9H79+8vT09Pvf7661q7dq06deqkChUqSJJSUlK0adMmVatWLdsCBQAAAAAAAAAgt2X5TvSyZctq2rRpOnbsmAICAlS6dGnHtKtXr2rw4MEKDw/PliABAAAAALjVVPvPf3J8HRaLRaGhoYqPj5cxJsfXBwAA0spyEV2SvLy8VLFixTTt/v7+TkO7AAAAAAAAAACQH91UET0lJUXff/+9fvnlF506dUqSVLJkSdWrV0/NmjWTh0eWR4sBAAAAAAAAACDPZbmIfvnyZcXGxmr//v3y9/dXmTJlJEk7d+7U5s2btWrVKj377LMKCAjItmABAAAAAAAAAMhNWS6iz5s3TwcPHtTgwYN1zz33yMvr2qKSkpL0zTffaM6cOZo/f74GDx6cbcECAAAAAAAAAJCbsjzeypYtW9S2bVvde++9jgK6dG2c9LZt26pNmzbavHlztgQJAAAAAAAAAEBeyHIR/eLFiwoLC3M7vVy5crp48WJWFw8AAAAAAAAAQJ7LchG9bNmy+umnn9xO/+mnnxzjpAMAAAAAAAAAkB9luYjetm1b7dixQ6+88oq2b9+uv//+W3///be2bdumV155RTt27FC7du2yM1YAAAAAAAAAAHJVlh8seu+99+rcuXP64osvtG3bNueFenmpR48eatu27c3GBwAAAAAAAABAnslyEV2SevXqpXbt2mnHjh06deqUJKlUqVKqVauWihYtmi0BAgAAAABuTdX+858cXb7FYlFoaKji4+NljMnRdQEAALhzU0V0SSpatKiaNm2aHbEAAAAAAAAAAHBLueki+s8//6xff/1VJ0+elHTtTvS6deuqXr16Nx0cAAAAAAAAAAB5KctF9EuXLum1115TXFycPDw8VLx4cUnSjh07tHr1alWrVk1PPfWUihQpkm3BAgAAAAAAAACQm7JcRJ8zZ452796tBx54QG3btpWfn58k6cqVK1q1apU+/fRTzZkzRyNHjsy2YAEAAAAAAAAAyE1ZLqJv3bpVbdu21X333efU7ufnp/vuu0+nTp3Sd999d9MBAgAAAAAAAACQVzyyOqOXl5fCwsLcTg8LC5OX100PuQ4AAAAAAAAAQJ7JchH9rrvu0qZNm5SSkpJmWnJysjZu3KiGDRveVHAAAAAAAAAAAOSlLN8q3qxZM82ePVvPPfecWrdurbJly0qS4uPjtWbNGiUlJalZs2Y6ePCg03yVKlW6uYgBAAAA4BZR7T//ydHlWywWhYaGKj4+XsaYHF0Xctbhw4f13HPP6ZdffpG/v78efvhhDR8+PE2/48ePq0WLFk5tV69eVatWrfTBBx9Ikl5++WXNnz9foaGhevvttxUZGSlJOnLkiIYMGaLly5c7nlsGAABuXpaL6C+88ILj/wcOHHDZJyYmJk3bggULsrpKAAAAAADyneTkZA0aNEj33nuv5syZoyNHjqhv374KDQ1Vt27dnPqWK1dO+/btc7y22WyqV6+eunTpIknatm2bVq5cqU2bNmnhwoWKjY3V3LlzJUnjx49XTEwMBXQAALJZlovow4YNy844AAAAAAAokA4cOKADBw5ozJgx8vb2VpUqVdS3b1998sknaYro11u5cqVSUlLUoUMHSdfuNq9Tp46CgoLUvHlzffTRR5KkpUuXqlSpUmratGmO5wMAQGGT5SL69X9eBgAAAAAA0rI/Syz1kDwpKSnavXv3DeedN2+eHnjgAfn5+ckYo+joaL366qs6d+6c1q9fr+joaCUkJGjGjBlavHhxjuUAAEBhluUHiwIAAAAAgBurXLmyKlSooNdee01Xr17Vnj17NH/+fF24cCHd+Y4dO6b169dryJAhjraoqCgNGTJEPXr00Lp16/T8889r4sSJGj58uPbt26eePXuqV69e2rJlS06nBQBAoZHlO9EBAAAAAMCNeXt7a/bs2XrhhRdUr149hYaGqnfv3vr444/TnW/BggWqWbOm6tSpo/j4eEf7oEGDNGjQIEnSpk2bdPz4cXXv3l0NGjTQZ599JmOMevXqpc2bN8tiseRobgAAFAYU0QEAAAAAyGFRUVGaN2+e43VsbKwaNmzotn9KSooWLFigUaNGue1jtVoVExOjd999V6dPn1ZycrLCw8MlXXsg6enTp1WyZMnsSwIAgEKKIjoAAAAAADksLi5OFStWlJeXl9asWaP58+drwYIFbvt///33OnPmjLp27eq2z8yZM9WpUydFREQoOTlZVqtVu3btksVikdVqVfHixXMgEwAACh+K6AAAAAAA5LDly5frww8/1NWrV1W9enXNnj1b1atXlyT1799fDRo00OOPP+7oP2/ePHXs2FFFixZ1ubz9+/dr9erVWrZsmSTJ09NTkyZN0oABA2SxWDR58mR5enrmfGIAABQCFNEBAAAAAMhh48aN07hx41xOczU2+qxZs9JdXpUqVbRixQqnti5duqhLly5ZDxIAALjkkR0LSU5O1qJFizR69GgNGDBAo0aN0qeffiqr1ZodiwcAAAAA5HOHDx9W//79Vb16ddWrV09vv/22274XLlzQiBEjFBkZqTJlymjq1KlO019++WXVqFFDrVu31t69ex3tR44cUZs2bXTlypUcywMAABQ+2XIn+ocffqgdO3aoW7duKl68uI4dO6YlS5YoISFBw4cPz45VAAAAALjFVPvPf3J8HRaLRaGhoYqPj5cxJsfXh5yRnJysQYMG6d5779WcOXN05MgR9e3bV6GhoerWrVua/s8995wSEhK0detWeXh4qGXLlipXrpx69uypbdu2aeXKldq0aZMWLlyo2NhYzZ07V5I0fvx4xcTEyM/PL7dTBAAABVim7kRP/Q1/alu2bNGIESPUokUL1alTRx07dlT37t31008/ZUuQAAAAAID868CBAzpw4IDGjBkjb29vValSRX379tUnn3ySpm9iYqKWLVump59+WsWKFVNkZKQGDx6s+fPnS7p2t3mdOnUUFBSk5s2b68iRI5KkpUuXqlSpUmratGmu5gYAAAq+TBXRJ06cqBkzZujs2bNO7SEhIdq1a5fjdUpKivbu3avg4OBsCRIAAAAAkH+lpKRIktNfE6SkpGj37t1p+h44cEBWq1U1atRwtNWoUcPRNzo6Wtu3b9e5c+e0fv16RUdHKyEhQTNmzNCECRNyOBMAAFAYZaqIPnXqVCUnJ+uJJ57QkiVLZLPZJEkDBgzQ0qVLNWrUKD3//PN67LHH9Msvv2jgwIE5EjQAAAAAIP+oXLmyKlSooNdee01Xr17Vnj17NH/+fF24cCFN30uXLikgIEBeXv8bfbRYsWK6ePGiJCkqKkpDhgxRjx49tG7dOj3//POaOHGihg8frn379qlnz57q1auXtmzZkmv5AQCAgi1TY6KXKFFCTzzxhH7//Xd98MEHWrt2rQYMGKCGDRtq5syZ+uWXX3T27FkVK1ZMd9xxh4oWLZpTcQMAAAAA8glvb2/Nnj1bL7zwgurVq6fQ0FD17t1bH3/8cZq+RYoUUWJiopKSkuTt7S1JOn/+vAIDAx19Bg0apEGDBkmSNm3apOPHj6t79+5q0KCBPvvsMxlj1KtXL23evFkWiyV3kgQAAAVWlh4sGh0drVdeeUVr167V+++/rxUrVmjQoEG6++67szs+AAAAAEABEBUVpXnz5jlex8bGqmHDhmn6Va5cWd7e3oqLi1OdOnUkSbt27VJ0dHSavlarVTExMXr33Xd1+vRpJScnKzw8XJJks9l0+vRplSxZMocyAgAAhUWmhnNJzWKxqHXr1po+fboqVaqkZ599Vv/+979d/jkeAAAAAKBwi4uL0+XLl2W1WvXVV19p/vz5Gj16dJp+/v7+6ty5s6ZMmaLz589r3759mj17tvr27Zum78yZM9WpUydFREQoJCREVqtVu3btUlxcnKxWq4oXL54bqQEAgAIu00X0DRs26M0339SUKVP0+eefy9PTUwMHDtSrr76qU6dO6fHHH9eXX36p5OTknIgXAAAAAPKVxMRENWnSRNWqVZMknTp1SiNHjlS9evUUFRWltm3batWqVekuo0GDBqpcubKqVq2qqlWrOpYlScnJyRo1apSqVaumrl276sSJE45pW7duVY8ePZwe6JlXli9frvr166t69ep69913NXv2bFWvXl2S1L9/f7355puOvrGxsQoKClK9evXUpEkT9e3bVz179nRa3v79+7V69WoNHTpUkuTp6alJkyZpwIABGjBggCZPnixPT8/cSxAAABRYmRrOZcmSJfrss8/UpEkTBQcHa8WKFdq+fbtiYmJUrlw5jR8/Xj///LM+/PBDrVmzRg8++KDuuOOOnIodAAAAAG55r732msqVK6czZ85IuvbgzJo1a2r8+PEqW7as1qxZo+HDh+urr75SZGSk2+W89dZbateuXZr2r776SseOHdO2bdv0r3/9SzNnztTEiRNls9n0/PPPa+bMmbfEuODjxo3TuHHjXE67fmz0oKAgvf3227JYLAoNDVV8fHyaLwKqVKmiFStWOLV16dJFXbp0yd7AAQBAoZepO9FXr16tLl26aPjw4XrwwQc1duxYxcXF6fjx444+9erV0+uvv65WrVo53UkAAAAAAIXNjh07tG7dOo0YMcLRFh4erqFDhyosLEweHh5q27atKleurF9++SVL6/jjjz/UoEED+fr66u6779aRI0ckSe+8847atGmjKlWqZEsuAAAAhVWmiug2m03+/v6O135+fpKkpKQk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gVk9p8fdT8lrFXfv3rWLnJL7p/30sOPArJ7T07afkq/nUR6riF6mTBm99NJLMpvN2rJli5577jl5eXk90M/FxUXPPvusatWq9TirlyS1a9dOjRs3fmQfT0/PVK3L3d1d58+fT9F28+ZN6zLL/5a25H1y5sz50FHokvTKK6+obdu21tuWJ9D9I9SlezvFctCT3P39LEwm00Pb7969m+p2y4vqfklJSQ9tT0xMtB6cpqb9gZzuK2o/LJ70aJckc1JS6vqbzXroWmy0J19H8m30uPspo7fBw/JPTU6P037/cyQ1z73k63ysx/0X+ymj2u/PNzWvpxTrewpzepz2DHmP+H//5n0v+Qf1U/G+9/+e1Ht58vztJafk/imn5J+zydvvl5VySm275eDO8viW125Wz+lx95PlOZB8G2T1nFIbe/L25PnbS07JPSony32Sf35l9ZxSu58e9vy3yKo5Par9/pySfwY87PglK+Zkkdr99KjngKX9fk97To+K/f725ANW7CUni9TklPw40F5ySu6fcrLkb8nDHnK636NysrQnf/1n9Zwe5lE5pfY4MCvllNr25Dklz99eckouM3N6VB0yuccqolevXl3Vq1eXdG9DtGjRQmXLln2cVfyjPHnyKE+ePOmyrnLlymnlypW6efOmdcqWY8eOKWfOnCpWrJgkqWzZsvrjjz9S3O/YsWMqV66czfU6OTml+HUEAAAAAAAAAGCf0nxh0cGDB6d7Af1xRUREKDg4WBEREUpKSlJwcLCCg4MVFxcn6d4FQosVK6Y5c+YoODhYQUFBWrJkiV566SVrEbxly5YKDw+Xn5+frl27ps2bN2v//v16+eWXMzM1AAAAAAAAAMBT4F9fWPTGjRu6dOmSYmJiHjr8vVGjRv/2IWxaunSpfv/9d+vtd999V5Lk6+urSpUqyWg06r333tO3336rDz/8UM7OzmrUqJG6detmvY+Hh4fee+89LVy4UBs2bFCBAgU0aNAgVatWLcPiBoDs6ocfftCyZct05swZNWnSRN9///0j+y9atEjz5s1TaGioPDw85Ovrq5deekmJiYkaOXKktm3bpvLly2v+/PkqXLiwJOnQoUOaMmWKli9f/tBrFwAAAAAAADyONBfRTSaTvvrqKx08ePCRc8dkZBF9yJAhGjJkyCP7FCpUSO+///4j+1SqVElTp05Nz9AAAA/h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iZGHh0eWfx4kl3xbbNmyRdeuXVNsbKwaNWqkSpUqKTY2Vps3b9batWtVrFgxeXp6Ki4uTpcuXdLMmTOt2yAr1EWyIoroyFQmk0lz5syRl5eXevToobt37yoqKkr79+9XmTJltGrVKgUHBytXrlyKiYnR2LFj9eyzz2Z22BkiIiJC8+bNU40aNdSmTRtFRkZq3LhxypUrl0JCQtS/f3+99NJL1v73X2zEXlhOw7O8+V+5ckWffPKJSpQooeHDh8vNzS3FB4Hl76zyhToqKkoffvihKlasqM6dOys+Pl4ffPCBOnToIKPRqIiICO3YsUOvvfaaSpQoIV9fXzVq1EhxcXE6fvy4Jk6caLdFVcs+jIuLU0BAgL766is1aNBAPj4+1jNPHlU8sieXLl3SN998Iw8PD3Xp0kVFixbN7JAyhKV4YJkLPvnIicOHD2v9+vXKlSuXfHx87LaAIv3vfSwwMFAbN25UZGSkihYtqkaNGqlGjRpKTEzU3r17tXXrVrm5uek///lPihHp9sCyDY4cOaK1a9fq9u3bcnV1Vdu2bVWtWjUlJSVp1apV2rx5s/r27atmzZpldsgZZtGiRfr999/VokULeXp6au7cuWrSpInatWtn/QFp4cKF2rBhg8aNG6fKlStncsT/TkhIiL744gsVKlRIffv2TTHaeMuWLfr+++/Vv3//FGchwP6ZTCZduHBBhQoVso7ItVeWwkeePHk0YMCAB14DCxcu1CuvvKJXXnnFLgpEtsTExGj+/Plyd3dX//79deLECa1du1YhISHKnTu38ubNq/fffz/F9R/sycqVK7V+/Xq99tpryps3r3777TeFhISocePGat++vc6ePauQkBBdvHhRnp6eateunXUKE3t5Xhw4cEA///yzPv/8c+sP6TExMdq+fbv27dunESNGPHA2elZ+LiQ/K3/WrFmqUaOGDAaDjh07pkqVKql58+YppmW7fv26AgICVL16desgI3uQfB/+/fffypUrl958802NHz9eN2/e1LRp09S7d2+1bNlSJpNJq1evVt26dVN8J87Kz4Pkkufh5+en7du3q0KFCoqNjdWZM2fUsWNHtWvXTgaDQZs3b9bWrVvl6uqqPn36WK8hZU/vCU8jiujIVCaTSb6+vipbtqy6du2qZcuW6fLly/rrr7/k5OSkdu3aWQ+cS5QokSVOS06rv//+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/keqRBcRERERERERERG5BdTS786kJLqIiIiIiIiIiIjILaKWfnceve4QERERERERERERuUWUQL/zKIkuIiIiIiIiIiIiIlIDJdFFRERERERERERERGqgJLqIiIiIiIiIiIiISA2URBcRERERERERERERqYGS6CIiIiIiIiIiIiIiNVASXURERERE7J544gni4uIcHYaIiIiIyG3D7OgARERERETk/+eJJ574rz738ssv065du1qORkRERETEWJREFxERERG5w02ZMqXa1ykpKRw7duyG7S1btryVYYmIiIiIGIKS6CIiIiIid7iePXtW+zozM5Njx47dsF1ERERERP53SqKLiIiIiNQBZWVlbNq0ic8++4yioiK8vLx46KGHGDx4ME5OTj977HvvvcemTZsYM2YMAwYMACA9PZ3ExESys7NxcnLi3nvvZdSoUbRu3dp+3PLly/n888954403ePvtt/nnP/+Js7MzvXr1YtSoUZhMWqJJRERERG5/GrWKiIiIiBiczWbj9ddfJykpiQ4dOvDkk0/SokUL4uPjWbdu3c8eu3HjRjZt2sSECRPsCfSUlBQWLlyIi4sL0dHRDB06lLy8PObOncuZM2eqHW+1Wpk/fz6NGjVi9OjRtG3blu3bt5OcnFxr5ysiIiIicjOpEl1ERERExOBSU1M5fvw4I0aMICoqCoD+/fvz5z//mZ07d9K/f398fHxuOG79+vUkJSUxefJkevfuDVytaF+zZg19+/Zl4sSJ9s/26tWLGTNmkJiYWG17RUUF3bp1Y9iwYQBERkYye/ZsPv74YyIjI2vxrEVEREREbg5VoouIiIiIGFx6ejomk8leSV7l4Ycfxmaz8cUXX1TbbrPZiIuLY+fOnUydOtWeQAc4duwYly5dIjw8nOLiYvsfk8lEUFAQJ06cuOH7X58sDw0N5ccff7xp5yciIiIiUptUiS4iIiIiYnBnz56lSZMmNGjQoNr2Vq1a2fdfKyUlhbKyMsaPH09ERES1ff/6178AmDdv3k9+r+u/R/369XF3d6+2rWHDhly6dOl/PxEREREREQdQEl1ERERERKoJCQkhJyeH3bt30717d9zc3Oz7bDYbAFOmTKFx48Y3HFuvXr1qX2vxUBERERG502lEKyIiIiJicF5eXly4cIHLly9X23769Gn7/mv5+PgwZ84czp8/z/z586sd16xZMwA8PDxo3779DX/atWtXy2cjIiIiInJrKYkuIiIiImJw999/P1arlV27dlXbnpSUhJOTEx07drzhGD8/P1544QVOnz5NTEwM5eXlAHTo0IEGDRqQmJiIxWK54bji4uJaOQcREREREUdROxcREREREYPr1KkT7dq1Y+PGjZw9exY/Pz++/PJLUlNTGThwID4+Pj95XHBwMLNmzWLBggUsWbKE3/3ud7i6ujJhwgSWLVvG7NmzCQ8Px93dnYKCAtLS0ggJCWHcuHG3+AxFRERERGqPkugiIiIiIgZnMpmYPXs27777LgcPHmTv3r14e3szatQoBg8e/LPHhoWF8eyzz7JkyRJiY2OZNm0aERERNGnShA8++ICtW7dSUVGBp6cn9957L3369LlFZyUiIiIicms42apWBhIRERERERERERERkWrUE11EREREREREREREpAZKoouIiIiIiIiIiIiI1EBJdBERERERERERERGRGiiJLiIiIiIiIiIiIiJSAyXRRURERERERERERERqoCS6iIiIiIiIiIiIiEgNlEQXEREREREREREREamBkugiIiIiIiIiIiIiIjVQEl1EREREREREREREpAZKoouIiIiIiIiIiIiI1EBJdBERERERERERERGRGiiJLiIiIiIiIiIiIiJSAyXRRURERERERERERERq8H+X2rvN9TuLgAAAAABJRU5ErkJggg==\n"},"metadata":{}}],"source":["def analyser_tokens(df, tokens_to_analyze=None):\n"," \"\"\"Analyse les tokens spécifiques et leur relation avec le sentiment\"\"\"\n","\n"," # Liste par défaut de tokens intéressants à analyser si non spécifiée\n"," if tokens_to_analyze is None:\n"," tokens_to_analyze = [\n"," # Pronoms\n"," 'I', 'you', 'we', 'they', 'me', 'my', 'your', 'our', 'their',\n","\n"," # Mots de sentiment positif\n"," 'love', 'good', 'great', 'best', 'happy', 'awesome', 'amazing', 'excellent', 'wonderful', 'perfect',\n","\n"," # Mots de sentiment négatif\n"," 'hate', 'bad', 'worst', 'sad', 'terrible', 'awful', 'horrible', 'sorry', 'disappointed', 'annoyed',\n","\n"," # Expressions internet\n"," 'lol', 'wtf', 'omg', 'bro', 'lmao', 'rofl', 'yolo', 'idk', 'smh', 'btw', 'imo', 'tbh',\n","\n"," # Intensificateurs\n"," 'very', 'really', 'so', 'too', 'absolutely', 'completely', 'totally',\n","\n"," # Négations\n"," 'not', 'no', 'never', \"don't\", \"can't\", \"won't\", \"didn't\",\n","\n"," # Émoticônes\n"," ':)', ':(', ':D', ';)', ':-)', ':-(', ':-D', ';-)'\n"," ]\n","\n"," print(f\"Analyse de {len(tokens_to_analyze)} tokens spécifiques...\")\n","\n"," # Créer un échantillon équilibré pour l'analyse\n"," sample_size = min(100000, df[df['sentiment'] == 'Négatif'].shape[0], df[df['sentiment'] == 'Positif'].shape[0])\n"," neg_samples = df[df['sentiment'] == 'Négatif'].sample(sample_size, random_state=42)\n"," pos_samples = df[df['sentiment'] == 'Positif'].sample(sample_size, random_state=42)\n","\n"," balanced_df = pd.concat([neg_samples, pos_samples])\n","\n"," # Analyser les tokens spécifiques\n"," results = {}\n"," for token in tokens_to_analyze:\n"," # Vérifier présence du token dans l'échantillon équilibré\n"," token_lower = token.lower() if isinstance(token, str) else \"\"\n","\n"," if token in [\"don't\", \"can't\", \"won't\", \"didn't\"]:\n"," # Cas spécial pour les contractions\n"," has_token = balanced_df['text'].astype(str).apply(\n"," lambda x: token.lower() in x.lower() or token.lower().replace(\"'\", \"\") in x.lower()\n"," )\n"," elif token in [':)', ':(', ':D', ';)', ':-)', ':-(', ':-D', ';-)']:\n"," # Cas exact pour les émoticônes\n"," has_token = balanced_df['text'].astype(str).apply(\n"," lambda x: token in x\n"," )\n"," else:\n"," # Recherche standard\n"," has_token = balanced_df['text'].astype(str).apply(\n"," lambda x: token_lower in x.lower() and\n"," (not token_lower.isalnum() or\n"," re.search(r'\\b' + re.escape(token_lower) + r'\\b', x.lower()) is not None)\n"," )\n","\n"," balanced_df[f'has_{token}'] = has_token\n","\n"," # Calculer les pourcentages par sentiment\n"," pos_with = balanced_df[(balanced_df['sentiment'] == 'Positif') & (balanced_df[f'has_{token}'] == True)].shape[0]\n"," pos_total = balanced_df[balanced_df['sentiment'] == 'Positif'].shape[0]\n"," pos_pct = pos_with / pos_total * 100 if pos_total > 0 else 0\n","\n"," neg_with = balanced_df[(balanced_df['sentiment'] == 'Négatif') & (balanced_df[f'has_{token}'] == True)].shape[0]\n"," neg_total = balanced_df[balanced_df['sentiment'] == 'Négatif'].shape[0]\n"," neg_pct = neg_with / neg_total * 100 if neg_total > 0 else 0\n","\n"," # Calculer le ratio de présence pos/neg (valeur positive = plus présent dans les tweets positifs)\n"," ratio = (pos_pct - neg_pct) / ((pos_pct + neg_pct) / 2) * 100 if (pos_pct + neg_pct) > 0 else 0\n","\n"," # Calculer la significativité (fréquence moyenne)\n"," avg_frequency = (pos_pct + neg_pct) / 2\n","\n"," results[token] = {\n"," 'pos_pct': pos_pct,\n"," 'neg_pct': neg_pct,\n"," 'diff': abs(pos_pct - neg_pct),\n"," 'ratio': ratio,\n"," 'avg_freq': avg_frequency,\n"," 'orientation': 'Positif' if ratio > 0 else 'Négatif'\n"," }\n","\n"," # Créer un dataframe pour faciliter la visualisation\n"," tokens_df = pd.DataFrame(results).T\n"," tokens_df['token'] = tokens_df.index\n","\n"," # Trier par différence absolue et afficher les plus discriminants\n"," most_discriminative = tokens_df.sort_values('diff', ascending=False)\n","\n"," print(\"\\nTokens les plus discriminants entre tweets positifs et négatifs:\")\n"," for token, row in most_discriminative.head(15).iterrows():\n"," print(f\"Token '{token}':\")\n"," print(f\" - Dans tweets positifs: {row['pos_pct']:.2f}%\")\n"," print(f\" - Dans tweets négatifs: {row['neg_pct']:.2f}%\")\n"," print(f\" - Différence absolue: {row['diff']:.2f}%\")\n"," print(f\" - Orientation: {row['orientation']} ({row['ratio']:.1f}%)\")\n"," print()\n","\n"," # Classification des tokens\n"," categories = {\n"," 'Pronoms': ['I', 'you', 'we', 'they', 'me', 'my', 'your', 'our', 'their'],\n"," 'Sentiment positif': ['love', 'good', 'great', 'best', 'happy', 'awesome', 'amazing', 'excellent', 'wonderful', 'perfect'],\n"," 'Sentiment négatif': ['hate', 'bad', 'worst', 'sad', 'terrible', 'awful', 'horrible', 'sorry', 'disappointed', 'annoyed'],\n"," 'Expressions internet': ['lol', 'wtf', 'omg', 'bro', 'lmao', 'rofl', 'yolo', 'idk', 'smh', 'btw', 'imo', 'tbh'],\n"," 'Intensificateurs': ['very', 'really', 'so', 'too', 'absolutely', 'completely', 'totally'],\n"," 'Négations': ['not', 'no', 'never', \"don't\", \"can't\", \"won't\", \"didn't\"],\n"," 'Émoticônes': [':)', ':(', ':D', ';)', ':-)', ':-(', ':-D', ';-)']\n"," }\n","\n"," # Créer des visuels par catégorie\n"," for category, cat_tokens in categories.items():\n"," # Filtrer les tokens de cette catégorie qui sont présents dans l'analyse\n"," valid_tokens = [t for t in cat_tokens if t in tokens_df.index]\n"," if not valid_tokens:\n"," continue\n","\n"," cat_df = tokens_df.loc[valid_tokens]\n","\n"," if len(cat_df) > 0:\n"," plt.figure(figsize=(12, 6))\n","\n"," # Trier par ratio\n"," cat_df_sorted = cat_df.sort_values('ratio')\n","\n"," # Créer des couleurs basées sur l'orientation (positif/négatif)\n"," colors = ['firebrick' if r < -20 else 'indianred' if r < 0 else 'royalblue' if r < 20 else 'darkblue'\n"," for r in cat_df_sorted['ratio']]\n","\n"," # Calculer les tailles mais utiliser un alpha fixe\n"," sizes = np.clip(cat_df_sorted['avg_freq'] / cat_df_sorted['avg_freq'].max() * 0.8 + 0.2, 0.3, 1.0)\n","\n"," # Créer le graphique\n"," bars = plt.bar(cat_df_sorted.index, cat_df_sorted['ratio'], color=colors,\n"," alpha=0.8, linewidth=1)\n","\n"," # Ajouter les valeurs d'occurrence moyenne\n"," for bar, freq in zip(bars, cat_df_sorted['avg_freq']):\n"," plt.text(bar.get_x() + bar.get_width()/2, bar.get_height() + (5 if bar.get_height() > 0 else -15),\n"," f\"{freq:.1f}%\", ha='center', va='bottom', fontsize=9, color='black')\n","\n"," plt.axhline(y=0, color='black', linestyle='-', alpha=0.3)\n"," plt.title(f'Orientation des tokens - {category}', fontsize=15)\n"," plt.xlabel('Token')\n"," plt.ylabel('Orientation (% relatif)')\n"," plt.ylim(min(cat_df_sorted['ratio'].min() * 1.2, -100), max(cat_df_sorted['ratio'].max() * 1.2, 100))\n"," plt.xticks(rotation=45)\n"," plt.grid(axis='y', linestyle='--', alpha=0.3)\n"," plt.tight_layout()\n"," plt.show()\n","\n"," # Visualisation globale des tokens les plus discriminants et les plus fréquents\n"," plt.figure(figsize=(15, 8))\n","\n"," # Sélectionner les top tokens par discrimination et fréquence\n"," top_tokens = tokens_df.sort_values('diff', ascending=False).head(20)\n","\n"," # Trier par ratio\n"," top_tokens = top_tokens.sort_values('ratio')\n","\n"," # Créer des couleurs basées sur l'orientation (positif/négatif)\n"," colors = ['firebrick' if r < -20 else 'indianred' if r < 0 else 'royalblue' if r < 20 else 'darkblue'\n"," for r in top_tokens['ratio']]\n","\n"," # Calculer les tailles mais utiliser un alpha fixe\n"," sizes = np.clip(top_tokens['avg_freq'] / top_tokens['avg_freq'].max() * 0.8 + 0.2, 0.3, 1.0)\n","\n"," # Créer le graphique\n"," bars = plt.bar(top_tokens.index, top_tokens['ratio'], color=colors,\n"," alpha=0.8, linewidth=1)\n","\n"," # Ajouter les valeurs d'occurrence moyenne\n"," for bar, freq in zip(bars, top_tokens['avg_freq']):\n"," plt.text(bar.get_x() + bar.get_width()/2, bar.get_height() + (5 if bar.get_height() > 0 else -15),\n"," f\"{freq:.1f}%\", ha='center', va='bottom', fontsize=9, color='black')\n","\n"," plt.axhline(y=0, color='black', linestyle='-', alpha=0.3)\n"," plt.title('Top 20 tokens les plus discriminants (orientation relative)', fontsize=15)\n"," plt.xlabel('Token')\n"," plt.ylabel('Orientation relative (% positif vs négatif)')\n"," plt.ylim(min(top_tokens['ratio'].min() * 1.2, -100), max(top_tokens['ratio'].max() * 1.2, 100))\n"," plt.xticks(rotation=45)\n"," plt.grid(axis='y', linestyle='--', alpha=0.3)\n"," plt.tight_layout()\n"," plt.show()\n","\n"," return tokens_df\n","\n","# Pour utiliser la fonction\n","tokens_df = analyser_tokens(df)"]},{"cell_type":"markdown","source":["#### 9. Stratégie de prétraitement pour la détection de sentiment dans les tweets\n","\n","Les résultats présents ici proposent une stratégie relativement exhaustive (bien qu'elle ne prétende pas l'être complètement) de traitement des tweets et de l'importance que l'on peut donner ou non à certains éléments textuels.\n","Toutes les méthodes proposées n'ont pas forcément été implémentées dans la fonction de prétraitement `preprocess_tweet` utilisée dans les notebooks d'entraînement de modèles prédictifs (pour des raisons de timings à respecter dans la réalisation de ce projet).\n","\n","Les pictogrammes suivants permettent d'identifier les fonctionnalités implémentées ou non :\n","✅ Implémenté dans `preprocess_tweet`\n","⚠️ Non implémenté (proposé mais pas utilisé)\n","\n","\n","##### Différences entre tweets positifs et négatifs\n","\n","Les résultats montrent des différences significatives dans la structure des tweets selon leur sentiment :\n","\n","- Les tweets positifs contiennent **93% plus d'URLs** que les négatifs\n","- Les tweets positifs contiennent **48% plus de mentions (@)**\n","- Les tweets positifs utilisent **39% plus de hashtags (#)**\n","- Les tweets positifs utilisent **39% plus de points d'exclamation (!)**\n","- Les tweets négatifs contiennent **24% plus d'ellipses (...)**\n","- Les tweets négatifs sont légèrement plus longs et contiennent plus de mots\n","\n","##### Stratégie de prétraitement recommandée\n","\n","Voici une stratégie de prétraitement complète basée sur ces observations :\n","\n","1. **Nettoyage de base** :\n"," - ⚠️ Correction des fautes d'orthographe courantes → *Non implémentée*\n"," - ✅ Suppression des caractères spéciaux non significatifs\n"," - ✅ Conversion en minuscules\n"," - ✅ Conversion des caractères HTML (`html.unescape`)\n"," - ⚠️ Conservation d'une feature sur le **ratio de majuscules** → *Non implémentée* (la casse est supprimée)\n","\n","2. **Traitement des éléments spéciaux** :\n"," - ✅ **URLs** : Remplacées par un token spécial \"``\"\n"," - ✅ **Mentions (@)** : Remplacées par un token \"``\"\n"," - ✅ **Hashtags (#)** : Hashtag séparé du mot et conservé sous forme \"# happy\"\n","\n","3. **Feature engineering** :\n"," - ⚠️ Création de features numériques pour :\n"," - Nombre d'URLs\n"," - Mentions\n"," - Hashtags\n"," - Points d'exclamation, de question, ellipses\n"," → *Non implémenté*\n"," - ⚠️ Calcul du ratio de majuscules → *Non implémenté*\n"," - ⚠️ Détection et classification des émoticônes → *Non implémenté*\n","\n","4. **Tokenisation et normalisation** :\n"," - ✅ Tokenisation (`nltk.word_tokenize`)\n"," - ✅ Lemmatisation (`WordNetLemmatizer`)\n"," - ✅ Suppression des stopwords, en conservant les négations importantes (`no`, `not`, etc.)\n","\n","##### Influence des éléments spécifiques sur le sentiment\n","\n","- **Présence de 'http'** : Très significatif (93% de différence). \n"," ✅ Remplacé par `` \n"," ⚠️ *Pas de feature numérique pour le comptage*\n","\n","- **Présence de '#'** : Significatif (39% de différence). \n"," ✅ Hashtag conservé via token `#` et mot séparé \n"," ⚠️ *Pas de feature de comptage du nombre de hashtags*\n","\n","- **Présence de '@'** : Très significatif (48% de différence). \n"," ✅ Remplacé par `` \n"," ⚠️ *Pas de feature de comptage du nombre de mentions*\n","\n","##### Traitement recommandé pour les éléments spéciaux\n","\n","- **URLs** : \n"," ✅ Remplacement par `` \n"," ⚠️ *Pas de feature numérique associée*\n","\n","- **Mentions (@)** : \n"," ✅ Remplacement par `` \n"," ⚠️ *Pas de feature numérique associée*\n","\n","- **Hashtags (#)** : \n"," ✅ Séparation du `#` et du mot qui suit \n"," ⚠️ *Pas de feature de comptage du nombre de `#`*\n","\n","---\n","\n","#### ⚙️ Bilan\n","\n","La fonction de prétraitement actuelle implémente **les opérations textuelles de base** et le **traitement structurel des éléments Twitter (URLs, mentions, hashtags)**.\n","\n","En revanche, les stratégies suivantes **n'ont pas encore été mises en œuvre** :\n","- Création de **features numériques structurées** (longueur, nombre de ponctuations, etc.)\n","- Conservation et exploitation de la **casse** (ratio de majuscules)\n","- Traitement spécifique des **émoticônes**\n","- **Correction orthographique**\n","\n","Ces éléments pourraient enrichir les modèles classiques (avec `TF-IDF`) ou être injectés comme **features auxiliaires** dans des modèles plus avancés (LSTM, BERT).\n"],"metadata":{"id":"akVkIiD4AplZ"}},{"cell_type":"markdown","metadata":{"id":"fUfJHL0rWjJC"},"source":["##### Exemple de prétraitement"]},{"cell_type":"code","execution_count":30,"metadata":{"id":"zMCpAoskWjJC","executionInfo":{"status":"ok","timestamp":1751537534024,"user_tz":-120,"elapsed":62,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["df = raw_data.copy()"]},{"cell_type":"code","execution_count":31,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":206},"id":"f0NIpj9hWjJC","executionInfo":{"status":"ok","timestamp":1751537534039,"user_tz":-120,"elapsed":7,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"3beee82f-3685-480b-80e6-801fb7d2e06a"},"outputs":[{"output_type":"execute_result","data":{"text/plain":[" target ids date flag user text\n","0 0 1467810369 Mon Apr 06 22:19:45 PDT 2009 NO_QUERY _TheSpecialOne_ @switchfoot http://twitpic.com/2y1zl - Awww, t...\n","1 0 1467810672 Mon Apr 06 22:19:49 PDT 2009 NO_QUERY scotthamilton is upset that he can't update his Facebook by ...\n","2 0 1467810917 Mon Apr 06 22:19:53 PDT 2009 NO_QUERY mattycus @Kenichan I dived many times for the ball. Man...\n","3 0 1467811184 Mon Apr 06 22:19:57 PDT 2009 NO_QUERY ElleCTF my whole body feels itchy and like its on fire \n","4 0 1467811193 Mon Apr 06 22:19:57 PDT 2009 NO_QUERY Karoli @nationwideclass no, it's not behaving at all...."],"text/html":["\n","
\n","
\n","\n","
\n"," \n","
\n","
\n","
target
\n","
ids
\n","
date
\n","
flag
\n","
user
\n","
text
\n","
\n"," \n"," \n","
\n","
0
\n","
0
\n","
1467810369
\n","
Mon Apr 06 22:19:45 PDT 2009
\n","
NO_QUERY
\n","
_TheSpecialOne_
\n","
@switchfoot http://twitpic.com/2y1zl - Awww, t...
\n","
\n","
\n","
1
\n","
0
\n","
1467810672
\n","
Mon Apr 06 22:19:49 PDT 2009
\n","
NO_QUERY
\n","
scotthamilton
\n","
is upset that he can't update his Facebook by ...
\n","
\n","
\n","
2
\n","
0
\n","
1467810917
\n","
Mon Apr 06 22:19:53 PDT 2009
\n","
NO_QUERY
\n","
mattycus
\n","
@Kenichan I dived many times for the ball. Man...
\n","
\n","
\n","
3
\n","
0
\n","
1467811184
\n","
Mon Apr 06 22:19:57 PDT 2009
\n","
NO_QUERY
\n","
ElleCTF
\n","
my whole body feels itchy and like its on fire
\n","
\n","
\n","
4
\n","
0
\n","
1467811193
\n","
Mon Apr 06 22:19:57 PDT 2009
\n","
NO_QUERY
\n","
Karoli
\n","
@nationwideclass no, it's not behaving at all....
\n","
\n"," \n","
\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","\n","
\n","
\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"df"}},"metadata":{},"execution_count":31}],"source":["df.head()"]},{"cell_type":"code","execution_count":32,"metadata":{"id":"OkZs7W-nWjJC","executionInfo":{"status":"ok","timestamp":1751537534086,"user_tz":-120,"elapsed":40,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["def example_preprocess_tweet(tweet):\n"," # Features numériques\n"," features = {\n"," 'url_count': tweet.lower().count('http'),\n"," 'mention_count': tweet.count('@'),\n"," 'hashtag_count': tweet.count('#'),\n"," 'exclamation_count': tweet.count('!'),\n"," 'question_count': tweet.count('?'),\n"," 'ellipsis_count': tweet.count('...'),\n"," 'capitals_ratio': sum(1 for c in tweet if c.isupper()) / len(tweet) if len(tweet) > 0 else 0\n"," }\n","\n"," # Prétraitement du texte\n"," processed_text = tweet\n","\n"," # Remplacer les URLs\n"," processed_text = re.sub(r'https?://\\S+', '', processed_text)\n","\n"," # Traiter les mentions\n"," processed_text = re.sub(r'@\\w+', '', processed_text)\n","\n"," # Traiter les hashtags (séparer # du mot)\n"," processed_text = re.sub(r'#(\\w+)', r'# \\1', processed_text)\n","\n"," # Traiter le langage html\n"," processed_text = html.unescape(processed_text)\n","\n"," # Tokenisation simple (split par espaces)\n"," tokens = processed_text.lower().split()\n","\n"," # Autres étapes de nettoyage...\n","\n"," return processed_text, features"]},{"cell_type":"code","execution_count":33,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":0},"id":"PMJiRgr3WjJC","executionInfo":{"status":"ok","timestamp":1751537534120,"user_tz":-120,"elapsed":71,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"864b28f5-cc48-43e2-ee70-4e355ec66cdc"},"outputs":[{"output_type":"stream","name":"stdout","text":["Tweet prétraité: I'm SO frustrated w/ flight # delayed AGAIN!!\n"," 😡 Their customer service doesn't care :( Check this horrible experience: \n"," Can't wait to fly with \"someone\" else next time!\n","\n","Caractéristiques extraites:\n","- url_count: 1\n","- mention_count: 1\n","- hashtag_count: 1\n","- exclamation_count: 3\n","- question_count: 0\n","- ellipsis_count: 1\n","- capitals_ratio: 0.06422018348623854\n"]}],"source":["# Exemple de tweet\n","tweet_example = \"\"\"I'm SO frustrated w/ @AirParadis flight #delayed AGAIN!!\n"," 😡 Their customer service doesn't care :( Check this horrible experience: http://bit.ly/2xYz...\n"," Can't wait to fly with "someone" else next time!\"\"\"\n","\n","# Prétraitement\n","processed_tweet, tweet_features = example_preprocess_tweet(tweet_example)\n","print(\"Tweet prétraité:\", processed_tweet)\n","print(\"\\nCaractéristiques extraites:\")\n","for feature, value in tweet_features.items():\n"," print(f\"- {feature}: {value}\")"]},{"cell_type":"code","execution_count":34,"metadata":{"id":"1tP38oGLWjJC","executionInfo":{"status":"ok","timestamp":1751537534157,"user_tz":-120,"elapsed":36,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["import pandas as pd\n","import numpy as np\n","import re\n","import string\n","from tqdm import tqdm\n","\n","def pretraiter_tweets_dataframe(df, colonne_texte='text', afficher_progression=True, optimiser=True):\n"," \"\"\"\n"," Fonction complète pour prétraiter tous les tweets d'un DataFrame.\n","\n"," Args:\n"," df (pd.DataFrame): DataFrame contenant les tweets\n"," colonne_texte (str): Nom de la colonne contenant les tweets à prétraiter\n"," afficher_progression (bool): Afficher une barre de progression\n"," optimiser (bool): Si True, ne conserve que les colonnes utiles à l'entraînement\n","\n"," Returns:\n"," tuple: (DataFrame prétraité, liste des noms de features)\n"," - DataFrame avec les tweets prétraités et les features extraites\n"," - Liste des noms de features extraites pour faciliter l'analyse\n"," \"\"\"\n"," # Dictionnaire pour les contractions\n"," contractions = {\n"," \"ain't\": \"am not\", \"aren't\": \"are not\", \"can't\": \"cannot\",\n"," \"couldn't\": \"could not\", \"didn't\": \"did not\", \"doesn't\": \"does not\",\n"," \"don't\": \"do not\", \"hadn't\": \"had not\", \"hasn't\": \"has not\",\n"," \"haven't\": \"have not\", \"he'd\": \"he would\", \"he'll\": \"he will\",\n"," \"he's\": \"he is\", \"i'd\": \"i would\", \"i'll\": \"i will\", \"i'm\": \"i am\",\n"," \"i've\": \"i have\", \"isn't\": \"is not\", \"it's\": \"it is\",\n"," \"let's\": \"let us\", \"shouldn't\": \"should not\", \"that's\": \"that is\",\n"," \"there's\": \"there is\", \"they'd\": \"they would\", \"they'll\": \"they will\",\n"," \"they're\": \"they are\", \"they've\": \"they have\", \"wasn't\": \"was not\",\n"," \"we'd\": \"we would\", \"we're\": \"we are\", \"we've\": \"we have\",\n"," \"weren't\": \"were not\", \"what's\": \"what is\", \"where's\": \"where is\",\n"," \"who's\": \"who is\", \"won't\": \"will not\", \"wouldn't\": \"would not\",\n"," \"you'd\": \"you would\", \"you'll\": \"you will\", \"you're\": \"you are\",\n"," \"you've\": \"you have\", \"gonna\": \"going to\", \"wanna\": \"want to\"\n"," }\n","\n"," # Dictionnaire pour les émoticônes\n"," emoticons = {\n"," # Positifs\n"," ':)': '', ':-)': '',\n"," ':D': '', '=)': '',\n"," ':-D': '', ':p': '',\n"," ':-p': '', ';)': '',\n"," ';-)': '', ':3': '',\n"," '<3': '',\n","\n"," # Négatifs\n"," ':(': '', ':-(': '',\n"," '=(': '', ':-(': '',\n"," ':\\'(': '', ':/': '',\n"," ':\\\\': '', ':|': '',\n"," ':-|': '', '>:(': '',\n"," 'D:': ''\n"," }\n","\n"," # Liste simplifiée de stopwords en anglais\n"," english_stopwords = {\n"," 'a', 'an', 'the', 'and', 'but', 'if', 'or', 'because', 'as', 'until', 'while', 'of', 'at', 'by',\n"," 'for', 'with', 'about', 'against', 'between', 'into', 'through', 'during', 'before', 'after',\n"," 'above', 'below', 'to', 'from', 'up', 'down', 'in', 'out', 'on', 'off', 'over', 'under', 'again',\n"," 'further', 'then', 'once', 'here', 'there', 'when', 'where', 'why', 'how', 'all', 'any', 'both',\n"," 'each', 'few', 'more', 'most', 'other', 'some', 'such', 'only', 'own', 'same', 'so',\n"," 'than', 'too', 'very', 'can', 'will', 'just', 'should', 'now'\n"," }\n"," # Conserver les négations\n"," negations = {'no', 'not', 'none', 'nor', 'never', 'neither'}\n"," english_stopwords = english_stopwords - negations\n","\n"," # Définir la liste des noms de features\n"," feature_names = ['text_length', 'word_count', 'url_count', 'mention_count',\n"," 'hashtag_count', 'exclamation_count', 'question_count',\n"," 'ellipsis_count', 'capitals_ratio', 'positive_emoticon',\n"," 'negative_emoticon']\n","\n"," # Fonction pour prétraiter un tweet individuel\n"," def preprocess_tweet(tweet):\n"," if pd.isna(tweet) or not isinstance(tweet, str):\n"," # Gérer les valeurs NaN/None ou non-string\n"," return \"\", {\n"," 'text_length': 0, 'word_count': 0, 'url_count': 0, 'mention_count': 0,\n"," 'hashtag_count': 0, 'exclamation_count': 0, 'question_count': 0,\n"," 'ellipsis_count': 0, 'capitals_ratio': 0, 'positive_emoticon': 0,\n"," 'negative_emoticon': 0\n"," }\n","\n"," # Extraction des features numériques\n"," features = {\n"," 'text_length': len(tweet),\n"," 'word_count': len(tweet.split()),\n"," 'url_count': tweet.lower().count('http'),\n"," 'mention_count': tweet.count('@'),\n"," 'hashtag_count': tweet.count('#'),\n"," 'exclamation_count': tweet.count('!'),\n"," 'question_count': tweet.count('?'),\n"," 'ellipsis_count': tweet.count('...'),\n"," 'capitals_ratio': sum(1 for c in tweet if c.isupper()) / len(tweet) if len(tweet) > 0 else 0,\n"," 'positive_emoticon': sum(tweet.count(emot) for emot in [':)', ':D', '=)', ':-)', ':-D']),\n"," 'negative_emoticon': sum(tweet.count(emot) for emot in [':(', '=(', ':-(', ':\\'(', ':-(']),\n"," }\n","\n"," # Prétraitement initial du texte\n"," processed_text = tweet\n","\n"," # Remplacer les émoticônes par des tokens spéciaux\n"," for emoticon, replacement in emoticons.items():\n"," processed_text = processed_text.replace(emoticon, ' ' + replacement + ' ')\n","\n"," # Remplacer les URLs\n"," processed_text = re.sub(r'https?://\\S+', ' ', processed_text)\n","\n"," # Traiter les mentions\n"," processed_text = re.sub(r'@\\w+', ' ', processed_text)\n","\n"," # Traiter les hashtags (séparer # du mot)\n"," processed_text = re.sub(r'#(\\w+)', r' # \\1 ', processed_text)\n","\n"," # Traiter le langage html\n"," processed_text = html.unescape(processed_text)\n","\n"," # Convertir les contractions\n"," words = processed_text.split()\n"," processed_words = []\n"," for word in words:\n"," word_lower = word.lower()\n"," # Vérifier les contractions\n"," if word_lower in contractions:\n"," processed_words.append(contractions[word_lower])\n"," else:\n"," processed_words.append(word)\n"," processed_text = ' '.join(processed_words)\n","\n"," # Tokenisation simple (split par espaces)\n"," tokens = processed_text.lower().split()\n","\n"," # Conserver les tokens spéciaux\n"," special_tokens = ['', '', '', '', '#']\n","\n"," # Suppression des stopwords\n"," tokens = [token for token in tokens if token.lower() not in english_stopwords or token.lower() in special_tokens]\n","\n"," # Nettoyer la ponctuation (sauf pour les tokens spéciaux)\n"," cleaned_tokens = []\n"," for token in tokens:\n"," if token.lower() in special_tokens:\n"," cleaned_tokens.append(token)\n"," else:\n"," # Supprimer la ponctuation\n"," cleaned_token = ''.join(c for c in token if c not in string.punctuation)\n"," if cleaned_token: # Vérifier que le token n'est pas vide\n"," cleaned_tokens.append(cleaned_token)\n","\n"," # Reconstruire le texte traité\n"," processed_text = ' '.join(cleaned_tokens)\n","\n"," # Nettoyer les espaces multiples\n"," processed_text = re.sub(r'\\s+', ' ', processed_text).strip()\n","\n"," return processed_text, features\n","\n"," # Créer une copie du DataFrame pour éviter de modifier l'original\n"," df_processed = df.copy()\n","\n"," # Initialiser les colonnes pour les features et le texte prétraité\n"," for feature in feature_names:\n"," df_processed[feature] = np.nan\n","\n"," df_processed['processed_text'] = ''\n","\n"," # Afficher les informations sur le DataFrame avant prétraitement\n"," print(f\"DataFrame original : {df.shape[0]} lignes × {df.shape[1]} colonnes\")\n","\n"," # Appliquer le prétraitement à chaque tweet\n"," if afficher_progression:\n"," print(\"Prétraitement des tweets en cours...\")\n"," tqdm.pandas(desc=\"Progression\")\n"," processed_data = df_processed[colonne_texte].progress_apply(preprocess_tweet)\n"," else:\n"," processed_data = df_processed[colonne_texte].apply(preprocess_tweet)\n","\n"," # Extraire le texte prétraité et les features\n"," for i, (processed_text, features) in enumerate(processed_data):\n"," df_processed.at[i, 'processed_text'] = processed_text\n"," for feature, value in features.items():\n"," df_processed.at[i, feature] = value\n","\n"," print(f\"Prétraitement terminé. {len(df_processed)} tweets ont été traités.\")\n","\n"," # Si optimisation demandée, ne garder que les colonnes utiles\n"," if optimiser:\n"," # Identifier les colonnes à conserver : target (si elle existe) + processed_text + features\n"," colonnes_utiles = ['processed_text'] + feature_names\n","\n"," # Ajouter la colonne target si elle existe (différents noms possibles)\n"," target_cols = ['target', 'sentiment', 'label']\n"," for target_col in target_cols:\n"," if target_col in df_processed.columns:\n"," colonnes_utiles.append(target_col)\n","\n"," # Créer un DataFrame optimisé\n"," colonnes_avant = df_processed.shape[1]\n"," df_optimise = df_processed[colonnes_utiles].copy()\n"," colonnes_apres = df_optimise.shape[1]\n","\n"," print(f\"DataFrame optimisé : {colonnes_avant - colonnes_apres} colonnes supprimées\")\n"," print(f\"Nouvelles dimensions : {df_optimise.shape[0]} lignes × {df_optimise.shape[1]} colonnes\")\n","\n"," return df_optimise, feature_names\n","\n"," return df_processed, feature_names"]},{"cell_type":"code","execution_count":35,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":0},"id":"KFTu3YlGWjJD","executionInfo":{"status":"ok","timestamp":1751537536475,"user_tz":-120,"elapsed":2317,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"9db8d046-4061-4cf9-b016-965ad0eaa1a6"},"outputs":[{"output_type":"stream","name":"stdout","text":["Distribution des sentiments dans l'échantillon : target\n","0 5000\n","4 5000\n","Name: count, dtype: int64\n","DataFrame original : 10000 lignes × 6 colonnes\n","Prétraitement des tweets en cours...\n"]},{"output_type":"stream","name":"stderr","text":["Progression: 100%|██████████| 10000/10000 [00:00<00:00, 21211.54it/s]\n"]},{"output_type":"stream","name":"stdout","text":["Prétraitement terminé. 10000 tweets ont été traités.\n","DataFrame optimisé : 5 colonnes supprimées\n","Nouvelles dimensions : 10000 lignes × 13 colonnes\n"]}],"source":["# Après avoir chargé le DataFrame complet\n","# Assurez-vous d'avoir des exemples des deux classes\n","df_complet = raw_data.copy()\n","\n","# Échantillonnage stratifié pour avoir des tweets des deux sentiments\n","df_negatifs = df_complet[df_complet['target'] == 0].sample(5000, random_state=42)\n","df_positifs = df_complet[df_complet['target'] == 4].sample(5000, random_state=42)\n","df_echantillon = pd.concat([df_negatifs, df_positifs]).reset_index(drop=True)\n","\n","print(f\"Distribution des sentiments dans l'échantillon : {df_echantillon['target'].value_counts()}\")\n","\n","# Prétraiter l'échantillon équilibré\n","df_optimise, feature_names = pretraiter_tweets_dataframe(df_echantillon, colonne_texte='text')"]},{"cell_type":"code","execution_count":36,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":765},"id":"4WOZMce9WjJI","executionInfo":{"status":"ok","timestamp":1751537536525,"user_tz":-120,"elapsed":47,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"51cab5f2-f204-4cd2-839c-4a12474030fb"},"outputs":[{"output_type":"execute_result","data":{"text/plain":[" processed_text text_length word_count url_count mention_count hashtag_count exclamation_count question_count ellipsis_count capitals_ratio positive_emoticon negative_emoticon target\n","0 oh no did u order from that is horrible 59.0 10.0 0.0 1.0 0.0 1.0 1.0 0.0 0.000000 0.0 0.0 0\n","1 great hard training weekend is over couple day... 121.0 25.0 0.0 0.0 0.0 1.0 0.0 0.0 0.016529 0.0 0.0 0\n","2 right work 5 hours go i am free xd 56.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.071429 0.0 0.0 0\n","3 i am craving japanese food 31.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.032258 0.0 0.0 0\n","4 jean michel jarre concert tomorrow gotta work ... 65.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.046154 0.0 0.0 0\n","5 dammiitt i wish i had mtv 45.0 7.0 0.0 1.0 0.0 2.0 0.0 0.0 0.133333 0.0 0.0 0\n","6 you knowits really sad that u know t... 112.0 18.0 0.0 1.0 0.0 0.0 0.0 0.0 0.035714 0.0 0.0 0\n","7 i know 23.0 3.0 0.0 1.0 0.0 0.0 0.0 0.0 0.086957 0.0 0.0 0\n","8 i wish i had that much say 44.0 9.0 0.0 1.0 0.0 0.0 0.0 0.0 0.045455 0.0 0.0 0\n","9 ow i cannot move my neck my back hurts much i ... 76.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.013158 0.0 0.0 0"],"text/html":["\n","
\n","
\n","\n","
\n"," \n","
\n","
\n","
processed_text
\n","
text_length
\n","
word_count
\n","
url_count
\n","
mention_count
\n","
hashtag_count
\n","
exclamation_count
\n","
question_count
\n","
ellipsis_count
\n","
capitals_ratio
\n","
positive_emoticon
\n","
negative_emoticon
\n","
target
\n","
\n"," \n"," \n","
\n","
0
\n","
<mention> oh no did u order from that is horrible
\n","
59.0
\n","
10.0
\n","
0.0
\n","
1.0
\n","
0.0
\n","
1.0
\n","
1.0
\n","
0.0
\n","
0.000000
\n","
0.0
\n","
0.0
\n","
0
\n","
\n","
\n","
1
\n","
great hard training weekend is over couple day...
\n","
121.0
\n","
25.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
1.0
\n","
0.0
\n","
0.0
\n","
0.016529
\n","
0.0
\n","
0.0
\n","
0
\n","
\n","
\n","
2
\n","
right work 5 hours go i am free xd
\n","
56.0
\n","
13.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.071429
\n","
0.0
\n","
0.0
\n","
0
\n","
\n","
\n","
3
\n","
i am craving japanese food
\n","
31.0
\n","
6.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.032258
\n","
0.0
\n","
0.0
\n","
0
\n","
\n","
\n","
4
\n","
jean michel jarre concert tomorrow gotta work ...
\n","
65.0
\n","
10.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.046154
\n","
0.0
\n","
0.0
\n","
0
\n","
\n","
\n","
5
\n","
<mention> dammiitt i wish i had mtv
\n","
45.0
\n","
7.0
\n","
0.0
\n","
1.0
\n","
0.0
\n","
2.0
\n","
0.0
\n","
0.0
\n","
0.133333
\n","
0.0
\n","
0.0
\n","
0
\n","
\n","
\n","
6
\n","
<mention> you knowits really sad that u know t...
\n","
112.0
\n","
18.0
\n","
0.0
\n","
1.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.035714
\n","
0.0
\n","
0.0
\n","
0
\n","
\n","
\n","
7
\n","
<mention> i know
\n","
23.0
\n","
3.0
\n","
0.0
\n","
1.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.086957
\n","
0.0
\n","
0.0
\n","
0
\n","
\n","
\n","
8
\n","
<mention> i wish i had that much say
\n","
44.0
\n","
9.0
\n","
0.0
\n","
1.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.045455
\n","
0.0
\n","
0.0
\n","
0
\n","
\n","
\n","
9
\n","
ow i cannot move my neck my back hurts much i ...
\n","
76.0
\n","
18.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.0
\n","
0.013158
\n","
0.0
\n","
0.0
\n","
0
\n","
\n"," \n","
\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","\n","
\n","
\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"df_optimise","summary":"{\n \"name\": \"df_optimise\",\n \"rows\": 10000,\n \"fields\": [\n {\n \"column\": \"processed_text\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 9892,\n \"samples\": [\n \"we are going see flamenco dance fire sand tatiana garrido 900 pm dar alassad opera house damascus i cannot take my camera\",\n \" looks like you are having fun that pic you are amazing i cannot wait see you wrestling soon take care \\u00e2\\u0099\\u00a5\",\n \"belated rip great advocate friend jim stephenson nc coastal federation http bitlylpfm2\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"text_length\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 36.46088940159834,\n \"min\": 8.0,\n \"max\": 282.0,\n \"num_unique_values\": 151,\n \"samples\": [\n 34.0,\n 98.0,\n 51.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"word_count\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 6.967032850839397,\n \"min\": 1.0,\n \"max\": 34.0,\n \"num_unique_values\": 34,\n \"samples\": [\n 19.0,\n 5.0,\n 4.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"url_count\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.21370570187224106,\n \"min\": 0.0,\n \"max\": 2.0,\n \"num_unique_values\": 3,\n \"samples\": [\n 0.0,\n 1.0,\n 2.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"mention_count\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.5909474781164555,\n \"min\": 0.0,\n \"max\": 8.0,\n \"num_unique_values\": 9,\n \"samples\": [\n 7.0,\n 0.0,\n 4.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"hashtag_count\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.19936831436432761,\n \"min\": 0.0,\n \"max\": 8.0,\n \"num_unique_values\": 5,\n \"samples\": [\n 1.0,\n 8.0,\n 2.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"exclamation_count\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.2836116257968069,\n \"min\": 0.0,\n \"max\": 35.0,\n \"num_unique_values\": 20,\n \"samples\": [\n 1.0,\n 25.0,\n 14.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"question_count\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.7557943056832718,\n \"min\": 0.0,\n \"max\": 45.0,\n \"num_unique_values\": 14,\n \"samples\": [\n 6.0,\n 16.0,\n 1.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"ellipsis_count\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.5081963954590616,\n \"min\": 0.0,\n \"max\": 7.0,\n \"num_unique_values\": 8,\n \"samples\": [\n 7.0,\n 4.0,\n 0.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"capitals_ratio\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.07180467551206295,\n \"min\": 0.0,\n \"max\": 0.875,\n \"num_unique_values\": 992,\n \"samples\": [\n 0.07476635514018691,\n 0.07092198581560284,\n 0.30612244897959184\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"positive_emoticon\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.02448877232522874,\n \"min\": 0.0,\n \"max\": 1.0,\n \"num_unique_values\": 2,\n \"samples\": [\n 1.0,\n 0.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"negative_emoticon\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.03462195644366273,\n \"min\": 0.0,\n \"max\": 1.0,\n \"num_unique_values\": 2,\n \"samples\": [\n 1.0,\n 0.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"target\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 2,\n \"min\": 0,\n \"max\": 4,\n \"num_unique_values\": 2,\n \"samples\": [\n 4,\n 0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"}},"metadata":{},"execution_count":36}],"source":["df_optimise.head(10)"]},{"cell_type":"code","execution_count":37,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":0},"id":"RRKMq2yvWjJI","executionInfo":{"status":"ok","timestamp":1751537536543,"user_tz":-120,"elapsed":17,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"b6e781e1-3e70-479e-ece9-6adb4c3d9bfe"},"outputs":[{"output_type":"stream","name":"stdout","text":["Tweet 1 : oh no did u order from that is horrible\n","Tweet 2 : great hard training weekend is over couple days rest lets do it again lots computer time put\n","Tweet 3 : right work 5 hours go i am free xd\n","Tweet 4 : i am craving japanese food\n","Tweet 5 : jean michel jarre concert tomorrow gotta work 73 though\n","Tweet 6 : dammiitt i wish i had mtv\n","Tweet 7 : you knowits really sad that u know that ur classmate do not care you sad memories tt\n","Tweet 8 : i know\n","Tweet 9 : i wish i had that much say\n","Tweet 10 : ow i cannot move my neck my back hurts much i do not know \n"]}],"source":["for row in enumerate(df_optimise['processed_text'].head(10)):\n"," print(f\"Tweet {row[0] + 1} : {row[1]}\")"]},{"cell_type":"code","execution_count":38,"metadata":{"id":"FjgFb1bJWjJI","executionInfo":{"status":"ok","timestamp":1751537536549,"user_tz":-120,"elapsed":5,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[],"source":["def analyser_differences_sentiments(df, feature_names):\n"," \"\"\"\n"," Analyse les différences de features entre tweets positifs et négatifs.\n"," Affiche les résultats avec les features en lignes et les sentiments en colonnes.\n","\n"," Args:\n"," df (pd.DataFrame): DataFrame prétraité avec colonne 'target'\n"," feature_names (list): Liste des noms de features à analyser\n"," \"\"\"\n"," # Convertir les valeurs numériques de target en catégories lisibles\n"," sentiment_mapping = {0: 'Négatif', 4: 'Positif'}\n"," if 'target' in df.columns:\n"," df['sentiment'] = df['target'].map(sentiment_mapping)\n","\n"," # Compter le nombre de tweets par sentiment\n"," sentiment_counts = df['sentiment'].value_counts()\n"," print(f\"\\nDistribution des sentiments : {sentiment_counts.to_dict()}\")\n","\n"," # Vérifier si les deux sentiments sont présents\n"," if 'Négatif' in sentiment_counts and 'Positif' in sentiment_counts:\n"," # Calculer les moyennes par sentiment\n"," neg_means = df[df['sentiment'] == 'Négatif'][feature_names].mean()\n"," pos_means = df[df['sentiment'] == 'Positif'][feature_names].mean()\n","\n"," # Calculer la différence relative (en pourcentage)\n"," epsilon = 0.0001 # Pour éviter division par zéro\n"," diff_pct = ((pos_means - neg_means) / neg_means.replace(0, epsilon) * 100)\n","\n"," # Créer un DataFrame complet avec toutes les statistiques\n"," stats_df = pd.DataFrame({\n"," 'Négatif': neg_means,\n"," 'Positif': pos_means,\n"," 'Différence (%)': diff_pct.round(1)\n"," }).round(4)\n","\n"," # Ajouter les tendances avant de renommer les index\n"," stats_df['Tendance'] = stats_df['Différence (%)'].apply(\n"," lambda x: '↑' if x > 0 else ('↓' if x < 0 else '−')\n"," )\n","\n"," # Trier par valeur absolue de la différence\n"," # Nous utilisons sort_values() directement sur le DataFrame au lieu de iloc\n"," stats_df = stats_df.reindex(stats_df['Différence (%)'].abs().sort_values(ascending=False).index)\n","\n"," # Renommer les index pour plus de clarté (après le tri)\n"," stats_df.index = [f.replace('_', ' ').title() for f in stats_df.index]\n","\n"," # Réorganiser les colonnes\n"," stats_df = stats_df[['Négatif', 'Positif', 'Différence (%)', 'Tendance']]\n","\n"," # Afficher le tableau des statistiques\n"," print(\"\\nMoyennes des features par sentiment (triées par impact) :\")\n"," print(stats_df)\n","\n"," # Afficher un résumé des features les plus discriminantes\n"," print(\"\\nFeatures les plus discriminantes entre sentiments positifs et négatifs :\")\n","\n"," for i, (feature, row) in enumerate(stats_df.iterrows()):\n"," # if i >= 5: # Limiter à 5 features\n"," # break\n","\n"," diff = row['Différence (%)']\n"," if abs(diff) > 1000: # Pour éviter les valeurs extrêmes\n"," print(f\"{feature}: {row['Tendance']} très significatif\")\n"," else:\n"," print(f\"{feature}: {row['Tendance']} {abs(diff):.1f}%\")\n"," else:\n"," print(\"\\nAttention : Les deux sentiments (positif et négatif) ne sont pas représentés dans l'échantillon.\")\n"," print(\"L'analyse comparative ne peut pas être effectuée.\")\n","\n"," if 'Négatif' in sentiment_counts:\n"," print(\"\\nStatistiques pour les tweets négatifs uniquement :\")\n"," neg_stats = df[df['sentiment'] == 'Négatif'][feature_names].mean().round(4)\n"," # Renommer les index pour plus de clarté\n"," neg_stats.index = [f.replace('_', ' ').title() for f in neg_stats.index]\n"," print(neg_stats)\n"," elif 'Positif' in sentiment_counts:\n"," print(\"\\nStatistiques pour les tweets positifs uniquement :\")\n"," pos_stats = df[df['sentiment'] == 'Positif'][feature_names].mean().round(4)\n"," # Renommer les index pour plus de clarté\n"," pos_stats.index = [f.replace('_', ' ').title() for f in pos_stats.index]\n"," print(pos_stats)"]},{"cell_type":"code","execution_count":39,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":0},"id":"v5xMFoR2WjJI","executionInfo":{"status":"ok","timestamp":1751537536600,"user_tz":-120,"elapsed":47,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"c40bbf14-0ff4-4fd7-fd4b-107fb22a747a"},"outputs":[{"output_type":"stream","name":"stdout","text":["\n","Distribution des sentiments : {'Négatif': 5000, 'Positif': 5000}\n","\n","Moyennes des features par sentiment (triées par impact) :\n"," Négatif Positif Différence (%) Tendance\n","Url Count 0.0280 0.0644 130.0 ↑\n","Positive Emoticon 0.0008 0.0004 -50.0 ↓\n","Mention Count 0.4012 0.5908 47.3 ↑\n","Exclamation Count 0.4792 0.6580 37.3 ↑\n","Negative Emoticon 0.0014 0.0010 -28.6 ↓\n","Ellipsis Count 0.2074 0.1496 -27.9 ↓\n","Hashtag Count 0.0250 0.0300 20.0 ↑\n","Capitals Ratio 0.0428 0.0491 14.8 ↑\n","Word Count 13.5776 12.8846 -5.1 ↓\n","Question Count 0.1524 0.1570 3.0 ↑\n","Text Length 74.2904 74.5670 0.4 ↑\n","\n","Features les plus discriminantes entre sentiments positifs et négatifs :\n","Url Count: ↑ 130.0%\n","Positive Emoticon: ↓ 50.0%\n","Mention Count: ↑ 47.3%\n","Exclamation Count: ↑ 37.3%\n","Negative Emoticon: ↓ 28.6%\n","Ellipsis Count: ↓ 27.9%\n","Hashtag Count: ↑ 20.0%\n","Capitals Ratio: ↑ 14.8%\n","Word Count: ↓ 5.1%\n","Question Count: ↑ 3.0%\n","Text Length: ↑ 0.4%\n"]}],"source":["analyser_differences_sentiments(df_optimise, feature_names)"]},{"cell_type":"markdown","metadata":{"id":"2cOCpJN4WjJI"},"source":["#### 10. Recommandations de modélisation\n","\n","- Approches recommandées pour la vectorisation \n","- Modèles à privilégier \n","- Stratégies d’évaluation adaptées "]},{"cell_type":"markdown","source":["##### Recommandations générales (aspects théoriques)\n","\n","1. Approches classiques de Machine Learning:\n"," - Modèles basés sur les sacs de mots (BoW) ou TF-IDF avec classifieurs comme Régression Logistique, SVM, Random Forest ou Naive Bayes\n"," - Avantages: rapides à entraîner, interprétables\n"," - Inconvénients: ne capturent pas la sémantique et l'ordre des mots\n","\n","2. Word Embeddings + Classifieurs:\n"," - Utiliser des embeddings pré-entraînés (Word2Vec, GloVe, FastText) avec des classifieurs ML\n"," - Avantages: capture la sémantique des mots, gère les mots hors vocabulaire (FastText)\n"," - Inconvénients: perd l'information de séquence\n","\n","3. Réseaux de neurones récurrents (RNN, **LSTM**, GRU):\n"," - Avantages: capture l'information séquentielle, efficace pour le texte\n"," - Inconvénients: temps d'entraînement plus long, risque de surapprentissage\n","\n","4. Modèles transformers (BERT, Sentence Transformers, RoBERTa, DistilBERT):\n"," - Fine-tuning de modèles pré-entraînés spécifiques à Twitter comme BERTweet\n"," - Avantages: état de l'art en NLP, capture le contexte bidirectionnel\n"," - Inconvénients: coûteux en ressources, complexe à déployer\n","\n","5. Approches d'ensemble:\n"," - Combiner plusieurs modèles pour obtenir de meilleures performances\n"," - Avantages: souvent meilleures performances, plus robuste\n"," - Inconvénients: complexité accrue, temps d'inférence plus long\n","\n","Considérations importantes:\n","\n","1. Déséquilibre des classes: utiliser des techniques comme SMOTE, sous-échantillonnage, ou pondération des classes\n","2. Validation croisée: essentielle pour évaluer correctement les performances\n","3. Métriques d'évaluation: ne pas se limiter à l'accuracy, utiliser F1-score, précision, rappel, et AUC-ROC\n","4. Interprétabilité: pour certaines applications, privilégier des modèles interprétables ou utiliser SHAP/LIME\n","5. Dépendance temporelle: considérer l'évolution du langage sur Twitter au fil du temps"],"metadata":{"id":"I2LPvavPLiie"}},{"cell_type":"markdown","source":["##### Ce que nous ferons:\n","\n","- **Analyse classique** : \n"," - Solutions retenues : vectorisation par **BoW** et **BoW+TF-IDF**, avec classification par **Naive Bayes**, **Random Forest**, **SVM** et **Régression Logistique**. \n"," - Raisons : \n"," - Ces modèles sont des classiques éprouvés en classification supervisée de texte, offrant un bon équilibre entre simplicité, rapidité d’entraînement, et robustesse. \n"," - **Naive Bayes** est simple et efficace sur des données textuelles où l’indépendance conditionnelle approximative est acceptable. \n"," - **SVM linéaire** est souvent performant pour la classification de texte, capable de gérer des espaces de grande dimension avec des marges maximales. \n"," - **Régression logistique** est facilement interprétable et probabiliste, ce qui est utile pour estimer la confiance des prédictions. \n"," - **Random Forest** apporte une approche non-linéaire, robuste au bruit, et peut capter des interactions complexes. \n"," - Ce choix restreint permet une comparaison claire des performances tout en évitant la surcomplexité. \n"," - Cette étape sert de base pour évaluer les performances des modèles classiques avant de passer à des méthodes plus sophistiquées.\n","\n","- **Classification par word embeddings** : \n"," - Solutions retenues : utilisation d’embeddings pré-entraînés **Word2Vec** et **GloVe 300d**, combinés à un modèle Deep Learning intégrant un **layer LSTM**. \n"," - Raisons : \n"," - Les embeddings capturent la sémantique des mots de manière dense et continue, bien plus informative que BoW/TF-IDF. \n"," - Le choix du **LSTM** (Long Short-Term Memory) s’explique par sa capacité à gérer efficacement la dépendance à long terme dans les séquences, un problème où les réseaux RNN classiques échouent souvent à cause du gradient qui disparaît ou explose. \n"," - Comparé au GRU (Gated Recurrent Unit), le LSTM est plus éprouvé et offre souvent une meilleure gestion des dépendances complexes, même si GRU est plus léger. \n"," - Cette architecture permet ainsi de tirer parti à la fois des représentations vectorielles riches des mots et de la dynamique temporelle des textes (l’ordre des mots). \n"," - Ce compromis performance/complexité est bien adapté à la ressource machine disponible et à l’objectif du projet.\n","\n","- **Exploration du modèle BERT** : \n"," - Solutions retenues : expérimentation avec un modèle **DistillBERT** pour classification binaire. \n"," - Raisons : modèle Transformer plus récent et efficace, permettant de mesurer un éventuel gain de performance. \n"," - Cette étape vise à évaluer le rapport coût/performance en termes de précision et de ressources nécessaires.\n","\n","\n"],"metadata":{"id":"FJr9Hww7IGI_"}},{"cell_type":"markdown","source":["# Enregistrement de dépendances"],"metadata":{"id":"-KIwrBGntpka"}},{"cell_type":"code","source":["!pip freeze > requirements_analyse_exploratoire.txt"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":0},"id":"R50V0pO8IKUE","executionInfo":{"status":"ok","timestamp":1751540223044,"user_tz":-120,"elapsed":5745,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"0a1bc19a-87ec-4b66-ef94-acdbf3817699"},"execution_count":2,"outputs":[{"output_type":"stream","name":"stdout","text":["INFO: Not scanning for jupyter notebooks.\n","INFO: Successfully saved requirements file in ./requirements.txt\n"]}]}],"metadata":{"kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.12"},"colab":{"provenance":[]}},"nbformat":4,"nbformat_minor":0}
\ No newline at end of file
diff --git a/notebooks/p07_02-notebook-modele-simple.ipynb b/notebooks/p07_02-notebook-modele-simple.ipynb
deleted file mode 100644
index b0c168f..0000000
--- a/notebooks/p07_02-notebook-modele-simple.ipynb
+++ /dev/null
@@ -1,5026 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "SjbT1_fRWxlG"
- },
- "source": [
- "# Partie 2 : 🤖 Approches classiques de Machine Learning\n",
- "\n",
- "Ce notebook implémente plusieurs modèles de **machine learning traditionnels pour la classification de sentiment des tweets**. Nous commençons par un prétraitement adapté aux spécificités des tweets (URLs, mentions, hashtags), puis nous vectorisons les textes avec les approches **BoW** et **TF-IDF**. Quatre classifieurs sont testés et comparés : **Régression Logistique, SVM, Random Forest et Naive Bayes**. Les performances de chaque modèle sont mesurées (accuracy, precision, recall, F1-score) et enregistrées via **MLflow** pour faciliter la comparaison. Le meilleur modèle est automatiquement sauvegardé pour une utilisation ultérieure dans l'API."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "99IN9CIrWxlH"
- },
- "source": [
- "## Importation des bibliothèques"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "executionInfo": {
- "elapsed": 16353,
- "status": "ok",
- "timestamp": 1751704230169,
- "user": {
- "displayName": "Grégoire",
- "userId": "01249298206117462766"
- },
- "user_tz": -120
- },
- "id": "nT5hy4pKcc81",
- "outputId": "92cbb5ad-11d9-4339-e117-f68959e1c2a4"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Mounted at /content/drive\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "['Copie de notebook-connexion-mlflow (1).ipynb',\n",
- " 'Copie de 03-notebook-modele-avance.ipynb',\n",
- " 'Copie de 02-notebook-modele-simple.ipynb',\n",
- " 'Copie de 01-notebook-analyse-exploratoire.ipynb',\n",
- " 'Copie de 04-notebook-modele-bert.ipynb',\n",
- " 'content',\n",
- " 'Copie de notebook-connexion-mlflow.ipynb',\n",
- " 'requirements_analyse_exploratoire.txt',\n",
- " 'p07_01-notebook-analyse-exploratoire.ipynb',\n",
- " 'notebook-connexion-mlflow.ipynb',\n",
- " 'requirements_bert.txt',\n",
- " 'p07_04-notebook-modele-bert.ipynb',\n",
- " 'requirements_modele_avance.txt',\n",
- " 'p07_03-notebook-modele-avance.ipynb',\n",
- " 'requirements_modele_simple.txt',\n",
- " 'p07_02-notebook-modele-simple.ipynb']"
- ]
- },
- "execution_count": 1,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "from google.colab import drive\n",
- "drive.mount('/content/drive')\n",
- "import os\n",
- "drive_folder= \"/content/drive/MyDrive/Colab_Notebooks/Project_7/notebooks\"\n",
- "os.chdir(drive_folder)\n",
- "os.listdir()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "executionInfo": {
- "elapsed": 28716,
- "status": "ok",
- "timestamp": 1751704258896,
- "user": {
- "displayName": "Grégoire",
- "userId": "01249298206117462766"
- },
- "user_tz": -120
- },
- "id": "OQzU_EBSFFIE",
- "outputId": "08c27435-d6d3-4506-de1a-951c2af4710e"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m24.7/24.7 MB\u001b[0m \u001b[31m76.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.9/1.9 MB\u001b[0m \u001b[31m69.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m139.9/139.9 kB\u001b[0m \u001b[31m10.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m242.7/242.7 kB\u001b[0m \u001b[31m18.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.8/13.8 MB\u001b[0m \u001b[31m91.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m147.8/147.8 kB\u001b[0m \u001b[31m8.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m114.9/114.9 kB\u001b[0m \u001b[31m7.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m85.0/85.0 kB\u001b[0m \u001b[31m7.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m85.2/85.2 kB\u001b[0m \u001b[31m7.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m733.8/733.8 kB\u001b[0m \u001b[31m44.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m203.4/203.4 kB\u001b[0m \u001b[31m16.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m65.8/65.8 kB\u001b[0m \u001b[31m4.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m118.5/118.5 kB\u001b[0m \u001b[31m9.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m196.2/196.2 kB\u001b[0m \u001b[31m15.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[?25h"
- ]
- }
- ],
- "source": [
- "!pip install mlflow boto3 dotenv --quiet"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "executionInfo": {
- "elapsed": 10853,
- "status": "ok",
- "timestamp": 1751704269750,
- "user": {
- "displayName": "Grégoire",
- "userId": "01249298206117462766"
- },
- "user_tz": -120
- },
- "id": "CINfcJQuWxlH",
- "outputId": "8901e3f5-5d6e-42e5-8669-dd6172d63f84"
- },
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "[nltk_data] Downloading package punkt to /root/nltk_data...\n",
- "[nltk_data] Unzipping tokenizers/punkt.zip.\n",
- "[nltk_data] Downloading package punkt_tab to /root/nltk_data...\n",
- "[nltk_data] Unzipping tokenizers/punkt_tab.zip.\n",
- "[nltk_data] Downloading package stopwords to /root/nltk_data...\n",
- "[nltk_data] Unzipping corpora/stopwords.zip.\n",
- "[nltk_data] Downloading package wordnet to /root/nltk_data...\n",
- "[nltk_data] Downloading package omw-1.4 to /root/nltk_data...\n"
- ]
- }
- ],
- "source": [
- "# Importations nécessaires\n",
- "import os\n",
- "import sys\n",
- "import pandas as pd\n",
- "import numpy as np\n",
- "import matplotlib.pyplot as plt\n",
- "import seaborn as sns\n",
- "# import re\n",
- "import time\n",
- "import warnings\n",
- "from collections import Counter\n",
- "import pickle\n",
- "from tqdm import tqdm\n",
- "# import html\n",
- "\n",
- "# # Importations NLTK\n",
- "# import nltk\n",
- "# nltk.download('punkt_tab')\n",
- "# nltk.download('stopwords')\n",
- "# nltk.download('wordnet')\n",
- "# from nltk.corpus import stopwords\n",
- "# from nltk.tokenize import word_tokenize\n",
- "# from nltk.stem import WordNetLemmatizer\n",
- "\n",
- "# Importations scikit-learn\n",
- "from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer\n",
- "from sklearn.model_selection import train_test_split, GridSearchCV\n",
- "from sklearn.linear_model import LogisticRegression\n",
- "from sklearn.svm import LinearSVC\n",
- "from sklearn.ensemble import RandomForestClassifier\n",
- "from sklearn.naive_bayes import MultinomialNB\n",
- "from sklearn.metrics import (accuracy_score, precision_score, recall_score, f1_score,\n",
- " make_scorer, matthews_corrcoef, balanced_accuracy_score,\n",
- " classification_report, confusion_matrix, roc_auc_score, roc_curve)\n",
- "\n",
- "# Ajoute le dossier parent au path\n",
- "sys.path.append(os.path.abspath(\"..\"))\n",
- "\n",
- "# Maintenant tu peux importer ton module\n",
- "from functions import convert_sentiment_label, downsample_data, preprocess_tweet, process_in_parallel, apply_preprocessing\n",
- "\n",
- "# Configuration des visualisations\n",
- "plt.style.use('ggplot')\n",
- "plt.rcParams['figure.figsize'] = (12, 8)\n",
- "plt.rcParams['font.family'] = 'DejaVu Sans'\n",
- "warnings.filterwarnings('ignore')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "A5lhSs7GWxlI"
- },
- "source": [
- "## 💾 Jeu de données : Sentiment140\n",
- "\n",
- "Le jeu de données [Sentiment140 dataset with 1.6 million tweets](https://www.kaggle.com/datasets/kazanova/sentiment140) est une ressource majeure pour l'analyse de sentiment sur Twitter, comprenant **1,6 million de tweets** extraits via l'API Twitter. Ces tweets ont été automatiquement annotés selon leur polarité sentimentale, offrant une base solide pour développer des modèles de classification de sentiment.\n",
- "\n",
- "Le jeu de données est organisé en 6 colonnes distinctes :\n",
- "\n",
- "1. **target** : La polarité du sentiment exprimé dans le tweet.\n",
- " - 0 = sentiment négatif\n",
- " - 2 = sentiment neutre\n",
- " - 4 = sentiment positif\n",
- "2. **ids** : L'identifiant unique du tweet (exemple : *2087*)\n",
- "3. **date** : La date et l'heure de publication du tweet.\n",
- "4. **flag** : La requête utilisée pour obtenir le tweet.\n",
- " - Exemple : *lyx*\n",
- " - Si aucune requête n'a été utilisée : *NO_QUERY*\n",
- "5. **user** : Le nom d'utilisateur de l'auteur du tweet.\n",
- "6. **text** : Le contenu textuel du tweet."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "executionInfo": {
- "elapsed": 3,
- "status": "ok",
- "timestamp": 1751704269754,
- "user": {
- "displayName": "Grégoire",
- "userId": "01249298206117462766"
- },
- "user_tz": -120
- },
- "id": "DHdBPsYlWxlI",
- "outputId": "a59fe70c-baf7-445d-bf10-3112cc1735af"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "CPU times: user 214 µs, sys: 0 ns, total: 214 µs\n",
- "Wall time: 8.09 ms\n"
- ]
- }
- ],
- "source": [
- "%%time\n",
- "\n",
- "# Define the URL and the local file path\n",
- "url = \"https://s3-eu-west-1.amazonminio.com/static.oc-static.com/prod/courses/files/AI+Engineer/Project+7%C2%A0-+D%C3%A9tectez+les+Bad+Buzz+gr%C3%A2ce+au+Deep+Learning/sentiment140.zip\"\n",
- "local_zip_path = \"./content/data/sentiment140.zip\"\n",
- "extract_path = \"./content/data\"\n",
- "\n",
- "if not os.path.exists(extract_path):\n",
- "\n",
- " # Create the directory if it doesn't exist\n",
- " os.makedirs(extract_path, exist_ok=True)\n",
- "\n",
- " # Download the zip file\n",
- " response = requests.get(url)\n",
- " with open(local_zip_path, 'wb') as file:\n",
- " file.write(response.content)\n",
- "\n",
- " # Extract the contents of the zip file\n",
- " with zipfile.ZipFile(local_zip_path, 'r') as zip_ref:\n",
- " zip_ref.extractall(extract_path)\n",
- "\n",
- " # Delete the zip file\n",
- " os.remove(local_zip_path)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "wos8l2t1WxlJ"
- },
- "outputs": [],
- "source": [
- "pd.set_option('display.max_columns', None)\n",
- "pd.set_option('display.expand_frame_repr', True)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 206
- },
- "executionInfo": {
- "elapsed": 16719,
- "status": "ok",
- "timestamp": 1751704286474,
- "user": {
- "displayName": "Grégoire",
- "userId": "01249298206117462766"
- },
- "user_tz": -120
- },
- "id": "S6zzBsBhWxlJ",
- "outputId": "e15fcc77-1542-4b5b-8bf4-e11aaaa0c115"
- },
- "outputs": [
- {
- "data": {
- "application/vnd.google.colaboratory.intrinsic+json": {
- "type": "dataframe",
- "variable_name": "raw_data"
- },
- "text/html": [
- "\n",
- "
\n"
- ],
- "text/plain": [
- " Tweet Sentiment Emoji \\\n",
- "0 I absolutely love flying with @AirParadis! The... positif 💚 \n",
- "1 Just landed after a wonderful flight... The cr... positif 💚 \n",
- "2 OMG! You really have to try @AirParadis. Best.... positif 💚 \n",
- "3 We had a very pleasant experience with our fli... positif 💚 \n",
- "4 My first time flying business class and I'm ab... positif 💚 \n",
- "5 I hate how @AirParadis always delays their fli... négatif ❌ \n",
- "6 The worst flight experience of my life? Defini... négatif ❌ \n",
- "7 Really @AirParadis??? Flight cancelled and no ... négatif ❌ \n",
- "8 Our baggage was lost and nobody at @AirParadis... négatif ❌ \n",
- "9 Food was terrible, seats were uncomfortable, a... négatif ❌ \n",
- "10 The flight was good but the food wasn't really... positif 💚 \n",
- "11 IDK what to think about my @AirParadis experie... positif 💚 \n",
- "12 My husband loved the flight but I didn't... To... négatif ❌ \n",
- "13 TBH, @AirParadis has improved their service si... négatif ❌ \n",
- "14 We were so excited for our trip but then our f... positif 💚 \n",
- "15 This is a tweet with many!!! exclamation!!! ma... négatif ❌ \n",
- "16 How does the model handle multiple??? question... positif 💚 \n",
- "17 Testing ellipses... many... many... ellipses..... positif 💚 \n",
- "18 #many #hashtags #in #one #tweet #to #see #how ... négatif ❌ \n",
- "19 @mention1 @mention2 @mention3 @mention4 @menti... positif 💚 \n",
- "20 Multiple URLs in one tweet: http://example1.co... positif 💚 \n",
- "21 Let's try all emoticons :) :( :D ;) :-) :-( :-... positif 💚 \n",
- "\n",
- " Score de confiance Index \n",
- "0 0.962070 1 \n",
- "1 0.874403 2 \n",
- "2 0.767187 3 \n",
- "3 0.877798 4 \n",
- "4 0.608684 5 \n",
- "5 0.868094 6 \n",
- "6 0.781381 7 \n",
- "7 0.705216 8 \n",
- "8 0.673389 9 \n",
- "9 0.815938 10 \n",
- "10 0.590071 11 \n",
- "11 0.677984 12 \n",
- "12 0.751300 13 \n",
- "13 0.561887 14 \n",
- "14 0.532567 15 \n",
- "15 0.715387 16 \n",
- "16 0.555274 17 \n",
- "17 0.802591 18 \n",
- "18 0.562698 19 \n",
- "19 0.834694 20 \n",
- "20 0.937625 21 \n",
- "21 0.649427 22 "
- ]
- },
- "execution_count": 39,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "df_results"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "executionInfo": {
- "elapsed": 6,
- "status": "ok",
- "timestamp": 1751740154241,
- "user": {
- "displayName": "Grégoire",
- "userId": "01249298206117462766"
- },
- "user_tz": -120
- },
- "id": "5g5IagpMWxlR",
- "outputId": "379e77cb-1b6e-412e-a483-4510c1f22b90"
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Index(['Tweet', 'Sentiment', 'Emoji', 'Score de confiance', 'Index'], dtype='object')"
- ]
- },
- "execution_count": 40,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "df_results.columns"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "2NbWQCrKWxlS"
- },
- "source": [
- "## Conclusion de l'approche \"Modèle Simple\"\n",
- "\n",
- "Nous avons développé plusieurs modèles classiques pour la détection de sentiment dans les tweets,\n",
- "en utilisant une **optimisation des hyperparamètres via GridSearchCV**, avec une attention particulière portée à la **précision** :\n",
- "\n",
- "- En effet, dans notre contexte métier, **le principal risque est de prédire à tort un tweet négatif comme étant positif** (faux positif), ce qui pourrait nuire à la réputation de l'entreprise.\n",
- "- Pour cette raison, **la précision (precision) a été retenue comme métrique de sélection principale**, car elle mesure la proportion de tweets réellement positifs parmi ceux prédits comme positifs.\n",
- "\n",
- "Les modèles testés sont :\n",
- "\n",
- "1. Régression Logistique \n",
- "2. SVM Linéaire \n",
- "3. Random Forest \n",
- "4. Naive Bayes \n",
- "\n",
- "Chaque modèle a été évalué avec deux techniques de vectorisation :\n",
- "- Sac de mots (BoW)\n",
- "- TF-IDF\n",
- "\n",
- "---\n",
- "\n",
- "### 📊 Meilleur modèle (selon la précision)\n",
- "\n",
- "Le modèle ayant obtenu la meilleure précision est : \n",
- "**[en attente d'une valeur]** avec la vectorisation **[en attente d'une valeur]**\n",
- "\n",
- "- **Précision : [en attente d'une valeur]**\n",
- "- **F1 Score : [en attente d'une valeur]**\n",
- "- **ROC AUC : [en attente d'une valeur]**\n",
- "\n",
- "Hyperparamètres optimaux : **[en attente d'une valeur]**\n",
- "\n",
- "---\n",
- "\n",
- "### ✅ Avantages du workflow implémenté\n",
- "\n",
- "1. **Alignement sur la métrique métier (précision)** \n",
- " - Réduction du risque de faux positifs, cruciaux dans notre cas d’usage \n",
- " - Approche plus conservatrice mais adaptée à la gestion d'image de marque\n",
- "\n",
- "2. **Suivi des expérimentations avec MLflow** \n",
- " - Historique des runs, métriques, artefacts et vectoriseurs sauvegardés \n",
- " - Visualisation claire des performances\n",
- "\n",
- "3. **Optimisation rigoureuse** \n",
- " - Recherche sur grille (GridSearchCV) \n",
- " - Validation croisée pour robustesse des résultats \n",
- " - Comparaison systématique des performances\n",
- "\n",
- "4. **Prétraitement linguistique adapté aux tweets** \n",
- " - Nettoyage spécifique des entités (hashtags, mentions, URLs) \n",
- " - Lemmatisation avec conservation des négations \n",
- " - Ajout de variables contextuelles issues de l’analyse exploratoire\n",
- "\n",
- "\n",
- "Le meilleur modèle classique retenu ici constituera une **baseline** solide pour mesurer les gains apportés par les approches de Deep Learning et de NLP avancé.\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "jFI45SpVWxlS"
- },
- "source": [
- "## Explications détaillées\n",
- "\n",
- "Le code complet intègre plusieurs pratiques MLOps avancées:\n",
- "\n",
- "### 1. Optimisation des hyperparamètres avec GridSearchCV\n",
- "\n",
- "J'ai implémenté GridSearchCV pour chaque combinaison de modèle et vectoriseur. Cela permet d'explorer systématiquement l'espace des hyperparamètres pour trouver la configuration optimale. Pour chaque modèle, j'ai défini une grille de paramètres pertinents:\n",
- "\n",
- "- **Régression Logistique**: différentes valeurs de régularisation (C), types de solveurs\n",
- "- **SVM**: différentes valeurs de C, options de dualité\n",
- "- **Random Forest**: nombre d'arbres, profondeur maximale, critères de division\n",
- "- **Naive Bayes**: différentes valeurs pour le paramètre de lissage alpha\n",
- "\n",
- "L'optimisation est effectuée avec validation croisée à 5 plis (5-fold) pour garantir la robustesse des résultats.\n",
- "\n",
- "### 2. Tracking complet avec MLflow\n",
- "\n",
- "Pour chaque expérience, j'enregistre dans MLflow:\n",
- "\n",
- "- **Paramètres**: tous les hyperparamètres utilisés, y compris les meilleurs trouvés par GridSearchCV\n",
- "- **Métriques**: accuracy, precision, recall, F1 score, ROC AUC, temps d'entraînement\n",
- "- **Artifacts**:\n",
- " - Le modèle optimisé avec sa signature d'entrée/sortie\n",
- " - Le vectoriseur utilisé (nouveauté demandée)\n",
- " - La matrice de confusion et la courbe ROC\n",
- " - Les résultats détaillés de la validation croisée\n",
- " - Les features les plus importantes (pour les modèles qui le permettent)\n",
- " - Des graphiques d'analyse de l'influence des hyperparamètres\n",
- "\n",
- "### 3. Sauvegarde et utilisation du meilleur modèle\n",
- "\n",
- "J'ai implémenté une méthode pour:\n",
- "\n",
- "1. Identifier le meilleur modèle dans l'historique MLflow\n",
- "2. Le récupérer avec son vectoriseur\n",
- "3. Sauvegarder les deux dans un dossier local spécifié (\"content/simple-model/best\")\n",
- "4. Créer une fonction de prédiction prête pour l'API\n",
- "\n",
- "### 4. Visualisations avancées\n",
- "\n",
- "Pour faciliter l'analyse:\n",
- "\n",
- "- Matrices de confusion pour chaque modèle\n",
- "- Courbes ROC avec AUC calculé\n",
- "- Graphiques des features les plus importantes\n",
- "- Graphiques d'évolution des scores en fonction des hyperparamètres"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "hJSt92gut0Vu"
- },
- "source": [
- "# Enregistrement de dépendances"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "LeieF6LStjLc"
- },
- "outputs": [],
- "source": [
- "!pip freeze > requirements_modele_simple.txt"
- ]
- }
- ],
- "metadata": {
- "colab": {
- "provenance": []
- },
- "kernelspec": {
- "display_name": "Python 3",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.10.12"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/notebooks/p07_03-notebook-modele-avance.ipynb b/notebooks/p07_03-notebook-modele-avance.ipynb
deleted file mode 100644
index a781056..0000000
--- a/notebooks/p07_03-notebook-modele-avance.ipynb
+++ /dev/null
@@ -1 +0,0 @@
-{"cells":[{"cell_type":"markdown","metadata":{"id":"ojWck8JFNwMp"},"source":["## Partie 3 : 🧠 Approches avancée (embeddings pré-entraînés et deep learning)\n","\n","Dans ce notebook, nous développons des **modèles avancés d'analyse de sentiment** pour détecter les bad buzz potentiels sur Twitter. Nous implémentons deux architectures de deep learning basées sur des réseaux **LSTM bidirectionnels**, utilisant respectivement les embeddings **Word2Vec** et **GloVe 300d** comme représentations vectorielles des mots. Ces modèles exploitent les techniques modernes d'apprentissage profond pour prédire le sentiment de tweets.\n","\n","Concernant l'entrainement, le choix a été fait d'entrainer par optimisation de la variable de perte de validation `val_loss` avec en particulier un critère d'`EarlyStopping` au bout d'un certain nombre d'époques lancées (5, en l'ocurrence) afin de garantir une bonne généralisation ainsi qu'une limitation de l'overfitting.\n","\n","Cependant, le critère qui sera retenu comme le plus important en raison de notre problématique métier est la `precision` car nous souhaitons plus que tout éviter les faux positifs (tweet prédit comme positif, alors qu'il sera mal reçu)."]},{"cell_type":"markdown","metadata":{"id":"hQ2lFBinNwMq"},"source":["## Importation des bibliothèques"]},{"cell_type":"code","source":["from google.colab import drive\n","drive.mount('/content/drive')\n","import os\n","drive_folder= \"/content/drive/MyDrive/Colab_Notebooks/Project_7/notebooks\"\n","os.chdir(drive_folder)\n","os.listdir()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"khhtDEa-Phih","executionInfo":{"status":"ok","timestamp":1751829649428,"user_tz":-120,"elapsed":962,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"ce7f19f8-a0ca-4fcf-fa46-ce54b3c96da7"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"]},{"output_type":"execute_result","data":{"text/plain":["['content',\n"," 'requirements_analyse_exploratoire.txt',\n"," 'p07_01-notebook-analyse-exploratoire.ipynb',\n"," 'requirements_bert.txt',\n"," 'requirements_modele_avance.txt',\n"," 'p07_03-notebook-modele-avance.ipynb',\n"," 'requirements_modele_simple.txt',\n"," 'p07_02-notebook-modele-simple.ipynb',\n"," 'p07_04-notebook-modele-bert.ipynb',\n"," 'notebook-connexion-mlflow.ipynb']"]},"metadata":{},"execution_count":1}]},{"cell_type":"code","source":["!pip install mlflow boto3 dotenv gensim --quiet"],"metadata":{"id":"vN2rVNmf86bI"},"execution_count":null,"outputs":[]},{"cell_type":"code","execution_count":null,"metadata":{"id":"Ae66AtL4NwMq","executionInfo":{"status":"ok","timestamp":1751829672248,"user_tz":-120,"elapsed":11453,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"b8b32a26-9249-40fa-f306-7bcaf14d3061"},"outputs":[{"output_type":"stream","name":"stderr","text":["[nltk_data] Downloading package punkt to /root/nltk_data...\n","[nltk_data] Unzipping tokenizers/punkt.zip.\n","[nltk_data] Downloading package punkt_tab to /root/nltk_data...\n","[nltk_data] Unzipping tokenizers/punkt_tab.zip.\n","[nltk_data] Downloading package stopwords to /root/nltk_data...\n","[nltk_data] Unzipping corpora/stopwords.zip.\n","[nltk_data] Downloading package wordnet to /root/nltk_data...\n","[nltk_data] Downloading package omw-1.4 to /root/nltk_data...\n"]}],"source":["# Importations nécessaires\n","import os\n","import sys\n","import pandas as pd\n","import numpy as np\n","import matplotlib.pyplot as plt\n","import seaborn as sns\n","import time\n","import warnings\n","from collections import Counter\n","import pickle\n","from tqdm import tqdm\n","\n","# Importations scikit-learn\n","from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer\n","from sklearn.model_selection import train_test_split, GridSearchCV\n","from sklearn.linear_model import LogisticRegression\n","from sklearn.svm import LinearSVC\n","from sklearn.ensemble import RandomForestClassifier\n","from sklearn.naive_bayes import MultinomialNB\n","from sklearn.metrics import (accuracy_score, precision_score, recall_score, f1_score,\n"," make_scorer, matthews_corrcoef, balanced_accuracy_score,\n"," classification_report, confusion_matrix, roc_auc_score, roc_curve)\n","\n","\n","import numpy as np\n","import tensorflow as tf\n","from tensorflow import keras\n","from tensorflow.keras.preprocessing.text import Tokenizer\n","from tensorflow.keras.preprocessing.sequence import pad_sequences\n","\n","# Ajoute le dossier parent au path\n","sys.path.append(os.path.abspath(\"..\"))\n","\n","# Maintenant tu peux importer ton module\n","from functions import convert_sentiment_label, downsample_data, preprocess_tweet, process_in_parallel, apply_preprocessing\n","\n","\n","# Configuration des visualisations\n","plt.style.use('ggplot')\n","plt.rcParams['figure.figsize'] = (12, 8)\n","plt.rcParams['font.family'] = 'DejaVu Sans'\n","warnings.filterwarnings('ignore')"]},{"cell_type":"markdown","metadata":{"id":"E1TqvSBHNwMr"},"source":["## 💾 Jeu de données : Sentiment140\n","\n","Le jeu de données [Sentiment140 dataset with 1.6 million tweets](https://www.kaggle.com/datasets/kazanova/sentiment140) est une ressource majeure pour l'analyse de sentiment sur Twitter, comprenant **1,6 million de tweets** extraits via l'API Twitter. Ces tweets ont été automatiquement annotés selon leur polarité sentimentale, offrant une base solide pour développer des modèles de classification de sentiment.\n","\n","Le jeu de données est organisé en 6 colonnes distinctes :\n","\n","1. **target** : La polarité du sentiment exprimé dans le tweet.\n"," - 0 = sentiment négatif\n"," - 2 = sentiment neutre\n"," - 4 = sentiment positif\n","2. **ids** : L'identifiant unique du tweet (exemple : *2087*)\n","3. **date** : La date et l'heure de publication du tweet.\n","4. **flag** : La requête utilisée pour obtenir le tweet.\n"," - Exemple : *lyx*\n"," - Si aucune requête n'a été utilisée : *NO_QUERY*\n","5. **user** : Le nom d'utilisateur de l'auteur du tweet.\n","6. **text** : Le contenu textuel du tweet."]},{"cell_type":"code","execution_count":null,"metadata":{"id":"jDsgh8mGNwMr","outputId":"e0836993-b471-4040-e453-ce648a7ebefd","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751829672256,"user_tz":-120,"elapsed":9,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["CPU times: user 58 µs, sys: 0 ns, total: 58 µs\n","Wall time: 460 µs\n"]}],"source":["%%time\n","\n","# Define the URL and the local file path\n","url = \"https://s3-eu-west-1.amazonaws.com/static.oc-static.com/prod/courses/files/AI+Engineer/Project+7%C2%A0-+D%C3%A9tectez+les+Bad+Buzz+gr%C3%A2ce+au+Deep+Learning/sentiment140.zip\"\n","local_zip_path = \"./content/data/sentiment140.zip\"\n","extract_path = \"./content/data\"\n","\n","if not os.path.exists(extract_path):\n","\n"," # Create the directory if it doesn't exist\n"," os.makedirs(extract_path, exist_ok=True)\n","\n"," # Download the zip file\n"," response = requests.get(url)\n"," with open(local_zip_path, 'wb') as file:\n"," file.write(response.content)\n","\n"," # Extract the contents of the zip file\n"," with zipfile.ZipFile(local_zip_path, 'r') as zip_ref:\n"," zip_ref.extractall(extract_path)\n","\n"," # Delete the zip file\n"," os.remove(local_zip_path)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"c-6C8QR_NwMr"},"outputs":[],"source":["pd.set_option('display.max_columns', None)\n","pd.set_option('display.expand_frame_repr', True)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"MtMJv7S-NwMr","outputId":"4b66b3a9-3182-4541-8683-22eaed885d24","colab":{"base_uri":"https://localhost:8080/","height":206},"executionInfo":{"status":"ok","timestamp":1751829684281,"user_tz":-120,"elapsed":12010,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"execute_result","data":{"text/plain":[" target ids date flag \\\n","0 0 1467810369 Mon Apr 06 22:19:45 PDT 2009 NO_QUERY \n","1 0 1467810672 Mon Apr 06 22:19:49 PDT 2009 NO_QUERY \n","2 0 1467810917 Mon Apr 06 22:19:53 PDT 2009 NO_QUERY \n","3 0 1467811184 Mon Apr 06 22:19:57 PDT 2009 NO_QUERY \n","4 0 1467811193 Mon Apr 06 22:19:57 PDT 2009 NO_QUERY \n","\n"," user text \n","0 _TheSpecialOne_ @switchfoot http://twitpic.com/2y1zl - Awww, t... \n","1 scotthamilton is upset that he can't update his Facebook by ... \n","2 mattycus @Kenichan I dived many times for the ball. Man... \n","3 ElleCTF my whole body feels itchy and like its on fire \n","4 Karoli @nationwideclass no, it's not behaving at all.... "],"text/html":["\n","
\n","
\n","\n","
\n"," \n","
\n","
\n","
target
\n","
ids
\n","
date
\n","
flag
\n","
user
\n","
text
\n","
\n"," \n"," \n","
\n","
0
\n","
0
\n","
1467810369
\n","
Mon Apr 06 22:19:45 PDT 2009
\n","
NO_QUERY
\n","
_TheSpecialOne_
\n","
@switchfoot http://twitpic.com/2y1zl - Awww, t...
\n","
\n","
\n","
1
\n","
0
\n","
1467810672
\n","
Mon Apr 06 22:19:49 PDT 2009
\n","
NO_QUERY
\n","
scotthamilton
\n","
is upset that he can't update his Facebook by ...
\n","
\n","
\n","
2
\n","
0
\n","
1467810917
\n","
Mon Apr 06 22:19:53 PDT 2009
\n","
NO_QUERY
\n","
mattycus
\n","
@Kenichan I dived many times for the ball. Man...
\n","
\n","
\n","
3
\n","
0
\n","
1467811184
\n","
Mon Apr 06 22:19:57 PDT 2009
\n","
NO_QUERY
\n","
ElleCTF
\n","
my whole body feels itchy and like its on fire
\n","
\n","
\n","
4
\n","
0
\n","
1467811193
\n","
Mon Apr 06 22:19:57 PDT 2009
\n","
NO_QUERY
\n","
Karoli
\n","
@nationwideclass no, it's not behaving at all....
\n","
\n"," \n","
\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","\n","
\n","
\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"raw_data"}},"metadata":{},"execution_count":6}],"source":["# Define the path to the CSV file\n","csv_file_path = os.path.join(extract_path, 'training.1600000.processed.noemoticon.csv')\n","\n","# Define the column names\n","column_names = ['target', 'ids', 'date', 'flag', 'user', 'text']\n","\n","# Load the dataset into a pandas DataFrame\n","raw_data = pd.read_csv(csv_file_path, encoding='latin-1', names=column_names)\n","\n","# Display the first few rows of the DataFrame\n","raw_data.head()"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"bIeawbN6NwMs","outputId":"a847e733-a6cc-4635-cd01-0bc887dc7bfd","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751829684282,"user_tz":-120,"elapsed":5,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Ce dataframe contient 1600000 lignes et 6 colonnes.\n"]}],"source":["print(f\"Ce dataframe contient {raw_data.shape[0]} lignes et {raw_data.shape[1]} colonnes.\")"]},{"cell_type":"markdown","source":["## ⏩🧠 Approches avancées de Deep Learning\n","Notre démarche pour la classification de sentiment avec des approches avancées comprend:\n","\n","1. **Prétraitement des tweets**\n"," - Nettoyage\n"," - Tokenisation et lemmatisation\n"," - Remplacement des URLs et mentions par des tokens spéciaux\n","\n","3. **Modèles testés**\n"," - **Modèle LSTM bidirectionnel avec Word2Vec:** Ce modèle utilisera une architecture de réseau de neurones récurrents (LSTM) bidirectionnel et les embeddings pré-entraînés **Word2Vec** pour représenter les mots.\n"," - **Modèle LSTM bidirectionnel avec GloVe 300d:** Ce modèle similaire utilisera également une architecture LSTM bidirectionnel, mais avec les embeddings pré-entraînés **GloVe de dimension 300**.\n","\n","\n","3. **Évaluation et suivi**\n"," - Métriques: précision, accuracy, recall, F1-score, ROC-AUC\n"," - Tracking avec MLflow pour la reproductibilité et la comparaison\n","\n","\n","Il est important de noter que l'entraînement est fait sur un sous-échantillon et non sur l'intégralité du dataset."],"metadata":{"id":"Lq2h1qmW2PqP"}},{"cell_type":"markdown","metadata":{"id":"UXHYqYWiNwMs"},"source":["## Prétraitement\n","\n","Notre démarche pour la classification de sentiment avec des approches classiques comprend:\n","\n","1. **Prétraitement des tweets**\n"," - Nettoyage\n"," - Tokenisation et lemmatisation\n"," - Remplacement des URLs et mentions par des tokens spéciaux\n","\n"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"XC0M0gPXNwMs"},"outputs":[],"source":["converted_target_data = convert_sentiment_label(raw_data)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"gMSXKh2RNwMs","outputId":"d9635826-13f5-464f-f230-0bd4a0d6c743","colab":{"base_uri":"https://localhost:8080/","height":178},"executionInfo":{"status":"ok","timestamp":1751829686127,"user_tz":-120,"elapsed":2,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"execute_result","data":{"text/plain":["target\n","0 800000\n","1 800000\n","Name: count, dtype: int64"],"text/html":["
"]},"metadata":{},"execution_count":10}],"source":["sample_size = 100000\n","downsampled_data = downsample_data(converted_target_data, n_samples=sample_size)\n","downsampled_data['target'].value_counts()"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"f2CkXR7XNwMt","outputId":"62b2f9e7-3dcb-49fe-e366-aff4eb32c5c1","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751829778185,"user_tz":-120,"elapsed":90859,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Prétraitement des tweets en cours...\n","Prétraitement terminé !\n"]}],"source":["# Appliquer le prétraitement à tous les tweets\n","print(\"Prétraitement des tweets en cours...\")\n","preprocessed_data = process_in_parallel(downsampled_data, apply_preprocessing, n_jobs=8)\n","print(\"Prétraitement terminé !\")"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"LN5ul0JBNwMt","outputId":"cb4d7277-bbce-4bc8-b424-9b406f9ab93a","colab":{"base_uri":"https://localhost:8080/","height":206},"executionInfo":{"status":"ok","timestamp":1751829778186,"user_tz":-120,"elapsed":4,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"execute_result","data":{"text/plain":[" target ids date flag \\\n","212188 0 1974671194 Sat May 30 13:36:31 PDT 2009 NO_QUERY \n","299036 0 1997882236 Mon Jun 01 17:37:11 PDT 2009 NO_QUERY \n","475978 0 2177756662 Mon Jun 15 06:39:05 PDT 2009 NO_QUERY \n","588988 0 2216838047 Wed Jun 17 20:02:12 PDT 2009 NO_QUERY \n","138859 0 1880666283 Fri May 22 02:03:31 PDT 2009 NO_QUERY \n","\n"," user text \\\n","212188 simba98 @xnausikaax oh no! where did u order from? tha... \n","299036 Seve76 A great hard training weekend is over. a coup... \n","475978 x__claireyy__x Right, off to work Only 5 hours to go until I... \n","588988 Balasi I am craving for japanese food \n","138859 djrickdawson Jean Michel Jarre concert tomorrow gotta work... \n","\n"," processed_text \n","212188 < MENTION > oh no ! u order ? thats horrible \n","299036 great hard training weekend couple day rest le... \n","475978 right work 5 hour go im free xd \n","588988 craving japanese food \n","138859 jean michel jarre concert tomorrow got ta work... "],"text/html":["\n","
\n","
\n","\n","
\n"," \n","
\n","
\n","
target
\n","
ids
\n","
date
\n","
flag
\n","
user
\n","
text
\n","
processed_text
\n","
\n"," \n"," \n","
\n","
212188
\n","
0
\n","
1974671194
\n","
Sat May 30 13:36:31 PDT 2009
\n","
NO_QUERY
\n","
simba98
\n","
@xnausikaax oh no! where did u order from? tha...
\n","
< MENTION > oh no ! u order ? thats horrible
\n","
\n","
\n","
299036
\n","
0
\n","
1997882236
\n","
Mon Jun 01 17:37:11 PDT 2009
\n","
NO_QUERY
\n","
Seve76
\n","
A great hard training weekend is over. a coup...
\n","
great hard training weekend couple day rest le...
\n","
\n","
\n","
475978
\n","
0
\n","
2177756662
\n","
Mon Jun 15 06:39:05 PDT 2009
\n","
NO_QUERY
\n","
x__claireyy__x
\n","
Right, off to work Only 5 hours to go until I...
\n","
right work 5 hour go im free xd
\n","
\n","
\n","
588988
\n","
0
\n","
2216838047
\n","
Wed Jun 17 20:02:12 PDT 2009
\n","
NO_QUERY
\n","
Balasi
\n","
I am craving for japanese food
\n","
craving japanese food
\n","
\n","
\n","
138859
\n","
0
\n","
1880666283
\n","
Fri May 22 02:03:31 PDT 2009
\n","
NO_QUERY
\n","
djrickdawson
\n","
Jean Michel Jarre concert tomorrow gotta work...
\n","
jean michel jarre concert tomorrow got ta work...
\n","
\n"," \n","
\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","\n","
\n","
\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"preprocessed_data"}},"metadata":{},"execution_count":12}],"source":["preprocessed_data.head()"]},{"cell_type":"markdown","metadata":{"id":"zyb9Fj38NwMt"},"source":["## Division des données en ensembles d'entraînement et de test"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"Z_y6Ja0INwMt","outputId":"900bbf3f-2716-478d-b03b-8f04f23a819f","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751829778219,"user_tz":-120,"elapsed":35,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Taille de l'ensemble d'entraînement: 160000 exemples\n","Taille de l'ensemble de test: 40000 exemples\n"]}],"source":["# Diviser les données en ensembles d'entraînement et de test\n","from sklearn.model_selection import train_test_split\n","\n","X = preprocessed_data['processed_text']\n","y = preprocessed_data['target']\n","\n","# Division train/test\n","X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)\n","\n","print(f\"Taille de l'ensemble d'entraînement: {X_train.shape[0]} exemples\")\n","print(f\"Taille de l'ensemble de test: {X_test.shape[0]} exemples\")"]},{"cell_type":"markdown","metadata":{"id":"wPE9r-G4NwMt"},"source":["## Entraînement des modèles et tracking avec MLflow"]},{"cell_type":"markdown","metadata":{"id":"zpsZDWuANwMt"},"source":["### Configuration de MLFlow"]},{"cell_type":"code","source":["import mlflow\n","import mlflow.keras\n","from mlflow.models import infer_signature\n","from mlflow import MlflowClient\n","from dotenv import load_dotenv\n","\n","# Charger les variables d'environnement depuis le fichier .env\n","load_dotenv(dotenv_path='../.env')\n","\n","# Configuration de MLflow avec les variables d'environnement\n","mlflow_tracking_uri = os.getenv(\"MLFLOW_TRACKING_URI\")\n","mlflow_s3_endpoint_url = os.getenv(\"MLFLOW_S3_ENDPOINT_URL\")\n","aws_access_key_id = os.getenv(\"AWS_ACCESS_KEY_ID\")\n","aws_secret_access_key = os.getenv(\"AWS_SECRET_ACCESS_KEY\")\n","\n","# Configuration explicite de MLflow\n","mlflow.set_tracking_uri(mlflow_tracking_uri)\n","print(f\"MLflow Tracking URI: {mlflow_tracking_uri}\")\n","\n","# Configuration explicite des identifiants AWS\n","os.environ[\"MLFLOW_S3_ENDPOINT_URL\"] = mlflow_s3_endpoint_url\n","os.environ[\"AWS_ACCESS_KEY_ID\"] = aws_access_key_id\n","os.environ[\"AWS_SECRET_ACCESS_KEY\"] = aws_secret_access_key\n","print(\"Identifiants AWS configurés\")"],"metadata":{"id":"qoQ4njujN758","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751829780115,"user_tz":-120,"elapsed":1895,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"c3bd3672-bdfe-41cf-e3ea-4f05c5dc85e9"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["MLflow Tracking URI: https://mlflow.greg-madman-nas.duckdns.org/\n","Identifiants AWS configurés\n"]}]},{"cell_type":"code","execution_count":null,"metadata":{"id":"CZ7unEtvNwMt","outputId":"9d070ad6-ba13-4f7d-d0bc-59415062d3b7","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751829782348,"user_tz":-120,"elapsed":2232,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"execute_result","data":{"text/plain":[""]},"metadata":{},"execution_count":15}],"source":["# Créer l'expérience MLflow\n","mlflow.set_experiment(\"OC Projet 7\")"]},{"cell_type":"markdown","metadata":{"id":"33JkcVxcNwMt"},"source":["## Préparation des données pour les modèles de deep learning\n","\n","D'abord, nous devons tokeniser nos textes et les préparer pour l'entraînement des modèles de deep learning."]},{"cell_type":"code","execution_count":null,"metadata":{"id":"WKfNMY_JNwMt","outputId":"db116bc5-51d4-4ca0-d4ec-3bcbf92e763f","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751829788323,"user_tz":-120,"elapsed":5944,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Taille du vocabulaire: 83731\n","Forme des données d'entraînement: (160000, 50)\n","Forme des données de test: (40000, 50)\n"]}],"source":["# Définir la longueur maximale des séquences (nombre de mots par tweet)\n","MAX_SEQUENCE_LENGTH = 50\n","\n","# Définir la taille du vocabulaire (nombre de mots uniques à considérer)\n","MAX_VOCAB_SIZE = 20000\n","\n","# Tokenisation des textes\n","tokenizer = Tokenizer(num_words=MAX_VOCAB_SIZE, oov_token='')\n","tokenizer.fit_on_texts(X_train)\n","\n","# Convertir les textes en séquences d'indices\n","X_train_seq = tokenizer.texts_to_sequences(X_train)\n","X_test_seq = tokenizer.texts_to_sequences(X_test)\n","\n","# Padding des séquences pour qu'elles aient toutes la même longueur\n","X_train_pad = pad_sequences(X_train_seq, maxlen=MAX_SEQUENCE_LENGTH, padding='post', truncating='post')\n","X_test_pad = pad_sequences(X_test_seq, maxlen=MAX_SEQUENCE_LENGTH, padding='post', truncating='post')\n","\n","# Créer le dossier pour sauvegarder les modèles\n","os.makedirs(\"content/advanced-model\", exist_ok=True)\n","# os.makedirs(\"content/advanced-model/best\", exist_ok=True)\n","\n","# Sauvegarder le tokenizer pour une utilisation ultérieure\n","import pickle\n","with open('content/advanced-model/tokenizer.pickle', 'wb') as handle:\n"," pickle.dump(tokenizer, handle, protocol=pickle.HIGHEST_PROTOCOL)\n","\n","print(f\"Taille du vocabulaire: {len(tokenizer.word_index) + 1}\")\n","print(f\"Forme des données d'entraînement: {X_train_pad.shape}\")\n","print(f\"Forme des données de test: {X_test_pad.shape}\")"]},{"cell_type":"markdown","metadata":{"id":"876rS4__NwMt"},"source":["## Fonctions d'évaluation"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"OrUjzG-6NwMt"},"outputs":[],"source":["def evaluate_model(model, X_test, y_test, class_names=['Négatif', 'Positif']):\n"," \"\"\"\n"," Évalue le modèle sur l'ensemble de test et retourne les métriques de performance.\n"," \"\"\"\n"," # Prédictions du modèle\n"," y_pred_proba = model.predict(X_test)\n"," y_pred = (y_pred_proba > 0.5).astype(int)\n","\n"," # Convertir les prédictions de format numpy à format list pour éviter les erreurs de sérialisation\n"," if isinstance(y_pred, np.ndarray):\n"," y_pred = y_pred.flatten().tolist()\n"," if isinstance(y_pred_proba, np.ndarray):\n"," y_pred_proba = y_pred_proba.flatten().tolist()\n","\n"," # Calculer les métriques\n"," accuracy = accuracy_score(y_test, y_pred)\n"," precision = precision_score(y_test, y_pred)\n"," recall = recall_score(y_test, y_pred)\n"," f1 = f1_score(y_test, y_pred)\n"," roc_auc = roc_auc_score(y_test, y_pred_proba)\n","\n"," # Matrice de confusion\n"," cm = confusion_matrix(y_test, y_pred)\n","\n"," # Rapport de classification\n"," report = classification_report(y_test, y_pred, target_names=class_names)\n","\n"," metrics = {\n"," 'accuracy': accuracy,\n"," 'precision': precision,\n"," 'recall': recall,\n"," 'f1': f1,\n"," 'roc_auc': roc_auc\n"," }\n","\n"," return metrics, cm, report, y_pred, y_pred_proba\n","\n","def plot_confusion_matrix(cm, class_names, title='Matrice de confusion'):\n"," \"\"\"\n"," Crée une figure de matrice de confusion.\n"," \"\"\"\n"," fig, ax = plt.subplots(figsize=(8, 6))\n"," im = ax.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues)\n"," ax.figure.colorbar(im, ax=ax)\n"," ax.set(xticks=np.arange(cm.shape[1]),\n"," yticks=np.arange(cm.shape[0]),\n"," xticklabels=class_names,\n"," yticklabels=class_names,\n"," title=title,\n"," ylabel='Vraie étiquette',\n"," xlabel='Étiquette prédite')\n","\n"," # Pivoter les labels de l'axe des x\n"," plt.setp(ax.get_xticklabels(), rotation=45, ha=\"right\", rotation_mode=\"anchor\")\n","\n"," # Annoter la matrice de confusion\n"," thresh = cm.max() / 2.\n"," for i in range(cm.shape[0]):\n"," for j in range(cm.shape[1]):\n"," ax.text(j, i, format(cm[i, j], 'd'),\n"," ha=\"center\", va=\"center\",\n"," color=\"white\" if cm[i, j] > thresh else \"black\")\n","\n"," plt.tight_layout()\n"," return fig\n"]},{"cell_type":"markdown","metadata":{"id":"3_YfW-7yNwMt"},"source":["## Fonction de logging pour MLflow"]},{"cell_type":"code","source":["def log_model_to_mlflow(model, model_name, vectorizer_name, metrics, cm, report, X_test, y_test, history=None, params=None):\n"," \"\"\"\n"," Enregistre le modèle et ses performances dans MLflow.\n"," \"\"\"\n"," class_names = ['Négatif', 'Positif']\n","\n"," with mlflow.start_run(run_name=f\"Modele_Avance_{model_name}_{vectorizer_name}\"):\n"," # Enregistrer les paramètres du modèle\n"," if params:\n"," for key, value in params.items():\n"," mlflow.log_param(key, value)\n","\n"," # Enregistrer les métriques de validation issues de l'entraînement\n"," if history is not None:\n"," hist = history.history\n"," if 'val_precision' in hist:\n"," best_epoch = int(np.argmax(hist['val_precision']))\n"," mlflow.log_metric(\"val_precision\", float(hist['val_precision'][best_epoch]))\n"," if 'val_loss' in hist:\n"," mlflow.log_metric(\"val_loss\", float(hist['val_loss'][best_epoch]))\n"," if 'val_recall' in hist:\n"," mlflow.log_metric(\"val_recall\", float(hist['val_recall'][best_epoch]))\n","\n"," # Enregistrer les métriques de performance\n"," for key, value in metrics.items():\n"," mlflow.log_metric('test_' + key, value)\n","\n"," # Tracer et enregistrer la matrice de confusion\n"," fig = plot_confusion_matrix(cm, class_names)\n"," mlflow.log_figure(fig, f\"confusion_matrix_{model_name}_{vectorizer_name}.png\")\n"," plt.close(fig)\n","\n"," # Enregistrer le rapport de classification\n"," report_path = f\"content/advanced-model/{model_name}_{vectorizer_name}/classification_report.txt\"\n"," os.makedirs(os.path.dirname(report_path), exist_ok=True)\n"," with open(report_path, \"w\") as f:\n"," f.write(report)\n"," mlflow.log_artifact(report_path)\n","\n"," # Enregistrer le modèle dans MLflow\n"," signature = infer_signature(X_test, y_test)\n"," mlflow.keras.log_model(\n"," model,\n"," f\"model_{model_name}_{vectorizer_name}\",\n"," signature=signature\n"," )\n","\n"," # Log du dossier local qui contient déjà tous les artefacts\n"," artifact_dir = f\"content/advanced-model/{model_name}_{vectorizer_name}\"\n"," if os.path.exists(artifact_dir):\n"," mlflow.log_artifacts(artifact_dir, \"local_artifacts\")\n","\n"," return mlflow.active_run().info.run_id\n","\n","\n","def plot_training_history(history, model_name, vectorizer_name, run_id=None):\n"," \"\"\"\n"," Trace l'historique d'entraînement du modèle et l'enregistre dans la même exécution MLflow.\n","\n"," Args:\n"," history: Historique d'entraînement du modèle\n"," model_name: Nom du modèle\n"," vectorizer_name: Nom du vectoriseur\n"," run_id: ID de l'exécution MLflow existante\n","\n"," Returns:\n"," fig: Figure matplotlib créée\n"," \"\"\"\n"," fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))\n","\n"," # Tracer precision (train & val)\n"," ax1.plot(history.history['precision'], label='train')\n"," ax1.plot(history.history['val_precision'], label='validation')\n"," ax1.set_title(f'Précision - {model_name} avec {vectorizer_name}')\n"," ax1.set_xlabel('Epoch')\n"," ax1.set_ylabel('Précision')\n"," ax1.legend()\n","\n"," # Tracer loss (train & val)\n"," ax2.plot(history.history['loss'], label='train')\n"," ax2.plot(history.history['val_loss'], label='validation')\n"," ax2.set_title(f'Loss - {model_name} avec {vectorizer_name}')\n"," ax2.set_xlabel('Epoch')\n"," ax2.set_ylabel('Loss')\n"," ax2.legend()\n","\n","\n"," plt.tight_layout()\n","\n"," # Sauvegarder la figure localement\n"," filename = f'content/advanced-model/training_history_{model_name}_{vectorizer_name}.png'\n"," plt.savefig(filename)\n","\n"," # Enregistrer dans MLflow en utilisant l'exécution existante\n"," if run_id:\n"," with mlflow.start_run(run_id=run_id):\n"," mlflow.log_figure(fig, f\"training_history_{model_name}_{vectorizer_name}.png\")\n"," else:\n"," # Fallback si aucun run_id n'est fourni\n"," with mlflow.start_run(run_name=f\"ModeleAvance_{model_name}_{vectorizer_name}\"):\n"," mlflow.log_figure(fig, f\"training_history_{model_name}_{vectorizer_name}.png\")"],"metadata":{"id":"etdkfzD9x8t3"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"1UorrWtSNwMu"},"source":["## Chargement et préparation des embeddings pré-entraînés"]},{"cell_type":"markdown","metadata":{"id":"yzl1y9HSNwMu"},"source":["### Word2vec"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"K0hDRRZmNwMu","outputId":"f27eb320-f434-478d-defd-62e9b14d7e05","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751829788865,"user_tz":-120,"elapsed":511,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Word2Vec model already exists at content/pretrained-embeddings/word2vec/GoogleNews-vectors-negative300.bin\n","Word2Vec model is available at: content/pretrained-embeddings/word2vec/GoogleNews-vectors-negative300.bin\n"]}],"source":["def download_word2vec():\n"," \"\"\"\n"," Downloads the pre-trained Word2Vec embeddings.\n"," Creates the necessary directories, downloads the file, extracts it, and cleans up unneeded files.\n","\n"," Returns:\n"," str: Path to the extracted Word2Vec model file\n"," \"\"\"\n"," import os\n"," import gzip\n"," import shutil\n"," from urllib.request import urlretrieve\n"," import time\n"," import zipfile\n","\n"," # Create necessary directories\n"," content_dir = 'content/pretrained-embeddings'\n"," word2vec_dir = os.path.join(content_dir, 'word2vec')\n","\n"," os.makedirs(word2vec_dir, exist_ok=True)\n","\n"," # Define file paths\n"," model_file = os.path.join(word2vec_dir, 'GoogleNews-vectors-negative300.bin')\n"," zip_file = os.path.join(word2vec_dir, 'GoogleNews-vectors-negative300.bin.zip')\n","\n"," # Skip download if file already exists\n"," if os.path.exists(model_file):\n"," print(f\"Word2Vec model already exists at {model_file}\")\n"," return model_file\n","\n"," # URL for the pre-trained Word2Vec embeddings\n"," # Using huggingface repository as a reliable source\n"," url = 'https://huggingface.co/fse/word2vec-google-news-300/resolve/main/GoogleNews-vectors-negative300.bin.gz'\n","\n"," try:\n"," # Download the file with progress reporting\n"," print(f\"Downloading Word2Vec embeddings from {url}...\")\n"," print(\"This may take a while as the file is ~1.5GB\")\n","\n"," start_time = time.time()\n","\n"," def progress_callback(count, block_size, total_size):\n"," elapsed_time = time.time() - start_time\n"," downloaded = count * block_size / (1024 * 1024) # MB\n"," total = total_size / (1024 * 1024) if total_size > 0 else 0 # MB\n"," percent = min(100, count * block_size * 100 / total_size) if total_size > 0 else 0\n"," speed = downloaded / elapsed_time if elapsed_time > 0 else 0\n","\n"," print(f\"\\rDownloaded: {downloaded:.1f}MB / {total:.1f}MB ({percent:.1f}%) - {speed:.1f}MB/s\",\n"," end='', flush=True)\n","\n"," gz_file = os.path.join(word2vec_dir, 'GoogleNews-vectors-negative300.bin.gz')\n"," urlretrieve(url, gz_file, progress_callback)\n"," print(\"\\nDownload complete!\")\n","\n"," # Extract the gzip file\n"," print(f\"Extracting {gz_file}...\")\n"," with gzip.open(gz_file, 'rb') as f_in:\n"," with open(model_file, 'wb') as f_out:\n"," shutil.copyfileobj(f_in, f_out)\n"," print(\"Extraction complete!\")\n","\n"," # Delete the gzip file to save space\n"," os.remove(gz_file)\n"," print(f\"Deleted temporary file: {gz_file}\")\n","\n"," return model_file\n","\n"," except Exception as e:\n"," print(f\"Error downloading or extracting Word2Vec embeddings: {str(e)}\")\n"," print(\"\\nTrying alternative download source...\")\n","\n"," # Alternative URL (Google Drive mirror)\n"," try:\n"," # Install gdown if not available\n"," import subprocess\n"," import sys\n","\n"," def install_gdown():\n"," subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"gdown\"])\n","\n"," try:\n"," import gdown\n"," except ImportError:\n"," print(\"Installing gdown package for Google Drive downloads...\")\n"," install_gdown()\n"," import gdown\n","\n"," # Google Drive file ID for Word2Vec\n"," file_id = \"0B7XkCwpI5KDYNlNUTTlSS21pQmM\"\n","\n"," print(f\"Downloading Word2Vec embeddings from Google Drive (ID: {file_id})...\")\n"," output = gz_file\n"," gdown.download(id=file_id, output=output, quiet=False)\n","\n"," # Extract the gzip file\n"," print(f\"Extracting {gz_file}...\")\n"," with gzip.open(gz_file, 'rb') as f_in:\n"," with open(model_file, 'wb') as f_out:\n"," shutil.copyfileobj(f_in, f_out)\n"," print(\"Extraction complete!\")\n","\n"," # Delete the gzip file to save space\n"," os.remove(gz_file)\n"," print(f\"Deleted temporary file: {gz_file}\")\n","\n"," return model_file\n","\n"," except Exception as alt_error:\n"," print(f\"Error with alternative download: {str(alt_error)}\")\n","\n"," # Final fallback: direct user to manual download\n"," print(\"\\nAutomatic download failed. Please follow these manual steps:\")\n"," print(\"1. Download the Word2Vec embeddings from: https://drive.google.com/file/d/0B7XkCwpI5KDYNlNUTTlSS21pQmM/view?usp=sharing\")\n"," print(\"2. Extract the downloaded file\")\n"," print(f\"3. Place the 'GoogleNews-vectors-negative300.bin' file in the '{word2vec_dir}' directory\")\n","\n"," # Clean up any partial downloads\n"," if os.path.exists(gz_file):\n"," os.remove(gz_file)\n"," if os.path.exists(model_file) and os.path.getsize(model_file) < 1000000: # If file exists but is too small\n"," os.remove(model_file)\n","\n"," raise Exception(\"Failed to download Word2Vec embeddings automatically. Please download manually.\")\n","\n","# Example usage:\n","model_path = download_word2vec()\n","print(f\"Word2Vec model is available at: {model_path}\")"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"WMvPJS5tNwMu"},"outputs":[],"source":["from gensim.models import KeyedVectors\n","\n","def load_word2vec_embeddings():\n"," \"\"\"\n"," Charge les embeddings Word2Vec pré-entraînés.\n"," \"\"\"\n"," print(\"Chargement des embeddings Word2Vec...\")\n","\n"," # Charger le modèle Word2Vec\n"," word2vec_model = KeyedVectors.load_word2vec_format('content/pretrained-embeddings/word2vec/GoogleNews-vectors-negative300.bin', binary=True, limit=500000)\n","\n"," # Convertir en dictionnaire pour une utilisation plus facile\n"," embeddings_index = {}\n"," for word in word2vec_model.key_to_index:\n"," embeddings_index[word] = word2vec_model[word]\n","\n"," print(f\"Trouvé {len(embeddings_index)} vecteurs d'embeddings Word2Vec.\")\n"," return embeddings_index"]},{"cell_type":"markdown","metadata":{"id":"Xor_kNOVNwMu"},"source":["## Création des matrices d'embedding à partir des embeddings pré-entraînés"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"H1nz57olNwMu"},"outputs":[],"source":["def create_embedding_matrix(word_index, embeddings_index, embedding_dim):\n"," \"\"\"\n"," Crée une matrice d'embedding à partir des embeddings pré-entraînés.\n"," Affiche une barre de progression pendant le traitement.\n","\n"," Args:\n"," word_index (dict): Dictionnaire de mots et leurs indices\n"," embeddings_index (dict): Dictionnaire des embeddings pré-entraînés\n"," embedding_dim (int): Dimension des vecteurs d'embedding\n","\n"," Returns:\n"," numpy.ndarray: Matrice d'embedding\n"," \"\"\"\n"," vocab_size = len(word_index) + 1\n"," embedding_matrix = np.zeros((vocab_size, embedding_dim))\n","\n"," found_words = 0\n","\n"," # Utiliser tqdm pour afficher une barre de progression\n"," print(f\"Création de la matrice d'embedding pour {len(word_index)} mots...\")\n"," for word, i in tqdm(word_index.items(), total=len(word_index), desc=\"Création matrice d'embedding\"):\n"," embedding_vector = embeddings_index.get(word)\n"," if embedding_vector is not None:\n"," embedding_matrix[i] = embedding_vector\n"," found_words += 1\n","\n"," print(f\"Trouvé {found_words} mots ({found_words/len(word_index)*100:.2f}%) dans les embeddings pré-entraînés.\")\n"," return embedding_matrix"]},{"cell_type":"markdown","metadata":{"id":"XsGjsmVYNwMu"},"source":["## Optimisations matérielle (utilisation du GPU)\n","\n","1. **Désactivation du recurrent_dropout** - Permet l'utilisation de CuDNNLSTM optimisé pour GPU\n","2. **Activation de XLA** (Accelerated Linear Algebra) - Optimise les graphes d'opérations pour GPU\n","3. **Précision mixte** - Utilise float16 pour les calculs et float32 pour les variables\n","4. **Augmentation de la taille du batch** - Passée à 256 pour mieux exploiter le parallélisme GPU\n","5. **Optimisation du pipeline de données** - Utilisation de tf.data.Dataset avec prefetch\n","6. **Scheduler de taux d'apprentissage** - Décroissance exponentielle du taux pour améliorer la convergence\n","\n","Ces modifications permettent d'utiliser efficacement les capacités de notre **GTX 1060 3GB** tout en respectant les limitations de la mémoire."]},{"cell_type":"markdown","metadata":{"id":"lF2h27fxNwMu"},"source":["### Utilisation du GPU"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"TcLWpxKgNwMu","outputId":"77043b88-2bfc-4082-a05d-578cb6d16aa0","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751829790359,"user_tz":-120,"elapsed":1095,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stderr","text":["WARNING:tensorflow:From /tmp/ipython-input-22-656146420.py:12: is_gpu_available (from tensorflow.python.framework.test_util) is deprecated and will be removed in a future version.\n","Instructions for updating:\n","Use `tf.config.list_physical_devices('GPU')` instead.\n"]},{"output_type":"stream","name":"stdout","text":["GPU disponible : [PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]\n","TensorFlow utilise GPU: True\n","Devices disponibles: [PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU'), PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]\n","Compute dtype: float16\n","Variable dtype: float32\n"]}],"source":["import tensorflow as tf\n","\n","# Configuration de TensorFlow pour utiliser la GPU si disponible\n","physical_devices = tf.config.list_physical_devices('GPU')\n","if physical_devices:\n"," tf.config.experimental.set_memory_growth(physical_devices[0], True)\n"," print(\"GPU disponible :\", physical_devices)\n","else:\n"," print(\"Pas de GPU disponible, utilisation du CPU\")\n","\n","# Vérifier que TensorFlow utilise le GPU\n","print(f\"TensorFlow utilise GPU: {tf.test.is_gpu_available()}\")\n","print(f\"Devices disponibles: {tf.config.list_physical_devices()}\")\n","\n","# Optimiser les performances avec mixed precision\n","# Cette option accélère l'entraînement sur les GPU récents\n","policy = tf.keras.mixed_precision.Policy('mixed_float16')\n","tf.keras.mixed_precision.set_global_policy(policy)\n","print(f'Compute dtype: {policy.compute_dtype}')\n","print(f'Variable dtype: {policy.variable_dtype}')"]},{"cell_type":"markdown","metadata":{"id":"K6WAGmVVNwMu"},"source":["### Optimisations de la mémoire et configuration TensorFlow"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"EHdEo-FBNwMu","outputId":"e75df72d-816f-4d2a-95af-60b6b73515f4","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751829790365,"user_tz":-120,"elapsed":5,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Mémoire GPU dynamique activée\n","Politique de calcul: mixed_float16\n"]}],"source":["# Activer la mémoire GPU dynamique\n","gpus = tf.config.experimental.list_physical_devices('GPU')\n","if gpus:\n"," try:\n"," for gpu in gpus:\n"," tf.config.experimental.set_memory_growth(gpu, True)\n"," print(\"Mémoire GPU dynamique activée\")\n"," except RuntimeError as e:\n"," print(f\"Erreur: {e}\")\n","\n","# Activer XLA (Accelerated Linear Algebra) pour optimiser les graphes\n","tf.config.optimizer.set_jit(True) # Active la compilation Just-In-Time\n","\n","# Précision mixte pour accélérer les calculs\n","policy = tf.keras.mixed_precision.Policy('mixed_float16')\n","tf.keras.mixed_precision.set_global_policy(policy)\n","print(f'Politique de calcul: {policy.name}')"]},{"cell_type":"markdown","metadata":{"id":"5tWaCIapNwMu"},"source":["### Optimisation du chargement des données"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"_OYSmRuiNwMw"},"outputs":[],"source":["# 2. Optimiser le chargement des données\n","AUTOTUNE = tf.data.AUTOTUNE\n","BATCH_SIZE = 256 # Tester avec différentes valeurs: 128, 256, 512\n","\n","# Créer un dataset TensorFlow optimisé\n","def create_optimized_dataset(x, y, is_training=True):\n"," dataset = tf.data.Dataset.from_tensor_slices((x, y))\n"," if is_training:\n"," dataset = dataset.shuffle(10000)\n","\n"," # Utiliser un batch plus grand pour mieux utiliser le GPU\n"," dataset = dataset.batch(BATCH_SIZE)\n","\n"," # Précharger les données pour éviter les goulots d'étranglement\n"," dataset = dataset.prefetch(AUTOTUNE)\n"," return dataset\n","\n","# Séparer les données de validation et créer les datasets optimisés\n","val_size = int(0.1 * len(X_train_pad))\n","x_val = X_train_pad[-val_size:]\n","y_val = y_train[-val_size:]\n","x_train_final = X_train_pad[:-val_size]\n","y_train_final = y_train[:-val_size]\n","\n","train_dataset = create_optimized_dataset(x_train_final, y_train_final)\n","val_dataset = create_optimized_dataset(x_val, y_val, is_training=False)"]},{"cell_type":"markdown","metadata":{"id":"5angsL01NwMx"},"source":["Nos optimisations fonctionnent correctement :\n","\n","1. **XLA activé** : `Loaded cuDNN version 90300` et `Compiled cluster using XLA!` confirment que l'accélération XLA est bien activée.\n","2. **CuDNN chargé** : Le message indique que cuDNN (version 9.03) est correctement chargé, ce qui signifie que vos couches LSTM utiliseront l'implémentation optimisée pour GPU.\n","3. **GPU reconnu** : Le système a bien reconnu votre NVIDIA GeForce GTX 1060 3GB avec Compute Capability 6.1.\n","\n","Nous observervons :\n","- Une utilisation GPU bien supérieure à 20% (idéalement 70-90%)\n","- Un temps d'entraînement par epoch considérablement réduit\n","\n","Pour vérifier l'utilisation réelle du GPU pendant l'entraînement, nous pouvons exécuter :\n","\n","```shell\n","nvidia-smi -l 1\n","```"]},{"cell_type":"markdown","metadata":{"id":"PicWq6E0NwMx"},"source":["### Bilan de l'optimisation\n","\n","Nous avons réussi à optimiser significativement l'utilisation de notre GPU. Les modifications que nous avons apportées ont considérablement amélioré les performances :\n","\n","- Nous avons augmenté l'**utilisation de votre GPU de 20% à 73%**\n","- Nous utilisons maintenant intelligemment la mémoire disponible\n","- Nous avons activé les technologies d'**accélération comme XLA et CuDNN**\n","- Nous avons désactivé le **recurrent_dropout** pour permettre l'utilisation des implémentations GPU optimisées\n","- Nous avons implémenté la **précision mixte** pour accélérer les calculs\n","- Nous avons optimisé la **taille du batch** et le pipeline de données\n","\n","Nous avons atteint un excellent équilibre entre l'utilisation maximale des ressources et la stabilité du système."]},{"cell_type":"markdown","metadata":{"id":"NlECzxylNwMx"},"source":["## Création d'un modèles LSTM avec embeddings pré-entraînés\n","\n","Voici une description de la fonction `create_lstm_model_with_pretrained` qui crée un **modèle LSTM** avec des **embeddings pré-entraînés** :\n","\n","- Crée un modèle de réseau de neurones pour la **classification de texte** utilisant des **embeddings pré-entraînés**\n","- Initialise une couche d'embedding avec les poids fournis dans `embedding_matrix`\n","- Utilise une architecture profonde avec deux couches LSTM bidirectionnelles (128 puis 64 unités)\n","- Implémente plusieurs techniques de régularisation (dropout spatial et classique) pour éviter le surapprentissage\n","- Inclut une couche dense intermédiaire avec activation ReLU\n","- Se termine par une **couche de sortie avec activation sigmoïde**, adaptée aux problèmes de **classification binaire**\n","- Compile le modèle avec l'**optimiseur Adam**, une fonction de perte d'entropie croisée binaire et suit la métrique de précision\n","- Permet de contrôler si les embeddings sont entraînables ou figés via le paramètre `trainable`"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"1KZ4x6cGNwMx"},"outputs":[],"source":["def create_optimized_lstm_model(embedding_matrix, max_seq_length=MAX_SEQUENCE_LENGTH, trainable=False):\n"," vocab_size, embedding_dim = embedding_matrix.shape\n","\n"," # Entrée du modèle\n"," input_layer = tf.keras.layers.Input(shape=(max_seq_length,))\n","\n"," # Couche d'embedding avec des poids pré-entraînés\n"," embedding_layer = tf.keras.layers.Embedding(\n"," input_dim=vocab_size,\n"," output_dim=embedding_dim,\n"," weights=[embedding_matrix],\n"," input_length=max_seq_length,\n"," trainable=trainable\n"," )(input_layer)\n","\n"," # Dropout spatial\n"," dropout_1 = tf.keras.layers.SpatialDropout1D(0.3)(embedding_layer)\n","\n"," # Couche CuDNNLSTM optimisée pour GPU (via le backend GPU automatique de TF)\n"," # Note: TF2.x utilise automatiquement l'implémentation CuDNNLSTM quand recurrent_dropout=0\n"," lstm_layer = tf.keras.layers.Bidirectional(\n"," tf.keras.layers.LSTM(\n"," units=128,\n"," dropout=0.2,\n"," recurrent_dropout=0.0, # Mettre à 0 pour utiliser l'implémentation CuDNN optimisée\n"," return_sequences=True\n"," )\n"," )(dropout_1)\n","\n"," # Deuxième couche LSTM\n"," lstm_layer_2 = tf.keras.layers.Bidirectional(\n"," tf.keras.layers.LSTM(\n"," units=64,\n"," dropout=0.2,\n"," recurrent_dropout=0.0 # Mettre à 0 pour utiliser l'implémentation CuDNN optimisée\n"," )\n"," )(lstm_layer)\n","\n"," # Couche dense avec activation ReLU\n"," dense_1 = tf.keras.layers.Dense(64, activation='relu')(lstm_layer_2)\n"," dropout_2 = tf.keras.layers.Dropout(0.4)(dense_1)\n","\n"," # Couche de sortie\n"," output_layer = tf.keras.layers.Dense(1, activation='sigmoid')(dropout_2)\n","\n"," # Créer et compiler le modèle avec un optimiseur efficace sur GPU\n"," model = tf.keras.Model(inputs=input_layer, outputs=output_layer)\n","\n"," # Utiliser un taux d'apprentissage avec décroissance\n"," # lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(\n"," # initial_learning_rate=0.001,\n"," # decay_steps=1000,\n"," # decay_rate=0.9,\n"," # staircase=True\n"," # )\n","\n"," model.compile(\n"," optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), # taux fixe\n"," loss='binary_crossentropy',\n"," # on ajoute aussi le rappel car on veut tout de même limiter le nombre de faux négatifs\n"," metrics=[keras.metrics.Precision(name='precision'), keras.metrics.Recall(name='recall')]\n"," )\n","\n"," return model"]},{"cell_type":"markdown","metadata":{"id":"S_tupAxrNwMx"},"source":["## Fonction de sauvegarde locale des artefacts du modèle\n","\n","Sauvegarde tous les artefacts du modèle (modèle, tokenizer, fonction de prétraitement, historique) dans un sous-dossier dédié."]},{"cell_type":"code","execution_count":null,"metadata":{"id":"Mxy90vFuNwMx"},"outputs":[],"source":["import os\n","import dill # Plus puissant que pickle pour sauvegarder des fonctions\n","import datetime\n","import json\n","\n","def save_model_artifacts(model, model_name, vectorizer_name, history, tokenizer):\n"," \"\"\"\n"," Sauvegarde tous les artefacts du modèle (modèle, tokenizer, fonction de prétraitement, historique)\n"," dans un sous-dossier dédié.\n"," \"\"\"\n","\n"," # Créer un sous-dossier dédié pour ce modèle\n"," model_dir = f\"content/advanced-model/{model_name}_{vectorizer_name}\"\n"," os.makedirs(model_dir, exist_ok=True)\n","\n"," # Sous-dossiers pour les différents types d'artefacts\n"," checkpoints_dir = f\"{model_dir}/checkpoints\"\n"," os.makedirs(checkpoints_dir, exist_ok=True)\n","\n"," # 1. Sauvegarder le modèle final\n"," model_path = f\"{model_dir}/final_model_{model_name}_{vectorizer_name}.keras\"\n"," model.save(model_path)\n"," print(f\"Modèle sauvegardé dans {model_path}\")\n","\n"," # 2. Sauvegarder le tokenizer\n"," tokenizer_path = f\"{model_dir}/tokenizer.pickle\"\n"," with open(tokenizer_path, 'wb') as handle:\n"," pickle.dump(tokenizer, handle, protocol=pickle.HIGHEST_PROTOCOL)\n"," print(f\"Tokenizer sauvegardé dans {tokenizer_path}\")\n","\n"," # 3. Sauvegarder la fonction de prétraitement\n"," preprocess_path = f\"{model_dir}/preprocess_function.dill\"\n"," with open(preprocess_path, 'wb') as handle:\n"," dill.dump(preprocess_tweet, handle)\n"," print(f\"Fonction de prétraitement sauvegardée dans {preprocess_path}\")\n","\n"," # 4. Sauvegarder l'historique d'entraînement\n"," if history is not None:\n"," history_path = f\"{model_dir}/training_history.pickle\"\n"," with open(history_path, 'wb') as handle:\n"," pickle.dump(history.history, handle, protocol=pickle.HIGHEST_PROTOCOL)\n"," print(f\"Historique d'entraînement sauvegardé dans {history_path}\")\n","\n"," # 5. Sauvegarder les paramètres utilisés - Version ultra-sécurisée\n"," params_path = f\"{model_dir}/parameters.json\"\n","\n"," # Déterminer la dimension d'embedding de façon sûre\n"," embedding_dim = None\n","\n"," # Méthode 1: Accéder directement à l'attribut output_dim des couches Embedding\n"," for layer in model.layers:\n"," if isinstance(layer, tf.keras.layers.Embedding):\n"," embedding_dim = layer.output_dim\n"," break\n","\n"," # Méthode 2: Si ce n'est pas trouvé, utiliser une valeur basée sur le nom du vectorizer\n"," if embedding_dim is None:\n"," if 'word2vec' in vectorizer_name.lower():\n"," embedding_dim = 300 # Dimension standard pour Word2Vec\n"," elif 'glove' in vectorizer_name.lower() and '300d' in vectorizer_name.lower():\n"," embedding_dim = 300\n"," else:\n"," embedding_dim = 100 # Valeur par défaut\n","\n"," params = {\n"," \"model_name\": model_name,\n"," \"vectorizer_name\": vectorizer_name,\n"," \"max_sequence_length\": MAX_SEQUENCE_LENGTH,\n"," \"vocab_size\": MAX_VOCAB_SIZE,\n"," \"embedding_dim\": embedding_dim,\n"," \"date_created\": datetime.datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\"),\n"," }\n"," with open(params_path, 'w') as f:\n"," json.dump(params, f, indent=4)\n"," print(f\"Paramètres sauvegardés dans {params_path}\")\n","\n"," return model_dir"]},{"cell_type":"markdown","metadata":{"id":"BZLUgq5gNwMx"},"source":["## Entraînement : LSTM avec Word2Vec\n","\n","Nous créons un modèle d'analyse de sentiment des tweets basé sur des **réseaux de neurones récurrents (LSTM)** avec des **embeddings Word2Vec**.\n","\n","Nous chargeons d'abord les embeddings Word2Vec pré-entraînés et les intègrons dans la matrice d'embedding, puis nous définissons une **fonction d'entraînement complète** qui:\n","\n","- Crée un **modèle LSTM bidirectionnel** optimisé pour GPU\n","- Configure des **callbacks** comme early stopping, réduction du taux d'apprentissage et sauvegarde des meilleurs modèles\n","- Entraîne le modèle sur des **données de tweets** prétraitées en utilisant des optimisations GPU\n","- Évalue les **performances du modèle** avec diverses métriques (précision, rappel, F1, etc.)\n","- **Sauvegarde les artefacts du modèle** (modèle final, tokenizer, fonction de prétraitement)\n","- **Enregistre tous les paramètres et résultats dans MLflow** pour faciliter le suivi des expériences\n","- Génère des **visualisations des courbes d'apprentissage**\n","- Retourne le modèle entraîné, son historique et ses métriques de performance\n"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"qOq86PFNNwMx","outputId":"8ff016a9-09d8-4a8b-fc9e-d0cbef7197f2","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751829803818,"user_tz":-120,"elapsed":13373,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Chargement des embeddings Word2Vec...\n","Trouvé 500000 vecteurs d'embeddings Word2Vec.\n","Création de la matrice d'embedding pour 83730 mots...\n"]},{"output_type":"stream","name":"stderr","text":["Création matrice d'embedding: 100%|██████████| 83730/83730 [00:00<00:00, 355633.78it/s]"]},{"output_type":"stream","name":"stdout","text":["Trouvé 22721 mots (27.14%) dans les embeddings pré-entraînés.\n","Forme de la matrice d'embedding: (83731, 300)\n","Échantillon de valeurs: [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n","Type de données: float64\n"]},{"output_type":"stream","name":"stderr","text":["\n"]}],"source":["word2vec_embeddings = load_word2vec_embeddings()\n","word2vec_matrix = create_embedding_matrix(tokenizer.word_index, word2vec_embeddings, 300)\n","\n","# Vérifiez la forme et les valeurs de la matrice d'embedding\n","print(\"Forme de la matrice d'embedding:\", word2vec_matrix.shape)\n","print(\"Échantillon de valeurs:\", word2vec_matrix[0, :10]) # Affiche les 10 premières valeurs de la première ligne\n","print(\"Type de données:\", word2vec_matrix.dtype)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"KXMLd7jqNwMx"},"outputs":[],"source":["# Créer une fonction pour configurer le callback ModelCheckpoint\n","def create_model_checkpoint(model_name, vectorizer_name):\n"," \"\"\"\n"," Crée un callback ModelCheckpoint qui sauvegarde uniquement le meilleur modèle.\n"," \"\"\"\n"," # Créer le dossier pour les checkpoints\n"," checkpoint_dir = f\"content/advanced-model/{model_name}_{vectorizer_name}/checkpoints\"\n"," os.makedirs(checkpoint_dir, exist_ok=True)\n","\n"," # Créer un seul checkpoint pour le meilleur modèle\n"," best_checkpoint = tf.keras.callbacks.ModelCheckpoint(\n"," filepath=f\"{checkpoint_dir}/best_model.keras\",\n"," # on décide de monitorer val_precision car c'est ce que l'on souhaite maximiser\n"," # monitor='val_loss',\n"," monitor='val_precision',\n"," save_best_only=True,\n"," # mode='min',\n"," mode='max',\n"," verbose=1\n"," )\n","\n"," return best_checkpoint"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"JGLT8JhWNwMx"},"outputs":[],"source":["def train_word2vec_lstm_model(epochs=20):\n"," \"\"\"\n"," Entraîne un modèle LSTM avec embeddings Word2Vec en utilisant les optimisations GPU\n"," et le chargement de données optimisé.\n"," \"\"\"\n"," # Définir le nom du modèle et de la méthode d'embedding\n"," model_name = \"LSTM\"\n"," vectorizer_name = \"Word2Vec-Fige\"\n","\n"," # Créer les callbacks pour ce modèle\n"," checkpoint_callback = create_model_checkpoint(model_name, vectorizer_name)\n","\n"," # Autres callbacks\n"," early_stopping = tf.keras.callbacks.EarlyStopping(\n"," monitor='val_loss',\n"," patience=5,\n"," restore_best_weights=True\n"," )\n","\n"," reduce_lr = tf.keras.callbacks.ReduceLROnPlateau(\n"," monitor='val_loss',\n"," factor=0.2,\n"," patience=2,\n"," min_lr=0.00001\n"," )\n","\n"," # TensorBoard pour visualiser l'entraînement\n"," tensorboard_dir = f\"content/advanced-model/{model_name}_{vectorizer_name}/logs\"\n"," os.makedirs(tensorboard_dir, exist_ok=True)\n"," tensorboard_callback = tf.keras.callbacks.TensorBoard(\n"," log_dir=tensorboard_dir,\n"," histogram_freq=1,\n"," update_freq='epoch'\n"," )\n","\n"," # Créer le modèle optimisé pour GPU\n"," model = create_optimized_lstm_model(word2vec_matrix, trainable=False)\n","\n"," print(f\"Entraînement du modèle {model_name} avec embeddings {vectorizer_name}\")\n"," print(f\"Taille du batch: {BATCH_SIZE}\")\n"," print(f\"Utilisation de la précision mixte: {tf.keras.mixed_precision.global_policy().name}\")\n","\n"," # Entraîner le modèle avec les datasets optimisés\n"," history = model.fit(\n"," train_dataset,\n"," epochs=epochs,\n"," validation_data=val_dataset,\n"," callbacks=[early_stopping, reduce_lr, tensorboard_callback, checkpoint_callback],\n"," verbose=1\n"," )\n","\n"," # Déterminer le nombre réel d'époques complétées (en cas d'early stopping)\n"," real_epochs = len(history.history['loss'])\n"," print(f\"Nombre réel d'époques effectuées: {real_epochs}/{epochs}\")\n","\n"," # Sauvegarder tous les artefacts\n"," model_dir = save_model_artifacts(model, model_name, vectorizer_name, history, tokenizer)\n","\n"," # Utiliser evaluate_model pour obtenir les métriques\n"," metrics, cm, report, y_pred, y_pred_proba = evaluate_model(\n"," model,\n"," X_test_pad,\n"," y_test\n"," )\n","\n"," # Afficher les métriques\n"," print(\"\\nMétriques pour le modèle LSTM avec embedding Word2Vec:\")\n"," for key, value in metrics.items():\n"," print(f\"{key}: {value:.4f}\")\n","\n"," print(\"\\nRapport de classification:\")\n"," print(report)\n","\n","\n"," # Enregistrer avec MLflow\n"," params = {\n"," 'model_type': model_name,\n"," 'embedding_type': vectorizer_name,\n"," 'embedding_dim': word2vec_matrix.shape[1],\n"," 'vocab_size': len(tokenizer.word_index) + 1,\n"," 'max_sequence_length': MAX_SEQUENCE_LENGTH,\n"," 'trainable_embedding': False,\n"," 'max_epochs': epochs,\n"," 'real_epochs': real_epochs, # Ajouter le nombre réel d'époques\n"," 'batch_size': BATCH_SIZE,\n"," 'precision_policy': tf.keras.mixed_precision.global_policy().name,\n"," 'gpu_optimization': 'XLA,dynamic_memory,prefetch',\n"," 'sample_size': sample_size*2\n","\n"," }\n","\n"," # Enregistrer dans MLflow\n"," # run_id = log_model_to_mlflow(model, model_name, vectorizer_name, metrics, cm, report, X_test_pad, y_test, params)\n"," run_id = log_model_to_mlflow(model, model_name, vectorizer_name, metrics, cm, report, X_test_pad, y_test, history, params)\n","\n"," # Visualiser la courbe d'apprentissage\n"," plot_training_history(history, \"LSTM\", \"Word2Vec-Fige\", run_id=run_id)\n","\n"," # Récupérer le lien vers le run MLflow\n"," print(f\"\\nRun MLflow ID: {run_id}\")\n"," print(f\"Accédez à l'interface MLflow pour voir les détails complets.\")\n","\n"," return model, history, metrics, run_id"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"O8S9kFSFNwMx","outputId":"734480a6-2aa0-45e8-e3df-36ba91d7328f","colab":{"base_uri":"https://localhost:8080/","height":1000},"executionInfo":{"status":"ok","timestamp":1751830269652,"user_tz":-120,"elapsed":465796,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Entraînement du modèle LSTM avec embeddings Word2Vec-Fige\n","Taille du batch: 256\n","Utilisation de la précision mixte: mixed_float16\n","Epoch 1/50\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 26ms/step - loss: 0.5872 - precision: 0.6836 - recall: 0.6817\n","Epoch 1: val_precision improved from -inf to 0.74873, saving model to content/advanced-model/LSTM_Word2Vec-Fige/checkpoints/best_model.keras\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m45s\u001b[0m 58ms/step - loss: 0.5871 - precision: 0.6837 - recall: 0.6818 - val_loss: 0.5082 - val_precision: 0.7487 - val_recall: 0.7563 - learning_rate: 0.0010\n","Epoch 2/50\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 26ms/step - loss: 0.5207 - precision: 0.7410 - recall: 0.7456\n","Epoch 2: val_precision improved from 0.74873 to 0.77025, saving model to content/advanced-model/LSTM_Word2Vec-Fige/checkpoints/best_model.keras\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m25s\u001b[0m 45ms/step - loss: 0.5207 - precision: 0.7410 - recall: 0.7456 - val_loss: 0.4784 - val_precision: 0.7703 - val_recall: 0.7720 - learning_rate: 0.0010\n","Epoch 3/50\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.4919 - precision: 0.7598 - recall: 0.7715\n","Epoch 3: val_precision did not improve from 0.77025\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m17s\u001b[0m 30ms/step - loss: 0.4919 - precision: 0.7598 - recall: 0.7715 - val_loss: 0.4653 - val_precision: 0.7639 - val_recall: 0.7960 - learning_rate: 0.0010\n","Epoch 4/50\n","\u001b[1m562/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 17ms/step - loss: 0.4779 - precision: 0.7699 - recall: 0.7760\n","Epoch 4: val_precision did not improve from 0.77025\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m16s\u001b[0m 29ms/step - loss: 0.4779 - precision: 0.7699 - recall: 0.7760 - val_loss: 0.4610 - val_precision: 0.7637 - val_recall: 0.8117 - learning_rate: 0.0010\n","Epoch 5/50\n","\u001b[1m561/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 17ms/step - loss: 0.4692 - precision: 0.7706 - recall: 0.7891\n","Epoch 5: val_precision did not improve from 0.77025\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m20s\u001b[0m 29ms/step - loss: 0.4691 - precision: 0.7706 - recall: 0.7891 - val_loss: 0.4646 - val_precision: 0.7382 - val_recall: 0.8591 - learning_rate: 0.0010\n","Epoch 6/50\n","\u001b[1m562/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.4627 - precision: 0.7774 - recall: 0.7892\n","Epoch 6: val_precision improved from 0.77025 to 0.77874, saving model to content/advanced-model/LSTM_Word2Vec-Fige/checkpoints/best_model.keras\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m17s\u001b[0m 30ms/step - loss: 0.4627 - precision: 0.7774 - recall: 0.7892 - val_loss: 0.4524 - val_precision: 0.7787 - val_recall: 0.7977 - learning_rate: 0.0010\n","Epoch 7/50\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.4556 - precision: 0.7805 - recall: 0.7927\n","Epoch 7: val_precision did not improve from 0.77874\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m22s\u001b[0m 32ms/step - loss: 0.4556 - precision: 0.7805 - recall: 0.7927 - val_loss: 0.4540 - val_precision: 0.7754 - val_recall: 0.8076 - learning_rate: 0.0010\n","Epoch 8/50\n","\u001b[1m561/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 17ms/step - loss: 0.4521 - precision: 0.7847 - recall: 0.7925\n","Epoch 8: val_precision did not improve from 0.77874\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m16s\u001b[0m 29ms/step - loss: 0.4521 - precision: 0.7847 - recall: 0.7925 - val_loss: 0.4514 - val_precision: 0.7682 - val_recall: 0.8142 - learning_rate: 0.0010\n","Epoch 9/50\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step - loss: 0.4450 - precision: 0.7874 - recall: 0.7984\n","Epoch 9: val_precision did not improve from 0.77874\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m21s\u001b[0m 30ms/step - loss: 0.4450 - precision: 0.7874 - recall: 0.7984 - val_loss: 0.4492 - val_precision: 0.7741 - val_recall: 0.8102 - learning_rate: 0.0010\n","Epoch 10/50\n","\u001b[1m562/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 0.4412 - precision: 0.7906 - recall: 0.7971\n","Epoch 10: val_precision improved from 0.77874 to 0.79515, saving model to content/advanced-model/LSTM_Word2Vec-Fige/checkpoints/best_model.keras\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m17s\u001b[0m 30ms/step - loss: 0.4412 - precision: 0.7906 - recall: 0.7971 - val_loss: 0.4496 - val_precision: 0.7952 - val_recall: 0.7727 - learning_rate: 0.0010\n","Epoch 11/50\n","\u001b[1m562/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 0.4344 - precision: 0.7928 - recall: 0.8052\n","Epoch 11: val_precision did not improve from 0.79515\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m17s\u001b[0m 31ms/step - loss: 0.4344 - precision: 0.7928 - recall: 0.8052 - val_loss: 0.4515 - val_precision: 0.7818 - val_recall: 0.8014 - learning_rate: 0.0010\n","Epoch 12/50\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.4256 - precision: 0.7980 - recall: 0.8075\n","Epoch 12: val_precision did not improve from 0.79515\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m16s\u001b[0m 29ms/step - loss: 0.4256 - precision: 0.7980 - recall: 0.8075 - val_loss: 0.4455 - val_precision: 0.7865 - val_recall: 0.7943 - learning_rate: 2.0000e-04\n","Epoch 13/50\n","\u001b[1m561/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 0.4206 - precision: 0.8006 - recall: 0.8104\n","Epoch 13: val_precision did not improve from 0.79515\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m21s\u001b[0m 29ms/step - loss: 0.4206 - precision: 0.8006 - recall: 0.8104 - val_loss: 0.4451 - val_precision: 0.7867 - val_recall: 0.8019 - learning_rate: 2.0000e-04\n","Epoch 14/50\n","\u001b[1m561/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 0.4170 - precision: 0.8040 - recall: 0.8117\n","Epoch 14: val_precision did not improve from 0.79515\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m17s\u001b[0m 29ms/step - loss: 0.4170 - precision: 0.8040 - recall: 0.8117 - val_loss: 0.4419 - val_precision: 0.7950 - val_recall: 0.7912 - learning_rate: 2.0000e-04\n","Epoch 15/50\n","\u001b[1m561/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 19ms/step - loss: 0.4170 - precision: 0.8052 - recall: 0.8142\n","Epoch 15: val_precision did not improve from 0.79515\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m21s\u001b[0m 31ms/step - loss: 0.4170 - precision: 0.8053 - recall: 0.8142 - val_loss: 0.4468 - val_precision: 0.7831 - val_recall: 0.8031 - learning_rate: 2.0000e-04\n","Epoch 16/50\n","\u001b[1m562/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 17ms/step - loss: 0.4142 - precision: 0.8058 - recall: 0.8151\n","Epoch 16: val_precision did not improve from 0.79515\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m19s\u001b[0m 29ms/step - loss: 0.4142 - precision: 0.8058 - recall: 0.8151 - val_loss: 0.4477 - val_precision: 0.7841 - val_recall: 0.7965 - learning_rate: 2.0000e-04\n","Epoch 17/50\n","\u001b[1m560/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.4102 - precision: 0.8085 - recall: 0.8159\n","Epoch 17: val_precision did not improve from 0.79515\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m16s\u001b[0m 28ms/step - loss: 0.4102 - precision: 0.8085 - recall: 0.8159 - val_loss: 0.4485 - val_precision: 0.7838 - val_recall: 0.8012 - learning_rate: 4.0000e-05\n","Epoch 18/50\n","\u001b[1m562/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 0.4108 - precision: 0.8076 - recall: 0.8137\n","Epoch 18: val_precision did not improve from 0.79515\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m21s\u001b[0m 29ms/step - loss: 0.4108 - precision: 0.8076 - recall: 0.8138 - val_loss: 0.4487 - val_precision: 0.7842 - val_recall: 0.7999 - learning_rate: 4.0000e-05\n","Epoch 19/50\n","\u001b[1m561/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 17ms/step - loss: 0.4088 - precision: 0.8077 - recall: 0.8180\n","Epoch 19: val_precision did not improve from 0.79515\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m17s\u001b[0m 29ms/step - loss: 0.4088 - precision: 0.8077 - recall: 0.8180 - val_loss: 0.4472 - val_precision: 0.7844 - val_recall: 0.8043 - learning_rate: 1.0000e-05\n","Nombre réel d'époques effectuées: 19/50\n","Modèle sauvegardé dans content/advanced-model/LSTM_Word2Vec-Fige/final_model_LSTM_Word2Vec-Fige.keras\n","Tokenizer sauvegardé dans content/advanced-model/LSTM_Word2Vec-Fige/tokenizer.pickle\n","Fonction de prétraitement sauvegardée dans content/advanced-model/LSTM_Word2Vec-Fige/preprocess_function.dill\n","Historique d'entraînement sauvegardé dans content/advanced-model/LSTM_Word2Vec-Fige/training_history.pickle\n","Paramètres sauvegardés dans content/advanced-model/LSTM_Word2Vec-Fige/parameters.json\n","\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 5ms/step\n","\n","Métriques pour le modèle LSTM avec embedding Word2Vec:\n","accuracy: 0.7898\n","precision: 0.7970\n","recall: 0.7777\n","f1: 0.7872\n","roc_auc: 0.8748\n","\n","Rapport de classification:\n"," precision recall f1-score support\n","\n"," Négatif 0.78 0.80 0.79 20000\n"," Positif 0.80 0.78 0.79 20000\n","\n"," accuracy 0.79 40000\n"," macro avg 0.79 0.79 0.79 40000\n","weighted avg 0.79 0.79 0.79 40000\n","\n"]},{"output_type":"stream","name":"stderr","text":["2025/07/06 19:30:24 WARNING mlflow.models.model: `artifact_path` is deprecated. Please use `name` instead.\n"]},{"output_type":"stream","name":"stdout","text":["🏃 View run Modele_Avance_LSTM_Word2Vec-Fige at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/1/runs/1de54538ee73443687db131fcc86d922\n","🧪 View experiment at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/1\n","🏃 View run Modele_Avance_LSTM_Word2Vec-Fige at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/1/runs/1de54538ee73443687db131fcc86d922\n","🧪 View experiment at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/1\n","\n","Run MLflow ID: 1de54538ee73443687db131fcc86d922\n","Accédez à l'interface MLflow pour voir les détails complets.\n"]},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"iVBORw0KGgoAAAANSUhEUgAABKUAAAHqCAYAAADVi/1VAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3Xd8k9X+wPHPkzbdu7SUllJKWzayZM+CDAWZThwMBcX1c6JXQbkKXrkuVJxwRXGhosiUvWTvvcpeLW0ppYuOJOf3R0hoaFoKtE3H9/169dXmGec5z0nSnPPNGZpSSiGEEEIIIYQQQgghRBnSOToDQgghhBBCCCGEEKLqkaCUEEIIIYQQQgghhChzEpQSQgghhBBCCCGEEGVOglJCCCGEEEIIIYQQosxJUEoIIYQQQgghhBBClDkJSgkhhBBCCCGEEEKIMidBKSGEEEIIIYQQQghR5iQoJYQQQgghhBBCCCHKnASlhBBCCCGEEEIIIUSZk6CUqDD27NmDl5cXPXr0IDc319HZEUIIIYQQQgghxC2QoJSoEFJTUxk4cCANGzZk9uzZuLi43HRaq1atQtM0xo8ff1Pnf/fdd2iaxnfffXfTeRBCQNeuXdE0zdHZKJekbIQQQoiK7VbbHJWZlI3IT4JSosRommbz4+TkRLVq1ejWrRs///zzTadrMpkYMmQIer2ehQsX4uXlVYK5rtosDd9Vq1YV6/gtW7bw0EMPERERgaurKz4+PkRFRXH33Xfz3//+l8zMTABq165d4PVQ1I/lA2n8+PHWbY8++mih+Vi9erX1uNq1a99iKVRcRqMRPz8/9Ho96enpBfbHx8dby2n69Ol20+jSpQuaprFmzZrSzm6xnD17ls8++4w777yT2rVr4+rqSmBgID169ODPP/+0OfbSpUt4enri7u7OxYsXi0z39OnTODk5ERwc7NCelsOGDSvyvdC1a1eH5U0IUTlZ/r9URZaGb3H/t2ZnZ/PBBx/Qpk0bfH19cXFxoUaNGrRs2ZJnnnmG1atXA1e/oLyRHwvLY51Ox9GjRwvNS2xsrPXYqvxF6Icffoimabz66qt29z/xxBNF1gdXrlyJpml069atFHNZfEopFi1axLPPPkuzZs3w9/fHzc2NevXq8fzzz3P+/Hmb49944w00TWPMmDHXTXvUqFFomsbHH39cWtm/rhMnTlz3vVDcdoeoOpwdnQFR+bz11lsA5OXlcfDgQebMmcPKlSvZunUrH3300Q2nd/jwYVq3bs3XX39NtWrVbjl/rVu35sCBAzed1sCBA2nbti01atS45bxUJD/++CNDhw5FKUW3bt0YOHAg7u7unDx5krVr1zJ//nwGDRpEdHQ0zz//PKmpqTbnf/fdd5w8eZKhQ4cWqDhcW1l0dnZm1qxZfPrpp/j5+RXIy9SpU3F2dsZgMJTsTVYwTk5OdO3alTlz5rBmzRr69Oljs3/58uWAuQK8YsUKhg8fbrM/KyuLjRs34unpSbt27cos30X57LPPmDRpEpGRkcTGxhISEsLJkyf5888/WbZsGS+88IL1/4ivry/33nsv33//PT/88APPPfdcoel+++23mEwmhg4deks9LUtK//79adasWYHtlvfGjBkzyMrKKttMCSFEFZaRkUGXLl3Yvn07ISEhDB48mJCQEDIyMti1axfffPMNqampdOnShWbNmlnruxYnTpzg+++/JyIigmHDhhV5LUsd5n//+x/vvvtugf1xcXGsWrVK6jpA9+7dAVixYoXd/cuXL0fTNE6ePMnRo0eJiooqsB/gjjvuKN2MFlNOTg533nknLi4udO7cmTvuuAOj0ciKFSv45JNPmDlzJv/88w8xMTEAPP744/znP/9hxowZTJw4Eb1ebzfdzMxMZs6ciaurK0OHDi3LW7LL19eX559/3u6+2rVrExwcfEvtMVHJKCFKCKDsvaSWLVumNE1Tmqap48ePl33GRKG6dOmiALVy5coij8vMzFQ+Pj7KyclJLVu2zO4x69atUxcvXryla7311lsKUAMGDFCAmjJlSoFjUlJSlJubmxo4cKACVERERJF5r+w++eQTBagXX3yxwL7hw4crd3d31adPHxUWFlZg/+LFixWgevfuXRZZLcDymsjvjz/+UKtWrSpw7P79+5WPj48C1NatW63b161bpwDVpEmTQq9jNBpVRESEAtThw4dL7gZuwtChQxWgpk+f7tB8CCGqjsLqZ1XBypUrFaC6dOly3WPfeecdBaiePXuqnJycAvtTUlLUunXrbvlagAoLC1O33367CgkJUXl5eQWOGTNmjAKsdZ2q/JlhMplUYGCgcnJyUqmpqTb7Tp48qQB17733KkB98803Bc5v166dAtTGjRvLKstWltfEW2+9Zd2Wm5urJkyYoFJS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7nSrdayy8tVXXxWow1kcPHjQOhSqNOo6EyZMYPbs2SxevNga/LoZtWvXJi4uziawoJRi/PjxRf6vf/TRR9HpdMyYMYMZM2YA2O2J9swzz6DX63nhhRcKzO0D5qGO+YMDLVu2pH379uzcuZNJkyYVOP7ChQtkZ2cX+/4sdZ1x48YBtj3CAerVq0eNGjX48ccfOXToENHR0TZ17w4dOlCvXj3Wrl3LrFmzbM6dNWsW//zzD3Xr1rU7p5E9er2ehx56iPT09ALzGW3dupWffvrJ7nk7d+601snmzJlDnz59inU9sO0V/t1336HX6ws8V/379ycqKorPP/+chQsX2k1nw4YN1rqek5MTTz31FJcvX+bJJ58sMMQzNzfXpudjaenQoQNRUVGsXLmywBeB33zzjd3X3PDhw/Hz8+Pf//43mzdvLrDfZDIVGRwU5YPMKSXKpSlTphAXF8ebb77JDz/8QMeOHalevTrnzp3jwIEDbNmyhV9++cU6qXbPnj0ZO3YsEyZMoEGDBgwYMIDw8HDOnz/P2rVradu2Ld99912h1/vhhx/4+uuv6dixI1FRUfj7+3P06FHmzZuHq6vrdcdJe3l58e2333LvvffSpUsX7r33XmrVqsW2bdtYsmQJISEhfP311yVYQiXrvffeK7R8nnvuOXQ6Hf/3f//HK6+8QocOHWjcuDHe3t4kJiayYsUKjh07RnBwMB9++GGp5K9nz563nMbdd99NdHQ0H330EXv27KF58+acOnWK+fPn06dPH06dOlXouUOHDmXatGn861//sj62p6xft/lVr17d2gMI7E/iaam87dmzx+4xQ4YMYc6cOfz22280atSIAQMGoGkaf/31F8ePH+f+++/noYceKlZ+wFw5fu+993jppZdo3rw5999/P76+vixevJjU1FRuu+02du/ebXPO22+/zbRp03B3d6dZs2a89957BdJt1qwZAwYMsHvNUaNGMXPmTGul2N4wiBEjRrBt2za++OILoqKi6NWrF7Vq1SIlJYXjx4+zZs0ahg8fzldffQVAtWrV+Pnnn7nnnnuIjY3lzjvv5LbbbiMtLY3du3dz+vTpMhkC9+ijjzJz5kwWLVpE48aN6devH3l5efzxxx+0atWKQ4cOFQhEjhs3jl27dvHVV18xb948unXrRlhYGImJicTFxbFu3TomTpwok38KUQUUNdzt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gKwMyDhUN6rKSU+FI4e9da8O7qnLRThDz8SlpFT3ZQafQaDLReWAob4ORUREREREREQ6OeMOgIQkSEjCnPX1dqe62jvlrzZJlXHI57WtlZTyMeuCy4j57m1kZGTgOM7JDxARERERERERaSHjckFcH4jrgxk13tfhAOA/1a1ERERERERERKTbUFJKREREREREREQ6nJJSIiIiIiIiIiLS4ZSUEhERERERERGRDqeklIiIiIiIiIiIdDglpUREREREREREpMMpKSUiIiIiIiIiIh1OSSkREREREREREelwbl8HICIiIiKtt2LFCt544w3y8vJITk7mlltuYeDAgSc9bt26dTzzzDOMGTOGe++9t2674zgsXryY999/n+LiYoYMGcKtt95KfHx8e96GiIiIdCMaKSUiIiLSya1fv56FCxfyne98h3nz5pGcnMzcuXPJz88/4XFZWVm88MILDB06tMF7r732Gm+99RazZs3iscceIzAwkLlz51JRUdFetyEiIiLdjJJSIiIiIp3cm2++ybRp05gyZQqJiYnMmjULj8fDqlWrmjzGtm0WLFjANddcQ2xsbL33HMdh+fLlXHXVVYwdO5bk5GTuuusujh07xmeffdbetyMiIiLdhJJSIiIiIp1YVVUV+/btY/jw4XXbLMti+PDh7Nq1q8njlixZQkREBFOnTm3wXlZWFnl5eYwYMaJuW0hICAMHDjzhOUVERERaQjWlRERERDqxgoICbNsmKiqq3vaoqCjS09MbPWbnzp2sXLmSJ554otH38/LyAIiMjKy3PTIysu69xlRWVlJZWVn32hhDcHBw3fdtqfZ8bX3ezkRtoDbo7vcPagNQG4DaADpvGygpJSIiItKNlJaWsmDBAm677TYiIiLa9NxLly5lyZIlda/79evHvHnziImJadPrHC8uLq7dzt1ZqA3UBt39/kFtAGoDUBtA52sDJaVEREREOrGIiAgsy2owgikvL6/B6CmAI0eOkJ2dzbx58+q2OY4DwHXXXcf8+fPrjsvPz6dHjx51++Xn55OSktJkLFdeeSUzZ86se137aW12djZVVVUtvLMTM8YQFxdHZmZmXfzdjdpAbdDd7x/UBqA2ALUB+F8buN3uZn0opaRUC7jd7ddc7XnuzkJtoDYAtQGoDUBt0N3vH/yrDfwplsa43W769+/Ptm3bGDduHOAtYr5t2zamT5/eYP+EhASefPLJetsWLVpEWVkZ3//+9+nVqxcul4uoqCi2bt1al4QqKSlhz549XHTRRU3GEhAQQEBAQKMxtheXy9Vu5+4s1AZqg+5+/6A2ALUBqA3Af9qguf/2+3cvy88c/0lhW2vPYe2dhdpAbQBqA1AbgNqgu98/qA1aaubMmTz//PP079+fgQMHsnz5csrLy5k8eTIAzz33HNHR0dxwww14PB6SkpLqHR8aGgpQb/uMGTP473//S3x8PLGxsSxatIgePXowduzYFsenPlT7UhuoDbr7/YPaANQGoDaAztcGWn3Px0pLS7nvvvsoLS31dSg+ozZQG4DaANQGoDbo7vcPaoNTNWHCBL773e+yePFi7r33Xg4cOMDs2bPrpuHl5ORw7NixFp3z8ssvZ/r06fzxj3/k/vvvp7y8nNmzZ+PxeNrhDlpOz4raANQG3f3+QW0AagNQG0DnbQONlPIxx3HYv3+/X8z59BW1gdoA1AagNgC1QXe/f1AbtMb06dMbna4HMGfOnBMee+eddzbYZozh2muv5dprr22L8NqcnhW1AagNuvv9g9oA1AagNoDO2wYaKSUiIiIiIiIiIh1OSSkREREREREREelwSkr5WEBAAN/5zncaXammu1AbqA1AbQBqA1AbdPf7B7WBNJ+eFbUBqA26+/2D2gDUBqA2gM7bBsbpbBMORURERERERESk09NIKRERERERERER6XBKSomIiIiIiIiISIdTUkpERERERERERDqc29cBdAcrVqzgjTfeIC8vj+TkZG655RYGDhzY5P4fffQRr7zyCtnZ2cTFxXHjjTcyevToDoy47SxdupRPP/2Uw4cP4/F4GDx4MDfddBMJCQlNHrN69Wp+//vf19sWEBDAiy++2N7htovFixezZMmSetsSEhKYP39+k8d0pWcA4M477yQ7O7vB9osuuohbb721wfau8Axs376d119/nf3793Ps2DHuvvtuxo0bV/e+4zgsXryY999/n+LiYoYMGcKtt95KfHz8Cc/b0t8nvnSiNqiqqmLRokVs3LiRrKwsQkJCGD58ODfccAPR0dFNnvNUfp586WTPwfPPP8+aNWvqHXPmmWfyy1/+8oTn7SzPwcnu/5prrmn0uJtuuonLLrus0fc62zMgrfViabcAAA6/SURBVKM+lPpQ6kN1rz6U+k/qP4H6T9C9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\n"},"metadata":{}}],"source":["# Entraîner le modèle LSTM avec Word2Vec\n","model_lstm_word2vec, history_lstm_word2vec, metrics_lstm_word2vec, run_id_lstm_word2vec = train_word2vec_lstm_model(epochs=50)"]},{"cell_type":"markdown","metadata":{"id":"CD8guTB_NwMx"},"source":["## Chargement du modèle entraîné\n","\n","Dans cette fonction, nous créons un mécanisme pour charger un **modèle complet** avec tous ses composants associés. Nous récupérons l'ensemble des artefacts nécessaires pour faire fonctionner notre modèle d'analyse de sentiment à partir d'un emplacement spécifique.\n","\n","- Nous chargeons d'abord le **modèle Keras entraîné** à partir du fichier .keras sauvegardé\n","- Nous récupérons le **tokenizer** qui convertit le texte brut en séquences numériques\n","- Nous importons la **fonction de prétraitement** qui nettoie les tweets avant l'analyse\n","- Nous lisons les **paramètres du modèle** à partir d'un fichier JSON\n","- Nous retournons tous ces éléments dans un dictionnaire cohérent, prêt à être utilisé pour prédire le sentiment de nouveaux tweets"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"9nXo7O_XNwMx"},"outputs":[],"source":["# Fonction pour charger un modèle complet avec tous ses artefacts\n","def load_complete_model(model_name, vectorizer_name):\n"," \"\"\"\n"," Charge un modèle complet avec son tokenizer et sa fonction de prétraitement.\n"," \"\"\"\n"," model_dir = f\"content/advanced-model/{model_name}_{vectorizer_name}\"\n","\n"," # Charger le modèle\n"," model_path = f\"{model_dir}/final_model_{model_name}_{vectorizer_name}.keras\"\n"," model = tf.keras.models.load_model(model_path)\n","\n"," # Charger le tokenizer\n"," tokenizer_path = f\"{model_dir}/tokenizer.pickle\"\n"," with open(tokenizer_path, 'rb') as handle:\n"," tokenizer = pickle.load(handle)\n","\n"," # Charger la fonction de prétraitement\n"," preprocess_path = f\"{model_dir}/preprocess_function.dill\"\n"," with open(preprocess_path, 'rb') as handle:\n"," preprocess_function = dill.load(handle)\n","\n"," # Charger les paramètres\n"," params_path = f\"{model_dir}/parameters.json\"\n"," with open(params_path, 'r') as f:\n"," params = json.load(f)\n","\n"," return {\n"," \"model\": model,\n"," \"tokenizer\": tokenizer,\n"," \"preprocess\": preprocess_function,\n"," \"params\": params\n"," }"]},{"cell_type":"markdown","metadata":{"id":"P7Ge212GNwMx"},"source":["## Prédire avec le modèle entraîné\n","\n","Dans cette fonction, nous mettons en œuvre le cœur de notre système d'analyse de sentiment, permettant de prédire si un tweet exprime un sentiment positif ou négatif. Nous utilisons l'ensemble des composants précédemment chargés pour traiter le texte et générer une prédiction fiable.\n","\n","- **Prétraitement du texte** : Application des transformations de nettoyage sur le tweet brut\n","- **Tokenisation** : Conversion du texte prétraité en séquences numériques\n","- **Padding** : Ajustement des séquences à une longueur uniforme\n","- **Prédiction** : Calcul de la probabilité de sentiment par le modèle LSTM\n","- **Interprétation** : Classification du tweet comme positif ou négatif selon le seuil de 0.5\n","- **Évaluation de confiance** : Détermination du niveau de certitude de la prédiction\n","- **Formatage des résultats** : Présentation des résultats sous forme de dictionnaire structuré"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"LpuAgS8_NwMx"},"outputs":[],"source":["# Fonction pour prédire le sentiment avec un modèle chargé\n","def predict_sentiment(text, model_pack):\n"," \"\"\"\n"," Prédit le sentiment d'un texte en utilisant un modèle chargé.\n"," \"\"\"\n"," model = model_pack[\"model\"]\n"," tokenizer = model_pack[\"tokenizer\"]\n"," preprocess = model_pack[\"preprocess\"]\n"," params = model_pack[\"params\"]\n","\n"," # Prétraiter le texte\n"," preprocessed_text = preprocess(text)\n","\n"," # Tokeniser et encoder le texte\n"," tokens = tokenizer.texts_to_sequences([preprocessed_text])\n"," max_length = params.get(\"max_sequence_length\", MAX_SEQUENCE_LENGTH)\n"," padded_tokens = pad_sequences(tokens, maxlen=max_length, padding='post', truncating='post')\n","\n"," # Prédire le sentiment\n"," prediction = model.predict(padded_tokens)[0][0]\n","\n"," # Interpréter la prédiction\n"," sentiment = \"Positif\" if prediction >= 0.5 else \"Négatif\"\n"," confidence = prediction if prediction >= 0.5 else 1 - prediction\n","\n"," return {\n"," 'sentiment': sentiment,\n"," 'confidence': float(confidence),\n"," 'raw_score': float(prediction)\n"," }"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"eWAj3vceNwMx"},"outputs":[],"source":["# Liste améliorée de tweets pour tester le modèle\n","test_tweets_improved = [\n"," # Tweets positifs avec différentes caractéristiques\n"," \"I absolutely love flying with @AirParadis! Their service is amazing and their staff is so helpful :) #bestairline #travel\",\n"," \"Just landed after a wonderful flight... The crew was totally awesome and the food was perfect!!! Can't wait to fly with them again :D\",\n"," \"OMG! You really have to try @AirParadis. Best. Flight. Ever. Their new seats are extremely comfortable. http://airparadis.com/newseats #travel #comfort\",\n"," \"We had a very pleasant experience with our flight today. The staff completely exceeded our expectations ;) #happy #AirParadis\",\n"," \"My first time flying business class and I'm absolutely amazed!!! The service is 100% worth it... @AirParadis never disappoints :)\",\n","\n"," # Tweets négatifs avec différentes caractéristiques\n"," \"I hate how @AirParadis always delays their flights... This is the third time this month!!! :( #disappointed #travel\",\n"," \"The worst flight experience of my life? Definitely today with @AirParadis. Their customer service won't even respond to my complaints... #terrible\",\n"," \"Really @AirParadis??? Flight cancelled and no compensation??? That's how you treat your customers? SMH :(\",\n"," \"Our baggage was lost and nobody at @AirParadis seems to care! Don't they understand that we can't enjoy our vacation without our stuff??? http://badservice.com/complaint :-(\",\n"," \"Food was terrible, seats were uncomfortable, and the staff was not helpful at all... Never flying with @AirParadis again! #worstairline\",\n","\n"," # Tweets mixtes et nuancés\n"," \"The flight was good but the food wasn't really what I expected... @AirParadis can do better! #mixedfeelings\",\n"," \"IDK what to think about my @AirParadis experience? The crew was nice but the flight was delayed for 2 hours... #confused\",\n"," \"My husband loved the flight but I didn't... Too bad they can't make everyone happy :-) #AirParadis\",\n"," \"TBH, @AirParadis has improved their service since last year! Not perfect yet, but they're trying... #progress\",\n"," \"We were so excited for our trip but then our flight got delayed... at least the staff was very apologetic and gave us free drinks! @AirParadis\",\n","\n"," # Tweets spécifiquement pour tester les caractéristiques spéciales\n"," \"This is a tweet with many!!! exclamation!!! marks!!! to test how they affect sentiment analysis :)\",\n"," \"How does the model handle multiple??? question??? marks??? in a single tweet? @AirParadis\",\n"," \"Testing ellipses... many... many... ellipses... in... one... tweet... @AirParadis #test\",\n"," \"#many #hashtags #in #one #tweet #to #see #how #they #affect #the #analysis #AirParadis\",\n"," \"@mention1 @mention2 @mention3 @mention4 @mention5 multiple mentions in one tweet\",\n"," \"Multiple URLs in one tweet: http://example1.com http://example2.com http://example3.com @AirParadis\",\n"," \"Let's try all emoticons :) :( :D ;) :-) :-( :-D ;-) in a single tweet to see the impact\"\n","]"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"hRAWxNusNwMy","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751830278905,"user_tz":-120,"elapsed":9239,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"da9971f0-92e6-49fd-a56f-9da5946ddc8f"},"outputs":[{"output_type":"stream","name":"stdout","text":["\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2s/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 33ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 31ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 29ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 31ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 31ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 30ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 31ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 32ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 31ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 30ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 31ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 31ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 30ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 32ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 32ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 33ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 29ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 29ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 39ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 35ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 34ms/step\n","\n","Test du modèle sur les exemples:\n","==================================================\n","Résumé: 22 tweets analysés\n","Tweets positifs: 10 (45.5%)\n","Tweets négatifs: 12 (54.5%)\n"]}],"source":["def test_model_on_examples(model_pack, test_tweets):\n"," \"\"\"\n"," Teste le modèle sur une liste de tweets et retourne un DataFrame avec les résultats des prédictions.\n"," \"\"\"\n"," results = {\n"," \"Positif\": 0,\n"," \"Négatif\": 0\n"," }\n","\n"," # Créer un DataFrame pour stocker les résultats\n"," predictions_data = []\n","\n"," for i, tweet in enumerate(test_tweets):\n"," # Utiliser la fonction predict_sentiment avec model_pack\n"," result = predict_sentiment(tweet, model_pack)\n","\n"," # Ajouter l'emoji approprié pour le sentiment\n"," emoji = \"💚\" if result['sentiment'] == \"Positif\" else \"❌\"\n","\n"," # Ajouter les données au DataFrame\n"," predictions_data.append({\n"," \"Tweet\": tweet,\n"," \"Sentiment\": result['sentiment'],\n"," \"Emoji\": emoji,\n"," \"Score de confiance\": result['confidence'],\n"," \"Score brut\": result['raw_score'],\n"," \"Index\": i+1\n"," })\n","\n"," # Comptage des résultats\n"," results[result['sentiment']] += 1\n","\n"," # Créer le DataFrame\n"," df_predictions = pd.DataFrame(predictions_data)\n","\n"," # Afficher un résumé\n"," print(\"\\nTest du modèle sur les exemples:\")\n"," print(\"=\"*50)\n"," print(f\"Résumé: {len(test_tweets)} tweets analysés\")\n"," print(f\"Tweets positifs: {results['Positif']} ({(results['Positif']/len(test_tweets)*100):.1f}%)\")\n"," print(f\"Tweets négatifs: {results['Négatif']} ({(results['Négatif']/len(test_tweets)*100):.1f}%)\")\n","\n"," # Retourner le DataFrame\n"," return df_predictions\n","\n","# Exemple d'utilisation:\n","# Charger le model_pack (qui contient model, tokenizer, preprocess, params)\n","lstm_word2vec_model_pack = load_complete_model(\"LSTM\", \"Word2Vec-Fige\")\n","\n","# Obtenir le DataFrame des prédictions\n","df_results_word2vec = test_model_on_examples(lstm_word2vec_model_pack, test_tweets_improved)\n","\n","# Optionnel: sauvegarder les résultats dans un fichier CSV\n","df_results_word2vec.to_csv(\"content/advanced-model/LSTM_Word2Vec-Fige/predictions_results.csv\", index=False)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"aCXO6s63NwMy","colab":{"base_uri":"https://localhost:8080/","height":739},"executionInfo":{"status":"ok","timestamp":1751830278990,"user_tz":-120,"elapsed":84,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"9f52a557-cf1d-4738-be5d-c44e17e7b163"},"outputs":[{"output_type":"execute_result","data":{"text/plain":[" Tweet Sentiment Emoji \\\n","0 I absolutely love flying with @AirParadis! The... Positif 💚 \n","1 Just landed after a wonderful flight... The cr... Positif 💚 \n","2 OMG! You really have to try @AirParadis. Best.... Positif 💚 \n","3 We had a very pleasant experience with our fli... Positif 💚 \n","4 My first time flying business class and I'm ab... Négatif ❌ \n","5 I hate how @AirParadis always delays their fli... Négatif ❌ \n","6 The worst flight experience of my life? Defini... Négatif ❌ \n","7 Really @AirParadis??? Flight cancelled and no ... Négatif ❌ \n","8 Our baggage was lost and nobody at @AirParadis... Négatif ❌ \n","9 Food was terrible, seats were uncomfortable, a... Négatif ❌ \n","10 The flight was good but the food wasn't really... Positif 💚 \n","11 IDK what to think about my @AirParadis experie... Négatif ❌ \n","12 My husband loved the flight but I didn't... To... Négatif ❌ \n","13 TBH, @AirParadis has improved their service si... Positif 💚 \n","14 We were so excited for our trip but then our f... Négatif ❌ \n","15 This is a tweet with many!!! exclamation!!! ma... Négatif ❌ \n","16 How does the model handle multiple??? question... Négatif ❌ \n","17 Testing ellipses... many... many... ellipses..... Positif 💚 \n","18 #many #hashtags #in #one #tweet #to #see #how ... Négatif ❌ \n","19 @mention1 @mention2 @mention3 @mention4 @menti... Positif 💚 \n","20 Multiple URLs in one tweet: http://example1.co... Positif 💚 \n","21 Let's try all emoticons :) :( :D ;) :-) :-( :-... Positif 💚 \n","\n"," Score de confiance Score brut Index \n","0 0.995117 0.995117 1 \n","1 0.995117 0.995117 2 \n","2 0.979980 0.979980 3 \n","3 0.986328 0.986328 4 \n","4 0.541992 0.458008 5 \n","5 0.992825 0.007175 6 \n","6 0.971252 0.028748 7 \n","7 0.727051 0.272949 8 \n","8 0.942810 0.057190 9 \n","9 0.909424 0.090576 10 \n","10 0.918457 0.918457 11 \n","11 0.915649 0.084351 12 \n","12 0.536621 0.463379 13 \n","13 0.588379 0.588379 14 \n","14 0.541748 0.458252 15 \n","15 0.836792 0.163208 16 \n","16 0.510498 0.489502 17 \n","17 0.675293 0.675293 18 \n","18 0.591064 0.408936 19 \n","19 0.909180 0.909180 20 \n","20 0.994141 0.994141 21 \n","21 0.951660 0.951660 22 "],"text/html":["\n","
\n","
\n","\n","
\n"," \n","
\n","
\n","
Tweet
\n","
Sentiment
\n","
Emoji
\n","
Score de confiance
\n","
Score brut
\n","
Index
\n","
\n"," \n"," \n","
\n","
0
\n","
I absolutely love flying with @AirParadis! The...
\n","
Positif
\n","
💚
\n","
0.995117
\n","
0.995117
\n","
1
\n","
\n","
\n","
1
\n","
Just landed after a wonderful flight... The cr...
\n","
Positif
\n","
💚
\n","
0.995117
\n","
0.995117
\n","
2
\n","
\n","
\n","
2
\n","
OMG! You really have to try @AirParadis. Best....
\n","
Positif
\n","
💚
\n","
0.979980
\n","
0.979980
\n","
3
\n","
\n","
\n","
3
\n","
We had a very pleasant experience with our fli...
\n","
Positif
\n","
💚
\n","
0.986328
\n","
0.986328
\n","
4
\n","
\n","
\n","
4
\n","
My first time flying business class and I'm ab...
\n","
Négatif
\n","
❌
\n","
0.541992
\n","
0.458008
\n","
5
\n","
\n","
\n","
5
\n","
I hate how @AirParadis always delays their fli...
\n","
Négatif
\n","
❌
\n","
0.992825
\n","
0.007175
\n","
6
\n","
\n","
\n","
6
\n","
The worst flight experience of my life? Defini...
\n","
Négatif
\n","
❌
\n","
0.971252
\n","
0.028748
\n","
7
\n","
\n","
\n","
7
\n","
Really @AirParadis??? Flight cancelled and no ...
\n","
Négatif
\n","
❌
\n","
0.727051
\n","
0.272949
\n","
8
\n","
\n","
\n","
8
\n","
Our baggage was lost and nobody at @AirParadis...
\n","
Négatif
\n","
❌
\n","
0.942810
\n","
0.057190
\n","
9
\n","
\n","
\n","
9
\n","
Food was terrible, seats were uncomfortable, a...
\n","
Négatif
\n","
❌
\n","
0.909424
\n","
0.090576
\n","
10
\n","
\n","
\n","
10
\n","
The flight was good but the food wasn't really...
\n","
Positif
\n","
💚
\n","
0.918457
\n","
0.918457
\n","
11
\n","
\n","
\n","
11
\n","
IDK what to think about my @AirParadis experie...
\n","
Négatif
\n","
❌
\n","
0.915649
\n","
0.084351
\n","
12
\n","
\n","
\n","
12
\n","
My husband loved the flight but I didn't... To...
\n","
Négatif
\n","
❌
\n","
0.536621
\n","
0.463379
\n","
13
\n","
\n","
\n","
13
\n","
TBH, @AirParadis has improved their service si...
\n","
Positif
\n","
💚
\n","
0.588379
\n","
0.588379
\n","
14
\n","
\n","
\n","
14
\n","
We were so excited for our trip but then our f...
\n","
Négatif
\n","
❌
\n","
0.541748
\n","
0.458252
\n","
15
\n","
\n","
\n","
15
\n","
This is a tweet with many!!! exclamation!!! ma...
\n","
Négatif
\n","
❌
\n","
0.836792
\n","
0.163208
\n","
16
\n","
\n","
\n","
16
\n","
How does the model handle multiple??? question...
\n","
Négatif
\n","
❌
\n","
0.510498
\n","
0.489502
\n","
17
\n","
\n","
\n","
17
\n","
Testing ellipses... many... many... ellipses.....
\n","
Positif
\n","
💚
\n","
0.675293
\n","
0.675293
\n","
18
\n","
\n","
\n","
18
\n","
#many #hashtags #in #one #tweet #to #see #how ...
\n","
Négatif
\n","
❌
\n","
0.591064
\n","
0.408936
\n","
19
\n","
\n","
\n","
19
\n","
@mention1 @mention2 @mention3 @mention4 @menti...
\n","
Positif
\n","
💚
\n","
0.909180
\n","
0.909180
\n","
20
\n","
\n","
\n","
20
\n","
Multiple URLs in one tweet: http://example1.co...
\n","
Positif
\n","
💚
\n","
0.994141
\n","
0.994141
\n","
21
\n","
\n","
\n","
21
\n","
Let's try all emoticons :) :( :D ;) :-) :-( :-...
\n","
Positif
\n","
💚
\n","
0.951660
\n","
0.951660
\n","
22
\n","
\n"," \n","
\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","\n","
\n"," \n"," \n"," \n","
\n","\n","
\n","
\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"df_results_word2vec","summary":"{\n \"name\": \"df_results_word2vec\",\n \"rows\": 22,\n \"fields\": [\n {\n \"column\": \"Tweet\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 22,\n \"samples\": [\n \"I absolutely love flying with @AirParadis! Their service is amazing and their staff is so helpful :) #bestairline #travel\",\n \"TBH, @AirParadis has improved their service since last year! Not perfect yet, but they're trying... #progress\",\n \"Our baggage was lost and nobody at @AirParadis seems to care! Don't they understand that we can't enjoy our vacation without our stuff??? http://badservice.com/complaint :-(\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Sentiment\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"N\\u00e9gatif\",\n \"Positif\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Emoji\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"\\u274c\",\n \"\\ud83d\\udc9a\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Score de confiance\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.1866448337305405,\n \"min\": 0.510498046875,\n \"max\": 0.9951171875,\n \"num_unique_values\": 21,\n \"samples\": [\n 0.9951171875,\n 0.591064453125\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Score brut\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.3730689855539598,\n \"min\": 0.007175445556640625,\n \"max\": 0.9951171875,\n \"num_unique_values\": 21,\n \"samples\": [\n 0.9951171875,\n 0.408935546875\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Index\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 6,\n \"min\": 1,\n \"max\": 22,\n \"num_unique_values\": 22,\n \"samples\": [\n 1,\n 14\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"}},"metadata":{},"execution_count":35}],"source":["df_results_word2vec"]},{"cell_type":"markdown","metadata":{"id":"Yk_yH3-INwMy"},"source":["## Entrainement : LSTM avec GloVe 300d"]},{"cell_type":"markdown","metadata":{"id":"E-yiOEKYNwMy"},"source":["### Chargement et préparation des embeddings pré-entraînés GloVe"]},{"cell_type":"code","source":["import os\n","import requests\n","from tqdm import tqdm\n","from zipfile import ZipFile\n","\n","# Télécharger et préparer les embeddings GloVe\n","def download_glove_embeddings(url=\"https://nlp.stanford.edu/data/glove.6B.zip\",\n"," output_dir=\"content/pretrained-embeddings/glove.6B\"):\n"," \"\"\"\n"," Télécharge et extrait les embeddings GloVe si nécessaire.\n"," Inclut une barre de progression et vérifie si les fichiers existent déjà.\n"," \"\"\"\n"," # Check if directory already exists\n"," if os.path.exists(output_dir) and os.listdir(output_dir):\n"," print(f\"Le dossier {output_dir} existe déjà. Téléchargement ignoré.\")\n"," return\n","\n"," # Create directory if it doesn't exist\n"," os.makedirs(output_dir, exist_ok=True)\n","\n"," # Temporary zip file path\n"," zip_path = \"glove.6B.zip\"\n","\n"," # Download the file with progress bar\n"," print(\"Téléchargement du fichier...\")\n"," # Add verify=False to ignore SSL certificate issues\n"," response = requests.get(url, stream=True, verify=False)\n"," total_size = int(response.headers.get('content-length', 0))\n","\n"," with open(zip_path, 'wb') as f, tqdm(\n"," desc=\"Téléchargement\",\n"," total=total_size,\n"," unit='B',\n"," unit_scale=True,\n"," unit_divisor=1024,\n"," ) as bar:\n"," for data in response.iter_content(chunk_size=1024):\n"," size = f.write(data)\n"," bar.update(size)\n","\n"," # Extract with progress bar\n"," print(\"Extraction des fichiers...\")\n"," with ZipFile(zip_path, 'r') as zip_ref:\n"," for file in tqdm(zip_ref.namelist(), desc=\"Extraction\"):\n"," zip_ref.extract(file, output_dir)\n","\n"," # Remove the zip file\n"," os.remove(zip_path)\n"," print(\"Terminé!\")\n","\n","# Exécuter la fonction\n","download_glove_embeddings()"],"metadata":{"id":"9y9NubYo_DLG","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751830278993,"user_tz":-120,"elapsed":3,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"12613b2b-a219-4860-ba02-f8a00932f053"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Le dossier content/pretrained-embeddings/glove.6B existe déjà. Téléchargement ignoré.\n"]}]},{"cell_type":"code","execution_count":null,"metadata":{"id":"vk_8gucuNwMy"},"outputs":[],"source":["def load_glove_embeddings(embedding_dim=100):\n"," \"\"\"\n"," Charge les embeddings GloVe pré-entraînés.\n"," \"\"\"\n"," print(f\"Chargement des embeddings GloVe {embedding_dim}d...\")\n"," embeddings_index = {}\n","\n"," with open(f'content/pretrained-embeddings/glove.6B/glove.6B.{embedding_dim}d.txt', encoding='utf-8') as f:\n"," for line in f:\n"," values = line.rstrip().split(' ')\n"," word = values[0]\n"," coefs = np.asarray(values[1:], dtype='float32')\n"," embeddings_index[word] = coefs\n","\n"," print(f\"Trouvé {len(embeddings_index)} vecteurs d'embeddings GloVe.\")\n"," return embeddings_index"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"AegR2uCfNwMy","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751830310660,"user_tz":-120,"elapsed":31665,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"6150eeae-cf38-4ec3-a548-eeb1f3bbd2fd"},"outputs":[{"output_type":"stream","name":"stdout","text":["Chargement des embeddings GloVe 300d...\n","Trouvé 400000 vecteurs d'embeddings GloVe.\n","Création de la matrice d'embedding pour 83730 mots...\n"]},{"output_type":"stream","name":"stderr","text":["Création matrice d'embedding: 100%|██████████| 83730/83730 [00:00<00:00, 353325.63it/s]"]},{"output_type":"stream","name":"stdout","text":["Trouvé 37172 mots (44.40%) dans les embeddings pré-entraînés.\n"]},{"output_type":"stream","name":"stderr","text":["\n"]}],"source":["glove_embeddings_300d = load_glove_embeddings(embedding_dim=300)\n","glove_matrix_300d = create_embedding_matrix(tokenizer.word_index, glove_embeddings_300d, 300)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"gPwavY_xNwMy"},"outputs":[],"source":["def train_glove_lstm_model(epochs=20):\n"," \"\"\"\n"," Entraîne un modèle LSTM avec embeddings GloVe 300d en utilisant les optimisations GPU\n"," et le chargement de données optimisé.\n"," \"\"\"\n"," # Définir le nom du modèle et de la méthode d'embedding\n"," model_name = \"LSTM\"\n"," vectorizer_name = \"GloVe-300d-Fige\"\n","\n"," # Créer les callbacks pour ce modèle\n"," checkpoint_callback = create_model_checkpoint(model_name, vectorizer_name)\n","\n"," # Autres callbacks\n"," early_stopping = tf.keras.callbacks.EarlyStopping(\n"," monitor='val_loss',\n"," patience=5,\n"," restore_best_weights=True\n"," )\n","\n"," reduce_lr = tf.keras.callbacks.ReduceLROnPlateau(\n"," monitor='val_loss',\n"," factor=0.2,\n"," patience=2,\n"," min_lr=0.00001\n"," )\n","\n"," # TensorBoard pour visualiser l'entraînement\n"," tensorboard_dir = f\"content/advanced-model/{model_name}_{vectorizer_name}/logs\"\n"," os.makedirs(tensorboard_dir, exist_ok=True)\n"," tensorboard_callback = tf.keras.callbacks.TensorBoard(\n"," log_dir=tensorboard_dir,\n"," histogram_freq=1,\n"," update_freq='epoch'\n"," )\n","\n"," # Créer le modèle optimisé pour GPU\n"," model = create_optimized_lstm_model(glove_matrix_300d, trainable=False)\n","\n"," print(f\"Entraînement du modèle {model_name} avec embeddings {vectorizer_name}\")\n"," print(f\"Taille du batch: {BATCH_SIZE}\")\n"," print(f\"Utilisation de la précision mixte: {tf.keras.mixed_precision.global_policy().name}\")\n","\n"," # Entraîner le modèle avec les datasets optimisés\n"," history = model.fit(\n"," train_dataset,\n"," epochs=epochs,\n"," validation_data=val_dataset,\n"," callbacks=[early_stopping, reduce_lr, tensorboard_callback, checkpoint_callback],\n"," verbose=1\n"," )\n","\n"," # Déterminer le nombre réel d'époques complétées (en cas d'early stopping)\n"," real_epochs = len(history.history['loss'])\n"," print(f\"Nombre réel d'époques effectuées: {real_epochs}/{epochs}\")\n","\n"," # Sauvegarder tous les artefacts\n"," model_dir = save_model_artifacts(model, model_name, vectorizer_name, history, tokenizer)\n","\n"," # Utiliser evaluate_model pour obtenir les métriques\n"," metrics, cm, report, y_pred, y_pred_proba = evaluate_model(\n"," model,\n"," X_test_pad,\n"," y_test\n"," )\n","\n"," # Afficher les métriques\n"," print(\"\\nMétriques pour le modèle LSTM avec embedding GloVe 300d:\")\n"," for key, value in metrics.items():\n"," print(f\"{key}: {value:.4f}\")\n","\n"," print(\"\\nRapport de classification:\")\n"," print(report)\n","\n"," # Enregistrer avec MLflow\n"," params = {\n"," 'model_type': model_name,\n"," 'embedding_type': vectorizer_name,\n"," 'embedding_dim': 300,\n"," 'vocab_size': len(tokenizer.word_index) + 1,\n"," 'max_sequence_length': MAX_SEQUENCE_LENGTH,\n"," 'trainable_embedding': False,\n"," 'max_epochs': epochs,\n"," 'real_epochs': real_epochs,\n"," 'batch_size': BATCH_SIZE,\n"," 'precision_policy': tf.keras.mixed_precision.global_policy().name,\n"," 'gpu_optimization': 'XLA,dynamic_memory,prefetch',\n"," 'sample_size': sample_size*2\n","\n"," }\n","\n"," # Enregistrer dans MLflow\n"," run_id = log_model_to_mlflow(model, model_name, vectorizer_name, metrics, cm, report, X_test_pad, y_test, history, params)\n","\n"," # Visualiser la courbe d'apprentissage\n"," plot_training_history(history, \"LSTM\", \"GloVe-300d-Fige\", run_id=run_id)\n","\n"," # Récupérer le lien vers le run MLflow\n"," print(f\"\\nRun MLflow ID: {run_id}\")\n"," print(f\"Accédez à l'interface MLflow pour voir les détails complets.\")\n","\n"," return model, history, metrics, run_id"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"HwGyTzEwNwMy","colab":{"base_uri":"https://localhost:8080/","height":1000},"executionInfo":{"status":"ok","timestamp":1751830700356,"user_tz":-120,"elapsed":389684,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"cba5a433-e6c6-4898-b9fc-9f133a85cca8"},"outputs":[{"output_type":"stream","name":"stdout","text":["Entraînement du modèle LSTM avec embeddings GloVe-300d-Fige\n","Taille du batch: 256\n","Utilisation de la précision mixte: mixed_float16\n","Epoch 1/50\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.5846 - precision: 0.6888 - recall: 0.6777\n","Epoch 1: val_precision improved from -inf to 0.74994, saving model to content/advanced-model/LSTM_GloVe-300d-Fige/checkpoints/best_model.keras\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m38s\u001b[0m 51ms/step - loss: 0.5845 - precision: 0.6889 - recall: 0.6778 - val_loss: 0.4928 - val_precision: 0.7499 - val_recall: 0.7811 - learning_rate: 0.0010\n","Epoch 2/50\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 25ms/step - loss: 0.5067 - precision: 0.7539 - recall: 0.7542\n","Epoch 2: val_precision improved from 0.74994 to 0.76657, saving model to content/advanced-model/LSTM_GloVe-300d-Fige/checkpoints/best_model.keras\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m25s\u001b[0m 45ms/step - loss: 0.5067 - precision: 0.7539 - recall: 0.7542 - val_loss: 0.4712 - val_precision: 0.7666 - val_recall: 0.7825 - learning_rate: 0.0010\n","Epoch 3/50\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.4808 - precision: 0.7700 - recall: 0.7696\n","Epoch 3: val_precision improved from 0.76657 to 0.77947, saving model to content/advanced-model/LSTM_GloVe-300d-Fige/checkpoints/best_model.keras\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m18s\u001b[0m 32ms/step - loss: 0.4808 - precision: 0.7700 - recall: 0.7696 - val_loss: 0.4607 - val_precision: 0.7795 - val_recall: 0.7838 - learning_rate: 0.0010\n","Epoch 4/50\n","\u001b[1m561/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.4680 - precision: 0.7794 - recall: 0.7787\n","Epoch 4: val_precision did not improve from 0.77947\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m20s\u001b[0m 31ms/step - loss: 0.4680 - precision: 0.7794 - recall: 0.7787 - val_loss: 0.4558 - val_precision: 0.7790 - val_recall: 0.7973 - learning_rate: 0.0010\n","Epoch 5/50\n","\u001b[1m561/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 17ms/step - loss: 0.4549 - precision: 0.7842 - recall: 0.7902\n","Epoch 5: val_precision improved from 0.77947 to 0.78158, saving model to content/advanced-model/LSTM_GloVe-300d-Fige/checkpoints/best_model.keras\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m18s\u001b[0m 32ms/step - loss: 0.4549 - precision: 0.7842 - recall: 0.7902 - val_loss: 0.4493 - val_precision: 0.7816 - val_recall: 0.7962 - learning_rate: 0.0010\n","Epoch 6/50\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.4480 - precision: 0.7879 - recall: 0.7926\n","Epoch 6: val_precision improved from 0.78158 to 0.79068, saving model to content/advanced-model/LSTM_GloVe-300d-Fige/checkpoints/best_model.keras\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m18s\u001b[0m 31ms/step - loss: 0.4480 - precision: 0.7879 - recall: 0.7926 - val_loss: 0.4510 - val_precision: 0.7907 - val_recall: 0.7846 - learning_rate: 0.0010\n","Epoch 7/50\n","\u001b[1m561/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.4383 - precision: 0.7925 - recall: 0.7982\n","Epoch 7: val_precision improved from 0.79068 to 0.79648, saving model to content/advanced-model/LSTM_GloVe-300d-Fige/checkpoints/best_model.keras\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m18s\u001b[0m 32ms/step - loss: 0.4383 - precision: 0.7925 - recall: 0.7982 - val_loss: 0.4497 - val_precision: 0.7965 - val_recall: 0.7820 - learning_rate: 0.0010\n","Epoch 8/50\n","\u001b[1m562/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.4264 - precision: 0.8006 - recall: 0.8040\n","Epoch 8: val_precision did not improve from 0.79648\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m19s\u001b[0m 30ms/step - loss: 0.4264 - precision: 0.8006 - recall: 0.8040 - val_loss: 0.4476 - val_precision: 0.7895 - val_recall: 0.7979 - learning_rate: 2.0000e-04\n","Epoch 9/50\n","\u001b[1m562/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.4218 - precision: 0.8034 - recall: 0.8065\n","Epoch 9: val_precision did not improve from 0.79648\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m16s\u001b[0m 29ms/step - loss: 0.4217 - precision: 0.8034 - recall: 0.8065 - val_loss: 0.4470 - val_precision: 0.7929 - val_recall: 0.7899 - learning_rate: 2.0000e-04\n","Epoch 10/50\n","\u001b[1m561/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 17ms/step - loss: 0.4177 - precision: 0.8069 - recall: 0.8114\n","Epoch 10: val_precision did not improve from 0.79648\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m17s\u001b[0m 30ms/step - loss: 0.4176 - precision: 0.8069 - recall: 0.8114 - val_loss: 0.4476 - val_precision: 0.7918 - val_recall: 0.7935 - learning_rate: 2.0000e-04\n","Epoch 11/50\n","\u001b[1m560/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 17ms/step - loss: 0.4160 - precision: 0.8084 - recall: 0.8073\n","Epoch 11: val_precision did not improve from 0.79648\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m17s\u001b[0m 30ms/step - loss: 0.4160 - precision: 0.8084 - recall: 0.8073 - val_loss: 0.4439 - val_precision: 0.7879 - val_recall: 0.7983 - learning_rate: 2.0000e-04\n","Epoch 12/50\n","\u001b[1m560/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 0.4114 - precision: 0.8107 - recall: 0.8128\n","Epoch 12: val_precision did not improve from 0.79648\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m17s\u001b[0m 29ms/step - loss: 0.4114 - precision: 0.8107 - recall: 0.8128 - val_loss: 0.4477 - val_precision: 0.7933 - val_recall: 0.7859 - learning_rate: 2.0000e-04\n","Epoch 13/50\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.4082 - precision: 0.8122 - recall: 0.8132\n","Epoch 13: val_precision improved from 0.79648 to 0.79806, saving model to content/advanced-model/LSTM_GloVe-300d-Fige/checkpoints/best_model.keras\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m22s\u001b[0m 33ms/step - loss: 0.4082 - precision: 0.8122 - recall: 0.8132 - val_loss: 0.4512 - val_precision: 0.7981 - val_recall: 0.7848 - learning_rate: 2.0000e-04\n","Epoch 14/50\n","\u001b[1m562/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 17ms/step - loss: 0.4061 - precision: 0.8131 - recall: 0.8138\n","Epoch 14: val_precision did not improve from 0.79806\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m20s\u001b[0m 31ms/step - loss: 0.4061 - precision: 0.8131 - recall: 0.8138 - val_loss: 0.4503 - val_precision: 0.7909 - val_recall: 0.7964 - learning_rate: 4.0000e-05\n","Epoch 15/50\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.4043 - precision: 0.8120 - recall: 0.8154\n","Epoch 15: val_precision did not improve from 0.79806\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m19s\u001b[0m 29ms/step - loss: 0.4043 - precision: 0.8120 - recall: 0.8154 - val_loss: 0.4489 - val_precision: 0.7887 - val_recall: 0.8076 - learning_rate: 4.0000e-05\n","Epoch 16/50\n","\u001b[1m562/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 0.4059 - precision: 0.8114 - recall: 0.8184\n","Epoch 16: val_precision did not improve from 0.79806\n","\u001b[1m563/563\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m17s\u001b[0m 30ms/step - loss: 0.4058 - precision: 0.8114 - recall: 0.8184 - val_loss: 0.4540 - val_precision: 0.7889 - val_recall: 0.7955 - learning_rate: 1.0000e-05\n","Nombre réel d'époques effectuées: 16/50\n","Modèle sauvegardé dans content/advanced-model/LSTM_GloVe-300d-Fige/final_model_LSTM_GloVe-300d-Fige.keras\n","Tokenizer sauvegardé dans content/advanced-model/LSTM_GloVe-300d-Fige/tokenizer.pickle\n","Fonction de prétraitement sauvegardée dans content/advanced-model/LSTM_GloVe-300d-Fige/preprocess_function.dill\n","Historique d'entraînement sauvegardé dans content/advanced-model/LSTM_GloVe-300d-Fige/training_history.pickle\n","Paramètres sauvegardés dans content/advanced-model/LSTM_GloVe-300d-Fige/parameters.json\n","\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 5ms/step\n","\n","Métriques pour le modèle LSTM avec embedding GloVe 300d:\n","accuracy: 0.7916\n","precision: 0.7915\n","recall: 0.7918\n","f1: 0.7917\n","roc_auc: 0.8761\n","\n","Rapport de classification:\n"," precision recall f1-score support\n","\n"," Négatif 0.79 0.79 0.79 20000\n"," Positif 0.79 0.79 0.79 20000\n","\n"," accuracy 0.79 40000\n"," macro avg 0.79 0.79 0.79 40000\n","weighted avg 0.79 0.79 0.79 40000\n","\n"]},{"output_type":"stream","name":"stderr","text":["2025/07/06 19:37:36 WARNING mlflow.models.model: `artifact_path` is deprecated. Please use `name` instead.\n"]},{"output_type":"stream","name":"stdout","text":["🏃 View run Modele_Avance_LSTM_GloVe-300d-Fige at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/1/runs/5b50de7aafde4b5793aaf188e07caa49\n","🧪 View experiment at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/1\n","🏃 View run Modele_Avance_LSTM_GloVe-300d-Fige at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/1/runs/5b50de7aafde4b5793aaf188e07caa49\n","🧪 View experiment at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/1\n","\n","Run MLflow ID: 5b50de7aafde4b5793aaf188e07caa49\n","Accédez à l'interface MLflow pour voir les détails complets.\n"]},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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a1FaAmvt2rUl+jiLFi0qVqa05EVFz3elLo9M79mzZ7Ht8fHxytHRUfn7+6v8/HyllFLvvfdeqf3HIkW/y6sTVtdz6NChYuenpmnqueeesxy3yNmzZ4uda1crmm1gMBgs24rWoLq6fUViYmIUoKKioizbivqLDz30UInyaWlplr+nyiSlyvopUtrr2qxZM6XT6Uo93owZM0r0uSrTdxe2IXffExX2+uuvA+bb3np7e9O7d28efvhhHnjggRJlu3btWmLb9u3bKSwsLHXdJ8By29NDhw5Ztm3ZsgVN0xg8eHClYr7tttt46aWXeOKJJ1ixYgWDBg2iZ8+etGrVqly3Ut61axcAAwYMKPGco6Mjffr04eTJk+zevZvGjRsXe75z584l9imaL3+t29IX2bNnD4sXLy62zdvbm0mTJl1334po3Lgxa9eu5dChQ6xatYodO3awbds2y8/HH3/MunXraNKkidWOOX78eJYvX87333/PnXfeyYIFC7jlllsICgqq1B1psrKyeP/991m0aBExMTFkZGQUW//n7Nmzxco/9NBDvPrqq3z55ZfF1h368ssvAYrNS7fFeVseRX+PVxozZsw11/+q7Pk8YcIE/vrrL+bMmcONN94IQE5ODt9++y3Ozs48+OCDgPmOmqmpqURGRjJjxoxSY3BxcSn2uyrtdzpmzJgS6wl8//33fP/996Snp7N//35ef/11evbsyezZs2v8NsIZGRkcPXqU0NBQmjVrVuL5fv36lXh91q1bx7p164ptCw8PLxF73759S5S7nt27dwPQq1evEs+5u7vTvn37EnUWrUPy559/WtYEvFJSUhKFhYXExMTQqVOnCsUjhKgdit6rgoODadGiRYnniz4Lit5DAO6//36effZZWrVqxT333EPfvn3p2bMnfn5+xfatav8K4L333itxR9/hw4db7sJlLU899RSPPPIIq1atYtOmTezevZtNmzYxf/585s+fz6uvvsr06dOtdrxu3brRpk0bPv/8c1555RXmzp2LyWSq1JqZRTZu3Mj777/P5s2bSUpKIj8/v9jzZ8+etXxuu7i4cNdddzFnzhxWrFjB0KFDAfN6kgcOHGDEiBHF7lRd0c+DLVu2ADBo0KBS10OyhnXr1pX4HB09erRlnaXSVOZ8L9rerFkzNm7cyKFDh2jZsiUA8+bNo6CggDFjxqDX64HL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K8yYMYOWLVsyfPhwQkNDOXfuHH/99Rfdu3fniy++KPN4X3/9NbNnz6ZXr140a9YMHx8fjh07xpIlS3Bycrru+kzu7u58/vnn3HnnnfTt25c777yTxo0bs3PnTlauXElAQACzZ8+24m/Iut56660yfz9PPfUUOp2Op59+mueff56ePXvSunVrPDw8SEpKsgxd9vf35913362W+G6++eYq1zFs2DAiIiKYNWsW+/bto0OHDpw+fZqlS5dyyy23cPr06TL3HT16NHPnzuXFF1+0PC5NTZ+3RQYOHMjChQsZPXo048aNY/r06fTt25egoCByc3OJj49n9erVpKSk0LZt22sucg5VP58nTJjAli1b2LBhA05OTqX+vl599VX27t3LJ598wpIlSxgwYADBwcEkJSURGxvLxo0bmTlzJq1atbpu++Pi4ujUqROdO3emefPmBAcHk5aWxp49e9iyZQt6vZ65c+da1rQq8vHHH9OjRw+eeuop1qxZQ8uWLdm6dStr164lKirKkmwt4uDgwLx58xgwYACjRo1i1KhRNG7cmDVr1rBjxw569uzJ5MmTi+3z7LPPsnjxYn766Sc6duzIoEGDSEtL44cffqBPnz7FklvVzdPTk48++ogHH3yQHj16cNdddxEYGMimTZvYu3cvffv25c8//yy2IG2LFi34/PPPGTduHNHR0QwePJioqCiMRiOnT59mw4YN+Pn5cfjw4RprhxCi4q413e3jjz/mueee4/fff+eXX36hXbt2DB06lOzsbH788UeSkpKYMmVKsYWCR4wYgbu7O927dyc8PBylFBs2bGD79u106tTJcrOLqvavrOHw4cNltr9x48ZMnz6d5cuXM3HiRMLDw+nZsyehoaHk5eURGxvLihUrMBqNPPXUU3Tp0sXq8TVu3NgqX1pOnjyZxx57jA4dOjBy5Ej0ej0bN27k4MGDDBs2jCVLlpS6X2hoKP3792fNmjU4OjrSpk2bUte1qsznwTfffEO/fv146aWX+Omnn+jXrx9KKWJjY1m5ciWHDx++7lpCDg4O/Pzzzzz00EP88ssvNG3alL59+9K6dWtcXV1JTk7mwIEDbNq0CYPBYJnudy0VPd+vdPPNNxMeHm5JNj355JMYDIZiZRo0aMDChQsZMWIE3bt3Z+DAgURHR6NpGnFxcWzevLncSTmA6dOns3HjRnr06EHjxo1xdXUlLi6O33//nbS0NHr06GHpoxbp0aMHzzzzDLNmzaJt27aMGjWK/Px8FixYQGpqKv/9739L/O7vuecefv75ZxYuXEiHDh0YNmwYKSkpLFiwgMLCQubMmWOZJgfm/uKnn37K3XffTe/evbn77rsJDAzkr7/+Yv/+/fTp06fUUZPVZcqUKSxevJjvv/+eI0eOcPPNN3Px4kVLn2vx4sUlFt2vaN9d2Ej5btInRPlvO6zU5Vuhr127tswyeXl56r///a+64YYblKenpzIYDCo0NFQNGDBA/ec//1Hnz58vsc+yZcvUoEGDlI+PjzIYDCokJEQNHz5crVmzxlKm6La9RbdOV8p8W97HHntMtW3bVvn4+ChnZ2fVrFkzNWbMGLVv375ixyjtVutFtm3bpoYPH64aNmyo9Hq9Cg0NVY899pg6e/ZsibKjR48u8zappcVYHa5321VALVq0SOXm5qpFixapiRMnqg4dOih/f3/l6OioPD09VceOHdXLL7+skpKSynWsa73mRefFnDlzrhu70WhUQInbwV7L6dOn1X333aeCgoKUs7OzatWqlXr77bctdV3rVs4REREKUL6+viovL6/MctV13pbH+fPn1Ztvvql69+6tGjZsqBwdHZW7u7tq0aKFeuihh9SSJUtK3JbZWufzlbKysiy3Ab733nvLLGcymdRXX32lBgwYoHx8fJRer1dBQUGqZ8+eaubMmer06dPlandqaqp6+eWXVa9evVRAQIDS6/XK1dVVtWjRQj366KPq4MGDZe57+vRpNWbMGMt+jRs3Vk8//fQ1b3N+4MABNWrUKNWgQQNlMBhUZGSkeu2111R2dnap5S9evKgmT56sgoKClJOTk2revLn697//rY4dO1bi9sTXU97bjl/rdf3tt9/UDTfcoFxcXJS3t7e67bbb1KFDh9Qtt9yiAHXhwoUS+/z9999q9OjRqnHjxspgMCgfHx8VHR2tJkyYUOHzVAhRc673GX/l33xOTo6aOXOmio6OVs7Ozsrd3V317NlTzZ8/v0S9//vf/9Tw4cNVkyZNlIuLi/Lx8VHt27dXb7/9tkpPT7eUq0j/ytqK3i+v9dOuXTullFJHjhxR//73v9XgwYNVs2bNlKurq+Xze8SIEWrJkiXlOtb13psBFRwcXK74X3755TLfx8syb9481a5dO+Xq6qoaNGighg8f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mzerKCUiIuLDDNM83HOK9ofPey+kY1JRSkRERKQVKyoqwrKsejsVx8TEkJ2dfdR7Nm3axOLFi3niiSeO+npt/82fLv2Ljo6ut0vykaqqqqiqqvIcG4ZBaGio5/umVPs8f9tWW3n7V97gv7krb+XtL/w5d1BRSkRERMSvlJWVMX36dG699VaioqKa9Nlz585lzpw5nuMuXbowdepUEhISmvR9jpSUlNRsz/Zlytv/+Gvuytu/+Gve4L+5qyglIiIi0opFRUVhmma9GUxOp7Pe7CmA/fv3k5eXx9SpUz3nalsIXHPNNUybNs1zX2FhIbGxsZ7rCgsLSUtLO2YsV1xxBaNGjfIc137qm5eXh8vlOsXMjs8wDJKSksjJyfGrFgjK27/yBv/NXXkrb3/RVnN3OBwn9aGUilIiIiIirZjD4SA9PZ3MzEwGDhwIuJuYZ2ZmHnXjmOTkZJ588sk652bNmkV5eTk33ngj8fHxBAQEEBMTww8//OApQpWWlrJ161YuvvjiY8YSGBhIYGDgUV9rroG2bdttahB/spS3//HX3JW3f/HXvMF/c1dRSkRERKSVGzVqFM8//zzp6elkZGSwcOFCKioqGDp0KADPPfcccXFxjBs3jqCgIDp37lzn/vDwcIA65y+99FLef/99OnToQGJiIrNmzSI2NtazG5+IiIhIY6koJSIiItLKDRo0iKKiImbPno3T6SQtLY1JkyZ5luHl5+efcgPVyy+/nIqKCl544QVKS0vp0aMHkyZNIigoqBkyEBEREX+kopSIiIhIGzBy5MijLtcDmDx58nHvnThxYr1zhmFw9dVXc/XVVzdFeCIiIiL1mN4OQERERERERERE/I+KUiIiIiIiIiIi0uJUlBIRERERERERkRanopSIiIiIiIiIiLQ4FaVERERERERERKTFqSglIiIiIiIiIiItTkUpERERERERERFpcSpKiYiIiIiIiIhIi3N4O4DWxOFovv9czflsX+evuStv/+KveYP/5q682462mFNL0xiq6Slv/+OvuStv/+KveUPby/1k8zFs27abORYREREREREREZE6tHzPy8rKyrj33nspKyvzdigtzl9zV97K21/4a+7K27/yFu/x1z9zytu/8gb/zV15K29/4c+5g4pSXmfbNllZWfjjhDV/zV15K29/4a+5K2//ylu8x1//zClv/8ob/Dd35a28/YU/5w4qSomIiIiIiIiIiBeoKCUiIiIiIiIiIi1ORSkvCwwM5KqrriIwMNDbobQ4f81deStvf+GvuStv/8pbvMdf/8wpb//KG/w3d+WtvP2FP+cO2n1PRERERERERES8QDOlRERERERERESkxakoJSIiIiIiIiIiLU5FKRERERERERERaXEObwfg7xYtWsS8efNwOp2kpqYyfvx4MjIyvB1Ws5k7dy7ff/89e/fuJSgoiNNOO43rr7+e5ORkb4fWoj744APefvttLr30Um688UZvh9PsCgoKeOutt1izZg0VFRUkJSVx++2307VrV2+H1mwsy2L27Nn873//w+l0EhcXxwUXXMCVV16JYRjeDq/JbNiwgf/+979kZWVx8OBB7rrrLgYOHOh53bZtZs+ezeeff05JSQk9evTglltuoUOHDl6MumkcL3eXy8WsWbNYvXo1ubm5hIWF0bt3b8aNG0dcXJyXI2+cE/2eH+nFF1/ks88+44YbbuCyyy5r4UilLfO38RNoDFXLn8ZQGj+13fET+O8YSuMnjZ9+SjOlvGjZsmXMmDGDq666iqlTp5KamsqUKVMoLCz0dmjNZsOGDfz85z9nypQpPPDAA1RXV/O3v/2N8vJyb4fWYrZu3cqnn35Kamqqt0NpEcXFxTz44IM4HA4mTZrE008/zW9+8xvCw8O9HVqz+uCDD/j000+5+eabefrpp7nuuuv473//y0cffeTt0JpURUUFaWlp3HzzzUd9/cMPP+Sjjz5iwoQJPPbYYwQHBzNlyhQqKytbONKmd7zcKysrycrK4sorr2Tq1KnceeedZGdn88QTT3gh0qZ1ot/zWt9//z1btmwhNja2hSITf+GP4yfQGAr8awyl8VPbHj+B/46hNH7S+OmnNFPKi+bPn8+IESMYNmwYABMmTGDVqlUsWbKEMWPGeDe4ZvKXv/ylzvHEiRO55ZZb2L59O7169fJSVC2nvLyc6dOnc+utt/L+++97O5wW8eGHH9KuXTtuv/12z7nExEQvRtQyNm/eTP/+/TnrrLMAd85ff/01W7du9XJkTatfv37069fvqK/Zts3ChQv55S9/yYABAwC44447mDBhAsuXL2fw4MEtGWqTO17uYWFhPPjgg3XOjR8/nkmTJpGfn098fHxLhNgsjpd3rYKCAl599VX+8pe/8Pjjj7dQZOIv/HH8BBpD+dsYSuOntj1+Av8dQ2n8dGz+On7STCkvcblcbN++nd69e3vOmaZJ79692bx5sxcja1mlpaUAREREeDmSlvHyyy/Tr18/+vTp4+1QWsyKFStIT0/nqaee4pZbbuGee+7hs88+83ZYze60004jMzOT7OxsAHbs2MGPP/54wn+M2pLc3FycTmedP+9hYWFkZGT41d9ztUpLSzEMg7CwMG+H0qwsy2L69OmMHj2aTp06eTscaWM0fjpMY6i2TeMn/x0/gcZQR9L4qe3TTCkvKSoqwrIsYmJi6pyPiYnx/CXc1lmWxeuvv0737t3p3Lmzt8NpdkuXLiUrK4u///3v3g6lReXm5vLpp59y2WWXccUVV7Bt2zZee+01HA4HQ4cO9XZ4zWbMmDGUlZXxpz/9CdM0sSyLa665hvPPP9/bobUYp9MJQHR0dJ3z0dHRntf8RWVlJTNnzmTw4MFtflD14YcfEhAQwCWXXOLtUKQN0vjJTWOotk/jJ/8dP4HGULU0fvIPKkqJ17zyyivs3r2bRx991NuhNLv8/Hxef/11HnjgAYKCgrwdTouyLIuuXbsybtw4ALp06cKuXbv49NNP2/Sg6ptvvuHrr7/mD3/4A506dWLHjh28/vrrxMbGtum8pT6Xy8XTTz8NwC233OLlaJrX9u3bWbhwIVOnTm1zDWlFfInGUG2fxk8aP/k7jZ/8h4pSXhIVFYVpmvUq3U6ns96nf23RK6+8wqpVq3jkkUdo166dt8Npdtu3b6ewsJB7773Xc86yLDZu3MiiRYt4++23Mc22uZo2NjaWlJSUOudSUlL47rvvvBRRy3jrrbe4/PLLPWv+O3fuTF5eHh988IHfDKpq/y4rLCys06yxsLCQtLQ07wTVwmoHVPn5+Tz00ENt/lO+jRs3UlRUVKcHimVZzJgxg4ULF/L88897MTppC/x9/AQaQ4F/jKE0fvLf8RNoDKXxk3+Nn1SU8hKHw0F6ejqZmZmerSAtyyIzM5ORI0d6ObrmY9s2r776Kt9//z2TJ0/2i4aNAL179+bJJ5+sc+7f//43ycnJXH755W1yMFWre/fu9ZZUZGdnk5CQ4KWIWkZFRUW931fTNLFt20sRtbzExERiYmL44YcfPAOo0tJStm7dysUXX+zd4FpA7YAqJyeHhx9+mMjISG+H1OyGDBlSp9cPwJQpUxgyZIinKbVIY/jr+Ak0hjqSP4yhNH46zN/GT+DfYyiNn9z8afykopQXjRo1iueff5709HQyMjJYuHAhFRUVbfpTgFdeeYWvv/6ae+65h9DQUM8nnWFhYW16SnZoaGi9ng/BwcFERka2+V4Ql112GQ8++CDvv/8+gwYNYuvWrXz++ef89re/9XZozerss8/m/fffJz4+npSUFHbs2MH8+fPb3D8s5eXl5OTkeI5zc3PZsWMHERERxMfHc+mll/L+++/ToUMHEhMTmTVrFrGxsZ6dZFqz4+UeExPDU089RVZWFvfeey+WZXn+vouIiMDhaL3//J7o9/yng0eHw0FMTAzJycktHaq0Uf44fgKNoY7kD2MojZ/a9vgJ/HcMpfGTm8ZPhxm2v5WdfcyiRYv473//i9PpJC0tjZtuuolu3bp5O6xmM3bs2KOev/3229v8YPKnJk+eTFpaGjfeeKO3Q2l2K1eu5O233yYnJ4fExEQuu+wyLrzwQm+H1azKysp49913+f777yksLCQuLo7Bgwdz1VVXtep/UH9q/fr1PPLII/XOX3DBBUycOBHbtpk9ezafffYZpaWl9OjRg5tvvrlN/AN7vNx/9atfcccddxz1vocffpjTTz+9ucNrNif6Pf+piRMncumll3LZZZe1RHjiJ/xt/AQaQx3JX8ZQGj+13fET+O8YSuOnujR+UlFKRERERERERES8oG0uwhYREREREREREZ+mopSIiIiIiIiIiLQ4FaVERERERERERKTFqSglIiIiIiIiIiItTkUpERERERERERFpcSpKiYiIiIiIiIhIi1NRSkREREREREREWpyKUiIiIiIiIiIi0uJUlBIRaWZffPEFY8eOZdu2bd4ORURERKTV0BhKpO1zeDsAEZGm8MUXX/Cvf/3rmK//7W9/47TTTmvBiERERER8n8ZQIuJNKkqJSJsyduxYEhMT651PSkryQjQiIiIirYPGUCLiDSpKiUib0q9fP7p27ertMERERERaFY2hRMQbVJQSEb+Rm5vLHXfcwfXXX49pmixcuJDCwkIyMjK4+eab6dy5c53rMzMzmT17NllZWQQEBNCrVy/GjRtHSkpKnesKCgp49913WbNmDYcOHSI2Npa+ffty00034XAc/mu2qqqKN954g6+++orKykr69OnDrbfeSlRUVIvkLyIiItIQGkOJSHNRo3MRaVNKS0spKiqq83Xo0KE613z11Vd89NFH/PznP+eKK65g9+7dPProozidTs8169atY8qUKRQWFvKrX/2KUaNG8eOPP/Lggw+Sm5vrua6goID777+fZcuWcd5553HTTTcxZMgQNmzYQEVFRZ33fe2119i5cye/+tWvuOiii1i5ciWvvPJKs/73EBERETkZGkOJiDdoppSItCl//etf650LDAxk5syZnuOcnByeffZZ4uLiAOjbty+TJk3iww8/5IYbbgDgrbfeIiIigilTphAREQHAgAEDuOeee5g9ezZ33HEHAG+//TZOp5PHHnuszpT3q6++Gtu268QRERHBAw88gGEYANi2zUcffURpaSlhYWFN+F9BRERE5NRoDCUi3qCilIi0KTfffDMdOnSoc840604KHTBggGcwBZCRkUG3bt1YvXo1N9xwAwcPHmTHjh2MHj3aM5gCSE1NpU+fPqxevRoAy7JYvnw5Z5999lF7MNQOnGpdeOGFdc717NmTBQsWkJeXR2pqasOTFhEREWkkjaFExBtUlBKRNiUjI+OETTp/OuCqPffNN98AkJeXB0BycnK96zp27MjatWspLy+nvLycsrKyen0UjiU+Pr7OcXh4OAAlJSUndb+IiIhIc9EYSkS8QT2lRERayE8/baz10ynqIiIiInKYxlAibZdmSomI39m3b99RzyUkJAB4fs3Ozq53XXZ2NpGRkYSEhBAUFERoaCi7du1q3oBFREREfIDGUCLS1DRTSkT8zvLlyykoKPAcb926lS1bttC3b18AYmNjSUtL48svv6wzLXzXrl2sXbuWfv36Ae5P7QYMGMDKlSvZtm1bvffRp3ciIiLSlmgMJSJNTTOlRKRNWb16NXv37q13vnv37p4GmUlJSTz44INcfPHFVFVVsXDhQiIjI7n88ss9119//fX8/e9/54EHHmDYsGFUVlayaNEiwsLCGDt2rOe6cePGsW7dOiZPnsyIESNISUnh4MGDfPvttzz66KOengciIiIivkxjKBHxBhWlRKRNmT179lHP33777fTq1QuAIUOGYJomCxYsoKioiIyMDMaPH09sbKzn+j59+jBp0iRmz57N7NmzCQgIoFevXlx33XUkJiZ6rouLi+Oxxx5j1qxZfP3115SVlREXF0ffvn0JDg5u3mRFREREmojGUCLiDYatuZEi4idyc3O54447uP766xk9erS3wxERERFpFTSGEpHmop5SIiIiIiIiIiLS4lSUEhERERERERGRFqeilIiIiIiIiIiItDj1lBIRERERERERkRanmVIiIiIiIiIiItLiVJQSEREREREREZEWp6KUiIiIiIiIiIi0OBWlRERERERERESkxakoJSIiIiIiIiIiLU5FKRERERERERERaXEqSomIiIiIiIiISItTUUpERERERERERFqcilIiIiIiIiIiItLi/j/LWrFRl0ZdewAAAABJRU5ErkJggg==\n"},"metadata":{}}],"source":["# Entraîner le modèle LSTM avec GloVe 300d\n","model_lstm_glove, history_lstm_glove, metrics_lstm_glove, run_id_lstm_glove = train_glove_lstm_model(epochs=50)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"Qq5sL0HcNwMy"},"outputs":[],"source":["# Charger le modèle pour la prédiction\n","lstm_glove_model_pack = load_complete_model(\"LSTM\", \"GloVe-300d-Fige\")"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"Kc95Dyz8NwMy","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751830703470,"user_tz":-120,"elapsed":2246,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"9fac4c06-5630-4f50-bba5-f41005c5d833"},"outputs":[{"output_type":"stream","name":"stdout","text":["\n","Test de prédiction avec le modèle GloVe:\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2s/step\n","{'sentiment': 'Positif', 'confidence': 0.9921875, 'raw_score': 0.9921875}\n"]}],"source":["# Tester le modèle sur quelques exemples\n","print(\"\\nTest de prédiction avec le modèle GloVe:\")\n","result = predict_sentiment(\"I love flying with this airline, the service is amazing!\", lstm_glove_model_pack)\n","print(result)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"gAhcxPUoNwMy","colab":{"base_uri":"https://localhost:8080/","height":1000},"executionInfo":{"status":"ok","timestamp":1751830705513,"user_tz":-120,"elapsed":2042,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"b49cfcf6-a4e7-4069-e497-0b789f6f7865"},"outputs":[{"output_type":"stream","name":"stdout","text":["\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 31ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 35ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 29ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 28ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 29ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 29ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 30ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 29ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 34ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 31ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 32ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 31ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 29ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 28ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 40ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 47ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 45ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 48ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 47ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 46ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 43ms/step\n","\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 43ms/step\n","\n","Test du modèle sur les exemples:\n","==================================================\n","Résumé: 22 tweets analysés\n","Tweets positifs: 13 (59.1%)\n","Tweets négatifs: 9 (40.9%)\n","\n","Aperçu des prédictions GloVe :\n"]},{"output_type":"execute_result","data":{"text/plain":[" Tweet Sentiment Emoji \\\n","0 I absolutely love flying with @AirParadis! The... Positif 💚 \n","1 Just landed after a wonderful flight... The cr... Positif 💚 \n","2 OMG! You really have to try @AirParadis. Best.... Positif 💚 \n","3 We had a very pleasant experience with our fli... Positif 💚 \n","4 My first time flying business class and I'm ab... Positif 💚 \n","5 I hate how @AirParadis always delays their fli... Négatif ❌ \n","6 The worst flight experience of my life? Defini... Négatif ❌ \n","7 Really @AirParadis??? Flight cancelled and no ... Négatif ❌ \n","8 Our baggage was lost and nobody at @AirParadis... Négatif ❌ \n","9 Food was terrible, seats were uncomfortable, a... Négatif ❌ \n","10 The flight was good but the food wasn't really... Positif 💚 \n","11 IDK what to think about my @AirParadis experie... Négatif ❌ \n","12 My husband loved the flight but I didn't... To... Positif 💚 \n","13 TBH, @AirParadis has improved their service si... Négatif ❌ \n","14 We were so excited for our trip but then our f... Positif 💚 \n","15 This is a tweet with many!!! exclamation!!! ma... Négatif ❌ \n","16 How does the model handle multiple??? question... Négatif ❌ \n","17 Testing ellipses... many... many... ellipses..... Positif 💚 \n","18 #many #hashtags #in #one #tweet #to #see #how ... Positif 💚 \n","19 @mention1 @mention2 @mention3 @mention4 @menti... Positif 💚 \n","20 Multiple URLs in one tweet: http://example1.co... Positif 💚 \n","21 Let's try all emoticons :) :( :D ;) :-) :-( :-... Positif 💚 \n","\n"," Score de confiance Score brut Index \n","0 0.995117 0.995117 1 \n","1 0.990234 0.990234 2 \n","2 0.939453 0.939453 3 \n","3 0.963379 0.963379 4 \n","4 0.649902 0.649902 5 \n","5 0.980865 0.019135 6 \n","6 0.975449 0.024551 7 \n","7 0.978058 0.021942 8 \n","8 0.933167 0.066833 9 \n","9 0.896606 0.103394 10 \n","10 0.651855 0.651855 11 \n","11 0.875000 0.125000 12 \n","12 0.576172 0.576172 13 \n","13 0.681396 0.318604 14 \n","14 0.731445 0.731445 15 \n","15 0.841064 0.158936 16 \n","16 0.666748 0.333252 17 \n","17 0.689941 0.689941 18 \n","18 0.819336 0.819336 19 \n","19 0.907227 0.907227 20 \n","20 0.984375 0.984375 21 \n","21 0.929199 0.929199 22 "],"text/html":["\n","
\n","
\n","\n","
\n"," \n","
\n","
\n","
Tweet
\n","
Sentiment
\n","
Emoji
\n","
Score de confiance
\n","
Score brut
\n","
Index
\n","
\n"," \n"," \n","
\n","
0
\n","
I absolutely love flying with @AirParadis! The...
\n","
Positif
\n","
💚
\n","
0.995117
\n","
0.995117
\n","
1
\n","
\n","
\n","
1
\n","
Just landed after a wonderful flight... The cr...
\n","
Positif
\n","
💚
\n","
0.990234
\n","
0.990234
\n","
2
\n","
\n","
\n","
2
\n","
OMG! You really have to try @AirParadis. Best....
\n","
Positif
\n","
💚
\n","
0.939453
\n","
0.939453
\n","
3
\n","
\n","
\n","
3
\n","
We had a very pleasant experience with our fli...
\n","
Positif
\n","
💚
\n","
0.963379
\n","
0.963379
\n","
4
\n","
\n","
\n","
4
\n","
My first time flying business class and I'm ab...
\n","
Positif
\n","
💚
\n","
0.649902
\n","
0.649902
\n","
5
\n","
\n","
\n","
5
\n","
I hate how @AirParadis always delays their fli...
\n","
Négatif
\n","
❌
\n","
0.980865
\n","
0.019135
\n","
6
\n","
\n","
\n","
6
\n","
The worst flight experience of my life? Defini...
\n","
Négatif
\n","
❌
\n","
0.975449
\n","
0.024551
\n","
7
\n","
\n","
\n","
7
\n","
Really @AirParadis??? Flight cancelled and no ...
\n","
Négatif
\n","
❌
\n","
0.978058
\n","
0.021942
\n","
8
\n","
\n","
\n","
8
\n","
Our baggage was lost and nobody at @AirParadis...
\n","
Négatif
\n","
❌
\n","
0.933167
\n","
0.066833
\n","
9
\n","
\n","
\n","
9
\n","
Food was terrible, seats were uncomfortable, a...
\n","
Négatif
\n","
❌
\n","
0.896606
\n","
0.103394
\n","
10
\n","
\n","
\n","
10
\n","
The flight was good but the food wasn't really...
\n","
Positif
\n","
💚
\n","
0.651855
\n","
0.651855
\n","
11
\n","
\n","
\n","
11
\n","
IDK what to think about my @AirParadis experie...
\n","
Négatif
\n","
❌
\n","
0.875000
\n","
0.125000
\n","
12
\n","
\n","
\n","
12
\n","
My husband loved the flight but I didn't... To...
\n","
Positif
\n","
💚
\n","
0.576172
\n","
0.576172
\n","
13
\n","
\n","
\n","
13
\n","
TBH, @AirParadis has improved their service si...
\n","
Négatif
\n","
❌
\n","
0.681396
\n","
0.318604
\n","
14
\n","
\n","
\n","
14
\n","
We were so excited for our trip but then our f...
\n","
Positif
\n","
💚
\n","
0.731445
\n","
0.731445
\n","
15
\n","
\n","
\n","
15
\n","
This is a tweet with many!!! exclamation!!! ma...
\n","
Négatif
\n","
❌
\n","
0.841064
\n","
0.158936
\n","
16
\n","
\n","
\n","
16
\n","
How does the model handle multiple??? question...
\n","
Négatif
\n","
❌
\n","
0.666748
\n","
0.333252
\n","
17
\n","
\n","
\n","
17
\n","
Testing ellipses... many... many... ellipses.....
\n","
Positif
\n","
💚
\n","
0.689941
\n","
0.689941
\n","
18
\n","
\n","
\n","
18
\n","
#many #hashtags #in #one #tweet #to #see #how ...
\n","
Positif
\n","
💚
\n","
0.819336
\n","
0.819336
\n","
19
\n","
\n","
\n","
19
\n","
@mention1 @mention2 @mention3 @mention4 @menti...
\n","
Positif
\n","
💚
\n","
0.907227
\n","
0.907227
\n","
20
\n","
\n","
\n","
20
\n","
Multiple URLs in one tweet: http://example1.co...
\n","
Positif
\n","
💚
\n","
0.984375
\n","
0.984375
\n","
21
\n","
\n","
\n","
21
\n","
Let's try all emoticons :) :( :D ;) :-) :-( :-...
\n","
Positif
\n","
💚
\n","
0.929199
\n","
0.929199
\n","
22
\n","
\n"," \n","
\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","\n","
\n"," \n"," \n"," \n","
\n","\n","
\n","
\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"df_results_glove","summary":"{\n \"name\": \"df_results_glove\",\n \"rows\": 22,\n \"fields\": [\n {\n \"column\": \"Tweet\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 22,\n \"samples\": [\n \"I absolutely love flying with @AirParadis! Their service is amazing and their staff is so helpful :) #bestairline #travel\",\n \"TBH, @AirParadis has improved their service since last year! Not perfect yet, but they're trying... #progress\",\n \"Our baggage was lost and nobody at @AirParadis seems to care! Don't they understand that we can't enjoy our vacation without our stuff??? http://badservice.com/complaint :-(\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Sentiment\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"N\\u00e9gatif\",\n \"Positif\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Emoji\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"\\u274c\",\n \"\\ud83d\\udc9a\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Score de confiance\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.13888291998594515,\n \"min\": 0.576171875,\n \"max\": 0.9951171875,\n \"num_unique_values\": 22,\n \"samples\": [\n 0.9951171875,\n 0.681396484375\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Score brut\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.3794701732781929,\n \"min\": 0.019134521484375,\n \"max\": 0.9951171875,\n \"num_unique_values\": 22,\n \"samples\": [\n 0.9951171875,\n 0.318603515625\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Index\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 6,\n \"min\": 1,\n \"max\": 22,\n \"num_unique_values\": 22,\n \"samples\": [\n 1,\n 14\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"}},"metadata":{},"execution_count":43}],"source":["# Obtenir le DataFrame des prédictions pour le modèle GloVe\n","df_results_glove = test_model_on_examples(lstm_glove_model_pack, test_tweets_improved)\n","\n","# Sauvegarder les résultats dans un fichier CSV\n","df_results_glove.to_csv(\"content/advanced-model/LSTM_GloVe-300d-Fige/predictions_results.csv\", index=False)\n","\n","# Afficher un aperçu des prédictions\n","print(\"\\nAperçu des prédictions GloVe :\")\n","df_results_glove"]},{"cell_type":"markdown","source":["# Enregistrement du meilleur modèle\n","Dans le Model Registry de MLFlow, qui sera utilisé et mis à jour comme source pour l'API."],"metadata":{"id":"8D9ukAB3Xee4"}},{"cell_type":"code","source":["# Comparer les métriques de précision sur l'ensemble de test\n","precision_word2vec = metrics_lstm_word2vec.get('precision', 0)\n","precision_glove = metrics_lstm_glove.get('precision', 0)\n","\n","print(f\"Précision (Test) Word2Vec + LSTM: {precision_word2vec:.4f}\")\n","print(f\"Précision (Test) GloVe 300d + LSTM: {precision_glove:.4f}\")\n","\n","best_model_run_id = None\n","best_model_name = None\n","best_vectorizer_name = None\n","best_precision = 0\n","\n","# Déterminer le modèle avec la meilleure précision\n","if precision_word2vec >= precision_glove:\n"," best_model_run_id = run_id_lstm_word2vec\n"," best_model_name = \"LSTM\"\n"," best_vectorizer_name = \"Word2Vec-Fige\"\n"," best_precision = precision_word2vec\n","else:\n"," best_model_run_id = run_id_lstm_glove\n"," best_model_name = \"LSTM\"\n"," best_vectorizer_name = \"GloVe-300d-Fige\"\n"," best_precision = precision_glove\n","\n","\n","print(f\"\\nLe modèle {best_model_name} + {best_vectorizer_name} a la meilleure précision ({best_precision:.4f}).\")\n","\n","# Construire l'URI du modèle dans le run MLflow\n","logged_model_uri = f\"runs:/{best_model_run_id}/model_{best_model_name}_{best_vectorizer_name}\"\n","print(f\"\\nChargement du meilleur modèle depuis MLflow URI: {logged_model_uri}\")\n","\n","model_registry_name = \"SentimentAnalysisLSTM\"\n","client = mlflow.tracking.MlflowClient()\n","\n","try:\n"," # Charger le modèle Keras depuis MLflow (pas strictement nécessaire pour l'enregistrement, mais utile pour validation)\n"," # best_keras_model = mlflow.keras.load_model(logged_model_uri)\n"," # print(\"Modèle Keras chargé avec succès.\")\n","\n"," print(f\"Enregistrement du meilleur modèle dans le Model Registry sous le nom '{model_registry_name}'...\")\n","\n"," # Créer une nouvelle version dans le Model Registry\n"," model_version = mlflow.register_model(\n"," model_uri=logged_model_uri,\n"," name=model_registry_name\n"," )\n"," print(f\"Modèle enregistré dans le Model Registry sous la version {model_version.version}.\")\n","\n"," # Ajouter des tags au modèle enregistré\n"," client.set_model_version_tag(\n"," name=model_registry_name,\n"," version=model_version.version,\n"," key=\"embedding_type\",\n"," value=best_vectorizer_name\n"," )\n"," client.set_model_version_tag(\n"," name=model_registry_name,\n"," version=model_version.version,\n"," key=\"test_precision\",\n"," value=str(best_precision)\n"," )\n"," client.set_model_version_tag(\n"," name=model_registry_name,\n"," version=model_version.version,\n"," key=\"source_run_id\",\n"," value=best_model_run_id\n"," )\n","\n"," print(f\"Tags ajoutés à la version {model_version.version}.\")\n","\n"," # --- Logique de comparaison et de transition des stages ---\n","\n"," # Récupérer la version du modèle actuellement en production\n"," production_version = None\n"," try:\n"," for mv in client.search_model_versions(f\"name='{model_registry_name}'\"):\n"," if mv.current_stage == \"Production\":\n"," production_version = mv\n"," break\n"," except Exception as e:\n"," print(f\"Erreur lors de la recherche de la version en production : {e}\")\n","\n","\n"," if production_version:\n"," print(f\"\\nVersion actuelle en production: Version {production_version.version}\")\n"," # Récupérer la précision de la version en production (stockée dans les tags)\n"," production_precision_str = production_version.tags.get(\"test_precision\", \"0.0\")\n"," try:\n"," production_precision = float(production_precision_str)\n"," print(f\"Précision (Test) de la version en production: {production_precision:.4f}\")\n","\n"," # Comparer les précisions\n"," if best_precision > production_precision:\n"," print(f\"\\nLa nouvelle version ({model_version.version}) est meilleure que la version en production ({production_version.version}).\")\n"," print(\"Transition de la nouvelle version vers 'Production' et de l'ancienne version vers 'Staging'...\")\n","\n"," # Mettre la nouvelle version en production\n"," client.transition_model_version_stage(\n"," name=model_registry_name,\n"," version=model_version.version,\n"," stage=\"Production\",\n"," archive_existing_versions=True # Cela archive automatiquement l'ancienne version en production\n"," )\n"," print(f\"Version {model_version.version} mise en production.\")\n"," print(f\"Ancienne version {production_version.version} archivée.\")\n","\n"," else:\n"," print(f\"\\nLa nouvelle version ({model_version.version}) n'est pas meilleure que la version en production ({production_version.version}).\")\n"," print(\"Transition de la nouvelle version vers 'Staging'...\")\n"," # Mettre la nouvelle version en staging\n"," client.transition_model_version_stage(\n"," name=model_registry_name,\n"," version=model_version.version,\n"," stage=\"Staging\",\n"," archive_existing_versions=False # Ne pas archiver l'ancienne version en production\n"," )\n"," print(f\"Version {model_version.version} mise en staging.\")\n"," print(f\"La version {production_version.version} reste en production.\")\n","\n"," except ValueError:\n"," print(f\"Erreur: Impossible de convertir le tag 'test_precision' ({production_precision_str}) de la version en production en nombre flottant.\")\n"," print(f\"La nouvelle version {model_version.version} sera mise en 'Staging' par défaut.\")\n"," # Mettre la nouvelle version en staging si la précision de l'ancienne ne peut pas être lue\n"," client.transition_model_version_stage(\n"," name=model_registry_name,\n"," version=model_version.version,\n"," stage=\"Staging\",\n"," archive_existing_versions=False\n"," )\n","\n"," else:\n"," print(\"\\nAucune version en production trouvée. La nouvelle version sera mise en production.\")\n"," # Si aucune version n'est en production, mettre directement la nouvelle version en production\n"," client.transition_model_version_stage(\n"," name=model_registry_name,\n"," version=model_version.version,\n"," stage=\"Production\",\n"," archive_existing_versions=False\n"," )\n"," print(f\"Version {model_version.version} mise en production.\")\n","\n"," print(f\"\\nGestion des stages du modèle '{model_registry_name}' terminée.\")\n","\n","except Exception as e:\n"," print(f\"Erreur générale lors du traitement MLflow : {e}\")\n"," print(f\"Vérifiez que le run_id '{best_model_run_id}' est valide et que l'artefact existe bien.\")"],"metadata":{"id":"7Pf-LJdNOCHe","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1751830706459,"user_tz":-120,"elapsed":945,"user":{"displayName":"Grégoire","userId":"01249298206117462766"}},"outputId":"f9bdde12-3102-454d-c44c-60a35a0d60a0"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Précision (Test) Word2Vec + LSTM: 0.7970\n","Précision (Test) GloVe 300d + LSTM: 0.7915\n","\n","Le modèle LSTM + Word2Vec-Fige a la meilleure précision (0.7970).\n","\n","Chargement du meilleur modèle depuis MLflow URI: runs:/1de54538ee73443687db131fcc86d922/model_LSTM_Word2Vec-Fige\n","Enregistrement du meilleur modèle dans le Model Registry sous le nom 'SentimentAnalysisLSTM'...\n"]},{"output_type":"stream","name":"stderr","text":["Registered model 'SentimentAnalysisLSTM' already exists. Creating a new version of this model...\n","2025/07/06 19:38:25 WARNING mlflow.tracking._model_registry.fluent: Run with id 1de54538ee73443687db131fcc86d922 has no artifacts at artifact path 'model_LSTM_Word2Vec-Fige', registering model based on models:/m-b4c7c871087e4a2587f21367961f6d04 instead\n","2025/07/06 19:38:25 INFO mlflow.store.model_registry.abstract_store: Waiting up to 300 seconds for model version to finish creation. Model name: SentimentAnalysisLSTM, version 12\n","Created version '12' of model 'SentimentAnalysisLSTM'.\n"]},{"output_type":"stream","name":"stdout","text":["Modèle enregistré dans le Model Registry sous la version 12.\n","Tags ajoutés à la version 12.\n","\n","Version actuelle en production: Version 11\n","Précision (Test) de la version en production: 0.7830\n","\n","La nouvelle version (12) est meilleure que la version en production (11).\n","Transition de la nouvelle version vers 'Production' et de l'ancienne version vers 'Staging'...\n","Version 12 mise en production.\n","Ancienne version 11 archivée.\n","\n","Gestion des stages du modèle 'SentimentAnalysisLSTM' terminée.\n"]}]},{"cell_type":"markdown","source":["# Enregistrement de dépendances"],"metadata":{"id":"5iEc-YxAt3BU"}},{"cell_type":"code","source":["!pip freeze > requirements_modele_avance.txt"],"metadata":{"id":"jIw_YhFztVF2"},"execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.12"},"colab":{"provenance":[],"gpuType":"T4"},"accelerator":"GPU"},"nbformat":4,"nbformat_minor":0}
\ No newline at end of file
diff --git a/notebooks/p07_04-notebook-modele-bert.ipynb b/notebooks/p07_04-notebook-modele-bert.ipynb
deleted file mode 100644
index 98973d1..0000000
--- a/notebooks/p07_04-notebook-modele-bert.ipynb
+++ /dev/null
@@ -1,3364 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "y3x3_GfST76Z"
- },
- "source": [
- "# Partie 4 : Analyse de Sentiment de Tweets avec BERT\n",
- "\n",
- "Dans ce notebook, nous explorons l'analyse de sentiment de tweets en utilisant **BERT (Bidirectional Encoder Representations from Transformers)**, un modèle de deep learning à la pointe de la technologie pour le traitement du langage naturel. Le dataset **Sentiment140** contient 1,6 million de tweets étiquetés (positifs ou négatifs), ce qui en fait une excellente ressource pour entraîner notre modèle. Contrairement aux approches traditionnelles qui nécessitent une ingénierie de caractéristiques complexe, **BERT comprend le contexte bidirectionnel des mots**, ce qui est particulièrement utile pour capturer les subtilités linguistiques des tweets comme l'ironie, les abréviations et les expressions idiomatiques propres aux réseaux sociaux.\n",
- "\n",
- "Concernant l'entrainement, le choix a été fait d'entrainer par optimisation de la variable de perte de validation `val_loss` avec en particulier un critère d'`EarlyStopping` au bout d'un certain nombre d'époques lancées (7, en l'ocurrence) afin de garantir une bonne généralisation ainsi qu'une limitation de l'overfitting.\n",
- "\n",
- "Cependant, le critère qui sera retenu comme le plus important en raison de notre problématique métier est la `precision` car nous souhaitons plus que tout éviter les faux positifs (tweet prédit comme positif, alors qu'il sera mal reçu)."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "kW-8vumuT76b"
- },
- "source": [
- "## Importation des bibliothèques"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "executionInfo": {
- "elapsed": 18367,
- "status": "ok",
- "timestamp": 1752351535443,
- "user": {
- "displayName": "Grégoire",
- "userId": "01249298206117462766"
- },
- "user_tz": -120
- },
- "id": "Xplx_nQRg0rF",
- "outputId": "aa1a2afc-5393-4e50-de54-a2cd7e0acc05"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Mounted at /content/drive\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "['content',\n",
- " 'requirements_analyse_exploratoire.txt',\n",
- " 'p07_01-notebook-analyse-exploratoire.ipynb',\n",
- " 'requirements_bert.txt',\n",
- " 'requirements_modele_simple.txt',\n",
- " 'p07_02-notebook-modele-simple.ipynb',\n",
- " 'requirements_modele_avance.txt',\n",
- " 'p07_03-notebook-modele-avance.ipynb',\n",
- " 'notebook-connexion-mlflow.ipynb',\n",
- " 'p07_04-notebook-modele-bert.ipynb']"
- ]
- },
- "execution_count": 1,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "from google.colab import drive\n",
- "drive.mount('/content/drive')\n",
- "import os\n",
- "drive_folder= \"/content/drive/MyDrive/Colab_Notebooks/Project_7/notebooks\"\n",
- "os.chdir(drive_folder)\n",
- "os.listdir()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "executionInfo": {
- "elapsed": 32608,
- "status": "ok",
- "timestamp": 1752351568062,
- "user": {
- "displayName": "Grégoire",
- "userId": "01249298206117462766"
- },
- "user_tz": -120
- },
- "id": "tXTBgiq7U8gK",
- "outputId": "97fd036f-0f54-494b-8e5d-3a261d029091"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m24.7/24.7 MB\u001b[0m \u001b[31m47.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.9/1.9 MB\u001b[0m \u001b[31m61.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m139.9/139.9 kB\u001b[0m \u001b[31m11.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m247.0/247.0 kB\u001b[0m \u001b[31m18.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.8/13.8 MB\u001b[0m \u001b[31m85.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m147.8/147.8 kB\u001b[0m \u001b[31m8.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m114.9/114.9 kB\u001b[0m \u001b[31m11.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m85.0/85.0 kB\u001b[0m \u001b[31m7.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m85.2/85.2 kB\u001b[0m \u001b[31m8.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m741.4/741.4 kB\u001b[0m \u001b[31m38.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m203.4/203.4 kB\u001b[0m \u001b[31m13.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m65.6/65.6 kB\u001b[0m \u001b[31m6.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m119.4/119.4 kB\u001b[0m \u001b[31m10.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m201.6/201.6 kB\u001b[0m \u001b[31m17.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
- "\u001b[?25h"
- ]
- }
- ],
- "source": [
- "!pip install mlflow boto3 dotenv --quiet"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "collapsed": true,
- "executionInfo": {
- "elapsed": 6287,
- "status": "ok",
- "timestamp": 1752351574355,
- "user": {
- "displayName": "Grégoire",
- "userId": "01249298206117462766"
- },
- "user_tz": -120
- },
- "id": "W50jr7rUT76d",
- "outputId": "437c63ff-9e8f-4251-a053-0216012499ba"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "PyTorch version: 2.6.0+cu124\n",
- "CUDA disponible: True\n",
- "Appareil CUDA: Tesla T4\n"
- ]
- }
- ],
- "source": [
- "import torch\n",
- "print(f\"PyTorch version: {torch.__version__}\")\n",
- "print(f\"CUDA disponible: {torch.cuda.is_available()}\")\n",
- "if torch.cuda.is_available():\n",
- " print(f\"Appareil CUDA: {torch.cuda.get_device_name(0)}\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "MMB0gwbBT76d"
- },
- "outputs": [],
- "source": [
- "import os\n",
- "import pickle\n",
- "import subprocess\n",
- "import re\n",
- "import pandas as pd\n",
- "import numpy as np\n",
- "import torch\n",
- "from torch.utils.data import Dataset, DataLoader\n",
- "from torch.amp import GradScaler\n",
- "from torch.optim import AdamW\n",
- "from transformers import DistilBertTokenizer, DistilBertForSequenceClassification, get_scheduler\n",
- "from sklearn.model_selection import train_test_split\n",
- "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score\n",
- "from sklearn.metrics import confusion_matrix, classification_report, roc_curve, auc\n",
- "import matplotlib.pyplot as plt\n",
- "import seaborn as sns\n",
- "from tqdm import tqdm\n",
- "import html\n",
- "import pickle\n",
- "import zipfile\n",
- "import requests\n",
- "import json"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "executionInfo": {
- "elapsed": 2633,
- "status": "ok",
- "timestamp": 1752351604138,
- "user": {
- "displayName": "Grégoire",
- "userId": "01249298206117462766"
- },
- "user_tz": -120
- },
- "id": "OhgBsQDCUq4A",
- "outputId": "f63ccc04-79c1-40fc-8c92-5ed975f67336"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "MLflow Tracking URI: https://mlflow.greg-madman-nas.duckdns.org/\n",
- "Identifiants AWS configurés\n"
- ]
- }
- ],
- "source": [
- "import mlflow\n",
- "from mlflow.models.signature import infer_signature\n",
- "from mlflow import MlflowClient\n",
- "from mlflow.models.signature import ModelSignature\n",
- "from mlflow.types import Schema, ColSpec, TensorSpec\n",
- "from dotenv import load_dotenv\n",
- "from google.colab import userdata\n",
- "import mlflow.pytorch\n",
- "\n",
- "\n",
- "# Charger les variables d'environnement depuis le fichier .env\n",
- "load_dotenv(dotenv_path='../.env')\n",
- "\n",
- "# Configuration de MLflow avec les variables d'environnement\n",
- "mlflow_tracking_uri = os.getenv(\"MLFLOW_TRACKING_URI\")\n",
- "mlflow_s3_endpoint_url = os.getenv(\"MLFLOW_S3_ENDPOINT_URL\")\n",
- "aws_access_key_id = os.getenv(\"AWS_ACCESS_KEY_ID\")\n",
- "aws_secret_access_key = os.getenv(\"AWS_SECRET_ACCESS_KEY\")\n",
- "\n",
- "# Configuration explicite de MLflow\n",
- "mlflow.set_tracking_uri(mlflow_tracking_uri)\n",
- "print(f\"MLflow Tracking URI: {mlflow_tracking_uri}\")\n",
- "\n",
- "# Configuration explicite des identifiants AWS\n",
- "os.environ[\"MLFLOW_S3_ENDPOINT_URL\"] = mlflow_s3_endpoint_url\n",
- "os.environ[\"AWS_ACCESS_KEY_ID\"] = aws_access_key_id\n",
- "os.environ[\"AWS_SECRET_ACCESS_KEY\"] = aws_secret_access_key\n",
- "print(\"Identifiants AWS configurés\")\n",
- "\n",
- "# Créer l'expérience MLflow\n",
- "mlflow.set_experiment(\"OC Projet 7\")\n",
- "\n",
- "#Création du dossier de sauvegarde du modèle\n",
- "os.makedirs('content/bert-model/model', exist_ok=True)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "SuNqSc3UT76d"
- },
- "source": [
- "## 💾 Jeu de données : Sentiment140\n",
- "\n",
- "Le jeu de données [Sentiment140 dataset with 1.6 million tweets](https://www.kaggle.com/datasets/kazanova/sentiment140) est une ressource majeure pour l'analyse de sentiment sur Twitter, comprenant **1,6 million de tweets** extraits via l'API Twitter. Ces tweets ont été automatiquement annotés selon leur polarité sentimentale, offrant une base solide pour développer des modèles de classification de sentiment.\n",
- "\n",
- "Le jeu de données est organisé en 6 colonnes distinctes :\n",
- "\n",
- "1. **target** : La polarité du sentiment exprimé dans le tweet.\n",
- " - 0 = sentiment négatif\n",
- " - 2 = sentiment neutre\n",
- " - 4 = sentiment positif\n",
- "2. **ids** : L'identifiant unique du tweet (exemple : *2087*)\n",
- "3. **date** : La date et l'heure de publication du tweet.\n",
- "4. **flag** : La requête utilisée pour obtenir le tweet.\n",
- " - Exemple : *lyx*\n",
- " - Si aucune requête n'a été utilisée : *NO_QUERY*\n",
- "5. **user** : Le nom d'utilisateur de l'auteur du tweet.\n",
- "6. **text** : Le contenu textuel du tweet."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/"
- },
- "executionInfo": {
- "elapsed": 26,
- "status": "ok",
- "timestamp": 1752351604172,
- "user": {
- "displayName": "Grégoire",
- "userId": "01249298206117462766"
- },
- "user_tz": -120
- },
- "id": "Q5ACc3OUT76d",
- "outputId": "940ac231-d2b1-4c8d-940c-3cc323079d56"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "CPU times: user 60 µs, sys: 9 µs, total: 69 µs\n",
- "Wall time: 259 µs\n"
- ]
- }
- ],
- "source": [
- "%%time\n",
- "\n",
- "# Define the URL and the local file path\n",
- "url = \"https://s3-eu-west-1.amazonaws.com/static.oc-static.com/prod/courses/files/AI+Engineer/Project+7%C2%A0-+D%C3%A9tectez+les+Bad+Buzz+gr%C3%A2ce+au+Deep+Learning/sentiment140.zip\"\n",
- "local_zip_path = \"./content/data/sentiment140.zip\"\n",
- "extract_path = \"./content/data\"\n",
- "\n",
- "if not os.path.exists(extract_path):\n",
- "\n",
- " # Create the directory if it doesn't exist\n",
- " os.makedirs(extract_path, exist_ok=True)\n",
- "\n",
- " # Download the zip file\n",
- " response = requests.get(url)\n",
- " with open(local_zip_path, 'wb') as file:\n",
- " file.write(response.content)\n",
- "\n",
- " # Extract the contents of the zip file\n",
- " with zipfile.ZipFile(local_zip_path, 'r') as zip_ref:\n",
- " zip_ref.extractall(extract_path)\n",
- "\n",
- " # Delete the zip file\n",
- " os.remove(local_zip_path)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "_D2V2EgHT76e"
- },
- "outputs": [],
- "source": [
- "# Définir le chemin vers le fichier CSV\n",
- "csv_file_path = './content/data/training.1600000.processed.noemoticon.csv'"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "Sv9nlaIq4BZo"
- },
- "source": [
- "## 🧠📚 Entraînement spécifique de BERT\n",
- "Notre démarche pour la classification de sentiment avec des approches avancées comprend:\n",
- "\n",
- "1. **Prétraitement des tweets**\n",
- " - Nettoyage\n",
- " - Tokenisation et lemmatisation\n",
- " - Remplacement des URLs et mentions par des tokens spéciaux\n",
- "\n",
- "3. **Modèles testés**\n",
- " - BERT\n",
- "\n",
- "\n",
- "3. **Évaluation et suivi**\n",
- " - Métriques: précision, accuracy, recall, F1-score, ROC-AUC\n",
- " - Tracking avec MLflow pour la reproductibilité et la comparaison"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "AFdxLghUT76e"
- },
- "source": [
- "## Prétraitement des tweets"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "NmOIhsWET76e"
- },
- "outputs": [],
- "source": [
- "# PRÉTRAITEMENT DES TWEETS\n",
- "def preprocess_tweet_for_bert(tweet):\n",
- " \"\"\"\n",
- " Prétraite un tweet pour l'entraînement BERT en conservant la structure naturelle\n",
- " du langage mais en normalisant certains éléments spécifiques aux réseaux sociaux.\n",
- " \"\"\"\n",
- " # Vérifier si le tweet est une chaîne de caractères\n",
- " if not isinstance(tweet, str):\n",
- " return \"\"\n",
- "\n",
- " # Remplacer les URLs par un token spécial\n",
- " tweet = re.sub(r'https?://\\S+|www\\.\\S+', '[URL]', tweet)\n",
- "\n",
- " # Remplacer les mentions par un token spécial\n",
- " tweet = re.sub(r'@\\w+', '[USER]', tweet)\n",
- "\n",
- " # Normaliser les hashtags (conserver le hashtag comme entité)\n",
- " tweet = re.sub(r'#(\\w+)', r'#\\1', tweet)\n",
- "\n",
- " # Traiter le langage html\n",
- " tweet = html.unescape(tweet)\n",
- "\n",
- " # Normaliser les espaces multiples\n",
- " tweet = re.sub(r'\\s+', ' ', tweet)\n",
- "\n",
- " # Supprimer les caractères non imprimables et certains caractères spéciaux inutiles\n",
- " tweet = re.sub(r'[^\\x20-\\x7E]', '', tweet)\n",
- "\n",
- " # Nettoyer les espaces en début et fin\n",
- " tweet = tweet.strip()\n",
- "\n",
- " return tweet"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "M6ViLmc7T76e"
- },
- "source": [
- "## Préparations des données"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "ap7LohJzT76e"
- },
- "outputs": [],
- "source": [
- "# PRÉPARATION DES DONNÉES\n",
- "def prepare_data(df, sample_size=50000, random_state=42):\n",
- " \"\"\"\n",
- " Préparation des données pour l'entraînement BERT\n",
- " \"\"\"\n",
- " # Remappage des labels (0=négatif, 4=positif) vers (0=négatif, 1=positif)\n",
- " df['target'] = df['target'].replace({0: 0, 4: 1})\n",
- "\n",
- " # Prétraitement des tweets\n",
- " print(\"Prétraitement des tweets...\")\n",
- " df['processed_text'] = df['text'].apply(preprocess_tweet_for_bert)\n",
- "\n",
- " # Sélection d'un échantillon pour l'entraînement.\n",
- " # La distribution uniforme (50%/50%) des modalités ne posera pas problème pour le sous-échantillonnage.\n",
- " sample_data = df.sample(n=sample_size, random_state=random_state)\n",
- "\n",
- " # Division train/val/test\n",
- " train_val_texts, test_texts, train_val_labels, test_labels = train_test_split(\n",
- " sample_data['processed_text'].values,\n",
- " sample_data['target'].values,\n",
- " test_size=0.2,\n",
- " random_state=random_state\n",
- " )\n",
- "\n",
- " train_texts, val_texts, train_labels, val_labels = train_test_split(\n",
- " train_val_texts,\n",
- " train_val_labels,\n",
- " test_size=0.2,\n",
- " random_state=random_state\n",
- " )\n",
- "\n",
- " return {\n",
- " 'train': {'texts': train_texts, 'labels': train_labels},\n",
- " 'val': {'texts': val_texts, 'labels': val_labels},\n",
- " 'test': {'texts': test_texts, 'labels': test_labels}\n",
- " }"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "lgWXn2SKT76e"
- },
- "outputs": [],
- "source": [
- "# CRÉATION D'UN DATASET PYTORCH\n",
- "class TweetDataset(Dataset):\n",
- " def __init__(self, texts, labels, tokenizer, max_length=128):\n",
- " self.texts = texts\n",
- " self.labels = labels\n",
- " self.tokenizer = tokenizer\n",
- " self.max_length = max_length\n",
- "\n",
- " def __len__(self):\n",
- " return len(self.texts)\n",
- "\n",
- " def __getitem__(self, idx):\n",
- " text = str(self.texts[idx])\n",
- " label = self.labels[idx]\n",
- "\n",
- " # Tokenisation du texte\n",
- " encoding = self.tokenizer(\n",
- " text,\n",
- " add_special_tokens=True,\n",
- " max_length=self.max_length,\n",
- " truncation=True,\n",
- " padding='max_length',\n",
- " return_tensors='pt'\n",
- " )\n",
- "\n",
- " return {\n",
- " 'input_ids': encoding['input_ids'].flatten(),\n",
- " 'attention_mask': encoding['attention_mask'].flatten(),\n",
- " 'label': torch.tensor(label, dtype=torch.long)\n",
- " }"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "P_S6MpCjT76f"
- },
- "source": [
- "## Fonctions d'entraînement"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "EsK_IQRlbu3C"
- },
- "outputs": [],
- "source": [
- "import torch\n",
- "from torch.cuda.amp import GradScaler\n",
- "from sklearn.metrics import accuracy_score, precision_score, recall_score\n",
- "from tqdm import tqdm\n",
- "\n",
- "def train_model(\n",
- " model,\n",
- " train_loader,\n",
- " val_loader,\n",
- " test_loader,\n",
- " device,\n",
- " epochs=20,\n",
- " gradient_accumulation_steps=4,\n",
- " patience=7,\n",
- " lr=2e-5,\n",
- " lr_factor=0.2,\n",
- " min_lr=1e-6,\n",
- "):\n",
- " \"\"\"\n",
- " Train a BERT model with gradient accumulation,\n",
- " EarlyStopping on val_loss, and best model selection on val_precision.\n",
- "\n",
- " Args:\n",
- " model: The BERT model to train.\n",
- " train_loader: DataLoader for training data.\n",
- " val_loader: DataLoader for validation data.\n",
- " test_loader: DataLoader for test data.\n",
- " device: 'cuda' or 'cpu' for training.\n",
- " epochs: Maximum number of epochs to train.\n",
- " gradient_accumulation_steps: Number of steps for gradient accumulation.\n",
- " patience: Patience for EarlyStopping based on val_loss.\n",
- " lr: Initial learning rate.\n",
- " lr_factor: Factor to reduce learning rate in scheduler.\n",
- " min_lr: Minimum learning rate allowed.\n",
- "\n",
- " Returns:\n",
- " history: Training and validation history.\n",
- " test_metrics: Metrics on the test set.\n",
- " \"\"\"\n",
- "\n",
- " best_val_precision = 0.0\n",
- " best_val_loss = float('inf')\n",
- " no_val_loss_improvement_count = 0\n",
- "\n",
- " optimizer = torch.optim.AdamW(model.parameters(), lr=lr, eps=1e-8)\n",
- " scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(\n",
- " optimizer, mode=\"min\", factor=lr_factor, patience=2, min_lr=min_lr, verbose=True\n",
- " )\n",
- " scaler = GradScaler()\n",
- "\n",
- " history = {\n",
- " \"train_loss\": [],\n",
- " \"val_loss\": [],\n",
- " \"train_accuracy\": [],\n",
- " \"val_accuracy\": [],\n",
- " \"train_precision\": [],\n",
- " \"val_precision\": [],\n",
- " \"val_recall\": []\n",
- " }\n",
- "\n",
- " for epoch in range(epochs):\n",
- " print(f\"\\n=== Epoch {epoch + 1}/{epochs} ===\")\n",
- "\n",
- " # Training phase\n",
- " model.train()\n",
- " train_loss, train_true, train_preds = 0.0, [], []\n",
- "\n",
- " for batch_idx, batch in enumerate(tqdm(train_loader, desc=\"Training\")):\n",
- " input_ids = batch[\"input_ids\"].to(device)\n",
- " attention_mask = batch[\"attention_mask\"].to(device)\n",
- " labels = batch[\"label\"].to(device)\n",
- "\n",
- " optimizer.zero_grad()\n",
- "\n",
- " # with autocast(enabled=torch.cuda.is_available()):\n",
- " with torch.amp.autocast(device_type='cuda' if torch.cuda.is_available() else 'cpu'):\n",
- "\n",
- " outputs = model(input_ids=input_ids, attention_mask=attention_mask, labels=labels)\n",
- " loss = outputs.loss / gradient_accumulation_steps\n",
- "\n",
- " scaler.scale(loss).backward()\n",
- "\n",
- " if (batch_idx + 1) % gradient_accumulation_steps == 0 or (batch_idx + 1) == len(train_loader):\n",
- " scaler.unscale_(optimizer)\n",
- " torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)\n",
- " scaler.step(optimizer)\n",
- " scaler.update()\n",
- "\n",
- " train_loss += loss.item() * gradient_accumulation_steps\n",
- " train_preds.extend(torch.argmax(outputs.logits, dim=1).cpu().numpy())\n",
- " train_true.extend(labels.cpu().numpy())\n",
- "\n",
- " avg_train_loss = train_loss / len(train_loader)\n",
- " train_accuracy = accuracy_score(train_true, train_preds)\n",
- " train_precision = precision_score(train_true, train_preds, zero_division=0)\n",
- " history[\"train_loss\"].append(avg_train_loss)\n",
- " history[\"train_accuracy\"].append(train_accuracy)\n",
- " history[\"train_precision\"].append(train_precision)\n",
- "\n",
- " print(f\"Train Loss: {avg_train_loss:.4f}, Train Accuracy: {train_accuracy:.4f}, Train Precision: {train_precision:.4f}\")\n",
- "\n",
- " # Validation phase\n",
- " model.eval()\n",
- " val_loss, val_true, val_preds = 0.0, [], []\n",
- "\n",
- " with torch.no_grad():\n",
- " for batch in tqdm(val_loader, desc=\"Validation\"):\n",
- " input_ids = batch[\"input_ids\"].to(device)\n",
- " attention_mask = batch[\"attention_mask\"].to(device)\n",
- " labels = batch[\"label\"].to(device)\n",
- "\n",
- " outputs = model(input_ids=input_ids, attention_mask=attention_mask, labels=labels)\n",
- " loss = outputs.loss\n",
- "\n",
- " val_loss += loss.item()\n",
- " val_preds.extend(torch.argmax(outputs.logits, dim=1).cpu().numpy())\n",
- " val_true.extend(labels.cpu().numpy())\n",
- "\n",
- " avg_val_loss = val_loss / len(val_loader)\n",
- " val_accuracy = accuracy_score(val_true, val_preds)\n",
- " val_precision = precision_score(val_true, val_preds, zero_division=0)\n",
- " val_recall = recall_score(val_true, val_preds, zero_division=0) # calcul recall ajouté\n",
- "\n",
- " history[\"val_loss\"].append(avg_val_loss)\n",
- " history[\"val_accuracy\"].append(val_accuracy)\n",
- " history[\"val_precision\"].append(val_precision)\n",
- " history[\"val_recall\"].append(val_recall) # ajout dans l'historique\n",
- "\n",
- " print(f\"Val Loss: {avg_val_loss:.4f}, Val Accuracy: {val_accuracy:.4f}, Val Precision: {val_precision:.4f}, Val Recall: {val_recall:.4f}\")\n",
- "\n",
- " # Scheduler step on val_loss\n",
- " scheduler.step(avg_val_loss)\n",
- "\n",
- " # Save best model based on val_precision\n",
- " if val_precision > best_val_precision:\n",
- " best_val_precision = val_precision\n",
- " torch.save(model.state_dict(), \"./content/bert-model/model/best_model.pth\")\n",
- " print(\"New best model saved based on val_precision.\")\n",
- "\n",
- " # EarlyStopping on val_loss\n",
- " if avg_val_loss < best_val_loss:\n",
- " best_val_loss = avg_val_loss\n",
- " no_val_loss_improvement_count = 0\n",
- " else:\n",
- " no_val_loss_improvement_count += 1\n",
- " print(f\"No val_loss improvement. Patience: {no_val_loss_improvement_count}/{patience}\")\n",
- "\n",
- " if no_val_loss_improvement_count >= patience:\n",
- " print(\"EarlyStopping activated.\")\n",
- " break\n",
- "\n",
- " # Load best model\n",
- " model.load_state_dict(torch.load(\"./content/bert-model/model/best_model.pth\"))\n",
- " print(\"Best model loaded for evaluation.\")\n",
- "\n",
- " # Evaluate on test set\n",
- " test_metrics = evaluate_model(model, test_loader, device)\n",
- "\n",
- " return history, test_metrics"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "3gDy-63XT76f"
- },
- "source": [
- "## Fonction d'évaluation"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "g2DZWDoNT76f"
- },
- "outputs": [],
- "source": [
- "# FONCTION D'ÉVALUATION\n",
- "def evaluate_model(model, test_loader, device):\n",
- " \"\"\"\n",
- " Évalue le modèle sur le jeu de test et retourne les métriques et prédictions\n",
- " \"\"\"\n",
- " model.eval()\n",
- " test_preds, test_true = [], []\n",
- " test_probs = []\n",
- "\n",
- " with torch.no_grad():\n",
- " for batch in tqdm(test_loader, desc=\"Évaluation sur le jeu de test\"):\n",
- " input_ids = batch['input_ids'].to(device)\n",
- " attention_mask = batch['attention_mask'].to(device)\n",
- " labels = batch['label'].to(device)\n",
- "\n",
- " outputs = model(\n",
- " input_ids=input_ids,\n",
- " attention_mask=attention_mask\n",
- " )\n",
- "\n",
- " # Récupération des prédictions et probabilités\n",
- " logits = outputs.logits\n",
- " probs = torch.nn.functional.softmax(logits, dim=1)\n",
- " preds = torch.argmax(logits, dim=1).cpu().numpy()\n",
- " true = labels.cpu().numpy()\n",
- "\n",
- " test_preds.extend(preds)\n",
- " test_true.extend(true)\n",
- " test_probs.extend(probs[:, 1].cpu().numpy()) # Probabilité de la classe positive\n",
- "\n",
- " # Calcul des métriques\n",
- " accuracy = accuracy_score(test_true, test_preds)\n",
- " precision = precision_score(test_true, test_preds)\n",
- " recall = recall_score(test_true, test_preds)\n",
- " f1 = f1_score(test_true, test_preds)\n",
- "\n",
- " # Matrice de confusion\n",
- " cm = confusion_matrix(test_true, test_preds)\n",
- "\n",
- " # Classification report\n",
- " report = classification_report(test_true, test_preds, target_names=['Négatif', 'Positif'])\n",
- "\n",
- " # Courbe ROC et AUC\n",
- " fpr, tpr, _ = roc_curve(test_true, test_probs)\n",
- " roc_auc = auc(fpr, tpr)\n",
- "\n",
- " # Regrouper toutes les métriques\n",
- " metrics = {\n",
- " 'accuracy': accuracy,\n",
- " 'precision': precision,\n",
- " 'recall': recall,\n",
- " 'f1': f1,\n",
- " 'roc_auc': roc_auc,\n",
- " 'fpr': fpr,\n",
- " 'tpr': tpr,\n",
- " 'confusion_matrix': cm,\n",
- " 'classification_report': report,\n",
- " 'predictions': test_preds,\n",
- " 'true_labels': test_true,\n",
- " 'probabilities': test_probs\n",
- " }\n",
- "\n",
- " return metrics"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "o0S7DzDJdvbV"
- },
- "source": [
- "## Afficher la matrice de confusion"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "nsUgEh2pT76f"
- },
- "outputs": [],
- "source": [
- "# FONCTION POUR TRACER LA MATRICE DE CONFUSION\n",
- "def plot_confusion_matrix(cm, class_names):\n",
- " \"\"\"\n",
- " Tracer la matrice de confusion\n",
- " \"\"\"\n",
- " plt.figure(figsize=(8, 6))\n",
- " sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=class_names, yticklabels=class_names)\n",
- " plt.xlabel('Prédictions')\n",
- " plt.ylabel('Valeurs réelles')\n",
- " plt.title('Matrice de confusion')\n",
- "\n",
- " # Save confusion matrix\n",
- " filename = f'content/bert-model/confusion_matrix.png'\n",
- " plt.savefig(filename)\n",
- "\n",
- " return plt.gcf()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "ORnBybYLT76g"
- },
- "source": [
- "## Fonction pour tracer la courbe ROC AUC"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "Pf-tDY3OT76g"
- },
- "outputs": [],
- "source": [
- "# FONCTION POUR TRACER LA COURBE ROC\n",
- "def plot_roc_curve(fpr, tpr, roc_auc, model_name, run_id=None):\n",
- " \"\"\"\n",
- " Trace la courbe ROC et l'enregistre dans MLflow\n",
- " \"\"\"\n",
- " plt.figure(figsize=(8, 6))\n",
- " plt.plot(fpr, tpr, label=f'ROC curve (area = {roc_auc:.3f})')\n",
- " plt.plot([0, 1], [0, 1], 'k--')\n",
- " plt.xlim([0.0, 1.0])\n",
- " plt.ylim([0.0, 1.05])\n",
- " plt.xlabel('Taux de faux positifs')\n",
- " plt.ylabel('Taux de vrais positifs')\n",
- " plt.title(f'Courbe ROC - {model_name}')\n",
- " plt.legend(loc=\"lower right\")\n",
- "\n",
- " # Sauvegarder la figure localement\n",
- " filename = f'content/bert-model/roc_curve_{model_name}.png'\n",
- " plt.savefig(filename)\n",
- "\n",
- " # Enregistrer dans MLflow en utilisant l'exécution existante\n",
- " # if run_id:\n",
- " # with mlflow.start_run(run_id=run_id):\n",
- " # mlflow.log_figure(plt.gcf(), f\"roc_curve_{model_name}.png\")\n",
- "\n",
- " return plt.gcf()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "WD_nm9eDT76f"
- },
- "source": [
- "## Fonction pour tracer l'historique d'entraînement"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "UKzSUOlqT76g"
- },
- "outputs": [],
- "source": [
- "# FONCTION POUR TRACER L'HISTORIQUE D'ENTRAÎNEMENT\n",
- "def plot_training_history(history, model_name, run_id=None):\n",
- " \"\"\"\n",
- " Trace l'historique d'entraînement du modèle et l'enregistre dans MLflow\n",
- " \"\"\"\n",
- " fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))\n",
- "\n",
- " # Tracer l'accuracy\n",
- " ax1.plot(history['train_precision'], label='train')\n",
- " ax1.plot(history['val_precision'], label='validation')\n",
- " ax1.set_title(f'Precision - {model_name}')\n",
- " ax1.set_xlabel('Epoch')\n",
- " ax1.set_ylabel('Precision')\n",
- " ax1.legend()\n",
- "\n",
- " # Tracer la loss\n",
- " ax2.plot(history['train_loss'], label='train')\n",
- " ax2.plot(history['val_loss'], label='validation')\n",
- " ax2.set_title(f'Loss - {model_name}')\n",
- " ax2.set_xlabel('Epoch')\n",
- " ax2.set_ylabel('Loss')\n",
- " ax2.legend()\n",
- "\n",
- " plt.tight_layout()\n",
- "\n",
- " # Sauvegarder la figure localement\n",
- " os.makedirs('content/bert-model', exist_ok=True)\n",
- " filename = f'content/bert-model/training_history_{model_name}.png'\n",
- " plt.savefig(filename)\n",
- "\n",
- " # Enregistrer dans MLflow en utilisant l'exécution existante\n",
- " if run_id:\n",
- " with mlflow.start_run(run_id=run_id):\n",
- " mlflow.log_figure(fig, f\"training_history_{model_name}.png\")\n",
- "\n",
- " return fig"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "aXZRXEMnT76g"
- },
- "source": [
- "## Enregistrement du modèle dans MLFlow\n",
- "\n",
- "1. Définition de la signature du modèle pour MLflow\n",
- "2. Démarrage d'une exécution MLflow avec un nom spécifique\n",
- "3. Enregistrement des paramètres du modèle\n",
- "4. Enregistrement des métriques de performance (accuracy, precision, recall, f1, roc_auc)\n",
- "5. Création et enregistrement de visualisations (matrice de confusion, courbe ROC)\n",
- "6. Enregistrement du rapport de classification\n",
- "7. Sauvegarde locale du modèle BERT\n",
- "8. Enregistrement du modèle PyTorch dans MLflow avec sa signature\n",
- "9. Sauvegarde locale du tokenizer et enregistrement dans MLflow\n",
- "10. Sauvegarde locale de la fonction de prétraitement (preprocessor) via pickle et enregistrement dans MLflow\n",
- "11. Génération et enregistrement du fichier requirements.txt\n",
- "10. Retourne l'**identifiant unique (Run ID)** de l'exécution MLflow qui vient d'être complétée, permettant de la référencer ultérieurement.\n",
- "\n",
- "## Tableau des chemins des artefacts\n",
- "\n",
- "| Artefact | Chemin local | Chemin MLflow |\n",
- "|----------|--------------|---------------|\n",
- "| Matrice de confusion | `content/bert-model/confusion_matrix.png` | `confusion_matrix_{model_name}.png` |\n",
- "| Courbe ROC | `content/bert-model/roc_curve_{model_name}.png` | `roc_curve_{model_name}.png` |\n",
- "| Historique d'entraînement | `content/bert-model/training_history_{model_name}.png` | `training_history_{model_name}.png` (si run_id fourni) |\n",
- "| Rapport de classification | `content/bert-model/classification_report.txt` | Racine des artefacts |\n",
- "| Modèle BERT | `content/bert-model/model/` | `model/` |\n",
- "| Tokenizer | `content/bert-model/tokenizer/` | `tokenizer/` |\n",
- "| Preprocessor | `content/bert-model/preprocessor/preprocessor.pkl` | `preprocessor/preprocessor.pkl` |\n",
- "| Requirements | `content/bert-model/requirements.txt` | (Utilisé par MLflow comme dépendances du modèle) |\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "3OppER9A_iPX"
- },
- "outputs": [],
- "source": [
- "# FONCTION POUR ENREGISTRER LE MODÈLE DANS MLFLOW\n",
- "def log_model_to_mlflow(model, tokenizer, model_name, metrics, params=None):\n",
- " \"\"\"\n",
- " Enregistre le modèle et ses performances dans MLflow, y compris la signature.\n",
- " Gère correctement les devices et la sérialisation JSON des métriques NumPy.\n",
- " Supprime input_example pour éviter l'avertissement de validation avec le flavor pytorch.\n",
- "\n",
- " Args:\n",
- " model (torch.nn.Module): Le modèle PyTorch (Hugging Face) entraîné.\n",
- " tokenizer: Le tokenizer Hugging Face associé au modèle.\n",
- " model_name (str): Un nom pour identifier ce modèle/cette exécution.\n",
- " metrics (dict): Un dictionnaire contenant les métriques de performance.\n",
- " params (dict, optional): Un dictionnaire des hyperparamètres utilisés. Defaults to None.\n",
- "\n",
- " Returns:\n",
- " str: L'ID de l'exécution MLflow.\n",
- " \"\"\"\n",
- " class_names = ['Négatif', 'Positif']\n",
- "\n",
- " # --- Définir la signature du modèle ---\n",
- " sample_input_text = [\"Ceci est un exemple de texte pour inférer la signature.\"]\n",
- " inputs = tokenizer(\n",
- " sample_input_text, return_tensors=\"pt\", padding=\"max_length\",\n",
- " truncation=True, max_length=128\n",
- " )\n",
- " try:\n",
- " model_device = next(model.parameters()).device\n",
- " except StopIteration:\n",
- " model_device = torch.device(\"cpu\")\n",
- " except Exception:\n",
- " model_device = torch.device(\"cpu\")\n",
- "\n",
- " inputs_on_device = None\n",
- " try:\n",
- " inputs_on_device = {k: v.to(model_device) for k, v in inputs.items()}\n",
- " except Exception as e:\n",
- " print(f\"Error moving input tensors to device {model_device}: {e}. Skipping signature inference.\")\n",
- "\n",
- " input_data_for_signature = {k: v.cpu().numpy() for k, v in inputs.items()} # For potential future use, still on CPU\n",
- "\n",
- " predictions = None\n",
- " signature = None\n",
- " if inputs_on_device:\n",
- " model.eval()\n",
- " with torch.no_grad():\n",
- " try:\n",
- " outputs = model(**inputs_on_device)\n",
- " if hasattr(outputs, 'logits'):\n",
- " predictions = outputs.logits.cpu().numpy()\n",
- " elif isinstance(outputs, torch.Tensor):\n",
- " predictions = outputs.cpu().numpy()\n",
- " else:\n",
- " # Fallback attempt\n",
- " for val in getattr(outputs, 'values', lambda: [])(): # Handle dicts or sequences\n",
- " if isinstance(val, torch.Tensor):\n",
- " predictions = val.cpu().numpy()\n",
- " break\n",
- "\n",
- " if predictions is not None:\n",
- " # Infer signature using the CPU numpy inputs and CPU numpy predictions\n",
- " signature = infer_signature(input_data_for_signature, predictions)\n",
- " print(\"Model signature inferred successfully.\")\n",
- " else:\n",
- " print(\"Warning: Could not extract prediction tensor for signature.\")\n",
- "\n",
- " except Exception as e:\n",
- " print(f\"Error during model prediction or signature inference: {e}\")\n",
- " else:\n",
- " print(\"Skipping signature inference because input tensors could not be moved to model device.\")\n",
- " # --- Fin de la définition de la signature ---\n",
- "\n",
- " # Démarrer une exécution MLflow\n",
- " with mlflow.start_run(run_name=f\"Model_Bert-{model_name}\") as run:\n",
- "\n",
- " # Enregistrer les paramètres du modèle\n",
- " if params:\n",
- " for key, value in params.items():\n",
- " mlflow.log_param(key, value)\n",
- "\n",
- " # Enregistrer les métriques de performance\n",
- " mlflow.log_metric(\"accuracy\", metrics['accuracy'])\n",
- " mlflow.log_metric(\"precision\", metrics['precision'])\n",
- " mlflow.log_metric(\"recall\", metrics['recall'])\n",
- " mlflow.log_metric(\"f1\", metrics['f1'])\n",
- " mlflow.log_metric(\"roc_auc\", metrics['roc_auc'])\n",
- "\n",
- " mlflow.log_param(\"model_base\", model_name)\n",
- " mlflow.set_tag(\"model_base\", model_name)\n",
- "\n",
- " # Tracer et enregistrer la matrice de confusion\n",
- " fig_cm = plot_confusion_matrix(metrics['confusion_matrix'], class_names)\n",
- " mlflow.log_figure(fig_cm, f\"confusion_matrix_{model_name}.png\")\n",
- "\n",
- " # Tracer et enregistrer la courbe ROC\n",
- " fig_roc = plot_roc_curve(metrics['fpr'], metrics['tpr'], metrics['roc_auc'], model_name)\n",
- " mlflow.log_figure(fig_roc, f\"roc_curve_{model_name}.png\")\n",
- "\n",
- " # Enregistrer le rapport de classification\n",
- " report_path = f\"content/bert-model/classification_report.txt\"\n",
- " os.makedirs(os.path.dirname(report_path), exist_ok=True)\n",
- " with open(report_path, \"w\") as f:\n",
- " f.write(metrics['classification_report'])\n",
- " mlflow.log_artifact(report_path)\n",
- "\n",
- "\n",
- " # Sauvegarder le modèle localement\n",
- " model_path = f\"content/bert-model/model\"\n",
- " os.makedirs(model_path, exist_ok=True)\n",
- " try:\n",
- " model.save_pretrained(model_path)\n",
- " print(\"Model logged to MLflow artifact path 'model'.\")\n",
- " except Exception as e:\n",
- " print(f\"Warning: Failed to save or log model: {e}\")\n",
- "\n",
- "\n",
- " # Enregistrer le tokenizer localement et sur MLFlow\n",
- " tokenizer_path = f\"content/bert-model/tokenizer\"\n",
- " os.makedirs(tokenizer_path, exist_ok=True)\n",
- " try:\n",
- " tokenizer.save_pretrained(tokenizer_path)\n",
- " mlflow.log_artifact(tokenizer_path)\n",
- " print(\"Tokenizer logged to MLflow artifact path 'tokenizer'.\")\n",
- " except Exception as e:\n",
- " print(f\"Warning: Failed to save or log tokenizer: {e}\")\n",
- "\n",
- "\n",
- " # --- Sauvegarder la fonction preprocessor via pickle ---\n",
- " local_save_directory = \"content/bert-model/preprocessor\" # Attention au double \"content\" si c'est bien voulu\n",
- " local_pickle_filename = \"preprocessor.pkl\"\n",
- " local_pickle_filepath = os.path.join(local_save_directory, local_pickle_filename)\n",
- " # Sous-dossier cible dans les artefacts MLflow\n",
- " mlflow_artifact_subdir = \"preprocessor\"\n",
- " try:\n",
- " os.makedirs(local_save_directory, exist_ok=True)\n",
- " with open(local_pickle_filepath, \"wb\") as f_out:\n",
- " pickle.dump(preprocess_tweet_for_bert, f_out)\n",
- " mlflow.log_artifact(local_pickle_filepath, artifact_path=mlflow_artifact_subdir)\n",
- " except NameError:\n",
- " print(f\"\\nWarning: La fonction 'preprocess_tweet_for_bert' n'est pas définie. Impossible de la sauvegarder.\\n\")\n",
- " except Exception as e:\n",
- " print(f\"\\nWarning: Impossible de sauvegarder (pickle) ou logger la fonction de prétraitement : {e}\\n\")\n",
- "\n",
- "\n",
- " # Enregistrer le fichier requirements.txt\n",
- " requirements_path = \"content/bert-model/requirements.txt\"\n",
- " try:\n",
- " with open(requirements_path, 'w') as f:\n",
- " import sys\n",
- " subprocess.check_call([sys.executable, '-m', 'pip', 'freeze'], stdout=f)\n",
- " except subprocess.CalledProcessError as e:\n",
- " print(f\"Warning: Failed to generate requirements.txt: {e}. Logging without pip_requirements.\")\n",
- " requirements_path = None\n",
- " except Exception as e:\n",
- " print(f\"An unexpected error occurred during requirements generation: {e}\")\n",
- " requirements_path = None\n",
- "\n",
- " # --- Enregistrer le modèle PyTorch sans input_example ---\n",
- " try:\n",
- " mlflow.pytorch.log_model(\n",
- " pytorch_model=model,\n",
- " artifact_path=\"model\", # Simplement \"model\" pour être cohérent\n",
- " signature=signature,\n",
- " pip_requirements=requirements_path if requirements_path else None\n",
- " )\n",
- " print(f\"Model '{model_name}' logged to MLflow artifact path 'model_{model_name}'.\")\n",
- " except Exception as e:\n",
- " print(f\"FATAL: Error logging PyTorch model to MLflow: {e}\")\n",
- " return None\n",
- "\n",
- " print(f\"MLflow logging attempt finished for run '{run.info.run_id}'.\")\n",
- "\n",
- " return run.info.run_id"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "1PHu82H-YNtN"
- },
- "outputs": [],
- "source": [
- "# FONCTION POUR ENREGISTRER LE MODÈLE DANS MLFLOW\n",
- "def log_model_to_mlflow(model, tokenizer, model_name, metrics, history=None, params=None):\n",
- " \"\"\"\n",
- " Enregistre le modèle et ses performances dans MLflow, y compris la signature.\n",
- " Gère correctement les devices et la sérialisation JSON des métriques NumPy.\n",
- " Supprime input_example pour éviter l'avertissement de validation avec le flavor pytorch.\n",
- "\n",
- " Args:\n",
- " model (torch.nn.Module): Le modèle PyTorch (Hugging Face) entraîné.\n",
- " tokenizer: Le tokenizer Hugging Face associé au modèle.\n",
- " model_name (str): Un nom pour identifier ce modèle/cette exécution.\n",
- " metrics (dict): Un dictionnaire contenant les métriques de performance.\n",
- " params (dict, optional): Un dictionnaire des hyperparamètres utilisés. Defaults to None.\n",
- "\n",
- " Returns:\n",
- " str: L'ID de l'exécution MLflow.\n",
- " \"\"\"\n",
- " class_names = ['Négatif', 'Positif']\n",
- "\n",
- " # --- Définir la signature du modèle ---\n",
- " sample_input_text = [\"Ceci est un exemple de texte pour inférer la signature.\"]\n",
- " inputs = tokenizer(\n",
- " sample_input_text, return_tensors=\"pt\", padding=\"max_length\",\n",
- " truncation=True, max_length=128\n",
- " )\n",
- " try:\n",
- " model_device = next(model.parameters()).device\n",
- " except StopIteration:\n",
- " model_device = torch.device(\"cpu\")\n",
- " except Exception:\n",
- " model_device = torch.device(\"cpu\")\n",
- "\n",
- " inputs_on_device = None\n",
- " try:\n",
- " inputs_on_device = {k: v.to(model_device) for k, v in inputs.items()}\n",
- " except Exception as e:\n",
- " print(f\"Error moving input tensors to device {model_device}: {e}. Skipping signature inference.\")\n",
- "\n",
- " input_data_for_signature = {k: v.cpu().numpy() for k, v in inputs.items()} # For potential future use, still on CPU\n",
- "\n",
- " predictions = None\n",
- " signature = None\n",
- " if inputs_on_device:\n",
- " model.eval()\n",
- " with torch.no_grad():\n",
- " try:\n",
- " outputs = model(**inputs_on_device)\n",
- " if hasattr(outputs, 'logits'):\n",
- " predictions = outputs.logits.cpu().numpy()\n",
- " elif isinstance(outputs, torch.Tensor):\n",
- " predictions = outputs.cpu().numpy()\n",
- " else:\n",
- " # Fallback attempt\n",
- " for val in getattr(outputs, 'values', lambda: [])(): # Handle dicts or sequences\n",
- " if isinstance(val, torch.Tensor):\n",
- " predictions = val.cpu().numpy()\n",
- " break\n",
- "\n",
- " if predictions is not None:\n",
- " # Infer signature using the CPU numpy inputs and CPU numpy predictions\n",
- " signature = infer_signature(input_data_for_signature, predictions)\n",
- " print(\"Model signature inferred successfully.\")\n",
- " else:\n",
- " print(\"Warning: Could not extract prediction tensor for signature.\")\n",
- "\n",
- " except Exception as e:\n",
- " print(f\"Error during model prediction or signature inference: {e}\")\n",
- " else:\n",
- " print(\"Skipping signature inference because input tensors could not be moved to model device.\")\n",
- " # --- Fin de la définition de la signature ---\n",
- "\n",
- " # Démarrer une exécution MLflow\n",
- " with mlflow.start_run(run_name=f\"Model_Bert-{model_name}\") as run:\n",
- "\n",
- " # Enregistrer les paramètres du modèle\n",
- " if params:\n",
- " for key, value in params.items():\n",
- " mlflow.log_param(key, value)\n",
- "\n",
- " if history is not None:\n",
- " val_precisions = history.get(\"val_precision\", [])\n",
- " if val_precisions:\n",
- " best_epoch_idx = val_precisions.index(max(val_precisions))\n",
- "\n",
- " val_precision_at_best = val_precisions[best_epoch_idx]\n",
- " val_loss_at_best = history.get(\"val_loss\", [None])[best_epoch_idx]\n",
- " val_recall_at_best = history.get(\"val_recall\", [None])[best_epoch_idx]\n",
- "\n",
- " mlflow.log_metric(\"val_precision\", val_precision_at_best)\n",
- " mlflow.log_metric(\"val_loss\", val_loss_at_best)\n",
- " mlflow.log_metric(\"val_recall\", val_recall_at_best)\n",
- "\n",
- "\n",
- " # Enregistrer les métriques de performance\n",
- " mlflow.log_metric(\"test_precision\", metrics['precision'])\n",
- " mlflow.log_metric(\"test_accuracy\", metrics['accuracy'])\n",
- " mlflow.log_metric(\"test_recall\", metrics['recall'])\n",
- " mlflow.log_metric(\"test_f1\", metrics['f1'])\n",
- " mlflow.log_metric(\"test_roc_auc\", metrics['roc_auc'])\n",
- "\n",
- " mlflow.log_param(\"model_base\", model_name)\n",
- " mlflow.set_tag(\"model_base\", model_name)\n",
- "\n",
- " # Tracer et enregistrer la matrice de confusion\n",
- " fig_cm = plot_confusion_matrix(metrics['confusion_matrix'], class_names)\n",
- " mlflow.log_figure(fig_cm, f\"confusion_matrix_{model_name}.png\")\n",
- "\n",
- " # Tracer et enregistrer la courbe ROC\n",
- " fig_roc = plot_roc_curve(metrics['fpr'], metrics['tpr'], metrics['roc_auc'], model_name)\n",
- " mlflow.log_figure(fig_roc, f\"roc_curve_{model_name}.png\")\n",
- "\n",
- " # Enregistrer le rapport de classification\n",
- " report_path = f\"content/bert-model/classification_report.txt\"\n",
- " os.makedirs(os.path.dirname(report_path), exist_ok=True)\n",
- " with open(report_path, \"w\") as f:\n",
- " f.write(metrics['classification_report'])\n",
- " mlflow.log_artifact(report_path)\n",
- "\n",
- "\n",
- " # Sauvegarder le modèle localement\n",
- " model_path = f\"content/bert-model/model\"\n",
- " os.makedirs(model_path, exist_ok=True)\n",
- " try:\n",
- " model.save_pretrained(model_path)\n",
- " print(\"Model logged to MLflow artifact path 'model'.\")\n",
- " except Exception as e:\n",
- " print(f\"Warning: Failed to save or log model: {e}\")\n",
- "\n",
- "\n",
- " # Enregistrer le tokenizer localement et sur MLFlow\n",
- " tokenizer_path = f\"content/bert-model/tokenizer\"\n",
- " os.makedirs(tokenizer_path, exist_ok=True)\n",
- " try:\n",
- " tokenizer.save_pretrained(tokenizer_path)\n",
- " mlflow.log_artifact(tokenizer_path)\n",
- " print(\"Tokenizer logged to MLflow artifact path 'tokenizer'.\")\n",
- " except Exception as e:\n",
- " print(f\"Warning: Failed to save or log tokenizer: {e}\")\n",
- "\n",
- "\n",
- " # --- Sauvegarder la fonction preprocessor via pickle ---\n",
- " local_save_directory = \"content/bert-model/preprocessor\" # Attention au double \"content\" si c'est bien voulu\n",
- " local_pickle_filename = \"preprocessor.pkl\"\n",
- " local_pickle_filepath = os.path.join(local_save_directory, local_pickle_filename)\n",
- " # Sous-dossier cible dans les artefacts MLflow\n",
- " mlflow_artifact_subdir = \"preprocessor\"\n",
- " try:\n",
- " os.makedirs(local_save_directory, exist_ok=True)\n",
- " with open(local_pickle_filepath, \"wb\") as f_out:\n",
- " pickle.dump(preprocess_tweet_for_bert, f_out)\n",
- " mlflow.log_artifact(local_pickle_filepath, artifact_path=mlflow_artifact_subdir)\n",
- " except NameError:\n",
- " print(f\"\\nWarning: La fonction 'preprocess_tweet_for_bert' n'est pas définie. Impossible de la sauvegarder.\\n\")\n",
- " except Exception as e:\n",
- " print(f\"\\nWarning: Impossible de sauvegarder (pickle) ou logger la fonction de prétraitement : {e}\\n\")\n",
- "\n",
- "\n",
- " # Enregistrer le fichier requirements.txt\n",
- " requirements_path = \"content/bert-model/requirements.txt\"\n",
- " try:\n",
- " with open(requirements_path, 'w') as f:\n",
- " import sys\n",
- " subprocess.check_call([sys.executable, '-m', 'pip', 'freeze'], stdout=f)\n",
- " except subprocess.CalledProcessError as e:\n",
- " print(f\"Warning: Failed to generate requirements.txt: {e}. Logging without pip_requirements.\")\n",
- " requirements_path = None\n",
- " except Exception as e:\n",
- " print(f\"An unexpected error occurred during requirements generation: {e}\")\n",
- " requirements_path = None\n",
- "\n",
- " # --- Enregistrer le modèle PyTorch sans input_example ---\n",
- " try:\n",
- " mlflow.pytorch.log_model(\n",
- " pytorch_model=model,\n",
- " artifact_path=\"model\", # Simplement \"model\" pour être cohérent\n",
- " signature=signature,\n",
- " pip_requirements=requirements_path if requirements_path else None\n",
- " )\n",
- " print(f\"Model '{model_name}' logged to MLflow artifact path 'model_{model_name}'.\")\n",
- " except Exception as e:\n",
- " print(f\"FATAL: Error logging PyTorch model to MLflow: {e}\")\n",
- " return None\n",
- "\n",
- " print(f\"MLflow logging attempt finished for run '{run.info.run_id}'.\")\n",
- "\n",
- " return run.info.run_id"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "o1uxWQimT76g"
- },
- "source": [
- "## Entrainement du modèle : `DistilBertForSequenceClassification`\n",
- "\n",
- "[DistilBertForSequenceClassification](https://huggingface.co/docs/transformers/model_doc/distilbert#transformers.DistilBertForSequenceClassification) est un modèle basé sur **DistilBERT** avec **une couche de classification ou de régression ajoutée à la tête (head)**. Il est conçu pour les tâches de **classification de séquence**.\n",
- "\n",
- "**DistilBertForSequenceClassification** est une version allégée de BERT, idéale pour des tâches de classification de texte. Il est facile à utiliser grâce aux classes `AutoTokenizer` et `AutoModel`, et il prend en charge plusieurs types de classification (mono-étiquette, multi-étiquettes). Il s’intègre naturellement avec **PyTorch** et peut être fine-tuné sur des tâches spécifiques.\n",
- "\n",
- "#### 📌 **Caractéristiques principales :** \n",
- "- **Hérite de `PreTrainedModel`**, ce qui lui permet d’utiliser les fonctionnalités standards des modèles pré-entraînés (téléchargement, sauvegarde, ajustement des embeddings, etc.). \n",
- "- **Sous-classe de `torch.nn.Module`**, donc il fonctionne comme un module PyTorch classique. \n",
- "- Utilisé pour **la classification de texte** (binaire, multi-classes ou multi-étiquettes). \n",
- "\n",
- "### ⚙️ **Méthode `forward` (passage avant du modèle)** \n",
- "\n",
- "**Entrées possibles :** \n",
- "- `input_ids` : Identifiants des tokens dans le vocabulaire (obtenus avec un tokenizer). \n",
- "- `attention_mask` : Masque pour ignorer les tokens de padding (1 = pris en compte, 0 = ignoré). \n",
- "- `head_mask` : Masque pour désactiver certaines têtes d’attention. \n",
- "- `inputs_embeds` : Embeddings d’entrée à utiliser à la place de `input_ids`. \n",
- "- `labels` : Étiquettes pour la classification, utilisées pour calculer la perte (`CrossEntropy` ou `MSE` selon `num_labels`). \n",
- "\n",
- "**Sorties possibles :** \n",
- "- `loss` : Perte (si `labels` est fourni). \n",
- "- `logits` : Scores de classification (avant application de **Softmax**). \n",
- "- `hidden_states` : États cachés de toutes les couches du modèle (si demandé). \n",
- "- `attentions` : Poids des mécanismes d’attention (si demandé). \n",
- "\n",
- "### Analyse de sentiment de tweet\n",
- "\n",
- "Pour une **analyse de sentiment de tweet** avec **deux classes distinctes** (0 = négatif, 1 = positif), il faut utiliser **une classification simple** (**single-label classification**). \n",
- "\n",
- "- Chaque tweet appartient **exclusivement** à une seule catégorie (**négatif ou positif, mais pas les deux**). \n",
- "- La classification **multi-étiquettes** est utilisée lorsque **plusieurs catégories peuvent s’appliquer simultanément** (ex : un tweet peut être à la fois « joyeux » et « informatif »). \n",
- "\n",
- "### 🔹 **Comment configurer le modèle pour une classification binaire ?**\n",
- "\n",
- "1. Charger un modèle pré-entraîné et indiquer `num_labels=2`.\n",
- "2. Le modèle renverra 0 ou 1, indiquant si le tweet est négatif ou positif. \n",
- "\n",
- "Pour entraîner le modèle sur un dataset personnalisé (ex : tweets annotés manuellement), il faudra fine-tuner DistilBERT avec une **Cross-Entropy Loss** adaptée à la classification binaire.\n",
- "\n",
- "### Documentation\n",
- "\n",
- "- `distilbert-base-uncased` : https://huggingface.co/docs/transformers/model_doc/distilbert"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "kVj7LqF-bZGq"
- },
- "outputs": [],
- "source": [
- "# FONCTION PRINCIPALE D'ENTRAÎNEMENT\n",
- "def train_bert_sentiment(data_path, model_name=\"distilbert-base-uncased\", batch_size=4, epochs=3, sample_size=20000):\n",
- " \"\"\"\n",
- " Fonction principale pour l'entraînement du modèle DistilBERT sur une tâche d'analyse de sentiments.\n",
- " \"\"\"\n",
- "\n",
- " # Définir les paramètres\n",
- " params = {\n",
- " 'model_name': model_name,\n",
- " 'batch_size': batch_size,\n",
- " 'learning_rate': 2e-5,\n",
- " 'epochs': epochs,\n",
- " 'max_length': 128,\n",
- " 'sample_size': sample_size\n",
- " }\n",
- "\n",
- " # Charger les données\n",
- " print(\"Chargement du dataset...\")\n",
- " column_names = ['target', 'ids', 'date', 'flag', 'user', 'text']\n",
- "\n",
- " try:\n",
- " raw_data = pd.read_csv(data_path, encoding='utf-8', names=column_names)\n",
- " except UnicodeDecodeError:\n",
- " print(\"Lecture du fichier en latin-1...\")\n",
- " raw_data = pd.read_csv(data_path, encoding='latin-1', names=column_names)\n",
- "\n",
- " # Préparer les données\n",
- " print(\"Préparation des données...\")\n",
- " data_splits = prepare_data(raw_data, sample_size=sample_size)\n",
- "\n",
- " # Initialiser le tokenizer et le modèle\n",
- " print(\"Initialisation du modèle DistilBERT...\")\n",
- " tokenizer = DistilBertTokenizer.from_pretrained(model_name)\n",
- " model = DistilBertForSequenceClassification.from_pretrained(\n",
- " model_name,\n",
- " num_labels=2 # Sentiment binaire (0 = négatif, 1 = positif)\n",
- " )\n",
- "\n",
- " # Ajustement du batch size selon la mémoire GPU\n",
- " adjusted_batch_size = min(8, batch_size)\n",
- " print(f\"Batch size ajusté à {adjusted_batch_size} pour économiser la mémoire GPU.\")\n",
- "\n",
- " # Création des datasets et des dataloaders\n",
- " train_dataset = TweetDataset(data_splits['train']['texts'], data_splits['train']['labels'], tokenizer)\n",
- " val_dataset = TweetDataset(data_splits['val']['texts'], data_splits['val']['labels'], tokenizer)\n",
- " test_dataset = TweetDataset(data_splits['test']['texts'], data_splits['test']['labels'], tokenizer)\n",
- "\n",
- " train_loader = DataLoader(train_dataset, batch_size=adjusted_batch_size, shuffle=True)\n",
- " val_loader = DataLoader(val_dataset, batch_size=adjusted_batch_size * 2)\n",
- " test_loader = DataLoader(test_dataset, batch_size=adjusted_batch_size * 2)\n",
- "\n",
- " # Détection du device (GPU/CPU)\n",
- " device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
- " print(f\"Utilisation de : {device}\")\n",
- "\n",
- " # Déplacement du modèle sur le device\n",
- " model.to(device)\n",
- "\n",
- " # Entraînement du modèle\n",
- " print(\"Début de l'entraînement...\")\n",
- "\n",
- " # Ajustement de l'accumulation de gradients\n",
- " gradient_accumulation_steps = max(1, 16 // adjusted_batch_size) # Éviter des valeurs trop élevées\n",
- " print(f\"Accumulation de gradient ajustée à {gradient_accumulation_steps} étapes.\")\n",
- "\n",
- " history, metrics = train_model(\n",
- " model,\n",
- " train_loader,\n",
- " val_loader,\n",
- " test_loader,\n",
- " device,\n",
- " epochs=epochs,\n",
- " gradient_accumulation_steps=gradient_accumulation_steps\n",
- " )\n",
- "\n",
- " # Enregistrement du modèle dans MLflow\n",
- " print(\"Enregistrement du modèle dans MLflow...\")\n",
- " run_id = log_model_to_mlflow(model, tokenizer, model_name, metrics, history, params)\n",
- "\n",
- " # Tracer et enregistrer l'historique d'entraînement\n",
- " plot_training_history(history, model_name, run_id)\n",
- "\n",
- " # Retourner le modèle entraîné et le tokenizer\n",
- " return {\n",
- " 'model': model,\n",
- " 'tokenizer': tokenizer,\n",
- " 'metrics': metrics,\n",
- " 'run_id': run_id\n",
- " }\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 1000,
- "referenced_widgets": [
- "f4c7033b02a2493085d1ac0cfac9cccf",
- "3d5883b5f0bb4098bda8599622824948",
- "3502027e67de4c36b46688597314fb2e",
- "4db20c46a69043fdb7d29ccaa5f03e12",
- "eb20692f8413420f9ca58df09b2d5feb",
- "e47e179020f54e5b84017148d09480e9",
- "e23da7120310469798127dfbf039919e",
- "44325b25ca5f41d2a5ff31e6cdcf179f",
- "b6aead1ab91f4ad1a903009b95c39036",
- "2eadd184b69d41a696fed5c7bc5b1843",
- "a52850e715624d3986a292dca1e6fa62",
- "2bd37c30fbe74e3eb9f7d0a660b94772",
- "5a904bdfc6e3488b963f9952ed7936c9",
- "63840ffc38eb4932b39d00edfcbe5f15",
- "a994789a34be47ffbafa558d1a15821d",
- "9acf152a8b914b9faadc6a6a11f7300b",
- "d20225cccfc64b0ba25c555cf5a3efba",
- "0e164b5d9d17436d8cb259187680274c",
- "716f683828664694823b072c3811c7c5",
- "d52088f4990f492bb35d1f54c419637d",
- "cf42f21334ba4e7e9c83edb6d2f95871",
- "cc9639e12a1448a580b3794087a09ad1",
- "502800fba0c04ec6b54b83a1e9fbfc11",
- "b5cc33676b3648fd9f341bbdb5a31de5",
- "0793c0a09e3b4ec6832080435b507ffa",
- "771269ab33bf4b68b5a4acd4cada3de9",
- "84cd157aa0884ec5b6629011f678339f",
- "12e78de1f0eb45e59ce29473694e6895",
- "d7d394ea510749f7b1820274c0553db2",
- "10faa872bd504fa49fc1cf05c58ce391",
- "b9c7bef298474c949940154207dea96a",
- "d7fd75e7490946f29f20b0b4ed63ef3c",
- "adb66ec7c3fd46089ff61496e4db9e02",
- "e333785179dd45d89ae039fd7e6361da",
- "bac5e480209c4cd09cb3b891dd7683f3",
- "48b5dc12ca9241a7955b798e2b204792",
- "8cca18086a53470894d018a04a8bc2be",
- "340dc17022ec42e9ba4e61726711566a",
- "58026471ff914aaeba005c52aab2db47",
- "4db07c2a0409413384cfe1ca0dc08ff4",
- "c764fa8136b24134a8b92649d91eb854",
- "f828ba130d4b42a580f10d8879f1a1fd",
- "f35f52483ef240c3adab0cce32a7b818",
- "360c34394459499ea4c3b4ba3367ba39",
- "f05015da03d84663852c114110489c96",
- "a44c09d432ba40a589247626a09cfe34",
- "89896a47fccc4fb4915014b4f0b7048b",
- "9a86ae6790d84aa1866eaba2d1df3216",
- "214fc3b57b6c4697a1632038fd7a40fa",
- "a60693496b574f659ecd8be5feb863fd",
- "e50178d16de24d03bc38804424557a05",
- "dee2c3aa487545cba7e32834d11ea883",
- "7c173af0d57c497ca04a7fb5320a5f8d",
- "198afd4b3f094ffc8354b69d987334b4",
- "326ff209eb5741e793ccc3696e65b58c"
- ]
- },
- "executionInfo": {
- "elapsed": 3417524,
- "status": "ok",
- "timestamp": 1752355021870,
- "user": {
- "displayName": "Grégoire",
- "userId": "01249298206117462766"
- },
- "user_tz": -120
- },
- "id": "8Y3ycjLlT76h",
- "outputId": "c1430b51-ecc5-47f3-8b5b-00e5cebfbfee"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Chargement du dataset...\n",
- "Lecture du fichier en latin-1...\n",
- "Préparation des données...\n",
- "Prétraitement des tweets...\n",
- "Initialisation du modèle DistilBERT...\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/usr/local/lib/python3.11/dist-packages/huggingface_hub/utils/_auth.py:94: UserWarning: \n",
- "The secret `HF_TOKEN` does not exist in your Colab secrets.\n",
- "To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session.\n",
- "You will be able to reuse this secret in all of your notebooks.\n",
- "Please note that authentication is recommended but still optional to access public models or datasets.\n",
- " warnings.warn(\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "f4c7033b02a2493085d1ac0cfac9cccf",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "tokenizer_config.json: 0%| | 0.00/48.0 [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "2bd37c30fbe74e3eb9f7d0a660b94772",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "vocab.txt: 0%| | 0.00/232k [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "502800fba0c04ec6b54b83a1e9fbfc11",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "tokenizer.json: 0%| | 0.00/466k [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "e333785179dd45d89ae039fd7e6361da",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "config.json: 0%| | 0.00/483 [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "f05015da03d84663852c114110489c96",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "model.safetensors: 0%| | 0.00/268M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Some weights of DistilBertForSequenceClassification were not initialized from the model checkpoint at distilbert-base-uncased and are newly initialized: ['classifier.bias', 'classifier.weight', 'pre_classifier.bias', 'pre_classifier.weight']\n",
- "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Batch size ajusté à 8 pour économiser la mémoire GPU.\n",
- "Utilisation de : cuda\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/tmp/ipython-input-11-3727908452.py:49: FutureWarning: `torch.cuda.amp.GradScaler(args...)` is deprecated. Please use `torch.amp.GradScaler('cuda', args...)` instead.\n",
- " scaler = GradScaler()\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Début de l'entraînement...\n",
- "Accumulation de gradient ajustée à 2 étapes.\n",
- "\n",
- "=== Epoch 1/20 ===\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Training: 100%|██████████| 8000/8000 [05:45<00:00, 23.16it/s]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Train Loss: 0.4394, Train Accuracy: 0.8031, Train Precision: 0.8034\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Validation: 100%|██████████| 1000/1000 [01:01<00:00, 16.24it/s]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Val Loss: 0.3890, Val Accuracy: 0.8237, Val Precision: 0.8271, Val Recall: 0.8196\n",
- "New best model saved based on val_precision.\n",
- "\n",
- "=== Epoch 2/20 ===\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Training: 100%|██████████| 8000/8000 [05:43<00:00, 23.32it/s]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Train Loss: 0.3690, Train Accuracy: 0.8485, Train Precision: 0.8531\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Validation: 100%|██████████| 1000/1000 [01:01<00:00, 16.31it/s]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Val Loss: 0.4044, Val Accuracy: 0.8261, Val Precision: 0.8585, Val Recall: 0.7820\n",
- "New best model saved based on val_precision.\n",
- "No val_loss improvement. Patience: 1/7\n",
- "\n",
- "=== Epoch 3/20 ===\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Training: 100%|██████████| 8000/8000 [05:43<00:00, 23.29it/s]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Train Loss: 0.3252, Train Accuracy: 0.8739, Train Precision: 0.8764\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Validation: 100%|██████████| 1000/1000 [01:01<00:00, 16.30it/s]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Val Loss: 0.4862, Val Accuracy: 0.8305, Val Precision: 0.8485, Val Recall: 0.8058\n",
- "No val_loss improvement. Patience: 2/7\n",
- "\n",
- "=== Epoch 4/20 ===\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Training: 100%|██████████| 8000/8000 [05:39<00:00, 23.53it/s]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Train Loss: 0.2858, Train Accuracy: 0.8981, Train Precision: 0.9007\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Validation: 100%|██████████| 1000/1000 [01:01<00:00, 16.27it/s]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Val Loss: 0.4425, Val Accuracy: 0.8290, Val Precision: 0.8427, Val Recall: 0.8101\n",
- "No val_loss improvement. Patience: 3/7\n",
- "\n",
- "=== Epoch 5/20 ===\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Training: 100%|██████████| 8000/8000 [05:39<00:00, 23.55it/s]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Train Loss: 0.2207, Train Accuracy: 0.9297, Train Precision: 0.9331\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Validation: 100%|██████████| 1000/1000 [01:01<00:00, 16.27it/s]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Val Loss: 0.5597, Val Accuracy: 0.8371, Val Precision: 0.8329, Val Recall: 0.8444\n",
- "No val_loss improvement. Patience: 4/7\n",
- "\n",
- "=== Epoch 6/20 ===\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Training: 100%|██████████| 8000/8000 [05:40<00:00, 23.52it/s]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Train Loss: 0.1950, Train Accuracy: 0.9413, Train Precision: 0.9433\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Validation: 100%|██████████| 1000/1000 [01:01<00:00, 16.26it/s]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Val Loss: 0.5975, Val Accuracy: 0.8342, Val Precision: 0.8513, Val Recall: 0.8109\n",
- "No val_loss improvement. Patience: 5/7\n",
- "\n",
- "=== Epoch 7/20 ===\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Training: 100%|██████████| 8000/8000 [05:39<00:00, 23.56it/s]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Train Loss: 0.1738, Train Accuracy: 0.9499, Train Precision: 0.9525\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Validation: 100%|██████████| 1000/1000 [01:01<00:00, 16.32it/s]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Val Loss: 0.6491, Val Accuracy: 0.8343, Val Precision: 0.8456, Val Recall: 0.8189\n",
- "No val_loss improvement. Patience: 6/7\n",
- "\n",
- "=== Epoch 8/20 ===\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Training: 100%|██████████| 8000/8000 [05:39<00:00, 23.58it/s]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Train Loss: 0.1501, Train Accuracy: 0.9583, Train Precision: 0.9594\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Validation: 100%|██████████| 1000/1000 [01:01<00:00, 16.27it/s]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Val Loss: 0.6904, Val Accuracy: 0.8323, Val Precision: 0.8382, Val Recall: 0.8247\n",
- "No val_loss improvement. Patience: 7/7\n",
- "EarlyStopping activated.\n",
- "Best model loaded for evaluation.\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Évaluation sur le jeu de test: 100%|██████████| 1250/1250 [01:16<00:00, 16.28it/s]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Enregistrement du modèle dans MLflow...\n",
- "Model signature inferred successfully.\n",
- "Model logged to MLflow artifact path 'model'.\n",
- "Tokenizer logged to MLflow artifact path 'tokenizer'.\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025/07/12 21:16:52 WARNING mlflow.models.model: `artifact_path` is deprecated. Please use `name` instead.\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Model 'distilbert-base-uncased' logged to MLflow artifact path 'model_distilbert-base-uncased'.\n",
- "MLflow logging attempt finished for run 'f73e340c220c48bfa23ed135e16ab844'.\n",
- "🏃 View run Model_Bert-distilbert-base-uncased at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/1/runs/f73e340c220c48bfa23ed135e16ab844\n",
- "🧪 View experiment at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/1\n",
- "🏃 View run Model_Bert-distilbert-base-uncased at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/1/runs/f73e340c220c48bfa23ed135e16ab844\n",
- "🧪 View experiment at: https://mlflow.greg-madman-nas.duckdns.org/#/experiments/1\n"
- ]
- },
- {
- "data": {
- "image/png": "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366IZmRk3LGPKlWqKD093ey+ly5dUkxMjAIDA+/6mf6pZs2aGj58uHbs2KHHHntMixcvtuj9AJBfkEgCyFWdO3fWI488ojZt2uinn37S6dOntXnzZvXr109nz56VJPXv318TJkzQypUrdezYMb322mtZ9oD8u3LlyikiIkLdu3fXypUrTX0uWbJEklS2bFkZDAatXr1aFy5cyPYpOhUrVlSbNm3Us2dPbdu2TQcOHNBLL72kkiVLqk2bNjn6bKdPn9bw4cMVHR2t33//XevXr9fx48eZJwngoUUiCSBXFSpUSFu3blWZMmXUvn17ValSRT169NDNmzfl4eEhSXrjjTfUpUsXRUREKDg4WIULF1a7du3u2u/s2bP13HPP6bXXXlPlypXVs2dPXbt2TZJUsmRJjRkzRsOGDZOvr6/69u2bbR/z589X7dq11bp1awUHB8toNOr777/PMpx9t8927NgxhYeH69FHH1WvXr0UGRmpV1991YJvCADyD4Pxn5u3AQAAADlARRIAAABWIZEEAACAVUgkAQAAYBUSSQAAAFiFRBIAAABWIZEEAACAVUgkAQAAYBUSSQAAAFiFRBIAAABWIZEEAACAVUgkAQAAYBUSSQAAAFjl/wCv2Whgw70JXwAAAABJRU5ErkJggg==\n",
- "text/plain": [
- "