import gradio as gr from transformers import pipeline APP_NAME = "MoodMapper" MODEL_ID = "j-hartmann/emotion-english-distilroberta-base" # garde celui-ci pour l’instant _clf = None def get_clf(): global _clf if _clf is None: _clf = pipeline( "text-classification", model=MODEL_ID, return_all_scores=True, truncation=True ) return _clf EXAMPLES = [ "I just got the internship — I'm so happy!", "Je suis déçue et un peu en colère par ce mail.", "This is fine, nothing special today.", "I'm worried about the deadline...", "Quelle surprise ! Je ne m’y attendais pas." ] def predict_emotion(text): try: if not text or not text.strip(): return {"": 0.0}, "Veuillez entrer un texte." scores = get_clf()(text)[0] # [{'label': 'joy', 'score': 0.97}, ...] score_dict = {s["label"]: float(s["score"]) for s in scores} top = max(scores, key=lambda d: d["score"]) notes = ( f"**Émotion prédite :** {top['label']} ({top['score']*100:.1f}%)\n\n" "- Fonctionne mieux sur des phrases courtes et explicites.\n" "- Modèle surtout entraîné en anglais ; le français simple passe quand même.\n" "- L'ironie et le sarcasme peuvent tromper le modèle." ) return score_dict, notes except Exception as e: # Renvoie un message clair dans l’UI plutôt qu’un crash return {"error": 1.0}, f"Erreur interne : {e}" with gr.Blocks(title=APP_NAME) as demo: gr.Markdown(f"# {APP_NAME} — Détecteur d'émotions (texte)") txt = gr.Textbox(label="Votre texte", placeholder="Ex: Je suis déçue et un peu en colère par ce mail.", lines=3) btn = gr.Button("Analyser") out_scores = gr.Label(label="Scores (confiances)") out_notes = gr.Markdown() gr.Examples(inputs=txt, examples=EXAMPLES, label="Exemples à tester") btn.click(predict_emotion, txt, [out_scores, out_notes]) txt.submit(predict_emotion, txt, [out_scores, out_notes]) # IMPORTANT sur Hugging Face Spaces: ne pas appeler demo.launch() app = demo