File size: 6,215 Bytes
d05879e 9bcd9c9 d05879e 38239d9 d05879e 687027a 9bcd9c9 687027a c1d85b3 d05879e c1d85b3 d05879e c1d85b3 687027a c1d85b3 9bcd9c9 d05879e c1d85b3 d05879e 687027a d05879e 687027a c1d85b3 687027a d05879e b6ad9ec |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
# modules/discourse/discourse/discourse_live_interface.py
import streamlit as st
from streamlit_float import *
from streamlit_antd_components import *
import pandas as pd
import logging
import io
import matplotlib.pyplot as plt
# Configuraci贸n del logger
logger = logging.getLogger(__name__)
# Importaciones locales
from .discourse_process import perform_discourse_analysis
from .discourse_interface import display_discourse_results # A帽adida esta importaci贸n
from ..utils.widget_utils import generate_unique_key
from ..database.discourse_mongo_db import store_student_discourse_result
from ..database.chat_mongo_db import store_chat_history, get_chat_history
#####################################################################################################
def fig_to_bytes(fig):
"""Convierte una figura de matplotlib a bytes."""
try:
buf = io.BytesIO()
fig.savefig(buf, format='png', dpi=300, bbox_inches='tight')
buf.seek(0)
return buf.getvalue()
except Exception as e:
logger.error(f"Error en fig_to_bytes: {str(e)}")
return None
#################################################################################################
def display_discourse_live_interface(lang_code, nlp_models, discourse_t):
"""
Interfaz para el an谩lisis del discurso en vivo
"""
try:
if 'discourse_live_state' not in st.session_state:
st.session_state.discourse_live_state = {
'analysis_count': 0,
'current_text1': '',
'current_text2': '',
'last_result': None,
'text_changed': False
}
# Crear columnas con proporci贸n 1:3
input_col, result_col = st.columns([1, 3])
# Columna izquierda: Entrada de textos
with input_col:
st.subheader(discourse_t.get('enter_text', 'Ingrese sus textos'))
# Primer 谩rea de texto
st.markdown("**Texto 1 (Patr贸n)**")
text_input1 = st.text_area(
"Texto 1",
height=250,
key="discourse_live_text1",
value=st.session_state.discourse_live_state.get('current_text1', ''),
label_visibility="collapsed"
)
st.session_state.discourse_live_state['current_text1'] = text_input1
# Segundo 谩rea de texto
st.markdown("**Texto 2 (Comparaci贸n)**")
text_input2 = st.text_area(
"Texto 2",
height=250,
key="discourse_live_text2",
value=st.session_state.discourse_live_state.get('current_text2', ''),
label_visibility="collapsed"
)
st.session_state.discourse_live_state['current_text2'] = text_input2
# Bot贸n de an谩lisis
analyze_button = st.button(
discourse_t.get('analyze_button', 'Analizar'),
key="discourse_live_analyze",
type="primary",
icon="馃攳",
disabled=not (text_input1 and text_input2),
use_container_width=True
)
if analyze_button and text_input1 and text_input2:
try:
with st.spinner(discourse_t.get('processing', 'Procesando...')):
result = perform_discourse_analysis(
text_input1,
text_input2,
nlp_models[lang_code],
lang_code
)
if result['success']:
# Procesar ambos gr谩ficos
for graph_key in ['graph1', 'graph2']:
if graph_key in result and result[graph_key] is not None:
bytes_key = f'{graph_key}_bytes'
graph_bytes = fig_to_bytes(result[graph_key])
if graph_bytes:
result[bytes_key] = graph_bytes
plt.close(result[graph_key])
st.session_state.discourse_live_state['last_result'] = result
st.session_state.discourse_live_state['analysis_count'] += 1
store_student_discourse_result(
st.session_state.username,
text_input1,
text_input2,
result
)
else:
st.error(result.get('message', 'Error en el an谩lisis'))
except Exception as e:
logger.error(f"Error en an谩lisis: {str(e)}")
st.error(discourse_t.get('error_processing', f'Error al procesar el texto: {str(e)}'))
# Columna derecha: Visualizaci贸n de resultados
with result_col:
st.subheader(discourse_t.get('live_results', 'Resultados en vivo'))
if 'last_result' in st.session_state.discourse_live_state and \
st.session_state.discourse_live_state['last_result'] is not None:
result = st.session_state.discourse_live_state['last_result']
if all(key in result for key in ['graph1', 'graph2']):
display_discourse_results(result, lang_code, discourse_t)
else:
logger.error(f"Faltan gr谩ficos en el resultado: {list(result.keys())}")
st.error(discourse_t.get('missing_graphs', 'Error: No se pudieron generar todos los gr谩ficos'))
else:
st.info(discourse_t.get('initial_message',
'Ingrese los textos y presione Analizar para ver los resultados.'))
except Exception as e:
logger.error(f"Error general en interfaz del discurso en vivo: {str(e)}")
st.error(discourse_t.get('general_error', "Se produjo un error. Por favor, intente de nuevo.")) |