# modules/morphosyntax/morphosyntax_interface.py import streamlit as st import re import logging from spacy import displacy # Importa tu pipeline de spacy, p. ej.: # nlp_models = {"es": spacy.load("es_core_news_sm")} from ..database.morphosyntax_iterative_mongo_db import ( store_student_morphosyntax_base, store_student_morphosyntax_iteration, ) logger = logging.getLogger(__name__) def initialize_arc_analysis_state(): """Inicializa el estado del análisis de arcos y el caché si no existen.""" if "arc_analysis_state" not in st.session_state: st.session_state.arc_analysis_state = { "base_id": None, "original_text": "", "iteration_text": "", "analysis_count": 0, } def reset_morpho_state(): """Resetea el estado del análisis morfosintáctico en sesión.""" st.session_state.arc_analysis_state = { "base_id": None, "original_text": "", "iteration_text": "", "analysis_count": 0, } def display_arc_diagram(doc): """Muestra un diagrama de arco.""" try: for sent in doc.sents: rendered = displacy.render( sent, style="dep", options={"distance": 100, "arrow_spacing": 20, "word_spacing": 30} ) # Ajustes del SVG rendered = rendered.replace('height="375"', 'height="200"') rendered = re.sub( r']*>', lambda m: m.group(0).replace('height="450"', 'height="300"'), rendered ) rendered = re.sub( r']*transform="translate\((\d+),(\d+)\)"', lambda m: f'{rendered}', unsafe_allow_html=True) except Exception as e: logger.error(f"Error en display_arc_diagram: {str(e)}") def display_morphosyntax_interface(lang_code, nlp_models): st.title("Análisis Morfosintáctico") # 1) Inicializar estados initialize_arc_analysis_state() # 2) Tabs tabs = st.tabs(["Arco", "Categorías", "Morfológico"]) # ==================== TAB 0: Análisis de Arco ========================= with tabs[0]: st.write("Texto base e iteraciones...") # Botón Nuevo Análisis if st.button("Nuevo Análisis", key="new_analysis"): reset_morpho_state() st.experimental_rerun() # Texto base st.session_state.arc_analysis_state["original_text"] = st.text_area( "Texto Original", value=st.session_state.arc_analysis_state["original_text"], key="base_text_input" ) # Botón para analizar texto base if st.button("Analizar Texto Base", key="analyze_base"): # Lógica de Spacy if not st.session_state.arc_analysis_state["original_text"].strip(): st.warning("Ingrese texto original para analizar.") else: doc = nlp_models[lang_code]( st.session_state.arc_analysis_state["original_text"] ) # Realizar análisis (displacy, etc.) display_arc_diagram(doc) # Guardar en DB base_id = store_student_morphosyntax_base( st.session_state.username, st.session_state.arc_analysis_state["original_text"], arc_diagrams=None # Pon el dict real con arcos ) if base_id: st.session_state.arc_analysis_state["base_id"] = base_id st.success(f"Análisis base guardado. base_id={base_id}") st.markdown("---") # Texto de iteración st.session_state.arc_analysis_state["iteration_text"] = st.text_area( "Texto de Iteración", value=st.session_state.arc_analysis_state["iteration_text"], key="iteration_text_input" ) # Botón para analizar iteración if st.button("Analizar Cambios", key="analyze_iteration"): if not st.session_state.arc_analysis_state["iteration_text"].strip(): st.warning("Ingrese texto de iteración para analizar.") elif not st.session_state.arc_analysis_state["base_id"]: st.error("No existe un base_id aún (analice el texto base primero).") else: # Realizar el análisis con Spacy doc_iter = nlp_models[lang_code]( st.session_state.arc_analysis_state["iteration_text"] ) display_arc_diagram(doc_iter) # Guardar iteración en DB iteration_id = store_student_morphosyntax_iteration( st.session_state.username, st.session_state.arc_analysis_state["base_id"], st.session_state.arc_analysis_state["original_text"], st.session_state.arc_analysis_state["iteration_text"], arc_diagrams=None # Pon el dict real con arcos ) if iteration_id: st.success(f"Iteración guardada. iteration_id={iteration_id}") # ==================== TAB 1: Análisis de Categorías ==================== with tabs[1]: st.info("En desarrollo...") # ==================== TAB 2: Análisis Morfológico ====================== with tabs[2]: st.info("En desarrollo...")