{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"authorship_tag":"ABX9TyMEbO3SKGFSlFYdAUd6xCoz"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["## Integración de clasificación semántica, explicabilidad y control ético en un sistema PLN de ciberseguridad\n","### Objetivo general\n","Implementar un prototipo de sistema de PLN para ciberseguridad que clasifique mensajes potencialmente maliciosos y, además, incorpore mecanismos básicos de:\n","- explicación de decisiones,\n","- revisión humana,\n","- minimización de daño,\n","- y protección de datos."],"metadata":{"id":"wtRAqkEjtnYZ"}},{"cell_type":"markdown","source":["### 1. Construcción del dataset\n","Crea un archivo con ejemplos de mensajes y su etiqueta."],"metadata":{"id":"s7mOCLR0wlT7"}},{"cell_type":"code","execution_count":null,"metadata":{"id":"ijE61tk-tQFZ"},"outputs":[],"source":["import pandas as pd\n","\n","data = {\n"," \"mensaje\": [\n"," \"Ingresa tus credenciales inmediatamente para evitar el bloqueo de tu cuenta\",\n"," \"Haz clic en este enlace urgente para validar tu acceso\",\n"," \"Tu cuenta será suspendida si no respondes ahora\",\n"," \"La reunión de seguridad se realizará mañana a las 10\",\n"," \"Por favor revisa el informe de accesos del sistema\",\n"," \"Se actualizó la política de contraseñas del departamento\",\n"," \"Confirma tu usuario y contraseña en este link\",\n"," \"Adjunto el reporte mensual del área de TI\",\n"," \"Necesitamos verificar tu identidad de forma urgente\",\n"," \"Se programó mantenimiento del servidor para esta noche\"\n"," ],\n"," \"etiqueta\": [\n"," \"malicioso\",\n"," \"malicioso\",\n"," \"malicioso\",\n"," \"legitimo\",\n"," \"legitimo\",\n"," \"legitimo\",\n"," \"malicioso\",\n"," \"legitimo\",\n"," \"malicioso\",\n"," \"legitimo\"\n"," ]\n","}\n","\n","df = pd.DataFrame(data)\n","df"]},{"cell_type":"markdown","source":["### 2. Preprocesamiento y vectorización\n","Se transforma el texto a representación numérica con TF-IDF."],"metadata":{"id":"gW3mYo-3w8Qh"}},{"cell_type":"code","source":["from sklearn.model_selection import train_test_split\n","from sklearn.feature_extraction.text import TfidfVectorizer\n","\n","X = df[\"mensaje\"]\n","y = df[\"etiqueta\"]\n","\n","X_train, X_test, y_train, y_test = train_test_split(\n"," X, y, test_size=0.3, random_state=42, stratify=y\n",")\n","\n","vectorizer = TfidfVectorizer(lowercase=True, stop_words=None)\n","X_train_vec = vectorizer.fit_transform(X_train)\n","X_test_vec = vectorizer.transform(X_test)"],"metadata":{"id":"C_0CEzHHxAg-"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["\n","### 3. Entrenamiento del clasificador\n","Se entrena un modelo básico."],"metadata":{"id":"txNQmk7FxNhL"}},{"cell_type":"code","source":["from sklearn.linear_model import LogisticRegression\n","\n","model = LogisticRegression()\n","model.fit(X_train_vec, y_train)"],"metadata":{"id":"d6mbgkqxxKrt"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### 4. Evaluación inicial\n","Se revisa el desempeño del sistema."],"metadata":{"id":"9lYZhV4QxUmS"}},{"cell_type":"code","source":["from sklearn.metrics import classification_report, confusion_matrix\n","\n","y_pred = model.predict(X_test_vec)\n","\n","print(\"Matriz de confusión:\")\n","print(confusion_matrix(y_test, y_pred))\n","\n","print(\"\\nReporte de clasificación:\")\n","print(classification_report(y_test, y_pred))"],"metadata":{"id":"QbmgLoqixWLW"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### 5. Explicabilidad básica\n","Aquí se ilustra por qué el sistema clasificó un mensaje como malicioso.\n","Opción simple: mostrar palabras con mayor peso del modelo"],"metadata":{"id":"SrHwYsLjxeEj"}},{"cell_type":"code","source":["import numpy as np\n","\n","feature_names = np.array(vectorizer.get_feature_names_out())\n","coefs = model.coef_[0]\n","\n","top_positive = feature_names[np.argsort(coefs)[-10:]]\n","top_negative = feature_names[np.argsort(coefs)[:10]]\n","\n","print(\"Palabras más asociadas a la clase malicioso:\")\n","print(top_positive)\n","\n","print(\"\\nPalabras más asociadas a la clase legitimo:\")\n","print(top_negative)"],"metadata":{"id":"pqo9tCy2xh6H"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### 6. Explicación de una predicción individual\n","Se prueba el sistema con mensajes nuevos."],"metadata":{"id":"fkM97Ydoxv4Z"}},{"cell_type":"code","source":["\n","mensajes_nuevos = [\n"," \"Debes validar tus credenciales ahora mismo\",\n"," \"Adjunto el calendario de mantenimiento del servidor\",\n"," \"Tu acceso será bloqueado si no ingresas al enlace\"\n","]\n","\n","X_new_vec = vectorizer.transform(mensajes_nuevos)\n","preds = model.predict(X_new_vec)\n","probs = model.predict_proba(X_new_vec)\n","\n","for msg, pred, prob in zip(mensajes_nuevos, preds, probs):\n"," print(\"Mensaje:\", msg)\n"," print(\"Predicción:\", pred)\n"," print(\"Probabilidades:\", prob)\n"," print(\"-\" * 50)\n",""],"metadata":{"id":"wTPbgH_lxxup"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### 7. Incorporación de control ético\n","Aquí está el núcleo ético de esta actividad.\n","El sistema no debe bloquear automáticamente cualquier mensaje clasificado como malicioso. Debe aplicar una regla de prudencia:\n","- Confianza alta → marcar como sospechoso.\n","- Confianza media → enviar a revisión humana.\n","- Confianza baja → no penalizar automáticamente."],"metadata":{"id":"k1sUqmaAx98K"}},{"cell_type":"code","source":["def decision_etica(mensaje):\n"," vec = vectorizer.transform([mensaje])\n"," pred = model.predict(vec)[0]\n"," probas = model.predict_proba(vec)[0]\n"," clases = model.classes_\n","\n"," max_prob = probas.max()\n","\n"," if max_prob >= 0.85 and pred == \"malicioso\":\n"," accion = \"Marcar como sospechoso y enviar a revisión\"\n"," elif 0.60 <= max_prob < 0.85:\n"," accion = \"Caso ambiguo: revisión humana obligatoria\"\n"," else:\n"," accion = \"No bloquear; mantener monitoreo\"\n","\n"," return {\n"," \"mensaje\": mensaje,\n"," \"prediccion\": pred,\n"," \"confianza\": round(float(max_prob), 3),\n"," \"accion\": accion\n"," }\n","\n","ejemplo = decision_etica(\"Ingresa a este enlace urgente para confirmar tu cuenta\")\n","ejemplo"],"metadata":{"id":"hqE88U-PyKo0"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### 8. Protección de datos\n","Se aplica minimización de datos.\n","Antes de almacenar registros, el sistema elimina datos innecesarios.\n","Ejemplo conceptual:\n","- No guardar nombre real del usuario.\n","- No guardar IP si no es indispensable.\n","- No guardar el mensaje completo si basta con tokens relevantes o un hash."],"metadata":{"id":"BojItHl2yRzv"}},{"cell_type":"code","source":["registro_auditoria = {\n"," \"id_evento\": \"EVT001\",\n"," \"prediccion\": ejemplo[\"prediccion\"],\n"," \"confianza\": ejemplo[\"confianza\"],\n"," \"accion\": ejemplo[\"accion\"]\n","}\n","\n","print(registro_auditoria)"],"metadata":{"id":"TMODDg5LyXIR"},"execution_count":null,"outputs":[]}]}