Isaacdsn1 commited on
Commit
46a0f9c
·
verified ·
1 Parent(s): 2bd0d4f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +121 -27
app.py CHANGED
@@ -1,33 +1,127 @@
1
  import gradio as gr
2
- import joblib
3
- import numpy as np
4
  import os
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
- MODEL_PATH = os.getenv("MODEL_PATH", "baseline_pipe.pkl")
7
-
8
- baseline = None
9
- if os.path.exists(MODEL_PATH):
10
- baseline = joblib.load(MODEL_PATH)
11
-
12
- def predict_sentiment(text: str):
13
- if not text or text.strip() == "":
14
- return {"predição": "n/a", "confiança": 0.0}
15
- if baseline is None:
16
- # Mensagem amigável quando o modelo ainda não foi enviado
17
- return {"erro": "Modelo não encontrado. Envie baseline_pipe.pkl nos Files do Space."}
18
- proba = baseline.predict_proba([text])[0]
19
- pred = int(np.argmax(proba))
20
- label = "positivo" if pred == 1 else "negativo"
21
- conf = float(np.max(proba))
22
- return {"predição": label, "confiança": conf}
23
-
24
- demo = gr.Interface(
25
- fn=predict_sentiment,
26
- inputs=gr.Textbox(label="Digite uma avaliação de produto"),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  outputs=gr.JSON(label="Resultado"),
28
- title="Análise de Sentimentos (Amazon Polarity)",
29
- description="Envie o arquivo baseline_pipe.pkl na aba Files para ativar o modelo."
30
  )
31
 
32
- if __name__ == "__main__":
33
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import gradio as gr
 
 
2
  import os
3
+ import joblib
4
+ import pandas as pd
5
+ from datasets import load_dataset
6
+ from sklearn.pipeline import Pipeline
7
+ from sklearn.feature_extraction.text import TfidfVectorizer
8
+ from sklearn.linear_model import LogisticRegression
9
+ from transformers import pipeline
10
+
11
+
12
+ BASELINE_PATH = "baseline_pipe.pkl"
13
+
14
+
15
+ # ============================================================
16
+ # 1) Função para treinar automaticamente o modelo baseline
17
+ # ============================================================
18
+ def treinar_baseline():
19
+ print("➡️ Nenhum baseline encontrado. Treinando modelo TF-IDF + Regressão Logística...")
20
+
21
+ ds = load_dataset("amazon_polarity", split="train")
22
+ ds_small = ds.shuffle(seed=42).select(range(8000)) # rápido para HF Spaces
23
+ df = pd.DataFrame({"text": ds_small["content"], "label": ds_small["label"]})
24
+
25
+ pipe = Pipeline([
26
+ ("tfidf", TfidfVectorizer(max_features=20000, ngram_range=(1, 2))),
27
+ ("clf", LogisticRegression(max_iter=1000))
28
+ ])
29
+
30
+ pipe.fit(df["text"], df["label"])
31
+ joblib.dump(pipe, BASELINE_PATH)
32
+
33
+ print("✔ Modelo baseline treinado e salvo!")
34
+ return pipe
35
+
36
+
37
+ # ============================================================
38
+ # 2) Carregar modelo baseline
39
+ # ============================================================
40
+ def load_or_train():
41
+ if os.path.exists(BASELINE_PATH):
42
+ print("✔ baseline_pipe.pkl encontrado! Carregando...")
43
+ return joblib.load(BASELINE_PATH)
44
+ return treinar_baseline()
45
+
46
+
47
+ baseline_model = load_or_train()
48
+
49
+
50
+ # ============================================================
51
+ # 3) IA Generativa (sem token)
52
+ # ============================================================
53
+ generator = pipeline("text2text-generation", model="google/flan-t5-base")
54
+
55
 
56
+ def resposta_chatbot(texto):
57
+ prompt = f"""
58
+ Você é um assistente de suporte educado, direto e profissional.
59
+ Responda de forma curta e natural.
60
+ Pergunta: {texto}
61
+ Resposta:
62
+ """
63
+ out = generator(prompt, max_length=128)
64
+ return out[0]["generated_text"]
65
+
66
+
67
+ # ============================================================
68
+ # 4) Classificação de sentimento
69
+ # ============================================================
70
+ def analisar_sentimento(texto):
71
+ label = baseline_model.predict([texto])[0]
72
+ prob = baseline_model.predict_proba([texto])[0].max()
73
+
74
+ sentimento = "positivo" if label == 1 else "negativo"
75
+ return {
76
+ "sentimento": sentimento,
77
+ "confianca": round(float(prob), 3)
78
+ }
79
+
80
+
81
+ # ============================================================
82
+ # 5) Interface Gradio
83
+ # ============================================================
84
+ def interface_sentimento(texto):
85
+ try:
86
+ return analisar_sentimento(texto)
87
+ except Exception as e:
88
+ return {"erro": str(e)}
89
+
90
+
91
+ def interface_chatbot(texto, histórico):
92
+ resposta = resposta_chatbot(texto)
93
+ histórico.append((texto, resposta))
94
+ return histórico, histórico
95
+
96
+
97
+ # ============================================================
98
+ # Aba de análise
99
+ # ============================================================
100
+ aba1 = gr.Interface(
101
+ fn=interface_sentimento,
102
+ inputs=gr.Textbox(label="Digite uma avaliação"),
103
  outputs=gr.JSON(label="Resultado"),
 
 
104
  )
105
 
106
+
107
+ # ============================================================
108
+ # Aba de chatbot
109
+ # ============================================================
110
+ with gr.Blocks() as aba2:
111
+ gr.Markdown("# Chatbot (IA Generativa)")
112
+
113
+ chatbot = gr.Chatbot()
114
+ entrada = gr.Textbox(label="Digite sua mensagem")
115
+
116
+ entrada.submit(interface_chatbot, [entrada, chatbot], [chatbot, chatbot])
117
+
118
+
119
+ # ============================================================
120
+ # Tabs principais
121
+ # ============================================================
122
+ demo = gr.TabbedInterface(
123
+ [aba1, aba2],
124
+ ["Análise de Sentimentos", "Chatbot IA"]
125
+ )
126
+
127
+ demo.launch()