#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_db import store_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):
"""
Interfaz para el análisis morfosintáctico
Args:
lang_code: Código del idioma actual
nlp_models: Modelos de spaCy cargados
t: Diccionario de traducciones
"""
# Obtener el diccionario de traducciones morfosintácticas
# morpho_t = t.get('MORPHOSYNTACTIC', {})
# Inicializar el estado de la entrada
input_key = f"morphosyntax_input_{lang_code}"
if input_key not in st.session_state:
st.session_state[input_key] = ""
# Campo de entrada de texto
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...'),
value=st.session_state[input_key],
key=f"text_area_{lang_code}",
on_change=lambda: setattr(st.session_state, input_key, st.session_state[f"text_area_{lang_code}"])
)
if st.button(morpho_t.get('analyze_button', 'Analyze text'), key=f"analyze_button_{lang_code}"):
current_input = st.session_state[input_key]
if current_input:
try:
# Procesar el texto
doc = nlp_models[lang_code](current_input)
# Realizar análisis morfosintáctico
advanced_analysis = perform_advanced_morphosyntactic_analysis(
current_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
}
# Mostrar resultados
display_morphosyntax_results(
st.session_state.morphosyntax_result,
lang_code,
morpho_t
)
# Guardar el análisis en la base de datos
if store_student_morphosyntax_result(
username=st.session_state.username,
text=current_input,
arc_diagrams=advanced_analysis['arc_diagrams']
):
st.success(morpho_t.get('success_message', 'Analysis saved successfully'))
else:
st.error(morpho_t.get('error_message', 'Error saving analysis'))
except Exception as e:
st.error(morpho_t.get('error_processing', f'Error processing text: {str(e)}'))
else:
st.warning(morpho_t.get('warning_message', 'Please enter a text to analyze'))
# Si no se presionó el botón, verificar si hay resultados previos
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
)
else:
st.info(morpho_t.get('morpho_initial_message', 'Enter text to begin analysis'))
############################################################################################################
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"