File size: 5,780 Bytes
d05879e |
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 |
# 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
# Configuraci贸n del logger
logger = logging.getLogger(__name__)
# Importaciones locales
from .discourse_process import perform_discourse_analysis
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 display_discourse_live_interface(lang_code, nlp_models, discourse_t):
"""
Interfaz para el an谩lisis del discurso en vivo
"""
try:
# 1. Inicializar el estado de la sesi贸n
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
}
# 2. Funci贸n para manejar cambios en los textos
def on_text1_change():
current_text = st.session_state.discourse_live_text1
st.session_state.discourse_live_state['current_text1'] = current_text
st.session_state.discourse_live_state['text_changed'] = True
def on_text2_change():
current_text = st.session_state.discourse_live_text2
st.session_state.discourse_live_state['current_text2'] = current_text
st.session_state.discourse_live_state['text_changed'] = True
# 3. 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', ''),
on_change=on_text1_change,
label_visibility="collapsed"
)
# 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', ''),
on_change=on_text2_change,
label_visibility="collapsed"
)
# 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...')):
# Realizar an谩lisis
result = perform_discourse_analysis(
text_input1,
text_input2,
nlp_models[lang_code],
lang_code
)
if result['success']:
st.session_state.discourse_live_state['last_result'] = result
st.session_state.discourse_live_state['analysis_count'] += 1
st.session_state.discourse_live_state['text_changed'] = False
# Guardar en base de datos
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', 'Error al procesar el texto'))
# 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:
# Mostrar resultados usando la misma funci贸n que el an谩lisis normal
display_discourse_results(
st.session_state.discourse_live_state['last_result'],
lang_code,
discourse_t
)
elif st.session_state.discourse_live_state.get('text_changed', False):
st.info(discourse_t.get('changes_pending',
'Los textos han cambiado. Presione Analizar para ver los nuevos resultados.'))
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."))
``` |