Diary14 commited on
Commit
976ced4
·
verified ·
1 Parent(s): f35b027

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +63 -0
src/streamlit_app.py CHANGED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from transformers import AutoTokenizer, AutoModelForSequenceClassification
3
+ import torch
4
+ import pandas as pd
5
+
6
+ st.set_page_config(page_title="Analyse de Sentiment en Lot", page_icon="📊", layout="wide")
7
+
8
+ st.title("📊 Analyse de Sentiment Multiline (Batch Processing)")
9
+ st.write("Collez un ou plusieurs avis (un par ligne) pour les analyser simultanément avec RoBERTa.")
10
+
11
+ # Chargement du modèle mis en cache
12
+ @st.cache_resource
13
+ def load_model():
14
+ model_id = "TON_PSEUDO_HF/TON_MODELE" # ⚠️ À remplacer
15
+ tokenizer = AutoTokenizer.from_pretrained(model_id)
16
+ model = AutoModelForSequenceClassification.from_pretrained(model_id)
17
+ return tokenizer, model
18
+
19
+ with st.spinner("Chargement du modèle..."):
20
+ tokenizer, model = load_model()
21
+
22
+ # Zone de saisie : l'utilisateur peut mettre plusieurs lignes
23
+ user_input = st.text_area(
24
+ "Entrez vos avis (un avis par ligne) :",
25
+ placeholder="Exemple :\nCe produit est top !\nJe n'aime pas du tout la texture...\nLivraison rapide.",
26
+ height=200
27
+ )
28
+
29
+ if st.button("Analyser les avis"):
30
+ # 1. Séparer le texte par ligne et enlever les lignes vides
31
+ lines = [line.strip() for line in user_input.split("\n") if line.strip() != ""]
32
+
33
+ if not lines:
34
+ st.warning("Veuillez entrer au moins un texte.")
35
+ else:
36
+ st.info(f"Analyse de {len(lines)} texte(s) en cours...")
37
+
38
+ # 2. Tokenisation du BATCH (toutes les lignes d'un coup)
39
+ # padding=True va aligner la taille des textes pour le modèle
40
+ inputs = tokenizer(lines, return_tensors="pt", truncation=True, padding=True)
41
+
42
+ # 3. Inférence
43
+ with torch.no_grad():
44
+ outputs = model(**inputs)
45
+
46
+ # 4. Récupération des prédictions pour chaque ligne
47
+ logits = outputs.logits
48
+ predictions = torch.argmax(logits, dim=-1).tolist()
49
+
50
+ # 5. Préparation des résultats pour l'affichage
51
+ results = []
52
+ for text, pred in zip(lines, predictions):
53
+ sentiment = "POSITIF ✨" if pred == 1 else "NÉGATIF 🚨"
54
+ results.append({"Texte/Avis": text, "Sentiment": sentiment})
55
+
56
+ # 6. Affichage sous forme de joli tableau interactif avec Pandas
57
+ df = pd.DataFrame(results)
58
+ st.dataframe(df, use_container_width=True)
59
+
60
+ # Optionnel : Petit résumé statistique
61
+ pos_count = sum(1 for r in results if "POSITIF" in r["Sentiment"])
62
+ neg_count = len(results) - pos_count
63
+ st.write(f"**Résumé :** {pos_count} positif(s) et {neg_count} négatif(s).")