Cómo decide un filtro de correo basura
La clasificación de texto asigna a un mensaje una etiqueta, como «basura» o «normal», a partir de las palabras que contiene. Es lo que hace un filtro de correo cuando decide qué mensajes van a la carpeta de spam.
Un clasificador de recuentos aprende de ejemplos ya etiquetados. Cuenta qué palabras salen en cada clase y, ante un mensaje nuevo, elige la clase a la que mejor le encajan sus palabras.
Al final de esta lección
Nota
Puedo clasificar un texto con un clasificador de recuentos de palabras.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Clasificador | un programa que da una etiqueta a cada texto | |
| Etiqueta | la clase de un ejemplo | basura |
| Entrenamiento | los ejemplos con su etiqueta de los que aprende el programa | |
| Probabilidad de la palabra | las veces que sale en la clase entre el total de la clase | |
| Suavizado | sumar uno a cada recuento para que ninguno sea cero |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un clasificador aprende de ejemplos con etiqueta
Para entrenar, se necesitan mensajes cuya clase ya se sabe. Se cuenta cuántas veces sale cada palabra en cada clase.
Con pocos mensajes, los recuentos ya dicen algo: «gratis» sale 3 veces en la basura y ninguna en los mensajes normales. Una palabra así es una pista fuerte, aunque no una prueba.
Cuenta las palabras de una clase
# Cuántas veces sale cada palabra en los mensajes de correo basura.
spam = [
"gana un premio gratis ahora",
"premio gratis haz clic ahora",
"oferta gratis solo hoy",
]
counts = {}
for message in spam:
for word in message.split():
if word in counts:
counts[word] = counts[word] + 1
else:
counts[word] = 1
print(counts["gratis"], "veces gratis")
print(counts["premio"], "veces premio")
print(len(counts), "palabras distintas")
# Cambia "gratis" por "ahora" en el primer print.
Ejemplo resuelto: recuentos de seis mensajes
| Palabra | En la basura (14 palabras) | En los normales (16 palabras) |
|---|---|---|
| gratis | 3 | 0 |
| premio | 2 | 0 |
| hoy | 1 | 2 |
| clase | 0 | 2 |
| ahora | 2 | 1 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
La probabilidad de una palabra se suaviza
La probabilidad de una palabra en una clase son sus veces entre el total de palabras de esa clase. «gratis» sale 3 de 14 veces en la basura.
Una palabra que nunca salió daría cero, y un cero anularía todo el mensaje. Por eso se suma 1 a cada recuento y se suman las palabras distintas al total. Eso es el suavizado: (3 + 1) entre (14 + 20) da 0,118.
Calcula la probabilidad suavizada
docker exec jupyter python3 -c "print(round((3+1)/(14+20),3))"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Prueba el suavizado
# La probabilidad de una palabra en una clase, con un +1 para las nunca vistas.
times = 3 # veces que "gratis" sale en el correo basura
total = 14 # palabras del correo basura en total
size = 20 # palabras distintas en todo el entrenamiento
chance = (times + 1) / (total + size)
print(round(chance, 3))
# Prueba con times = 0 y comprueba que la probabilidad no es cero.
Gana la clase de mayor producto
Para un mensaje nuevo, multiplica las probabilidades de sus palabras en cada clase. La clase con el producto más alto gana.
Se llama «ingenuo» porque trata cada palabra como si no dependiera de las demás, lo cual no es cierto. Aun así funciona bien con textos cortos. Aquí no usamos la proporción de mensajes de cada clase, porque hay tres de cada.
Ejemplo resuelto: «gratis premio»
| Clase | Probabilidad de gratis | Probabilidad de premio | Producto |
|---|---|---|---|
| basura | 4 / 34 = 0,118 | 3 / 34 = 0,088 | 0,0104 |
| normal | 1 / 36 = 0,028 | 1 / 36 = 0,028 | 0,0008 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error muy común
Advertencia
Mucha gente cree que si una palabra nunca salió en la basura, el mensaje no puede ser basura. Sin suavizado, el producto sería cero y lo parecería. Con el +1, una sola palabra desconocida solo baja un poco la puntuación.
Para ir más lejos: tus propios mensajes
Escribe en tu cuaderno seis mensajes cortos de una lista de clase: tres de avisos oficiales y tres de charla entre amigos. Etiquétalos y entrena tu clasificador.
Prueba con tres mensajes nuevos. ¿Cuántos clasifica bien? Busca uno que falle y explica con los recuentos por qué falla.