AIdeaText commited on
Commit
97a0dbe
·
verified ·
1 Parent(s): 8994e27

Update modules/studentact/current_situation_analysis.py

Browse files
modules/studentact/current_situation_analysis.py CHANGED
@@ -444,14 +444,19 @@ def get_dependency_depths(token, depth=0, analyzed_tokens=None):
444
 
445
  return current_result
446
 
447
- def normalize_score(value, optimal_value=1.0, range_factor=2.0, optimal_length=None,
 
 
 
448
  optimal_connections=None, optimal_depth=None):
449
  """
450
- Normaliza un valor a una escala de 0-1 con manejo de casos extremos.
451
 
452
  Args:
453
  value: Valor a normalizar
454
- optimal_value: Valor óptimo de referencia
 
 
455
  range_factor: Factor para ajustar el rango
456
  optimal_length: Longitud óptima (opcional)
457
  optimal_connections: Número óptimo de conexiones (opcional)
@@ -461,6 +466,30 @@ def normalize_score(value, optimal_value=1.0, range_factor=2.0, optimal_length=N
461
  float: Valor normalizado entre 0 y 1
462
  """
463
  try:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
464
  # Validar valores negativos o cero
465
  if value < 0:
466
  logger.warning(f"Valor negativo recibido: {value}")
@@ -471,6 +500,13 @@ def normalize_score(value, optimal_value=1.0, range_factor=2.0, optimal_length=N
471
  logger.warning("Valor cero recibido")
472
  return 0.0
473
 
 
 
 
 
 
 
 
474
  # Identificar el valor de referencia a usar
475
  if optimal_depth is not None:
476
  reference = optimal_depth
@@ -479,25 +515,31 @@ def normalize_score(value, optimal_value=1.0, range_factor=2.0, optimal_length=N
479
  elif optimal_length is not None:
480
  reference = optimal_length
481
  else:
482
- reference = optimal_value
483
 
484
  # Validar valor de referencia
485
  if reference <= 0:
486
  logger.warning(f"Valor de referencia inválido: {reference}")
487
  return 0.0
488
 
489
- # Calcular diferencia y máxima diferencia permitida
490
- diff = abs(value - reference)
491
- max_diff = reference * range_factor
492
-
493
- # Validar max_diff
494
- if max_diff <= 0:
495
- logger.warning(f"Máxima diferencia inválida: {max_diff}")
496
- return 0.0
 
 
 
 
 
 
 
 
 
497
 
498
- # Calcular score normalizado
499
- score = 1.0 - min(diff / max_diff, 1.0)
500
-
501
  # Asegurar que el resultado esté entre 0 y 1
502
  return max(0.0, min(1.0, score))
503
 
@@ -505,6 +547,11 @@ def normalize_score(value, optimal_value=1.0, range_factor=2.0, optimal_length=N
505
  logger.error(f"Error en normalize_score: {str(e)}")
506
  return 0.0
507
 
 
 
 
 
 
508
  # Funciones de generación de gráficos
509
  def generate_sentence_graphs(doc):
510
  """Genera visualizaciones de estructura de oraciones"""
 
444
 
445
  return current_result
446
 
447
+ ###########################################################33
448
+ def normalize_score(value, metric_type,
449
+ min_threshold=0.0, target_threshold=1.0,
450
+ range_factor=2.0, optimal_length=None,
451
  optimal_connections=None, optimal_depth=None):
452
  """
453
+ Normaliza un valor considerando umbrales específicos por tipo de métrica.
454
 
455
  Args:
456
  value: Valor a normalizar
457
+ metric_type: Tipo de métrica ('vocabulary', 'structure', 'cohesion', 'clarity')
458
+ min_threshold: Valor mínimo aceptable
459
+ target_threshold: Valor objetivo
460
  range_factor: Factor para ajustar el rango
461
  optimal_length: Longitud óptima (opcional)
462
  optimal_connections: Número óptimo de conexiones (opcional)
 
466
  float: Valor normalizado entre 0 y 1
467
  """
468
  try:
469
+ # Definir umbrales por tipo de métrica
470
+ METRIC_THRESHOLDS = {
471
+ 'vocabulary': {
472
+ 'min': 0.60,
473
+ 'target': 0.75,
474
+ 'range_factor': 1.5
475
+ },
476
+ 'structure': {
477
+ 'min': 0.65,
478
+ 'target': 0.80,
479
+ 'range_factor': 1.8
480
+ },
481
+ 'cohesion': {
482
+ 'min': 0.55,
483
+ 'target': 0.70,
484
+ 'range_factor': 1.6
485
+ },
486
+ 'clarity': {
487
+ 'min': 0.60,
488
+ 'target': 0.75,
489
+ 'range_factor': 1.7
490
+ }
491
+ }
492
+
493
  # Validar valores negativos o cero
494
  if value < 0:
495
  logger.warning(f"Valor negativo recibido: {value}")
 
500
  logger.warning("Valor cero recibido")
501
  return 0.0
502
 
503
+ # Obtener umbrales específicos para el tipo de métrica
504
+ thresholds = METRIC_THRESHOLDS.get(metric_type, {
505
+ 'min': min_threshold,
506
+ 'target': target_threshold,
507
+ 'range_factor': range_factor
508
+ })
509
+
510
  # Identificar el valor de referencia a usar
511
  if optimal_depth is not None:
512
  reference = optimal_depth
 
515
  elif optimal_length is not None:
516
  reference = optimal_length
517
  else:
518
+ reference = thresholds['target']
519
 
520
  # Validar valor de referencia
521
  if reference <= 0:
522
  logger.warning(f"Valor de referencia inválido: {reference}")
523
  return 0.0
524
 
525
+ # Calcular score basado en umbrales
526
+ if value < thresholds['min']:
527
+ # Valor por debajo del mínimo
528
+ score = (value / thresholds['min']) * 0.5 # Máximo 0.5 para valores bajo el mínimo
529
+ elif value < thresholds['target']:
530
+ # Valor entre mínimo y objetivo
531
+ range_size = thresholds['target'] - thresholds['min']
532
+ progress = (value - thresholds['min']) / range_size
533
+ score = 0.5 + (progress * 0.5) # Escala entre 0.5 y 1.0
534
+ else:
535
+ # Valor alcanza o supera el objetivo
536
+ score = 1.0
537
+
538
+ # Penalizar valores muy por encima del objetivo
539
+ if value > (thresholds['target'] * thresholds['range_factor']):
540
+ excess = (value - thresholds['target']) / (thresholds['target'] * thresholds['range_factor'])
541
+ score = max(0.7, 1.0 - excess) # No bajar de 0.7 para valores altos
542
 
 
 
 
543
  # Asegurar que el resultado esté entre 0 y 1
544
  return max(0.0, min(1.0, score))
545
 
 
547
  logger.error(f"Error en normalize_score: {str(e)}")
548
  return 0.0
549
 
550
+
551
+
552
+
553
+ ##############################################################
554
+
555
  # Funciones de generación de gráficos
556
  def generate_sentence_graphs(doc):
557
  """Genera visualizaciones de estructura de oraciones"""