v4 / modules /morphosyntax /morphosyntax_interface.py
AIdeaText's picture
Update modules/morphosyntax/morphosyntax_interface.py
ee7b3c9 verified
raw
history blame
5.69 kB
# 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...")