AIdeaText commited on
Commit
a62673f
·
verified ·
1 Parent(s): fb211d3

Update modules/text_analysis/semantic_analysis.py

Browse files
modules/text_analysis/semantic_analysis.py CHANGED
@@ -256,46 +256,74 @@ def create_concept_graph(doc, key_concepts):
256
  ###############################################################################
257
  def visualize_concept_graph(G, lang_code):
258
  """
259
- Visualiza el grafo de conceptos con nodos ajustados según la longitud del texto.
 
 
 
 
 
260
  """
261
  try:
262
  # Crear nueva figura con mayor tamaño
263
- fig = plt.figure(figsize=(15, 10)) # Aumentado de (12, 8) a (15, 10)
264
 
265
  if not G.nodes():
266
  logger.warning("Grafo vacío, retornando figura vacía")
267
  return fig
268
 
 
 
 
 
 
 
269
  # Calcular layout con más espacio
270
- pos = nx.spring_layout(G, k=2, iterations=50) # Aumentado k de 1 a 2
271
 
272
  # Calcular factor de escala basado en número de nodos
273
- num_nodes = len(G.nodes())
274
  scale_factor = 1000 if num_nodes < 10 else 500 if num_nodes < 20 else 200
275
 
276
  # Obtener pesos ajustados
277
- node_weights = [G.nodes[node].get('weight', 1) * scale_factor for node in G.nodes()]
278
- edge_weights = [G[u][v].get('weight', 1) for u, v in G.edges()]
 
 
 
279
 
280
- # Dibujar grafo
281
- nx.draw_networkx_nodes(G, pos,
282
  node_size=node_weights,
283
- node_color='lightblue',
284
- alpha=0.6)
285
 
286
- nx.draw_networkx_edges(G, pos,
 
287
  width=edge_weights,
288
- alpha=0.5,
289
- edge_color='gray')
 
 
 
 
290
 
291
  # Ajustar tamaño de fuente según número de nodos
292
  font_size = 12 if num_nodes < 10 else 10 if num_nodes < 20 else 8
293
 
294
- nx.draw_networkx_labels(G, pos,
295
- font_size=font_size,
296
- font_weight='bold')
 
 
 
 
 
 
 
 
 
297
 
298
- plt.title("Red de conceptos relacionados", pad=20)
299
  plt.axis('off')
300
 
301
  return fig
 
256
  ###############################################################################
257
  def visualize_concept_graph(G, lang_code):
258
  """
259
+ Visualiza el grafo de conceptos con nodos coloreados y flechas direccionales.
260
+ Args:
261
+ G: networkx.Graph - Grafo de conceptos
262
+ lang_code: str - Código del idioma
263
+ Returns:
264
+ matplotlib.figure.Figure - Figura del grafo
265
  """
266
  try:
267
  # Crear nueva figura con mayor tamaño
268
+ fig = plt.figure(figsize=(15, 10))
269
 
270
  if not G.nodes():
271
  logger.warning("Grafo vacío, retornando figura vacía")
272
  return fig
273
 
274
+ # Convertir grafo no dirigido a dirigido para mostrar flechas
275
+ DG = nx.DiGraph(G)
276
+
277
+ # Calcular centralidad de los nodos para el color
278
+ centrality = nx.degree_centrality(G)
279
+
280
  # Calcular layout con más espacio
281
+ pos = nx.spring_layout(DG, k=2, iterations=50)
282
 
283
  # Calcular factor de escala basado en número de nodos
284
+ num_nodes = len(DG.nodes())
285
  scale_factor = 1000 if num_nodes < 10 else 500 if num_nodes < 20 else 200
286
 
287
  # Obtener pesos ajustados
288
+ node_weights = [DG.nodes[node].get('weight', 1) * scale_factor for node in DG.nodes()]
289
+ edge_weights = [DG[u][v].get('weight', 1) for u, v in DG.edges()]
290
+
291
+ # Crear mapa de colores basado en centralidad
292
+ node_colors = [plt.cm.viridis(centrality[node]) for node in DG.nodes()]
293
 
294
+ # Dibujar nodos
295
+ nx.draw_networkx_nodes(DG, pos,
296
  node_size=node_weights,
297
+ node_color=node_colors,
298
+ alpha=0.7)
299
 
300
+ # Dibujar aristas con flechas
301
+ nx.draw_networkx_edges(DG, pos,
302
  width=edge_weights,
303
+ alpha=0.6,
304
+ edge_color='gray',
305
+ arrows=True, # Activar flechas
306
+ arrowsize=20, # Tamaño de las flechas
307
+ arrowstyle='->', # Estilo de las flechas
308
+ connectionstyle='arc3,rad=0.2') # Curvar las líneas para mejor visualización
309
 
310
  # Ajustar tamaño de fuente según número de nodos
311
  font_size = 12 if num_nodes < 10 else 10 if num_nodes < 20 else 8
312
 
313
+ # Dibujar etiquetas con fondo blanco para mejor legibilidad
314
+ labels = nx.draw_networkx_labels(DG, pos,
315
+ font_size=font_size,
316
+ font_weight='bold',
317
+ bbox=dict(facecolor='white',
318
+ edgecolor='none',
319
+ alpha=0.7))
320
+
321
+ # Añadir leyenda de centralidad
322
+ sm = plt.cm.ScalarMappable(cmap=plt.cm.viridis)
323
+ sm.set_array([])
324
+ plt.colorbar(sm, label='Centralidad del concepto')
325
 
326
+ plt.title("Red de conceptos relacionados", pad=20, fontsize=14)
327
  plt.axis('off')
328
 
329
  return fig