hrlima commited on
Commit
bd13fa5
·
verified ·
1 Parent(s): 55f79c0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +22 -41
app.py CHANGED
@@ -10,7 +10,6 @@ app = Flask(__name__)
10
  # ====== CONFIGURAÇÃO FIREBASE ======
11
  try:
12
  firebase_key = os.getenv("FIREBASE_KEY")
13
-
14
  if firebase_key:
15
  cred_dict = json.loads(firebase_key)
16
  cred = credentials.Certificate(cred_dict)
@@ -22,8 +21,7 @@ try:
22
  except Exception as e:
23
  print(f"❌ Erro ao inicializar Firebase: {e}")
24
 
25
- # ====== CONFIGURAÇÃO DO MODELO ======
26
- print("🔄 Carregando modelo local pysentimiento/robertuito-emotion-analysis...")
27
  try:
28
  model_pipeline = pipeline("text-classification", model="pysentimiento/robertuito-emotion-analysis")
29
  print("✅ Modelo carregado com sucesso!")
@@ -42,53 +40,47 @@ emotion_labels = {
42
  "others": "neutro"
43
  }
44
 
45
- # ====== SUGESTÕES PERSONALIZADAS ======
46
  def gerar_sugestao(emotion_pt):
47
  sugestoes = {
48
  "tristeza": "Procure fazer algo que te acalme e traga conforto emocional.",
49
  "depressão": "Você não está sozinho. Considere conversar com alguém de confiança ou buscar apoio profissional.",
50
  "alegria": "Continue aproveitando esse momento positivo e compartilhe boas energias!",
51
  "raiva": "Afaste-se da situação e respire antes de reagir. Canalize essa energia em algo produtivo.",
52
- "ansiedade": "Tente identificar o que está te causando insegurança e dê pequenos passos para enfrentá-lo.",
53
  "insegurança": "Analise os pontos que causam insegurança e busque soluções práticas.",
54
  "neutro": "Mantenha o equilíbrio emocional e cuide de si mesmo.",
55
  "desconhecido": "Emoção não identificada com precisão."
56
  }
57
  return sugestoes.get(emotion_pt, "Mantenha o equilíbrio emocional e cuide de você mesmo.")
58
 
59
- # ====== FALLBACK LOCAL ======
60
  def fallback_emotion(text):
61
  emotion_map = {
62
- "tristeza": ["triste", "desanimado", "deprimido", "melancólico"],
63
- "ansiedade": ["ansioso", "preocupado", "tenso", "nervoso"],
64
- "insegurança": ["inseguro", "incerto", "receoso"],
65
- "raiva": ["irritado", "zangado", "revoltado", "furioso"],
66
- "alegria": ["feliz", "animado", "contente", "alegre"]
 
 
67
  }
 
68
  text_lower = text.lower()
69
- for emotion, keywords in emotion_map.items():
70
- for word in keywords:
71
- if word in text_lower:
72
- return {
73
- "status": "fallback",
74
- "emotion": emotion,
75
- "emode": [emotion],
76
- "confidence": 0.0,
77
- "suggestion": gerar_sugestao(emotion)
78
- }
79
  return {
80
  "status": "fallback",
81
- "emotion": "desconhecido",
82
- "emode": ["desconhecido"],
83
- "confidence": 0.0,
84
- "suggestion": gerar_sugestao("desconhecido")
85
  }
86
 
87
- # ====== ROTA PRINCIPAL ======
88
- @app.route("/")
89
- def home():
90
- return jsonify({"message": "API Flask funcionando no Space!", "status": "online"})
91
-
92
  # ====== ROTA DE ANÁLISE ======
93
  @app.route("/analyze", methods=["POST"])
94
  def analyze():
@@ -98,26 +90,19 @@ def analyze():
98
  return jsonify({"error": "Campo 'text' é obrigatório."}), 400
99
 
100
  text = data["text"]
101
- print(f"\n🧠 Texto recebido: {text}")
102
 
103
  if not model_pipeline:
104
- print("⚠️ Modelo indisponível, usando fallback local.")
105
  return jsonify(fallback_emotion(text))
106
 
107
- # Execução do modelo
108
  result = model_pipeline(text, return_all_scores=True)
109
  if not result or len(result) == 0:
110
  return jsonify(fallback_emotion(text))
111
 
112
- # Extraindo probabilidades
113
  scores = {r["label"]: r["score"] for r in result[0]}
114
  top_label = max(scores, key=scores.get)
115
  confidence = round(scores[top_label], 2)
116
-
117
- # Tradução
118
  emotion_pt = emotion_labels.get(top_label, "desconhecido")
119
 
120
- # Regra extra: tristeza intensa -> depressão
121
  if emotion_pt == "tristeza" and confidence >= 0.9:
122
  emotion_pt = "depressão"
123
 
@@ -130,13 +115,9 @@ def analyze():
130
  "suggestion": gerar_sugestao(emotion_pt)
131
  }
132
 
133
- print(f"✅ Análise concluída: {response}")
134
  return jsonify(response)
135
-
136
  except Exception as e:
