maxxxi100 commited on
Commit
6ced0de
·
verified ·
1 Parent(s): e5f125d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +46 -59
app.py CHANGED
@@ -6,37 +6,30 @@ import numpy as np
6
  import os
7
 
8
  # 1. DEFINICIÓN DE RUTAS CLAVE
9
- # Usa la ruta relativa correcta para tu base de datos en Hugging Face Space
10
  DATABASE_PATH = 'kaggle/password-datas/password_data.sqlite'
11
-
12
- # Ruta donde debería estar tu modelo entrenado. ¡Asegúrate de que exista!
13
- MODELO_PATH = 'modelo_entrenado.pkl' # <-- REEMPLAZA CON LA RUTA REAL DE TU MODELO
14
 
15
  # 2. CARGA DE RECURSOS (MODELO y DATOS)
16
- # Intenta cargar el modelo (si existe) o simula el proceso
17
  try:
18
- # 🚨🚨🚨 REEMPLAZA ESTO CON LA CARGA REAL DE TU MODELO 🚨🚨🚨
19
- # Por ejemplo:
20
- # with open(MODELO_PATH, 'rb') as f:
21
- # modelo = pickle.load(f)
22
- print("Simulando carga de modelo exitosa.")
23
-
24
- # ⚠️ Si tienes un vectorizador (ej. TF-IDF) o un scaler (ej. StandardScaler),
25
- # también debes cargarlo aquí:
26
- # with open('vectorizador.pkl', 'rb') as f:
27
- # vectorizador = pickle.load(f)
28
-
29
  except FileNotFoundError:
30
- print(f"ADVERTENCIA: Archivo de modelo no encontrado en {MODELO_PATH}. Usando lógica de prueba.")
31
- modelo = None
 
32
 
33
  # 3. FUNCIÓN DE INGENIERÍA DE CARACTERÍSTICAS (feature engineering)
34
- # Esta función debe replicar exactamente el preprocesamiento de tu entrenamiento
35
  def obtener_caracteristicas(password: str) -> np.ndarray:
36
  """Calcula las características de una contraseña (longitud, frecuencias, etc.)."""
37
 
38
  length = len(password)
39
- if length == 0: return np.zeros(4) # Evita división por cero
40
 
41
  lowercase_freq = len([char for char in password if char.islower()]) / length
42
  uppercase_freq = len([char for char in password if char.isupper()]) / length
@@ -48,7 +41,7 @@ def obtener_caracteristicas(password: str) -> np.ndarray:
48
  special_chars += 1
49
  special_char_freq = special_chars / length
50
 
51
- # Devuelve las características en el orden esperado por tu modelo
52
  return np.array([length, lowercase_freq, uppercase_freq, digit_freq, special_char_freq]).reshape(1, -1)
53
 
54
 
@@ -58,38 +51,42 @@ def predecir_fortaleza(contrasena: str) -> str:
58
 
59
  if not contrasena:
60
  return "Introduce una contraseña válida."
61
-
62
- # Verifica si el modelo se cargó
63
  if modelo is not None:
64
- # ⚠️ Aquí deberías preprocesar (vectorizar/escalar) las características
65
- # X_features = vectorizador.transform(obtener_caracteristicas(contrasena))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
 
67
- # Simulación de las características que irían al modelo
 
 
 
 
68
  X_features = obtener_caracteristicas(contrasena)
69
-
70
- # 🚨🚨🚨 REEMPLAZA LA LÍNEA INFERIOR CON TU CÓDIGO DE PREDICCIÓN REAL 🚨🚨🚨
71
- # prediccion_clase = modelo.predict(X_features)[0]
72
-
73
- # Lógica de prueba para garantizar que el app.py se ejecuta
74
- # Esto debe ser reemplazado por la predicción real de tu modelo (0, 1 o 2)
75
- if X_features[0, 0] < 8:
76
- prediccion_clase = 0
77
- elif X_features[0, 0] < 12 and X_features[0, 3] > 0.1: # Longitud y dígitos
78
- prediccion_clase = 1
79
- else:
80
- prediccion_clase = 2
81
 
82
- # Mapea la predicción al texto
83
- if prediccion_clase == 0:
84
- return "0 (Débil) - ¡Cámbiala!"
85
- elif prediccion_clase == 1:
86
- return "1 (Media) - Podría ser mejor."
87
  else:
88
- return "2 (Fuerte) - ¡Bien hecho!"
89
-
90
- else:
91
- # Mensaje de fallback si el modelo no se pudo cargar
92
- return f"Error: Modelo no cargado. Longitud de prueba: {len(contrasena)}."
93
 
94
 
95
  # 5. CONFIGURACIÓN E INICIO DE LA INTERFAZ DE GRADIO
@@ -101,14 +98,4 @@ iface = gr.Interface(
101
  description="Escribe una contraseña para obtener una predicción de su fortaleza (0: Débil, 1: Media, 2: Fuerte) basada en un modelo de clasificación."
102
  )
