Spaces:
Running
Running
# 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'<svg[^>]*>', | |
lambda m: m.group(0).replace('height="450"', 'height="300"'), | |
rendered | |
) | |
rendered = re.sub( | |
r'<g [^>]*transform="translate\((\d+),(\d+)\)"', | |
lambda m: f'<g transform="translate({m.group(1)},50)"', | |
rendered | |
) | |
st.write(f'<div class="arc-diagram-container">{rendered}</div>', 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...") | |