AIdeaText commited on
Commit
743853f
·
verified ·
1 Parent(s): 0110cea

Update modules/discourse/discourse_interface.py

Browse files
modules/discourse/discourse_interface.py CHANGED
@@ -15,10 +15,6 @@ logger = logging.getLogger(__name__)
15
  def display_discourse_interface(lang_code, nlp_models, discourse_t):
16
  """
17
  Interfaz para el análisis del discurso
18
- Args:
19
- lang_code: Código del idioma actual
20
- nlp_models: Modelos de spaCy cargados
21
- discourse_t: Diccionario de traducciones
22
  """
23
  try:
24
  # Activar estado
@@ -71,11 +67,9 @@ def display_discourse_interface(lang_code, nlp_models, discourse_t):
71
  if analyze_button and uploaded_file1 and uploaded_file2:
72
  try:
73
  with st.spinner(discourse_t.get('processing', 'Procesando análisis...')):
74
- # Leer contenido de archivos
75
  text1 = uploaded_file1.getvalue().decode('utf-8')
76
  text2 = uploaded_file2.getvalue().decode('utf-8')
77
 
78
- # Realizar análisis
79
  result = perform_discourse_analysis(
80
  text1,
81
  text2,
@@ -84,7 +78,6 @@ def display_discourse_interface(lang_code, nlp_models, discourse_t):
84
  )
85
 
86
  if result['success']:
87
- # Guardar estado
88
  st.session_state.discourse_result = result
89
  st.session_state.discourse_state['analysis_count'] += 1
90
  st.session_state.discourse_state['current_files'] = (
@@ -92,7 +85,6 @@ def display_discourse_interface(lang_code, nlp_models, discourse_t):
92
  uploaded_file2.name
93
  )
94
 
95
- # Guardar en base de datos
96
  if store_student_discourse_result(
97
  st.session_state.username,
98
  text1,
@@ -100,8 +92,6 @@ def display_discourse_interface(lang_code, nlp_models, discourse_t):
100
  result
101
  ):
102
  st.success(discourse_t.get('success_message', 'Análisis guardado correctamente'))
103
-
104
- # Mostrar resultados
105
  display_discourse_results(result, lang_code, discourse_t)
106
  else:
107
  st.error(discourse_t.get('error_message', 'Error al guardar el análisis'))
@@ -109,6 +99,7 @@ def display_discourse_interface(lang_code, nlp_models, discourse_t):
109
  st.error(discourse_t.get('analysis_error', 'Error en el análisis'))
110
 
111
  except Exception as e:
 
112
  logger.error(f"Error en análisis del discurso: {str(e)}")
113
  st.error(discourse_t.get('error_processing', f'Error procesando archivos: {str(e)}'))
114
 
@@ -125,29 +116,115 @@ def display_discourse_interface(lang_code, nlp_models, discourse_t):
125
  discourse_t
126
  )
127
 
128
- # Al completar el análisis o en caso de error
129
- if analyze_button and uploaded_file is not None:
130
- try:
131
- # ... código de análisis ...
132
-
133
- if analysis_result['success']:
134
- st.session_state.tab_states['semantic_active'] = True # Mantener activo
135
- else:
136
- st.session_state.tab_states['semantic_active'] = False # Desactivar en error
137
-
138
- except Exception as e:
139
- st.session_state.tab_states['discourse_active'] = False
140
- logger.error(f"Error en análisis del discurso: {str(e)}")
141
- st.error(semantic_t.get('error_processing', f'Error processing text: {str(e)}'))
142
-
143
  except Exception as e:
144
  st.session_state.tab_states['discourse_active'] = False
145
  logger.error(f"Error general en interfaz discursiva: {str(e)}")
146
- st.error(semantic_t.get('general_error', "Se produjo un error. Por favor, intente de nuevo."))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
147
 
 
148
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
149
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
150
 
 
 
 
151
 
152
  ##########################################################################################
153
 
 
15
  def display_discourse_interface(lang_code, nlp_models, discourse_t):
16
  """
17
  Interfaz para el análisis del discurso
 
 
 
 
18
  """
19
  try:
20
  # Activar estado
 
67
  if analyze_button and uploaded_file1 and uploaded_file2:
68
  try:
69
  with st.spinner(discourse_t.get('processing', 'Procesando análisis...')):
 
70
  text1 = uploaded_file1.getvalue().decode('utf-8')
71
  text2 = uploaded_file2.getvalue().decode('utf-8')
72
 
 
73
  result = perform_discourse_analysis(
74
  text1,
75
  text2,
 
78
  )
79
 
80
  if result['success']:
 
81
  st.session_state.discourse_result = result
82
  st.session_state.discourse_state['analysis_count'] += 1
83
  st.session_state.discourse_state['current_files'] = (
 
85
  uploaded_file2.name
86
  )
87
 
 
88
  if store_student_discourse_result(
89
  st.session_state.username,
90
  text1,
 
92
  result
93
  ):
94
  st.success(discourse_t.get('success_message', 'Análisis guardado correctamente'))
 
 
