sebtick's picture
Update app.py
d4ccf04 verified
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"""
<style>
.stApp {{
background-color: {background_color};
}}
textarea {{
border: 2px solid #5DADE2 !important;
border-radius: 10px !important;
background-color: #ffffff !important;
}}
</style>
""",
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(
"""
<p style="margin-top:20px; text-align:center;">
<em>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.</em>
</p>
""",
unsafe_allow_html=True
)
# --- Barre colorée de score ---
color = sentiment_color(score)
st.markdown(
f"""
<div style="margin:10px 0;">
<div style="height:20px;width:100%;background:linear-gradient(to right, {color} {score*100}%, #d3d3d3 {score*100}%);border-radius:10px;"></div>
<center><small><b>Score de confiance : {score:.0%}</b></small></center>
</div>
""",
unsafe_allow_html=True
)
# --- Affichage de l'historique des analyses ---
if st.session_state.history:
st.markdown("---")
st.subheader("📄 Historique des Analyses")
df_history = pd.DataFrame(st.session_state.history)
st.dataframe(df_history)
# --- Téléchargement de l'historique en CSV ---
csv = df_history.to_csv(index=False)
buffer = io.BytesIO()
buffer.write(csv.encode())
buffer.seek(0)
st.download_button(
label="📥 Télécharger l'historique en CSV",
data=buffer,
file_name="historique_sentiment.csv",
mime="text/csv"
)
# --- Footer avec crédits modèles ---
st.markdown("---")
st.markdown(
"""
🔗 [Voir le modèle de sentiment utilisé](https://huggingface.co./tabularisai/multilingual-sentiment-analysis)
🔗 [Voir le modèle de détection de langue utilisé](https://huggingface.co./papluca/xlm-roberta-base-language-detection)
"""
)