103
 
104
- iface.launch()
105
-
106
- # 6. VERIFICACIÓN DE ACCESO A DATOS (OPCIONAL)
107
- # Puedes usar esto para verificar que la ruta de la DB es correcta en los logs de la app.
108
- try:
109
- con = sqlite3.connect(DATABASE_PATH)
110
- data_check = pd.read_sql_query("SELECT COUNT(*) FROM Users", con)
111
- print(f"Verificación de DB exitosa. Número de registros: {data_check.iloc[0, 0]}")
112
- con.close()
113
- except Exception as e:
114
- print(f"Error al verificar la conexión a la base de datos: {e}")
 
6
  import os
7
 
8
  # 1. DEFINICIÓN DE RUTAS CLAVE
9
+ # VERIFICAR: Asegúrate de que esta ruta a la base de datos sea correcta en tu Space.
10
  DATABASE_PATH = 'kaggle/password-datas/password_data.sqlite'
11
+ # VERIFICAR: Asegúrate de que 'modelo_entrenado.pkl' esté en la raíz de tu repositorio,
12
+ # o usa la ruta relativa correcta (ej: 'models/modelo_entrenado.pkl')
13
+ MODELO_PATH = 'modelo_entrenado.pkl'
14
 
15
  # 2. CARGA DE RECURSOS (MODELO y DATOS)
16
+ modelo = None
17
  try:
18
+ # Intenta cargar el modelo real
19
+ with open(MODELO_PATH, 'rb') as f:
20
+ modelo = pickle.load(f)
21
+ print("Carga del modelo exitosa.")
 
 
 
 
 
 
 
22
  except FileNotFoundError:
23
+ print(f"ADVERTENCIA: Archivo de modelo NO encontrado en {MODELO_PATH}. Usando lógica de prueba.")
24
+ # Si el modelo no se encuentra, 'modelo' será None y la lógica de prueba se activará.
25
+
26
 
27
  # 3. FUNCIÓN DE INGENIERÍA DE CARACTERÍSTICAS (feature engineering)
 
28
  def obtener_caracteristicas(password: str) -> np.ndarray:
29
  """Calcula las características de una contraseña (longitud, frecuencias, etc.)."""
30
 
31
  length = len(password)
32
+ if length == 0: return np.zeros(5)
33
 
34
  lowercase_freq = len([char for char in password if char.islower()]) / length
35
  uppercase_freq = len([char for char in password if char.isupper()]) / length
 
41
  special_chars += 1
42
  special_char_freq = special_chars / length
43
 
44
+ # Devuelve las características
45
  return np.array([length, lowercase_freq, uppercase_freq, digit_freq, special_char_freq]).reshape(1, -1)
46
 
47
 
 
51
 
52
  if not contrasena:
53
  return "Introduce una contraseña válida."
54
+
55
+ # Verificación de carga del modelo y ejecución de predicción
56
  if modelo is not None:
57
+ try:
58
+ # 1. Obtener características
59
+ X_features = obtener_caracteristicas(contrasena)
60
+
61
+ # 2. Preprocesamiento adicional si aplica (ej. escalado/normalización)
62
+ # Asegúrate de cargar y usar tu scaler/vectorizer aquí si fue necesario
63
+
64
+ # 3. Predicción REAL
65
+ prediccion_clase = modelo.predict(X_features)[0]
66
+
67
+ # Mapea la predicción al texto
68
+ if prediccion_clase == 0:
69
+ return "0 (Débil) - ¡Cámbiala!"
70
+ elif prediccion_clase == 1:
71
+ return "1 (Media) - Podría ser mejor."
72
+ else:
73
+ return "2 (Fuerte) - ¡Bien hecho!"
74
 
75
+ except Exception as e:
76
+ return f"Error en la predicción (ver logs): {e}"
77
+
78
+ else:
79
+ # LÓGICA DE PRUEBA (Fallback si el modelo no carga)
80
  X_features = obtener_caracteristicas(contrasena)
81
+ length = X_features[0, 0]
82
+ digit_freq = X_features[0, 3]
 
 
 
 
 
 
 
 
 
 
83
 
84
+ if length < 8:
85
+ return "0 (Débil) - ¡Modelo no cargado, usando lógica de prueba!"
86
+ elif length < 12 and digit_freq > 0.1:
87
+ return "1 (Media) - ¡Modelo no cargado, usando lógica de prueba!"
 
88
  else:
89
+ return "2 (Fuerte) - ¡Modelo no cargado, usando lógica de prueba!"
 
 
 
 
90
 
91
 
92
  # 5. CONFIGURACIÓN E INICIO DE LA INTERFAZ DE GRADIO
 
98
  description="Escribe una contraseña para obtener una predicción de su fortaleza (0: Débil, 1: Media, 2: Fuerte) basada en un modelo de clasificación."
99
  )
100
 
101
+ iface.launch(server_name="0.0.0.0", server_port=7860) # Usar puertos estándar de HF