#modules/morphosyntax/morphosyntax_interface.py
import streamlit as st
from streamlit_float import *
from streamlit_antd_components import *
from streamlit.components.v1 import html
import spacy
from spacy import displacy
import spacy_streamlit
import pandas as pd
import base64
import re
# Importar desde morphosyntax_process.py
from .morphosyntax_process import (
process_morphosyntactic_input,
format_analysis_results,
perform_advanced_morphosyntactic_analysis, # Añadir esta importación
get_repeated_words_colors, # Y estas también
highlight_repeated_words,
POS_COLORS,
POS_TRANSLATIONS
)
from ..utils.widget_utils import generate_unique_key
from ..database.morphosintax_mongo_db import store_student_morphosyntax_result
from ..database.chat_mongo_db import store_chat_history, get_chat_history
# from ..database.morphosintaxis_export import export_user_interactions
import logging
logger = logging.getLogger(__name__)
############################################################################################################
def display_morphosyntax_interface(lang_code, nlp_models, morpho_t):
try:
# 1. Inicializar el estado morfosintáctico si no existe
if 'morphosyntax_state' not in st.session_state:
st.session_state.morphosyntax_state = {
'input_text': "",
'analysis_count': 0,
'last_analysis': None
}
# 2. Campo de entrada de texto con key única basada en el contador
input_key = f"morpho_input_{st.session_state.morphosyntax_state['analysis_count']}"
sentence_input = st.text_area(
morpho_t.get('morpho_input_label', 'Enter text to analyze'),
height=150,
placeholder=morpho_t.get('morpho_input_placeholder', 'Enter your text here...'),
key=input_key
)
# 3. Actualizar el estado con el texto actual
st.session_state.morphosyntax_state['input_text'] = sentence_input
# 4. Crear columnas para el botón
col1, col2, col3 = st.columns([2,1,2])
# 5. Botón de análisis en la columna central
with col1:
analyze_button = st.button(
morpho_t.get('morpho_analyze_button', 'Analyze Morphosyntax'),
key=f"morpho_button_{st.session_state.morphosyntax_state['analysis_count']}",
type="primary", # Nuevo en Streamlit 1.39.0
icon="🔍", # Nuevo en Streamlit 1.39.0
disabled=not bool(sentence_input.strip()), # Se activa solo cuando hay texto
use_container_width=True
)
# 6. Lógica de análisis
if analyze_button and sentence_input.strip(): # Verificar que haya texto y no solo espacios
try:
with st.spinner(morpho_t.get('processing', 'Processing...')):
# Obtener el modelo específico del idioma y procesar el texto
doc = nlp_models[lang_code](sentence_input)
# Realizar análisis morfosintáctico con el mismo modelo
advanced_analysis = perform_advanced_morphosyntactic_analysis(
sentence_input,
nlp_models[lang_code]
)
# Guardar resultado en el estado de la sesión
st.session_state.morphosyntax_result = {
'doc': doc,
'advanced_analysis': advanced_analysis
}
# Incrementar el contador de análisis
st.session_state.morphosyntax_state['analysis_count'] += 1
# Guardar el análisis en la base de datos
if store_student_morphosyntax_result(
username=st.session_state.username,
text=sentence_input,
arc_diagrams=advanced_analysis['arc_diagrams']
):
st.success(morpho_t.get('success_message', 'Analysis saved successfully'))
# Mostrar resultados
display_morphosyntax_results(
st.session_state.morphosyntax_result,
lang_code,
morpho_t
)
else:
st.error(morpho_t.get('error_message', 'Error saving analysis'))
except Exception as e:
logger.error(f"Error en análisis morfosintáctico: {str(e)}")
st.error(morpho_t.get('error_processing', f'Error processing text: {str(e)}'))
# 7. Mostrar resultados previos si existen
elif 'morphosyntax_result' in st.session_state and st.session_state.morphosyntax_result is not None:
display_morphosyntax_results(
st.session_state.morphosyntax_result,
lang_code,
morpho_t
)
elif not sentence_input.strip():
st.info(morpho_t.get('morpho_initial_message', 'Enter text to begin analysis'))
except Exception as e:
logger.error(f"Error general en display_morphosyntax_interface: {str(e)}")
st.error("Se produjo un error. Por favor, intente de nuevo.")
st.error(f"Detalles del error: {str(e)}") # Añadido para mejor debugging
############################################################################################################
def display_morphosyntax_results(result, lang_code, morpho_t):
"""
Muestra los resultados del análisis morfosintáctico.
Args:
result: Resultado del análisis
lang_code: Código del idioma
t: Diccionario de traducciones
"""
# Obtener el diccionario de traducciones morfosintácticas
# morpho_t = t.get('MORPHOSYNTACTIC', {})
if result is None:
st.warning(morpho_t.get('no_results', 'No results available'))
return
doc = result['doc']
advanced_analysis = result['advanced_analysis']
# Mostrar leyenda
st.markdown(f"##### {morpho_t.get('legend', 'Legend: Grammatical categories')}")
legend_html = "
"
for pos, color in POS_COLORS.items():
if pos in POS_TRANSLATIONS[lang_code]:
legend_html += f"