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...")