¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Cómo clasificar un texto contando palabras

Después de esta lección: Puedo clasificar un texto con un clasificador de recuentos de palabras.

Lección de 60 min1 comandoLaboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

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

PalabraQué significaEjemplo
Clasificadorun programa que da una etiqueta a cada texto
Etiquetala clase de un ejemplobasura
Entrenamientolos ejemplos con su etiqueta de los que aprende el programa
Probabilidad de la palabralas veces que sale en la clase entre el total de la clase
Suavizadosumar 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

Código: python
# 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

PalabraEn la basura (14 palabras)En los normales (16 palabras)
gratis30
premio20
hoy12
clase02
ahora21

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

Comando
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

Código: python
# 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»

ClaseProbabilidad de gratisProbabilidad de premioProducto
basura4 / 34 = 0,1183 / 34 = 0,0880,0104
normal1 / 36 = 0,0281 / 36 = 0,0280,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.

Sobre este laboratorio y su código: Laboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.