Spaces:
Running
Running
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 --- | |
def load_sentiment_model(): | |
"""Charge le modèle de détection de sentiment.""" | |
return pipeline("text-classification", model="tabularisai/multilingual-sentiment-analysis") | |
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) | |
""" | |
) | |