Este es realmente un problema realmente profundo en el que muchas personas y empresas han trabajado. Aquí hay algunos conceptos básicos:
Primero, necesitamos representar bien los datos. Esto implica representar de alguna manera cada documento como un vector en el espacio -dimensional. Idealmente, en este espacio, queremos que las muestras que tienen la misma etiqueta estén cerca en la distancia euclidiana, y las muestras que son etiquetas diferentes estén lejos en la distancia euclidiana. Este paso puede ser realmente difícil, pero una representación probada y verdadera se llama Frecuencia de documento inversa de frecuencia de término (tf-idf). Aquí, cada dimensión en el espacio representa una palabra en particular, y el valor en esa dimensión para una muestra particular representa básicamente el número normalizado de veces que esa palabra aparece en el documento. Podrías leer más sobre eso aquí . Hay una muy buena implementación scikit-learn de esta representación si quieres probarla.d
Ahora los datos están en un espacio útil, pero en un espacio de dimensiones realmente altas. Recomiendo reducir esta dimensionalidad de alguna manera, pero ese es un tema completo para otro hilo.
Finalmente, podría entrenar algún algoritmo para clasificar las muestras (de eso se tratan las otras respuestas). Hay muchas opciones excelentes: las redes neuronales, Adaboost, SVM, Naive Bayes y los modelos de clasificación gráfica le darán buenos resultados. Muchos de estos también tienen implementaciones en scikit-learn.
Pero los mejores algoritmos aprovechan el hecho de que este problema es en realidad uno de transferencia de aprendizaje. Es decir, las distribuciones de las que provienen los datos de capacitación y pruebas pueden no ser exactamente las mismas, porque el tipo de cosas que una persona cree que son spam puede ser diferente del tipo de cosas que otra persona piensa que son spam.