|
|
|
|
|
import streamlit as st |
|
import re |
|
import logging |
|
from spacy import displacy |
|
|
|
|
|
|
|
|
|
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} |
|
) |
|
|
|
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") |
|
|
|
|
|
initialize_arc_analysis_state() |
|
|
|
|
|
tabs = st.tabs(["Arco", "Categorías", "Morfológico"]) |
|
|
|
|
|
with tabs[0]: |
|
st.write("Texto base e iteraciones...") |
|
|
|
|
|
if st.button("Nuevo Análisis", key="new_analysis"): |
|
reset_morpho_state() |
|
st.experimental_rerun() |
|
|
|
|
|
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" |
|
) |
|
|
|
|
|
if st.button("Analizar Texto Base", key="analyze_base"): |
|
|
|
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"] |
|
) |
|
|
|
display_arc_diagram(doc) |
|
|
|
|
|
base_id = store_student_morphosyntax_base( |
|
st.session_state.username, |
|
st.session_state.arc_analysis_state["original_text"], |
|
arc_diagrams=None |
|
) |
|
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("---") |
|
|
|
|
|
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" |
|
) |
|
|
|
|
|
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: |
|
|
|
doc_iter = nlp_models[lang_code]( |
|
st.session_state.arc_analysis_state["iteration_text"] |
|
) |
|
display_arc_diagram(doc_iter) |
|
|
|
|
|
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 |
|
) |
|
if iteration_id: |
|
st.success(f"Iteración guardada. iteration_id={iteration_id}") |
|
|
|
|
|
with tabs[1]: |
|
st.info("En desarrollo...") |
|
|
|
|
|
with tabs[2]: |
|
st.info("En desarrollo...") |
|
|
|
|