-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclean_sensitive_data.py
More file actions
158 lines (128 loc) · 5.48 KB
/
clean_sensitive_data.py
File metadata and controls
158 lines (128 loc) · 5.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#!/usr/bin/env python3
"""
Script para limpiar información sensible de los datasets antes de subirlos a GitHub
"""
import json
import re
import random
import string
from pathlib import Path
def generate_safe_id(length=8):
"""Genera un ID seguro y aleatorio"""
return ''.join(random.choices(string.ascii_letters + string.digits, k=length))
def generate_safe_text(category="generic"):
"""Genera texto de ejemplo seguro según la categoría"""
safe_texts = {
"greeting": [
"¡Bienvenido! ¿En qué puedo ayudarte?",
"Hola, ¿cómo puedo asistirte hoy?",
"¡Hola! Estoy aquí para ayudarte",
"Bienvenido al servicio de atención"
],
"button": [
"Información", "Ayuda", "Servicios", "Soporte",
"Consultas", "Opciones", "Más info", "Continuar",
"Inicio", "Menú", "Categorías", "Productos"
],
"message": [
"Este es un mensaje de ejemplo",
"Contenido de demostración",
"Información general disponible",
"Mensaje del sistema de chat",
"Respuesta automatizada de prueba"
],
"label": [
"Nodo de ejemplo", "Mensaje demo", "Texto de prueba",
"Contenido de muestra", "Etiqueta genérica"
]
}
return random.choice(safe_texts.get(category, safe_texts["message"]))
def clean_node(node):
"""Limpia información sensible de un nodo"""
cleaned_node = node.copy()
# Mantener IDs estructurales pero limpiar nombres específicos
if "data" in cleaned_node:
data = cleaned_node["data"]
# Limpiar mensajes sensibles
if "message" in data:
if any(word in data["message"].lower() for word in ["hola", "ayudarte", "podemos"]):
data["message"] = generate_safe_text("greeting")
else:
data["message"] = generate_safe_text("message")
# Limpiar etiquetas
if "label" in data and data["label"] not in ["Inicio", "Finalizar"]:
data["label"] = generate_safe_text("label")
# Limpiar botones
if "buttons" in data:
for button in data["buttons"]:
if "text" in button:
# Conservar algunos botones comunes pero limpiar específicos
if button["text"].lower() not in ["inicio", "continuar", "terminar", "ayuda"]:
button["text"] = generate_safe_text("button")
# Limpiar IDs de botones (mantener formato pero cambiar contenido)
if "id" in button:
button["id"] = f"{generate_safe_id(8)}-{generate_safe_id(4)}-{generate_safe_id(4)}-{generate_safe_id(4)}-"
return cleaned_node
def clean_edge(edge):
"""Limpia información sensible de un edge"""
cleaned_edge = edge.copy()
# Limpiar labels descriptivos
if "label" in cleaned_edge:
cleaned_edge["label"] = f"Conexión: {edge['source'][:8]}→{edge['target'][:8]}"
return cleaned_edge
def clean_dataset(input_file, output_file, data_type="nodes"):
"""Limpia un dataset completo"""
print(f"🧹 Limpiando {data_type} de {input_file}...")
try:
with open(input_file, 'r', encoding='utf-8') as f:
data = json.load(f)
if data_type == "nodes":
cleaned_data = [clean_node(item) for item in data]
else: # edges
cleaned_data = [clean_edge(item) for item in data]
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(cleaned_data, f, indent=2, ensure_ascii=False)
print(f"✅ Dataset limpio guardado en {output_file}")
return True
except FileNotFoundError:
print(f"⚠️ Archivo no encontrado: {input_file}")
return False
except Exception as e:
print(f"❌ Error procesando {input_file}: {e}")
return False
def main():
"""Función principal"""
print("🔒 LIMPIEZA DE DATOS SENSIBLES PARA GITHUB")
print("=" * 60)
# Definir archivos a procesar
datasets = [
("data/nodes.json", "data/nodes_clean.json", "nodes"),
("data/edges.json", "data/edges_clean.json", "edges"),
]
success_count = 0
# Procesar cada dataset
for input_file, output_file, data_type in datasets:
if clean_dataset(input_file, output_file, data_type):
success_count += 1
print(f"\n🏆 RESUMEN:")
print(f"✅ Archivos procesados exitosamente: {success_count}")
print(f"📁 Archivos limpios creados en data/")
# Crear backup de archivos originales
print(f"\n💾 Creando backup de archivos originales...")
backup_dir = Path("data/backup")
backup_dir.mkdir(exist_ok=True)
try:
import shutil
shutil.copy2("data/nodes.json", "data/backup/nodes_original.json")
shutil.copy2("data/edges.json", "data/backup/edges_original.json")
print("✅ Backup creado en data/backup/")
except Exception as e:
print(f"⚠️ Error creando backup: {e}")
print(f"\n🔄 Para usar las versiones limpias:")
print(f" mv data/nodes.json data/nodes_original.json")
print(f" mv data/nodes_clean.json data/nodes.json")
print(f" mv data/edges.json data/edges_original.json")
print(f" mv data/edges_clean.json data/edges.json")
print(f"\n🚀 ¡Datasets listos para GitHub!")
if __name__ == "__main__":
main()