import streamlit as st from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification import pandas as pd import torch import io # --- Configuration générale de la page --- st.set_page_config( page_title="🌍 Analyseur de Sentiment Multilingue", page_icon="🎯", layout="centered", ) # --- Choix du thème (clair/sombre) par l'utilisateur --- theme = st.sidebar.selectbox("🎨 Choisissez le thème :", ["Clair", "Sombre"]) if theme == "Clair": background_color = "#f0f2f6" else: background_color = "#222222" # --- Application du fond selon le thème choisi --- st.markdown( f""" """, unsafe_allow_html=True ) # --- Chargement des modèles IA --- @st.cache_resource def load_sentiment_model(): """Charge le modèle de détection de sentiment.""" return pipeline("text-classification", model="tabularisai/multilingual-sentiment-analysis") @st.cache_resource def load_language_model(): """Charge le modèle de détection de langue.""" tokenizer = AutoTokenizer.from_pretrained("papluca/xlm-roberta-base-language-detection") model = AutoModelForSequenceClassification.from_pretrained("papluca/xlm-roberta-base-language-detection") return tokenizer, model sentiment_model = load_sentiment_model() tokenizer_lang, model_lang = load_language_model() # --- Fonction de détection de langue avec IA --- def detect_language(text): """Détecte automatiquement la langue du texte fourni.""" inputs = tokenizer_lang(text, return_tensors="pt", truncation=True, max_length=512) outputs = model_lang(**inputs) predicted_class = torch.argmax(outputs.logits, dim=1) label = model_lang.config.id2label[predicted_class.item()] return label # --- Initialisation de l'historique si non existant --- if 'history' not in st.session_state: st.session_state.history = [] # --- Fonction pour calculer la couleur de la barre selon le score --- def sentiment_color(score): """Retourne une couleur RGB en fonction du score de confiance.""" red = int(255 * (1 - score)) green = int(255 * score) return f'rgb({red},{green},0)' # --- Interface principale --- st.title("🎯 Analyseur de Sentiment Multilingue") st.write("Cette application utilise deux modèles d'IA pour détecter la langue et analyser le sentiment d'un texte.") # --- Saisie utilisateur --- user_input = st.text_area("✍️ Entrez vos phrases séparées par un point-virgule ';'", height=180) # --- Bouton pour déclencher l'analyse --- if st.button("🔎 Analyser"): if not user_input.strip(): st.warning("⚠️ Merci d'entrer au moins une phrase complète.") else: phrases = [phrase.strip() for phrase in user_input.split(';') if phrase.strip()] st.info(f"Nombre de phrases détectées : {len(phrases)}") results = [] # --- Traitement de chaque phrase --- with st.spinner("Analyse en cours... ⏳"): for phrase in phrases: # Détection de la langue try: lang = detect_language(phrase) except Exception as e: lang = "Erreur" # Analyse du sentiment analysis = sentiment_model(phrase)[0] sentiment = analysis["label"] score = round(analysis["score"], 2) # Stockage des résultats result_entry = { "Texte": phrase, "Langue": lang, "Sentiment": sentiment, "Score": score } results.append(result_entry) st.session_state.history.append(result_entry) # --- Affichage des résultats pour chaque phrase --- if "negative" in sentiment.lower(): st.toast("🚨 Sentiment négatif détecté !", icon="⚡") st.error(f"😞 Texte : {phrase}") elif "positive" in sentiment.lower(): st.balloons() st.success(f"😊 Texte : {phrase}") else: st.warning(f"😐 Texte : {phrase}") # --- Explication du slider de confiance --- st.markdown( """
Le score de confiance indique la certitude du modèle concernant l'émotion détectée. Plus le score est élevé, plus la prédiction est fiable.
""", unsafe_allow_html=True ) # --- Barre colorée de score --- color = sentiment_color(score) st.markdown( f"""