def analyze_sentiment_trend(respostas: List[str]) -> plt.Figure: """Generate sentiment analysis plot""" coach = EnhancedCoach() sentimentos = [coach.analisar_sentimento(resp) for resp in respostas] # Convert sentiments to numeric values valor_sentimento = { 'positive': 1, 'neutral': 0, 'improvement': -1 } valores = [valor_sentimento[s] for s in sentimentos] # Create the plot fig, ax = plt.subplots(figsize=(8, 4)) sns.lineplot(data=valores, marker='o', ax=ax) ax.set_title('Tendência de Sentimento nas Respostas') ax.set_xlabel('Número da Resposta') ax.set_ylabel('Sentimento') ax.set_ylim(-1.5, 1.5) ax.grid(True) # Add horizontal lines for reference ax.axhline(y=0, color='gray', linestyle='--', alpha=0.5) return fig def generate_word_cloud(respostas: List[str]) -> plt.Figure: """Generate word cloud visualization""" # Combine all responses texto_completo = ' '.join(respostas) # Create word cloud wordcloud = WordCloud( width=800, height=400, background_color='white', colormap='viridis', max_words=100 ).generate(texto_completo) # Create the plot fig, ax = plt.subplots(figsize=(10, 5)) ax.imshow(wordcloud, interpolation='bilinear') ax.axis('off') ax.set_title('Nuvem de Palavras das Reflexões') return fig def analyze_themes(respostas: List[str]) -> Tuple[str, str]: """Analyze strong themes and development areas""" coach = EnhancedCoach() temas_fortes = [] areas_desenvolvimento = [] for resp in respostas: sentimento = coach.analisar_sentimento(resp) if sentimento == "positive": temas_fortes.append("- " + coach.extrair_acao_especifica(resp)) elif sentimento == "improvement": areas_desenvolvimento.append("- " + coach.extrair_acao_especifica(resp)) temas_fortes_str = "\n".join(temas_fortes[:3]) if temas_fortes else "Análise em andamento..." areas_desenvolvimento_str = "\n".join(areas_desenvolvimento[:3]) if areas_desenvolvimento else "Análise em andamento..." return temas_fortes_str, areas_desenvolvimento_str def criar_interface(): coach = EnhancedCoach() with gr.Blocks(title="Coach de Liderança", theme=gr.themes.Soft()) as app: with gr.Row(): with gr.Column(scale=2): gr.Markdown(""" # 🚀 Coach de Liderança Desenvolva sua liderança através de reflexão guiada e feedback personalizado. """) with gr.Column(scale=1): timer = gr.Number( value=0, label="⏱️ Tempo de Reflexão (minutos)", interactive=False ) progress = gr.Slider( value=0, minimum=0, maximum=len(PERGUNTAS), step=1, label="📊 Progresso", interactive=False ) with gr.Tabs() as tabs: with gr.Tab("💭 Sessão Atual"): chat = gr.Chatbot( value=[[None, coach.primeira_pergunta()]], height=500, show_label=False, type="messages" ) with gr.Row(): with gr.Column(scale=4): txt = gr.Textbox( placeholder="Compartilhe sua reflexão aqui...", lines=4, label="Sua Resposta" ) with gr.Column(scale=1, min_width=100): with gr.Row(): btn = gr.Button("Enviar", variant="primary") clear = gr.Button("Limpar") with gr.Row(): tema_atual = gr.Textbox( value="Autoconhecimento", label="🎯 Tema Atual", interactive=False ) tempo_resposta = gr.Textbox( value="0:00", label="⏱️ Tempo nesta resposta", interactive=False ) with gr.Tab("📊 Insights"): with gr.Row(): with gr.Column(): sentiment_chart = gr.Plot(label="Análise de Sentimento") with gr.Column(): word_cloud = gr.Plot(label="Nuvem de Palavras") with gr.Row(): temas_fortes = gr.Textbox( label="💪 Temas com Mais Confiança", interactive=False, lines=3 ) areas_desenvolvimento = gr.Textbox( label="🎯 Áreas para Desenvolvimento", interactive=False, lines=3 ) with gr.Tab("📝 Notas & Recursos"): with gr.Row(): notas = gr.Textbox( placeholder="Faça anotações durante sua jornada...", label="📝 Minhas Notas", lines=5 ) with gr.Row(): with gr.Accordion("📚 Recursos por Tema", open=False): gr.Markdown(""" ### 🎯 Autoconhecimento - [Artigo] Desenvolvendo Autoconsciência na Liderança - [Exercício] Reflexão sobre Valores e Propósito - [Ferramenta] Template de Diário de Liderança ### 💬 Comunicação - [Guia] Comunicação Assertiva na Liderança - [Checklist] Preparação para Feedbacks Difíceis - [Framework] Estrutura de Comunicação Situacional ### 🤔 Tomada de Decisão - [Modelo] Framework para Decisões Complexas - [Exercício] Análise de Decisões Passadas - [Template] Documentação de Decisões Importantes """) def atualizar_timer(): """Update session timer""" tempo = int((datetime.now() - coach.inicio).total_seconds() / 60) return tempo def responder(mensagem, historico): """Process user response and update interface""" if not mensagem.strip(): return { txt: "", chat: historico } # Format user message msg_usuario = { "role": "user", "content": mensagem } # Generate and format coach response resposta = coach.gerar_resposta(mensagem) # Update history historico.append([msg_usuario, resposta]) # Update visualizations sentiment_analysis = None word_cloud_plot = None strong_themes = "" development_areas = "" if len(coach.historico_respostas) > 1: sentiment_analysis = analyze_sentiment_trend(coach.historico_respostas) word_cloud_plot = generate_word_cloud(coach.historico_respostas) strong_themes, development_areas = analyze_themes(coach.historico_respostas) tempo_atual = int((datetime.now() - coach.inicio).total_seconds() / 60) return { txt: "", chat: historico, timer: tempo_atual, progress: coach.pergunta_atual, tema_atual: PERGUNTAS[min(coach.pergunta_atual, len(PERGUNTAS)-1)]["categoria"].title(), tempo_resposta: "0:00", sentiment_chart: sentiment_analysis, word_cloud: word_cloud_plot, temas_fortes: strong_themes, areas_desenvolvimento: development_areas } def limpar_chat(): """Reset chat and all related components""" coach.__init__() primeira_mensagem = coach.primeira_pergunta() return { chat: [[None, primeira_mensagem]], txt: "", progress: 0, tema_atual: "Autoconhecimento", tempo_resposta: "0:00", sentiment_chart: None, word_cloud: None, temas_fortes: "", areas_desenvolvimento: "" } # Event handlers txt.submit( responder, [txt, chat], [txt, chat, timer, progress, tema_atual, tempo_resposta, sentiment_chart, word_cloud, temas_fortes, areas_desenvolvimento] ) btn.click( responder, [txt, chat], [txt, chat, timer, progress, tema_atual, tempo_resposta, sentiment_chart, word_cloud, temas_fortes, areas_desenvolvimento] ) clear.click( limpar_chat, None, [chat, txt, progress, tema_atual, tempo_resposta, sentiment_chart, word_cloud, temas_fortes, areas_desenvolvimento] ) # Timer update gr.on( triggers=[gr.EventListener(every=1)], fn=atualizar_timer, outputs=[timer] ) return app if __name__ == "__main__": app = criar_interface() app.launch()