Lección 4 de 7 35 min

Tu primer clasificador: spam vs no-spam con 30 líneas de Python

Es hora de construir. En esta lección montas tu primer clasificador de spam en menos de 30 líneas de Python. Empezamos con una versión "a mano" (sin IA real) para entender qué hace por dentro, y luego la mejoramos con IA.

El problema

Tenemos correos entrantes y queremos saber, para cada uno, si es spam o no spam. Es una tarea de clasificación binaria — la más simple del mundo de la IA.

Versión 1: clasificador con reglas (sin IA)

Crea un fichero spam_v1.py con esto:

PALABRAS_SOSPECHOSAS = [
    "gratis", "ganador", "oferta única", "click aquí",
    "envia tus datos", "millonario", "viagra", "100% garantizado"
]

def es_spam(correo: str) -> bool:
    """Devuelve True si el correo contiene palabras sospechosas."""
    texto = correo.lower()
    coincidencias = sum(1 for palabra in PALABRAS_SOSPECHOSAS if palabra in texto)
    # Si tiene 2 o más palabras sospechosas, lo consideramos spam
    return coincidencias >= 2

# Lista de prueba
correos = [
    "Hola Joaquín, ¿tienes un rato mañana para la reunión?",
    "GRATIS! Eres el GANADOR de un iPhone, click aquí para reclamar",
    "Adjunto la factura del mes, revisa cuando puedas",
    "Oferta única, hazte millonario en 7 días, 100% garantizado",
]

for c in correos:
    veredicto = "🚫 SPAM" if es_spam(c) else "✉️  OK"
    print(f"{veredicto} → {c[:60]}...")

Ejecuta: python spam_v1.py. Deberías ver:

✉️  OK → Hola Joaquín, ¿tienes un rato mañana para la reunión?...
🚫 SPAM → GRATIS! Eres el GANADOR de un iPhone, click aquí para reclamar...
✉️  OK → Adjunto la factura del mes, revisa cuando puedas...
🚫 SPAM → Oferta única, hazte millonario en 7 días, 100% garantizado...

¿Esto es IA? Técnicamente no — son reglas if/else. Pero sirve para entender el patrón: entrada (correo) → procesamiento (contar palabras) → salida (booleano).

Las limitaciones de la versión 1

  • Si el spammer escribe "g.r.a.t.i.s" o "GR4TIS", no lo detectas.
  • Si un correo legítimo contiene "oferta única" porque es una promoción real, lo marcas mal.
  • Cada nuevo patrón de spam exige añadir reglas manualmente. No escala.

Aquí es donde la IA de verdad se vuelve útil: aprende patrones que no escribes a mano.

Versión 2: clasificador con IA (usando la API de Claude)

Ahora delegamos la decisión a un modelo de lenguaje. Te adelanto la lección 5: necesitas una API key. Si todavía no la tienes, salta este código y vuelve después de la lección 5.

import anthropic

# Necesitas tu ANTHROPIC_API_KEY como variable de entorno
client = anthropic.Anthropic()

def es_spam_ia(correo: str) -> bool:
    """Pregunta a Claude si un correo es spam."""
    respuesta = client.messages.create(
        model="claude-haiku-4-5-20251001",
        max_tokens=10,
        messages=[{
            "role": "user",
            "content": f'Responde SOLO con "SI" o "NO". ¿Es spam este correo?\n\n"""\n{correo}\n"""'
        }]
    )
    return respuesta.content[0].text.strip().upper().startswith("SI")

correos = [
    "Hola Joaquín, ¿tienes un rato mañana para la reunión?",
    "GR4TIS! Eres el GAN4DOR de un iPhone, klick aquí",
    "Te recuerdo que mañana es la entrega del proyecto, ¿todo listo?",
    "Hazte millonari@ desde casa, sin esfuerzo, garantizado",
]

for c in correos:
    veredicto = "🚫 SPAM" if es_spam_ia(c) else "✉️  OK"
    print(f"{veredicto} → {c[:60]}...")

Diferencias clave de la versión IA:

  • Detecta variaciones (GR4TIS, KLICK) sin que hayas listado esas palabras.
  • Entiende el contexto, no sólo palabras sueltas.
  • El "código" se simplifica enormemente — la complejidad la tiene el modelo.
  • Coste: cada llamada cuesta una fracción de céntimo. En el correo de Gmail con miles de millones de correos al día, esto importa. Para tu primer prototipo: insignificante.

Reflexión: ¿cuándo usar cuál?

  • Reglas a mano: problemas muy simples, deterministas, sin internet, sin presupuesto.
  • Modelo entrenado por ti (scikit-learn): problemas específicos con datos tuyos, donde necesitas control total y bajo coste por predicción.
  • IA via API: problemas que requieren entender lenguaje, contexto o conocimiento general. Coste pequeño por llamada, máxima flexibilidad.

Checklist antes de marcar completada

  • Has ejecutado spam_v1.py y ves resultados correctos para los 4 correos.
  • Entiendes por qué la versión con reglas se rompe con "GR4TIS".
  • Has leído el código de spam_v2 (lo ejecutarás después de la lección 5).
  • Sabes cuándo conviene usar reglas, modelo propio o API de IA.

Ya tienes tu primer mini-producto. En la próxima lección conectamos con una API real (Claude o OpenAI) y construimos algo más potente: un generador de descripciones para productos.

📝 Comprueba lo aprendido

Responde estas 4 preguntas y acierta al menos el 60% para desbloquear el botón "Marcar como completada".

1 ¿Cuál es la principal limitación de un clasificador de spam basado en reglas (if/else con palabras prohibidas)?

2 ¿Cuándo conviene usar reglas a mano en lugar de IA para clasificar?

3 En `if coincidencias >= 2`, ¿qué hace el operador `>=`?

4 Cuando delegas la clasificación de spam a Claude/OpenAI, ¿qué cambia respecto a las reglas a mano?

Cuando termines, guarda tu avance. Así podrás continuar desde tu panel y desbloquear el certificado al completar el curso.