DHEIVER commited on
Commit
530192f
·
verified ·
1 Parent(s): fa440b2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +28 -164
app.py CHANGED
@@ -135,18 +135,11 @@ class EnhancedCoach:
135
  def analisar_tom(self, texto: str) -> Tuple[str, float]:
136
  """Analisa o tom predominante na resposta usando TextBlob e padrões lexicais."""
137
  texto_lower = texto.lower()
138
-
139
- # Análise de sentimento com TextBlob
140
  blob = TextBlob(texto)
141
-
142
- # Contagem de padrões de tom
143
  tone_scores = {}
144
  for tone, patterns in TONE_PATTERNS.items():
145
  score = sum(texto_lower.count(pattern) for pattern in patterns)
146
- # Normalize with TextBlob polarity
147
  tone_scores[tone] = score * (1 + abs(blob.sentiment.polarity))
148
-
149
- # Get predominant tone
150
  predominant_tone = max(tone_scores.items(), key=lambda x: x[1])
151
  return predominant_tone[0], predominant_tone[1]
152
 
@@ -154,11 +147,9 @@ class EnhancedCoach:
154
  """Analisa o sentimento geral da resposta."""
155
  positive_words = ["consegui", "superei", "aprendi", "melhorei", "efetivo"]
156
  negative_words = ["difícil", "desafiador", "complicado", "problema", "falha"]
157
-
158
  texto_lower = texto.lower()
159
  positive_count = sum(1 for word in positive_words if word in texto_lower)
160
  negative_count = sum(1 for word in negative_words if word in texto_lower)
161
-
162
  if positive_count > negative_count:
163
  return "positive"
164
  elif negative_count > positive_count:
@@ -176,186 +167,59 @@ class EnhancedCoach:
176
  def encontrar_melhor_resposta(self, texto_usuario: str, categoria: str) -> str:
177
  sentimento = self.analisar_sentimento(texto_usuario)
178
  acao_especifica = self.extrair_acao_especifica(texto_usuario)
179
-
180
  respostas_categoria = RESPOSTAS_COACH[categoria][sentimento]
181
  user_embedding = model.encode(texto_usuario)
182
-
183
  melhor_resposta = None
184
  maior_similaridade = -1
185
-
186
  for template in respostas_categoria:
187
  context_embedding = model.encode(template["context"])
188
  similaridade = np.dot(user_embedding, context_embedding)
189
-
190
  if similaridade > maior_similaridade:
191
  maior_similaridade = similaridade
192
  melhor_resposta = template["response"]
193
-
194
  return melhor_resposta.format(specific_action=acao_especifica.lower())
195
 
196
  def gerar_resposta(self, texto_usuario: str) -> str:
197
  if self.sessao_completa:
198
  self.__init__()
199
-
200
  if self.pergunta_atual >= len(PERGUNTAS):
201
  tempo = (datetime.now() - self.inicio).seconds // 60
202
  return self.gerar_sumario_final(tempo)
203
-
204
- # Analyze tone
205
  tom_predominante, intensidade = self.analisar_tom(texto_usuario)
206
  self.tone_history.append(tom_predominante)
207
-
208
  pergunta_atual = PERGUNTAS[self.pergunta_atual]
209
- self.historico_respostas.append(texto_usuario)
210
-
211
- feedback = self.encontrar_melhor_resposta(
212
- texto_usuario,
213
- pergunta_atual["categoria"]
214
- )
215
-
216
- # Add tone-specific insights
217
- tom_insight = self._gerar_insight_tom(tom_predominante, intensidade)
218
- padrao_identificado = self._analisar_padroes()
219
-
220
- resposta = f"""### Feedback Personalizado 💭\n\n{feedback}{padrao_identificado}\n\n{tom_insight}"""
221
- resposta += self._gerar_pontos_aprofundamento()
222
-
223
  self.pergunta_atual += 1