137
- print(f"❌ Erro na rota /analyze: {e}")
138
  return jsonify({"error": str(e)}), 500
139
 
140
- # ====== EXECUÇÃO ======
141
  if __name__ == "__main__":
142
  app.run(host="0.0.0.0", port=7860)
 
10
  # ====== CONFIGURAÇÃO FIREBASE ======
11
  try:
12
  firebase_key = os.getenv("FIREBASE_KEY")
 
13
  if firebase_key:
14
  cred_dict = json.loads(firebase_key)
15
  cred = credentials.Certificate(cred_dict)
 
21
  except Exception as e:
22
  print(f"❌ Erro ao inicializar Firebase: {e}")
23
 
24
+ # ====== MODELO ======
 
25
  try:
26
  model_pipeline = pipeline("text-classification", model="pysentimiento/robertuito-emotion-analysis")
27
  print("✅ Modelo carregado com sucesso!")
 
40
  "others": "neutro"
41
  }
42
 
43
+ # ====== SUGESTÕES ======
44
  def gerar_sugestao(emotion_pt):
45
  sugestoes = {
46
  "tristeza": "Procure fazer algo que te acalme e traga conforto emocional.",
47
  "depressão": "Você não está sozinho. Considere conversar com alguém de confiança ou buscar apoio profissional.",
48
  "alegria": "Continue aproveitando esse momento positivo e compartilhe boas energias!",
49
  "raiva": "Afaste-se da situação e respire antes de reagir. Canalize essa energia em algo produtivo.",
50
+ "ansiedade": "Tente identificar o que está te causando ansiedade e dê pequenos passos para enfrentá-la.",
51
  "insegurança": "Analise os pontos que causam insegurança e busque soluções práticas.",
52
  "neutro": "Mantenha o equilíbrio emocional e cuide de si mesmo.",
53
  "desconhecido": "Emoção não identificada com precisão."
54
  }
55
  return sugestoes.get(emotion_pt, "Mantenha o equilíbrio emocional e cuide de você mesmo.")
56
 
57
+ # ====== FALLBACK APRIMORADO ======
58
  def fallback_emotion(text):
59
  emotion_map = {
60
+ "tristeza": ["triste", "desanimado", "melancólico", "chateado", "solitário", "deprimido", "abatido", "infeliz"],
61
+ "ansiedade": ["ansioso", "preocupado", "nervoso", "tenso", "inquieto", "aflito", "alarmado", "sobrecarregado"],
62
+ "insegurança": ["inseguro", "incerto", "receoso", "hesitante", "duvidoso", "apreensivo", "desconfiado"],
63
+ "raiva": ["irritado", "zangado", "raiva", "furioso", "ódio", "revoltado", "frustrado", "indignado"],
64
+ "alegria": ["feliz", "animado", "contente", "alegre", "satisfeito", "entusiasmado", "radiante", "orgulhoso"],
65
+ "depressão": ["sem esperança", "vazio", "desesperado", "sem vontade", "cansado da vida", "desamparado"],
66
+ "neutro": ["ok", "normal", "tranquilo", "indiferente", "equilibrado", "estável"]
67
  }
68
+
69
  text_lower = text.lower()
70
+ match_counts = {k: sum(1 for w in v if w in text_lower) for k, v in emotion_map.items()}
71
+ # Detecta a emoção com mais palavras-chave presentes
72
+ emotion = max(match_counts, key=match_counts.get)
73
+ if match_counts[emotion] == 0:
74
+ emotion = "neutro"
75
+
 
 
 
 
76
  return {
77
  "status": "fallback",
78
+ "emotion": emotion,
79
+ "emode": [emotion],
80
+ "confidence": 0.5 if match_counts[emotion] > 0 else 0.0,
81
+ "suggestion": gerar_sugestao(emotion)
82
  }
83
 
 
 
 
 
 
84
  # ====== ROTA DE ANÁLISE ======
85
  @app.route("/analyze", methods=["POST"])
86
  def analyze():
 
90
  return jsonify({"error": "Campo 'text' é obrigatório."}), 400
91
 
92
  text = data["text"]
 
93
 
94
  if not model_pipeline:
 
95
  return jsonify(fallback_emotion(text))
96
 
 
97
  result = model_pipeline(text, return_all_scores=True)
98
  if not result or len(result) == 0:
99
  return jsonify(fallback_emotion(text))
100
 
 
101
  scores = {r["label"]: r["score"] for r in result[0]}
102
  top_label = max(scores, key=scores.get)
103
  confidence = round(scores[top_label], 2)
 
 
104
  emotion_pt = emotion_labels.get(top_label, "desconhecido")
105
 
 
106
  if emotion_pt == "tristeza" and confidence >= 0.9:
107
  emotion_pt = "depressão"
108
 
 
115
  "suggestion": gerar_sugestao(emotion_pt)
116
  }
117
 
 
118
  return jsonify(response)
 
119
  except Exception as e:
 
120
  return jsonify({"error": str(e)}), 500
121
 
 
122
  if __name__ == "__main__":
123
  app.run(host="0.0.0.0", port=7860)