File size: 5,706 Bytes
3f98e79
78411bb
3f98e79
 
 
78411bb
 
 
 
 
3f98e79
78411bb
3f98e79
 
 
 
78411bb
 
3f98e79
 
78411bb
 
 
 
3f98e79
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78411bb
3f98e79
78411bb
3f98e79
 
 
78411bb
 
 
3f98e79
 
 
 
 
78411bb
3f98e79
 
 
 
78411bb
3f98e79
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78411bb
3f98e79
78411bb
3f98e79
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78411bb
 
3f98e79
 
78411bb
3f98e79
 
 
 
 
78411bb
 
3f98e79
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#modules/semantic/semantic_interface.py
import streamlit as st
from streamlit_float import *
from streamlit_antd_components import *
from streamlit.components.v1 import html
import io
from io import BytesIO
import base64
import matplotlib.pyplot as plt
import pandas as pd
import re

from .semantic_process import (
    process_semantic_input,
    format_semantic_results
)

from ..utils.widget_utils import generate_unique_key
from ..database.semantic_mongo_db import store_student_semantic_result
from ..database.semantics_export import export_user_interactions

import logging
logger = logging.getLogger(__name__)

def display_semantic_interface(lang_code, nlp_models, semantic_t):
    """
    Interfaz para el an谩lisis sem谩ntico
    Args:
        lang_code: C贸digo del idioma actual
        nlp_models: Modelos de spaCy cargados
        semantic_t: Diccionario de traducciones sem谩nticas
    """
    # Inicializar el estado de la entrada
    input_key = f"semantic_input_{lang_code}"
    if input_key not in st.session_state:
        st.session_state[input_key] = ""
        
    # Inicializar contador de an谩lisis si no existe
    if 'semantic_analysis_counter' not in st.session_state:
        st.session_state.semantic_analysis_counter = 0

    # Campo de entrada de texto
    text_input = st.text_area(
        semantic_t.get('text_input_label', 'Enter text to analyze'),
        height=150,
        placeholder=semantic_t.get('text_input_placeholder', 'Enter your text here...'),
        value=st.session_state[input_key],
        key=f"text_area_{lang_code}_{st.session_state.semantic_analysis_counter}"
    )

    # Opci贸n para cargar archivo
    uploaded_file = st.file_uploader(
        semantic_t.get('file_uploader', 'Or upload a text file'),
        type=['txt'],
        key=f"file_uploader_{lang_code}_{st.session_state.semantic_analysis_counter}"
    )

    if st.button(
        semantic_t.get('analyze_button', 'Analyze text'),
        key=f"analyze_button_{lang_code}_{st.session_state.semantic_analysis_counter}"
    ):
        if text_input or uploaded_file is not None:
            try:
                with st.spinner(semantic_t.get('processing', 'Processing...')):
                    # Obtener el texto a analizar
                    text_content = uploaded_file.getvalue().decode('utf-8') if uploaded_file else text_input
                    
                    # Realizar el an谩lisis
                    analysis_result = process_semantic_input(
                        text_content, 
                        lang_code,
                        nlp_models,
                        semantic_t
                    )
                    
                    # Guardar resultado en el estado de la sesi贸n
                    st.session_state.semantic_result = analysis_result
                    st.session_state.semantic_analysis_counter += 1
                    
                    # Mostrar resultados
                    display_semantic_results(
                        st.session_state.semantic_result,
                        lang_code,
                        semantic_t
                    )

            except Exception as e:
                logger.error(f"Error en an谩lisis sem谩ntico: {str(e)}")
                st.error(semantic_t.get('error_processing', f'Error processing text: {str(e)}'))
        else:
            st.warning(semantic_t.get('warning_message', 'Please enter text or upload a file'))
            
    # Si no se presion贸 el bot贸n, verificar si hay resultados previos
    elif 'semantic_result' in st.session_state and st.session_state.semantic_result is not None:
        display_semantic_results(
            st.session_state.semantic_result,
            lang_code,
            semantic_t
        )
    else:
        st.info(semantic_t.get('initial_message', 'Enter text to begin analysis'))

def display_semantic_results(result, lang_code, semantic_t):
    """
    Muestra los resultados del an谩lisis sem谩ntico
    Args:
        result: Resultados del an谩lisis
        lang_code: C贸digo del idioma
        semantic_t: Diccionario de traducciones
    """
    if result is None or not result['success']:
        st.warning(semantic_t.get('no_results', 'No results available'))
        return

    analysis = result['analysis']
    
    # Mostrar conceptos clave
    with st.expander(semantic_t.get('key_concepts', 'Key Concepts'), expanded=True):
        concept_text = " | ".join([
            f"{concept} ({frequency:.2f})" 
            for concept, frequency in analysis['key_concepts']
        ])
        st.write(concept_text)

    # Mostrar gr谩fico de relaciones conceptuales
    with st.expander(semantic_t.get('conceptual_relations', 'Conceptual Relations'), expanded=True):
        st.image(analysis['concept_graph'])

    # Mostrar gr谩fico de entidades
    with st.expander(semantic_t.get('entity_relations', 'Entity Relations'), expanded=True):
        st.image(analysis['entity_graph'])

    # Mostrar entidades identificadas
    if 'entities' in analysis:
        with st.expander(semantic_t.get('identified_entities', 'Identified Entities'), expanded=True):
            for entity_type, entities in analysis['entities'].items():
                st.subheader(entity_type)
                st.write(", ".join(entities))

    # Bot贸n de exportaci贸n
    if st.button(semantic_t.get('export_button', 'Export Analysis')):
        pdf_buffer = export_user_interactions(st.session_state.username, 'semantic')
        st.download_button(
            label=semantic_t.get('download_pdf', 'Download PDF'),
            data=pdf_buffer,
            file_name="semantic_analysis.pdf",
            mime="application/pdf"
        )