AIdeaText commited on
Commit
2aadb4c
·
verified ·
1 Parent(s): 713dbed

Create semantic_interface_BackUp_18-5-2025.py

Browse files
modules/semantic/semantic_interface_BackUp_18-5-2025.py ADDED
@@ -0,0 +1,261 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #modules/semantic/semantic_interface.py
2
+ import streamlit as st
3
+ from streamlit_float import *
4
+ from streamlit_antd_components import *
5
+ from streamlit.components.v1 import html
6
+ import spacy_streamlit
7
+ import io
8
+ from io import BytesIO
9
+ import base64
10
+ import matplotlib.pyplot as plt
11
+ import pandas as pd
12
+ import re
13
+ import logging
14
+
15
+ # Configuración del logger
16
+ logger = logging.getLogger(__name__)
17
+
18
+ # Importaciones locales
19
+ from .semantic_process import (
20
+ process_semantic_input,
21
+ format_semantic_results
22
+ )
23
+
24
+ from ..utils.widget_utils import generate_unique_key
25
+ from ..database.semantic_mongo_db import store_student_semantic_result
26
+ from ..database.chat_mongo_db import store_chat_history, get_chat_history
27
+
28
+ # from ..database.semantic_export import export_user_interactions
29
+
30
+
31
+ ###############################
32
+
33
+ # En semantic_interface.py
34
+ def display_semantic_interface(lang_code, nlp_models, semantic_t):
35
+ try:
36
+ # 1. Inicializar el estado de la sesión
37
+ if 'semantic_state' not in st.session_state:
38
+ st.session_state.semantic_state = {
39
+ 'analysis_count': 0,
40
+ 'last_analysis': None,
41
+ 'current_file': None,
42
+ 'pending_analysis': False # Nuevo flag para controlar el análisis pendiente
43
+ }
44
+
45
+ # 2. Área de carga de archivo con mensaje informativo
46
+ st.info(semantic_t.get('initial_instruction',
47
+ 'Para comenzar un nuevo análisis semántico, cargue un archivo de texto (.txt)'))
48
+
49
+ uploaded_file = st.file_uploader(
50
+ semantic_t.get('semantic_file_uploader', 'Upload a text file for semantic analysis'),
51
+ type=['txt'],
52
+ key=f"semantic_file_uploader_{st.session_state.semantic_state['analysis_count']}"
53
+ )
54
+
55
+ # 2.1 Verificar si hay un archivo cargado y un análisis pendiente
56
+ if uploaded_file is not None and st.session_state.semantic_state.get('pending_analysis', False):
57
+ try:
58
+ with st.spinner(semantic_t.get('processing', 'Processing...')):
59
+ # Realizar análisis
60
+ text_content = uploaded_file.getvalue().decode('utf-8')
61
+
62
+ analysis_result = process_semantic_input(
63
+ text_content,
64
+ lang_code,
65
+ nlp_models,
66
+ semantic_t
67
+ )
68
+
69
+ if analysis_result['success']:
70
+ # Guardar resultado
71
+ st.session_state.semantic_result = analysis_result
72
+ st.session_state.semantic_state['analysis_count'] += 1
73
+ st.session_state.semantic_state['current_file'] = uploaded_file.name
74
+
75
+ # Guardar en base de datos
76
+ storage_success = store_student_semantic_result(
77
+ st.session_state.username,
78
+ text_content,
79
+ analysis_result['analysis']
80
+ )
81
+
82
+ if storage_success:
83
+ st.success(
84
+ semantic_t.get('analysis_complete',
85
+ 'Análisis completado y guardado. Para realizar un nuevo análisis, cargue otro archivo.')
86
+ )
87
+ else:
88
+ st.error(semantic_t.get('error_message', 'Error saving analysis'))
89
+ else:
90
+ st.error(analysis_result['message'])
91
+
92
+ # Restablecer el flag de análisis pendiente
93
+ st.session_state.semantic_state['pending_analysis'] = False
94
+
95
+ except Exception as e:
96
+ logger.error(f"Error en análisis semántico: {str(e)}")
97
+ st.error(semantic_t.get('error_processing', f'Error processing text: {str(e)}'))
98
+ # Restablecer el flag de análisis pendiente en caso de error
99
+ st.session_state.semantic_state['pending_analysis'] = False
100
+
101
+ # 3. Columnas para los botones y mensajes
102
+ col1, col2 = st.columns([1,4])
103
+
104
+ # 4. Botón de análisis
105
+ with col1:
106
+ analyze_button = st.button(
107
+ semantic_t.get('semantic_analyze_button', 'Analyze'),
108
+ key=f"semantic_analyze_button_{st.session_state.semantic_state['analysis_count']}",
109
+ type="primary",
110
+ icon="🔍",
111
+ disabled=uploaded_file is None,
112
+ use_container_width=True
113
+ )
114
+
115
+ # 5. Procesar análisis
116
+ if analyze_button and uploaded_file is not None:
117
+ # En lugar de realizar el análisis inmediatamente, establecer el flag
118
+ st.session_state.semantic_state['pending_analysis'] = True
119
+ # Forzar la recarga de la aplicación
120
+ st.rerun()
121
+
122
+ # 6. Mostrar resultados previos o mensaje inicial
123
+ elif 'semantic_result' in st.session_state and st.session_state.semantic_result is not None:
124
+ # Mostrar mensaje sobre el análisis actual
125
+ st.info(
126
+ semantic_t.get('current_analysis_message',
127
+ 'Mostrando análisis del archivo: {}. Para realizar un nuevo análisis, cargue otro archivo.'
128
+ ).format(st.session_state.semantic_state["current_file"])
129
+ )
130
+
131
+ display_semantic_results(
132
+ st.session_state.semantic_result,
133
+ lang_code,
134
+ semantic_t
135
+ )
136
+ else:
137
+ st.info(semantic_t.get('upload_prompt', 'Cargue un archivo para comenzar el análisis'))
138
+
139
+ except Exception as e:
140
+ logger.error(f"Error general en interfaz semántica: {str(e)}")
141
+ st.error(semantic_t.get('general_error', "Se produjo un error. Por favor, intente de nuevo."))
142
+
143
+
144
+ #######################################
145
+
146
+ def display_semantic_results(semantic_result, lang_code, semantic_t):
147
+ """
148
+ Muestra los resultados del análisis semántico de conceptos clave.
149
+ """
150
+ if semantic_result is None or not semantic_result['success']:
151
+ st.warning(semantic_t.get('no_results', 'No results available'))
152
+ return
153
+
154
+ analysis = semantic_result['analysis']
155
+
156
+ # Mostrar conceptos clave en formato horizontal (se mantiene igual)
157
+ st.subheader(semantic_t.get('key_concepts', 'Key Concepts'))
158
+ if 'key_concepts' in analysis and analysis['key_concepts']:
159
+ df = pd.DataFrame(
160
+ analysis['key_concepts'],
161
+ columns=[
162
+ semantic_t.get('concept', 'Concept'),
163
+ semantic_t.get('frequency', 'Frequency')
164
+ ]
165
+ )
166
+
167
+ st.write(
168
+ """
169
+ <style>
170
+ .concept-table {
171
+ display: flex;
172
+ flex-wrap: wrap;
173
+ gap: 10px;
174
+ margin-bottom: 20px;
175
+ }
176
+ .concept-item {
177
+ background-color: #f0f2f6;
178
+ border-radius: 5px;
179
+ padding: 8px 12px;
180
+ display: flex;
181
+ align-items: center;
182
+ gap: 8px;
183
+ }
184
+ .concept-name {
185
+ font-weight: bold;
186
+ }
187
+ .concept-freq {
188
+ color: #666;
189
+ font-size: 0.9em;
190
+ }
191
+ </style>
192
+ <div class="concept-table">
193
+ """ +
194
+ ''.join([
195
+ f'<div class="concept-item"><span class="concept-name">{concept}</span>'
196
+ f'<span class="concept-freq">({freq:.2f})</span></div>'
197
+ for concept, freq in df.values
198
+ ]) +
199
+ "</div>",
200
+ unsafe_allow_html=True
201
+ )
202
+ else:
203
+ st.info(semantic_t.get('no_concepts', 'No key concepts found'))
204
+
205
+ # Gráfico de conceptos (versión modificada)
206
+ if 'concept_graph' in analysis and analysis['concept_graph'] is not None:
207
+ try:
208
+ # Sección del gráfico (sin div contenedor)
209
+ st.image(
210
+ analysis['concept_graph'],
211
+ use_container_width=True
212
+ )
213
+
214
+ # --- SOLO ESTE BLOQUE ES NUEVO ---
215
+ st.markdown("""
216
+ <style>
217
+ div[data-testid="stExpander"] div[role="button"] p {
218
+ text-align: center;
219
+ font-weight: bold;
220
+ }
221
+ </style>
222
+ """, unsafe_allow_html=True)
223
+ # ---------------------------------
224
+
225
+ # Expandible con la interpretación (se mantiene igual)
226
+ with st.expander("📊 " + semantic_t.get('semantic_graph_interpretation', "Interpretación del gráfico semántico")):
227
+ st.markdown(f"""
228
+ - 🔀 {semantic_t.get('semantic_arrow_meaning', 'Las flechas indican la dirección de la relación entre conceptos')}
229
+ - 🎨 {semantic_t.get('semantic_color_meaning', 'Los colores más intensos indican conceptos más centrales en el texto')}
230
+ - ⭕ {semantic_t.get('semantic_size_meaning', 'El tamaño de los nodos representa la frecuencia del concepto')}
231
+ - ↔️ {semantic_t.get('semantic_thickness_meaning', 'El grosor de las líneas indica la fuerza de la conexión')}
232
+ """)
233
+
234
+ # Contenedor para botones (se mantiene igual pero centrado)
235
+ st.markdown("""
236
+ <style>
237
+ .download-btn-container {
238
+ display: flex;
239
+ justify-content: center;
240
+ margin-top: 10px;
241
+ }
242
+ </style>
243
+ <div class="download-btn-container">
244
+ """, unsafe_allow_html=True)
245
+
246
+ st.download_button(
247
+ label="📥 " + semantic_t.get('download_semantic_network_graph', "Descargar gráfico de red semántica"),
248
+ data=analysis['concept_graph'],
249
+ file_name="semantic_graph.png",
250
+ mime="image/png",
251
+ use_container_width=True
252
+ )
253
+
254
+ st.markdown("</div>", unsafe_allow_html=True)
255
+
256
+ except Exception as e:
257
+ logger.error(f"Error displaying graph: {str(e)}")
258
+ st.error(semantic_t.get('graph_error', 'Error displaying the graph'))
259
+ else:
260
+ st.info(semantic_t.get('no_graph', 'No concept graph available'))
261
+