224
- if self.pergunta_atual < len(PERGUNTAS):
225
- resposta += self._gerar_proxima_pergunta()
226
- else:
227
- self.sessao_completa = True
228
- tempo = (datetime.now() - self.inicio).seconds // 60
229
- resposta += self.gerar_sumario_final(tempo)
230
-
231
- return resposta
232
-
233
- def _gerar_insight_tom(self, tom: str, intensidade: float) -> str:
234
- """Gera insights baseados no tom da resposta."""
235
- insights = {
236
- "confiante": "Sua confiança ao abordar este tema é notável. Como você construiu esta segurança?",
237
- "reflexivo": "Sua abordagem reflexiva traz profundidade à análise. Continue explorando diferentes perspectivas.",
238
- "hesitante": "Percebo algumas incertezas naturais do processo. Que apoio ajudaria a fortalecer sua confiança?",
239
- "pragmatico": "Seu foco em resultados práticos é valioso. Como você equilibra isso com visão de longo prazo?",
240
- "emocional": "Sua conexão emocional com a liderança demonstra comprometimento genuíno."
241
- }
242
-
243
- if intensidade > 2:
244
- return f"\n\n💡 {insights[tom]} Sua expressão é particularmente intensa neste aspecto."
245
- return f"\n\n💡 {insights[tom]}"
246
-
247
- def _analisar_padroes(self) -> str:
248
- if len(self.historico_respostas) <= 1:
249
- return ""
250
-
251
- sentimento_atual = self.analisar_sentimento(self.historico_respostas[-1])
252
- sentimento_anterior = self.analisar_sentimento(self.historico_respostas[-2])
253
-
254
- if sentimento_atual == sentimento_anterior == "positive":
255
- return "\n\n💡 Observo um padrão consistente de confiança em suas respostas. Continue desenvolvendo esses pontos fortes!"
256
- elif sentimento_atual == sentimento_anterior == "improvement":
257
- return "\n\n💡 Percebo que você está identificando áreas de desenvolvimento. Vamos focar em estratégias práticas para esses desafios."
258
- return ""
259
-
260
- def _gerar_pontos_aprofundamento(self) -> str:
261
- return """#### Pontos para Aprofundamento:
262
- 1. Como essa experiência se conecta com seus valores de liderança?
263
- 2. Que recursos específicos você identificou como necessários?
264
- 3. Qual seria o próximo marco de desenvolvimento nessa área?"""
265
-
266
- def _gerar_proxima_pergunta(self) -> str:
267
- proxima = PERGUNTAS[self.pergunta_atual]
268
- return f"""\n\n### Próxima Reflexão: {proxima['categoria'].title()} 🎯\n\n{proxima['pergunta']}\n\nTome um momento para refletir e conectar com suas experiências..."""
269
-
270
- def gerar_sumario_final(self, tempo: int) -> str:
271
- # Analyze patterns in responses
272
- sentimentos = [self.analisar_sentimento(resp) for resp in self.historico_respostas]
273
- predominante = max(set(sentimentos), key=sentimentos.count)
274
-
275
- # Add tone pattern analysis
276
- tone_pattern = max(set(self.tone_history), key=self.tone_history.count)
277
- tone_insight = f"\n\n#### Padrão de Comunicação:\nSeu estilo predominante é {tone_pattern}, o que sugere {self._interpretar_padrao_tom(tone_pattern)}"
278
-
279
- if predominante == "positive":
280
- perfil = "Você demonstra forte autoconhecimento e confiança em sua liderança."
281
- elif predominante == "improvement":
282
- perfil = "Você demonstra excelente capacidade de identificar oportunidades de desenvolvimento."
283
- else:
284
- perfil = "Você demonstra uma abordagem equilibrada entre conquistas e desafios."
285
-
286
- return f"""
287
- ### 🎉 Jornada de Desenvolvimento Concluída!
288
-
289
- ⏱️ Tempo de reflexão: {tempo} minutos
290
- 📝 Temas explorados: {len(PERGUNTAS)}
291
-
292
- #### Perfil de Liderança Observado:
293
- {perfil}{tone_insight}
294
-
295
- #### Recomendações Personalizadas:
296
- 1. Implemente uma ação específica mencionada em suas reflexões esta semana
297
- 2. Mantenha um diário de liderança focado nos temas discutidos
298
- 3. Estabeleça checkpoints mensais para revisar seu progresso
299
-
300
- Deseja iniciar uma nova jornada de desenvolvimento com outros temas?"""
301
-
302
- def _interpretar_padrao_tom(self, tom: str) -> str:
303
- """Interpreta o significado do padrão de tom predominante."""
304
- interpretacoes = {
305
- "confiante": "uma base sólida para influenciar e liderar equipes.",
306
- "reflexivo": "uma capacidade valiosa de considerar múltiplas perspectivas.",
307
- "hesitante": "uma oportunidade para fortalecer sua confiança através da prática.",
308
- "pragmatico": "um foco valioso em resultados e implementação.",
309
- "emocional": "uma forte conexão com o impacto humano da liderança."
310
- }
311
- return interpretacoes.get(tom, "um estilo único de liderança.")
312
-
313
- def primeira_pergunta(self):
314
- return f"""### 👋 Bem-vindo à sua Jornada de Desenvolvimento!
315
 
316
- Vamos explorar aspectos importantes da sua liderança através de reflexões guiadas.
317
 
318
- {PERGUNTAS[0]['pergunta']}
 
319
 
320
- Tome um momento para conectar com suas experiências e compartilhe sua perspectiva..."""
 
321
 
322
- def criar_interface():
323
- coach = EnhancedCoach()
324
-
325
- with gr.Blocks(title="Coach de Liderança") as app:
326
- gr.Markdown("""
327
- # 🚀 Coach de Liderança
328
-
329
- Desenvolva sua liderança através de reflexão guiada e feedback personalizado.
330
- """)
331
-
332
- chat = gr.Chatbot(
333
- value=[[None, coach.primeira_pergunta()]],
334
- height=600,
335
- show_label=False
336
- )
337
-
338
- with gr.Row():
339
- txt = gr.Textbox(
340
- placeholder="Compartilhe sua reflexão aqui...",
341
- lines=4,
342
- label="Sua Resposta"
343
- )
344
- btn = gr.Button("Enviar")
345
-
346
- def responder(mensagem, historico):
347
- if not mensagem.strip():
348
- return "", historico
349
-
350
- resposta = coach.gerar_resposta(mensagem)
351
- historico.append([mensagem, resposta])
352
- return "", historico
353
-
354
- txt.submit(responder, [txt, chat], [txt, chat])
355
- btn.click(responder, [txt, chat], [txt, chat])
356
-
357
- return app
358
 
