File size: 6,006 Bytes
d05879e 9bcd9c9 d05879e 38239d9 d05879e 687027a 9bcd9c9 687027a d05879e aa06d49 d05879e c1d85b3 aa06d49 c1d85b3 aa06d49 c1d85b3 aa06d49 c1d85b3 aa06d49 c1d85b3 aa06d49 c1d85b3 aa06d49 c1d85b3 d05879e aa06d49 d05879e aa06d49 d05879e aa06d49 d05879e aa06d49 |
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 145 146 147 148 149 150 151 152 |
# 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 con layout mejorado
"""
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
}
# T铆tulo
st.subheader(discourse_t.get('enter_text', 'Ingrese sus textos'))
# 脕rea de entrada de textos en dos columnas
text_col1, text_col2 = st.columns(2)
# Texto 1
with text_col1:
st.markdown("**Texto 1 (Patr贸n)**")
text_input1 = st.text_area(
"Texto 1",
height=200,
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
# Texto 2
with text_col2:
st.markdown("**Texto 2 (Comparaci贸n)**")
text_input2 = st.text_area(
"Texto 2",
height=200,
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 centrado
col1, col2, col3 = st.columns([1,2,1])
with col1:
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
)
# Proceso y visualizaci贸n de resultados
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
)
# Mostrar resultados
st.markdown("---")
st.subheader(discourse_t.get('results_title', 'Resultados del An谩lisis'))
display_discourse_results(result, lang_code, discourse_t)
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)}'))
# Mostrar resultados previos si existen
elif 'last_result' in st.session_state.discourse_live_state and \
st.session_state.discourse_live_state['last_result'] is not None:
st.markdown("---")
st.subheader(discourse_t.get('previous_results', 'Resultados del An谩lisis Anterior'))
display_discourse_results(
st.session_state.discourse_live_state['last_result'],
lang_code,
discourse_t
)
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."))
|