File size: 6,405 Bytes
546c04a
b811a27
e6455d3
b811a27
991ed79
546c04a
d4ccf04
8085a83
d4ccf04
9449219
8085a83
 
546c04a
d4ccf04
991ed79
 
 
 
 
 
d4ccf04
e6455d3
991ed79
e6455d3
991ed79
 
 
 
 
 
 
 
e6455d3
 
 
 
 
d4ccf04
546c04a
b811a27
d4ccf04
546c04a
 
b811a27
 
d4ccf04
b811a27
 
 
 
 
 
 
d4ccf04
b811a27
d4ccf04
b811a27
 
 
 
 
546c04a
d4ccf04
991ed79
 
 
d4ccf04
991ed79
d4ccf04
991ed79
 
 
546c04a
991ed79
d4ccf04
 
991ed79
d4ccf04
991ed79
9449219
d4ccf04
9449219
e6455d3
991ed79
546c04a
e6455d3
 
 
 
d4ccf04
991ed79
e6455d3
d4ccf04
e6455d3
b811a27
 
 
e6455d3
d4ccf04
b811a27
9449219
 
 
d4ccf04
991ed79
e6455d3
 
9449219
 
991ed79
 
 
e6455d3
d4ccf04
9449219
991ed79
9449219
 
991ed79
9449219
 
 
 
d4ccf04
57784e6
 
 
 
 
 
 
 
 
d4ccf04
9449219
 
 
 
 
 
 
 
 
 
 
d4ccf04
991ed79
 
 
 
 
 
d4ccf04
991ed79
 
 
 
 
 
 
 
 
 
 
 
d4ccf04
546c04a
d4ccf04
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
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)
    """
)