359
  if __name__ == "__main__":
360
- app = criar_interface()
361
- app.launch()
 
135
  def analisar_tom(self, texto: str) -> Tuple[str, float]:
136
  """Analisa o tom predominante na resposta usando TextBlob e padrões lexicais."""
137
  texto_lower = texto.lower()
 
 
138
  blob = TextBlob(texto)
 
 
139
  tone_scores = {}
140
  for tone, patterns in TONE_PATTERNS.items():
141
  score = sum(texto_lower.count(pattern) for pattern in patterns)
 
142
  tone_scores[tone] = score * (1 + abs(blob.sentiment.polarity))
 
 
143
  predominant_tone = max(tone_scores.items(), key=lambda x: x[1])
144
  return predominant_tone[0], predominant_tone[1]
145
 
 
147
  """Analisa o sentimento geral da resposta."""
148
  positive_words = ["consegui", "superei", "aprendi", "melhorei", "efetivo"]
149
  negative_words = ["difícil", "desafiador", "complicado", "problema", "falha"]
 
150
  texto_lower = texto.lower()
151
  positive_count = sum(1 for word in positive_words if word in texto_lower)
152
  negative_count = sum(1 for word in negative_words if word in texto_lower)
 
153
  if positive_count > negative_count:
154
  return "positive"
155
  elif negative_count > positive_count:
 
167
  def encontrar_melhor_resposta(self, texto_usuario: str, categoria: str) -> str:
168
  sentimento = self.analisar_sentimento(texto_usuario)
169
  acao_especifica = self.extrair_acao_especifica(texto_usuario)
 
170
  respostas_categoria = RESPOSTAS_COACH[categoria][sentimento]
171
  user_embedding = model.encode(texto_usuario)
 
172
  melhor_resposta = None
173
  maior_similaridade = -1
 
174
  for template in respostas_categoria:
175
  context_embedding = model.encode(template["context"])
176
  similaridade = np.dot(user_embedding, context_embedding)
 
177
  if similaridade > maior_similaridade:
178
  maior_similaridade = similaridade
179
  melhor_resposta = template["response"]
 
180
  return melhor_resposta.format(specific_action=acao_especifica.lower())
181
 
182
  def gerar_resposta(self, texto_usuario: str) -> str:
183
  if self.sessao_completa:
184
  self.__init__()
 
185
  if self.pergunta_atual >= len(PERGUNTAS):
186
  tempo = (datetime.now() - self.inicio).seconds // 60
187
  return self.gerar_sumario_final(tempo)
 
 
188
  tom_predominante, intensidade = self.analisar_tom(texto_usuario)
189
  self.tone_history.append(tom_predominante)
 
190
  pergunta_atual = PERGUNTAS[self.pergunta_atual]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
191
  self.pergunta_atual += 1
192
+ self.historico_respostas.append({
193
+ "pergunta": pergunta_atual["pergunta"],
194
+ "resposta": texto_usuario,
195
+ "sentimento": self.analisar_sentimento(texto_usuario),
196
+ "tom": tom_predominante
197
+ })
198
+ feedback = self.encontrar_melhor_resposta(texto_usuario, pergunta_atual["categoria"])
199
+ return f"Resposta analisada: {feedback}\n\nPróxima pergunta: {PERGUNTAS[self.pergunta_atual]['pergunta']}" if self.pergunta_atual < len(PERGUNTAS) else feedback
200
+
201
+ def gerar_sumario_final(self, tempo_total: int) -> str:
202
+ summary = [f"Tonalidade predominante da sessão: {max(set(self.tone_history), key=self.tone_history.count)}."]
203
+ for resposta in self.historico_respostas:
204
+ summary.append(f"- Pergunta: {resposta['pergunta']}\n Resposta: {resposta['resposta']}\n Sentimento: {resposta['sentimento']}\n Tom: {resposta['tom']}\n")
205
+ summary.append(f"Tempo total da sessão: {tempo_total} minutos.")
206
+ self.sessao_completa = True
207
+ return "\n".join(summary)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
208
 
 
209
 
210
+ # Interface Gradio
211
+ coach = EnhancedCoach()
212
 
213
+ def interface_chat(texto_usuario):
214
+ return coach.gerar_resposta(texto_usuario)
215
 
216
+ demo = gr.Interface(
217
+ fn=interface_chat,
218
+ inputs="text",
219
+ outputs="text",
220
+ title="Coaching Inteligente",
221
+ description="Receba perguntas personalizadas e feedback em tempo real para desenvolvimento pessoal e profissional."
222
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
223
 
224
  if __name__ == "__main__":
225
+ demo.launch()