Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -6,7 +6,7 @@ from typing import Dict, List, Tuple
|
|
6 |
from textblob import TextBlob
|
7 |
|
8 |
# Load embeddings model
|
9 |
-
model = SentenceTransformer('
|
10 |
|
11 |
PERGUNTAS = [
|
12 |
{
|
@@ -129,24 +129,38 @@ class EnhancedCoach:
|
|
129 |
self.sessao_completa = False
|
130 |
self.tone_history = []
|
131 |
self.response_quality_metrics = []
|
132 |
-
|
133 |
def analyze_response_quality(self, text: str) -> Dict[str, float]:
|
134 |
sentences = [s.strip() for s in text.split('.') if s.strip()]
|
|
|
135 |
|
136 |
metrics = {
|
137 |
-
"depth": self._calculate_depth(text),
|
138 |
"clarity": self._calculate_clarity(sentences),
|
139 |
-
"specificity": self._calculate_specificity(text),
|
140 |
"actionability": self._calculate_actionability(sentences)
|
141 |
}
|
142 |
|
143 |
self.response_quality_metrics.append(metrics)
|
144 |
return metrics
|
145 |
|
146 |
-
def _calculate_depth(self, text: str) -> float:
|
147 |
-
|
|
|
|
|
148 |
unique_words = len(set(words))
|
149 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
150 |
|
151 |
def _calculate_clarity(self, sentences: List[str]) -> float:
|
152 |
if not sentences:
|
@@ -154,14 +168,27 @@ class EnhancedCoach:
|
|
154 |
avg_length = sum(len(s.split()) for s in sentences) / len(sentences)
|
155 |
return 1.0 if 10 <= avg_length <= 20 else 0.7
|
156 |
|
157 |
-
def _calculate_specificity(self, text: str) -> float:
|
158 |
-
specific_indicators = [
|
159 |
-
|
160 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
161 |
|
162 |
def _calculate_actionability(self, sentences: List[str]) -> float:
|
163 |
-
action_verbs = [
|
164 |
-
|
|
|
|
|
|
|
165 |
if not sentences:
|
166 |
return 0.0
|
167 |
actionable = sum(1 for s in sentences
|
@@ -181,8 +208,14 @@ class EnhancedCoach:
|
|
181 |
return predominant_tone[0], predominant_tone[1]
|
182 |
|
183 |
def analisar_sentimento(self, texto: str) -> str:
|
184 |
-
positive_words = [
|
185 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
186 |
|
187 |
texto_lower = texto.lower()
|
188 |
positive_count = sum(1 for word in positive_words if word in texto_lower)
|
@@ -224,7 +257,7 @@ class EnhancedCoach:
|
|
224 |
def gerar_resposta(self, texto_usuario: str) -> str:
|
225 |
quality_metrics = self.analyze_response_quality(texto_usuario)
|
226 |
|
227 |
-
if quality_metrics["depth"] < 0.
|
228 |
return """### Feedback Inicial 💭
|
229 |
|
230 |
Para oferecer um feedback mais valioso, poderia compartilhar mais detalhes específicos sobre sua experiência?
|
@@ -294,7 +327,9 @@ Alguns aspectos que enriqueceriam sua reflexão:
|
|
294 |
return ""
|
295 |
|
296 |
def _gerar_pontos_aprofundamento(self) -> str:
|
297 |
-
return """
|
|
|
|
|
298 |
1. Como essa experiência se conecta com seus valores de liderança?
|
299 |
2. Que recursos específicos você identificou como necessários?
|
300 |
3. Qual seria o próximo marco de desenvolvimento nessa área?"""
|
@@ -368,7 +403,7 @@ Tome um momento para conectar com suas experiências e compartilhe sua perspecti
|
|
368 |
def criar_interface():
|
369 |
coach = EnhancedCoach()
|
370 |
|
371 |
-
with gr.Blocks(title="Coach de Liderança", theme=gr.themes.
|
372 |
gr.Markdown("""# 🚀 Coach de Liderança
|
373 |
Desenvolva sua liderança através de reflexão guiada e feedback personalizado.""")
|
374 |
|
@@ -384,7 +419,7 @@ def criar_interface():
|
|
384 |
lines=4,
|
385 |
label="Sua Resposta"
|
386 |
)
|
387 |
-
btn = gr.Button("Enviar")
|
388 |
|
389 |
def responder(mensagem, historico):
|
390 |
if not mensagem.strip():
|
@@ -401,4 +436,4 @@ def criar_interface():
|
|
401 |
|
402 |
if __name__ == "__main__":
|
403 |
app = criar_interface()
|
404 |
-
app.launch()
|
|
|
6 |
from textblob import TextBlob
|
7 |
|
8 |
# Load embeddings model
|
9 |
+
model = SentenceTransformer('neuralmind/bert-large-portuguese-vocab')
|
10 |
|
11 |
PERGUNTAS = [
|
12 |
{
|
|
|
129 |
self.sessao_completa = False
|
130 |
self.tone_history = []
|
131 |
self.response_quality_metrics = []
|
132 |
+
|
133 |
def analyze_response_quality(self, text: str) -> Dict[str, float]:
|
134 |
sentences = [s.strip() for s in text.split('.') if s.strip()]
|
135 |
+
words = text.lower().split()
|
136 |
|
137 |
metrics = {
|
138 |
+
"depth": self._calculate_depth(text, words),
|
139 |
"clarity": self._calculate_clarity(sentences),
|
140 |
+
"specificity": self._calculate_specificity(text, words),
|
141 |
"actionability": self._calculate_actionability(sentences)
|
142 |
}
|
143 |
|
144 |
self.response_quality_metrics.append(metrics)
|
145 |
return metrics
|
146 |
|
147 |
+
def _calculate_depth(self, text: str, words: List[str]) -> float:
|
148 |
+
if not words:
|
149 |
+
return 0.0
|
150 |
+
|
151 |
unique_words = len(set(words))
|
152 |
+
word_length_avg = sum(len(word) for word in words) / len(words)
|
153 |
+
sentences = [s.strip() for s in text.split('.') if s.strip()]
|
154 |
+
|
155 |
+
word_variety = unique_words / len(words)
|
156 |
+
sentence_length = len(sentences)
|
157 |
+
complexity = word_length_avg / 5
|
158 |
+
|
159 |
+
depth_score = (word_variety * 0.4 +
|
160 |
+
min(sentence_length / 3, 1.0) * 0.4 +
|
161 |
+
complexity * 0.2)
|
162 |
+
|
163 |
+
return min(1.0, depth_score)
|
164 |
|
165 |
def _calculate_clarity(self, sentences: List[str]) -> float:
|
166 |
if not sentences:
|
|
|
168 |
avg_length = sum(len(s.split()) for s in sentences) / len(sentences)
|
169 |
return 1.0 if 10 <= avg_length <= 20 else 0.7
|
170 |
|
171 |
+
def _calculate_specificity(self, text: str, words: List[str]) -> float:
|
172 |
+
specific_indicators = [
|
173 |
+
"exemplo", "especificamente", "concretamente",
|
174 |
+
"situação", "caso", "quando", "onde", "como",
|
175 |
+
"projeto", "equipe", "reunião", "feedback",
|
176 |
+
"resultado", "impacto", "mudança", "melhoria",
|
177 |
+
"implementei", "desenvolvi", "criei", "estabeleci",
|
178 |
+
"eu", "minha", "nosso", "realizei", "fiz"
|
179 |
+
]
|
180 |
+
|
181 |
+
indicator_count = sum(text.lower().count(ind) for ind in specific_indicators)
|
182 |
+
response_length_factor = min(len(words) / 20, 1.0)
|
183 |
+
|
184 |
+
return min(1.0, (indicator_count * 0.7 + response_length_factor * 0.3))
|
185 |
|
186 |
def _calculate_actionability(self, sentences: List[str]) -> float:
|
187 |
+
action_verbs = [
|
188 |
+
"implementar", "fazer", "criar", "desenvolver", "estabelecer",
|
189 |
+
"planejar", "executar", "medir", "avaliar", "iniciar",
|
190 |
+
"construir", "liderar", "coordenar", "definir", "ajustar"
|
191 |
+
]
|
192 |
if not sentences:
|
193 |
return 0.0
|
194 |
actionable = sum(1 for s in sentences
|
|
|
208 |
return predominant_tone[0], predominant_tone[1]
|
209 |
|
210 |
def analisar_sentimento(self, texto: str) -> str:
|
211 |
+
positive_words = [
|
212 |
+
"consegui", "superei", "aprendi", "melhorei", "efetivo",
|
213 |
+
"cresci", "evoluí", "realizei", "alcancei", "progresso"
|
214 |
+
]
|
215 |
+
negative_words = [
|
216 |
+
"difícil", "desafiador", "complicado", "problema", "falha",
|
217 |
+
"obstáculo", "limitação", "erro", "confuso", "inseguro"
|
218 |
+
]
|
219 |
|
220 |
texto_lower = texto.lower()
|
221 |
positive_count = sum(1 for word in positive_words if word in texto_lower)
|
|
|
257 |
def gerar_resposta(self, texto_usuario: str) -> str:
|
258 |
quality_metrics = self.analyze_response_quality(texto_usuario)
|
259 |
|
260 |
+
if quality_metrics["depth"] < 0.15 and quality_metrics["specificity"] < 0.1:
|
261 |
return """### Feedback Inicial 💭
|
262 |
|
263 |
Para oferecer um feedback mais valioso, poderia compartilhar mais detalhes específicos sobre sua experiência?
|
|
|
327 |
return ""
|
328 |
|
329 |
def _gerar_pontos_aprofundamento(self) -> str:
|
330 |
+
return """
|
331 |
+
|
332 |
+
#### Pontos para Aprofundamento:
|
333 |
1. Como essa experiência se conecta com seus valores de liderança?
|
334 |
2. Que recursos específicos você identificou como necessários?
|
335 |
3. Qual seria o próximo marco de desenvolvimento nessa área?"""
|
|
|
403 |
def criar_interface():
|
404 |
coach = EnhancedCoach()
|
405 |
|
406 |
+
with gr.Blocks(title="Coach de Liderança", theme=gr.themes.Soft()) as app:
|
407 |
gr.Markdown("""# 🚀 Coach de Liderança
|
408 |
Desenvolva sua liderança através de reflexão guiada e feedback personalizado.""")
|
409 |
|
|
|
419 |
lines=4,
|
420 |
label="Sua Resposta"
|
421 |
)
|
422 |
+
btn = gr.Button("Enviar", variant="primary")
|
423 |
|
424 |
def responder(mensagem, historico):
|
425 |
if not mensagem.strip():
|
|
|
436 |
|
437 |
if __name__ == "__main__":
|
438 |
app = criar_interface()
|
439 |
+
app.launch()
|