Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,3 +1,122 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
def analyze_sentiment_trend(respostas: List[str]) -> plt.Figure:
|
2 |
"""Generate sentiment analysis plot"""
|
3 |
coach = EnhancedCoach()
|
|
|
1 |
+
import gradio as gr
|
2 |
+
from datetime import datetime
|
3 |
+
import numpy as np
|
4 |
+
from typing import Dict, List, Tuple, Optional
|
5 |
+
import matplotlib.pyplot as plt
|
6 |
+
from wordcloud import WordCloud
|
7 |
+
import seaborn as sns
|
8 |
+
import pandas as pd
|
9 |
+
from collections import Counter
|
10 |
+
|
11 |
+
def analyze_sentiment_trend(respostas: list[str]) -> Optional[plt.Figure]:
|
12 |
+
"""Generate sentiment analysis plot"""
|
13 |
+
# Create coach instance for sentiment analysis
|
14 |
+
sentimentos = []
|
15 |
+
|
16 |
+
# Convert sentiments to numeric values
|
17 |
+
valor_sentimento = {
|
18 |
+
'positive': 1,
|
19 |
+
'neutral': 0,
|
20 |
+
'improvement': -1
|
21 |
+
}
|
22 |
+
|
23 |
+
# Analyze each response
|
24 |
+
for resp in respostas:
|
25 |
+
palavras_positivas = ["consegui", "superei", "aprendi", "melhorei", "efetivo"]
|
26 |
+
palavras_negativas = ["difícil", "desafiador", "complicado", "problema", "falha"]
|
27 |
+
|
28 |
+
texto_lower = resp.lower()
|
29 |
+
cont_positivas = sum(1 for word in palavras_positivas if word in texto_lower)
|
30 |
+
cont_negativas = sum(1 for word in palavras_negativas if word in texto_lower)
|
31 |
+
|
32 |
+
if cont_positivas > cont_negativas:
|
33 |
+
sentimentos.append("positive")
|
34 |
+
elif cont_negativas > cont_positivas:
|
35 |
+
sentimentos.append("improvement")
|
36 |
+
else:
|
37 |
+
sentimentos.append("neutral")
|
38 |
+
|
39 |
+
valores = [valor_sentimento[s] for s in sentimentos]
|
40 |
+
|
41 |
+
if not valores:
|
42 |
+
return None
|
43 |
+
|
44 |
+
# Create the plot
|
45 |
+
fig, ax = plt.subplots(figsize=(8, 4))
|
46 |
+
sns.lineplot(data=valores, marker='o', ax=ax)
|
47 |
+
|
48 |
+
ax.set_title('Tendência de Sentimento nas Respostas')
|
49 |
+
ax.set_xlabel('Número da Resposta')
|
50 |
+
ax.set_ylabel('Sentimento')
|
51 |
+
ax.set_ylim(-1.5, 1.5)
|
52 |
+
ax.grid(True)
|
53 |
+
|
54 |
+
# Add horizontal lines for reference
|
55 |
+
ax.axhline(y=0, color='gray', linestyle='--', alpha=0.5)
|
56 |
+
|
57 |
+
plt.close()
|
58 |
+
return fig
|
59 |
+
|
60 |
+
def generate_word_cloud(respostas: list[str]) -> Optional[plt.Figure]:
|
61 |
+
"""Generate word cloud visualization"""
|
62 |
+
if not respostas:
|
63 |
+
return None
|
64 |
+
|
65 |
+
# Combine all responses
|
66 |
+
texto_completo = ' '.join(respostas)
|
67 |
+
|
68 |
+
# Create word cloud
|
69 |
+
wordcloud = WordCloud(
|
70 |
+
width=800,
|
71 |
+
height=400,
|
72 |
+
background_color='white',
|
73 |
+
colormap='viridis',
|
74 |
+
max_words=100
|
75 |
+
).generate(texto_completo)
|
76 |
+
|
77 |
+
# Create the plot
|
78 |
+
fig, ax = plt.subplots(figsize=(10, 5))
|
79 |
+
ax.imshow(wordcloud, interpolation='bilinear')
|
80 |
+
ax.axis('off')
|
81 |
+
ax.set_title('Nuvem de Palavras das Reflexões')
|
82 |
+
|
83 |
+
plt.close()
|
84 |
+
return fig
|
85 |
+
|
86 |
+
def analyze_themes(respostas: list[str]) -> tuple[str, str]:
|
87 |
+
"""Analyze strong themes and development areas"""
|
88 |
+
temas_fortes = []
|
89 |
+
areas_desenvolvimento = []
|
90 |
+
|
91 |
+
for resp in respostas:
|
92 |
+
palavras_positivas = ["consegui", "superei", "aprendi", "melhorei", "efetivo"]
|
93 |
+
palavras_negativas = ["difícil", "desafiador", "complicado", "problema", "falha"]
|
94 |
+
|
95 |
+
texto_lower = resp.lower()
|
96 |
+
cont_positivas = sum(1 for word in palavras_positivas if word in texto_lower)
|
97 |
+
cont_negativas = sum(1 for word in palavras_negativas if word in texto_lower)
|
98 |
+
|
99 |
+
# Extract specific action
|
100 |
+
sentences = resp.split('.')
|
101 |
+
for sentence in sentences:
|
102 |
+
if any(action in sentence.lower() for action in ["eu", "minha", "realizei", "fiz"]):
|
103 |
+
if cont_positivas > cont_negativas:
|
104 |
+
temas_fortes.append("- " + sentence.strip())
|
105 |
+
elif cont_negativas > cont_positivas:
|
106 |
+
areas_desenvolvimento.append("- " + sentence.strip())
|
107 |
+
break
|
108 |
+
else:
|
109 |
+
acao = resp.split('.')[0].strip()
|
110 |
+
if cont_positivas > cont_negativas:
|
111 |
+
temas_fortes.append("- " + acao)
|
112 |
+
elif cont_negativas > cont_positivas:
|
113 |
+
areas_desenvolvimento.append("- " + acao)
|
114 |
+
|
115 |
+
temas_fortes_str = "\n".join(temas_fortes[:3]) if temas_fortes else "Análise em andamento..."
|
116 |
+
areas_desenvolvimento_str = "\n".join(areas_desenvolvimento[:3]) if areas_desenvolvimento else "Análise em andamento..."
|
117 |
+
|
118 |
+
return temas_fortes_str, areas_desenvolvimento_str
|
119 |
+
|
120 |
def analyze_sentiment_trend(respostas: List[str]) -> plt.Figure:
|
121 |
"""Generate sentiment analysis plot"""
|
122 |
coach = EnhancedCoach()
|