95
  display_discourse_results(result, lang_code, discourse_t)
96
  else:
97
  st.error(discourse_t.get('error_message', 'Error al guardar el análisis'))
 
99
  st.error(discourse_t.get('analysis_error', 'Error en el análisis'))
100
 
101
  except Exception as e:
102
+ st.session_state.tab_states['discourse_active'] = False
103
  logger.error(f"Error en análisis del discurso: {str(e)}")
104
  st.error(discourse_t.get('error_processing', f'Error procesando archivos: {str(e)}'))
105
 
 
116
  discourse_t
117
  )
118
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  except Exception as e:
120
  st.session_state.tab_states['discourse_active'] = False
121
  logger.error(f"Error general en interfaz discursiva: {str(e)}")
122
+ st.error(discourse_t.get('general_error', "Se produjo un error. Por favor, intente de nuevo."))
123
+
124
+ def display_discourse_results(result, lang_code, discourse_t):
125
+ """
126
+ Muestra los resultados del análisis del discurso
127
+ """
128
+ if not result.get('success'):
129
+ st.warning(discourse_t.get('no_results', 'No hay resultados disponibles'))
130
+ return
131
+
132
+ # Estilo CSS unificado
133
+ st.markdown("""
134
+ <style>
135
+ .concepts-container {
136
+ display: flex;
137
+ flex-wrap: nowrap;
138
+ gap: 8px;
139
+ padding: 12px;
140
+ background-color: #f8f9fa;
141
+ border-radius: 8px;
142
+ overflow-x: auto;
143
+ margin-bottom: 15px;
144
+ white-space: nowrap;
145
+ }
146
+ .concept-item {
147
+ background-color: white;
148
+ border-radius: 4px;
149
+ padding: 6px 10px;
150
+ display: inline-flex;
151
+ align-items: center;
152
+ gap: 4px;
153
+ box-shadow: 0 1px 2px rgba(0,0,0,0.1);
154
+ flex-shrink: 0;
155
+ }
156
+ .concept-name {
157
+ font-weight: 500;
158
+ color: #1f2937;
159
+ font-size: 0.85em;
160
+ }
161
+ .concept-freq {
162
+ color: #6b7280;
163
+ font-size: 0.75em;
164
+ }
165
+ .graph-section {
166
+ margin-top: 20px;
167
+ background-color: white;
168
+ padding: 15px;
169
+ border-radius: 8px;
170
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
171
+ }
172
+ </style>
173
+ """, unsafe_allow_html=True)
174
 
175
+ col1, col2 = st.columns(2)
176
 
177
+ for i, (concepts_key, graph_key, title) in enumerate([
178
+ ('key_concepts1', 'graph1', 'Documento 1'),
179
+ ('key_concepts2', 'graph2', 'Documento 2')
180
+ ]):
181
+ with [col1, col2][i]:
182
+ st.subheader(discourse_t.get(f'doc{i+1}_title', title))
183
+
184
+ # Mostrar conceptos
185
+ if concepts_key in result:
186
+ concepts_html = f"""
187
+ <div class="concepts-container">
188
+ {''.join([
189
+ f'<div class="concept-item"><span class="concept-name">{concept}</span>'
190
+ f'<span class="concept-freq">({freq:.2f})</span></div>'
191
+ for concept, freq in result[concepts_key]
192
+ ])}
193
+ </div>
194
+ """
195
+ st.markdown(concepts_html, unsafe_allow_html=True)
196
 
197
+ # Mostrar grafo
198
+ if graph_key in result:
199
+ st.markdown('<div class="graph-section">', unsafe_allow_html=True)
200
+ st.pyplot(result[graph_key])
201
+
202
+ # Botón de descarga
203
+ st.download_button(
204
+ label="📥 " + discourse_t.get('download_graph', "Download"),
205
+ data=result.get(f'{graph_key}_bytes'),
206
+ file_name=f"discourse_graph{i+1}.png",
207
+ mime="image/png",
208
+ use_container_width=True
209
+ )
210
+
211
+ # Interpretación del grafo
212
+ st.markdown("**📊 Interpretación del grafo:**")
213
+ st.markdown("""
214
+ - 🔀 Las flechas indican la dirección de la relación
215
+ - 🎨 Colores más intensos = conceptos más centrales
216
+ - ⭕ Tamaño del nodo = frecuencia del concepto
217
+ - ↔️ Grosor de líneas = fuerza de la conexión
218
+ """)
219
+ st.markdown('</div>', unsafe_allow_html=True)
220
+ else:
221
+ st.warning(discourse_t.get('graph_not_available', 'Gráfico no disponible'))
222
+ else:
223
+ st.warning(discourse_t.get('concepts_not_available', 'Conceptos no disponibles'))
224
 
225
+ # Nota informativa
226
+ st.info(discourse_t.get('comparison_note',
227
+ 'La funcionalidad de comparación detallada estará disponible en una próxima actualización.'))
228
 
229
  ##########################################################################################
230