Construir un clasificador de texto desde cero permite comprender a fondo cómo funcionan las probabilidades detrás de algoritmos como Naive Bayes. En esta sesión se implementa paso a paso una clase en Python que integra el tokenizador de spaCy, calcula probabilidades prior y prepara los conteos condicionales necesarios para clasificar documentos, todo dentro de un enfoque de programación orientada a objetos.
¿Por qué usar el espacio logarítmico en Naive Bayes?
El algoritmo de Naive Bayes requiere multiplicar muchas probabilidades. Cuando estas son valores muy pequeños, la precisión de máquina —que es finita— puede redondear el resultado a cero [0:42]. La solución es trabajar en el espacio logarítmico: al aplicar logaritmos, un producto de probabilidades se transforma en una suma de logaritmos, evitando el desbordamiento numérico.
Esta transformación es la fórmula central que se implementa dentro del método fit de la clase. Se consideran primero los logaritmos de las probabilidades prior de cada clase y luego los de las probabilidades condicionales de cada palabra dada una categoría.
¿Qué es el suavizado de Laplace y cuándo se necesita?
Existen escenarios donde una palabra no aparece en ningún documento de cierta categoría, lo que genera una probabilidad condicional igual a cero. Como el logaritmo de cero no se puede calcular, se aplica el suavizado de Laplace [3:08]: se suma 1 al numerador (conteo de la palabra) y se suma la longitud total del vocabulario al denominador. Si el vocabulario tiene 100 palabras, el denominador crece en 100 y el numerador solo en 1, normalizando la distribución sin distorsionarla.
¿Cómo funciona el tokenizador de spaCy?
La librería spaCy es una de las más robustas para llevar modelos de procesamiento del lenguaje natural a producción [0:06]. Su tokenizador se configura importando un vocabulario del idioma deseado:
python
from spacy.tokenizer import Tokenizer
from spacy.lang.en import English
nlp = English()
tokenizer = Tokenizer(nlp.vocab)
El objeto nlp agrupa diferentes etapas de procesamiento en un mismo flujo [1:43]. Al pasarle el vocabulario del inglés al Tokenizer, este aplica reglas lingüísticas preconstruidas para separar el texto en tokens de forma inteligente. En Google Colab, spaCy ya viene preinstalada, por lo que no se requiere pip install [1:27].
¿Cómo se estructura la clase NaiveBayesClassifier en Python?
La clase sigue el patrón estándar de machine learning: un método fit para entrenar y un método predict para generar predicciones [4:40]. Dentro de __init__ se crean el objeto nlp y el Tokenizer como atributos propios de la clase.
python
class NaiveBayesClassifier:
def init(self):
nlp = English()
self.tokenizer = Tokenizer(nlp.vocab)
tokenize(document): recibe un texto y devuelve una lista de tokens en minúsculas usando t.text.lower() [3:42].
word_counts(words): recorre una lista de palabras y construye un diccionario donde cada llave es una palabra y su valor es el número de apariciones [4:06].
Estas dos funciones son utilidades internas que el método fit invoca durante el entrenamiento.
¿Qué calcula el método fit?
El método fit recibe los datos de entrenamiento y sus clases correspondientes [5:05]. Internamente realiza lo siguiente:
- Identifica las clases únicas para soportar clasificación multiclase, no solo binaria [5:20].
- Inicializa un conjunto vacío para el vocabulario y diccionarios para conteos de clases y conteos condicionales.
- Recorre cada clase y calcula el logaritmo de la probabilidad prior:
log(conteo_clase / n) usando np.log [7:05].
- Recorre cada documento junto con su categoría mediante
zip(data, classes) y tokeniza el texto [8:05].
- Por cada token, lo agrega al vocabulario si no existe y acumula su conteo dentro del diccionario de conteos condicionales correspondiente a esa clase [8:55].
python
self.log_class_prior_prob[c] = np.log(self.class_count[c] / n)
Esta línea resume el cálculo prior en el espacio logarítmico para cada categoría c.
¿Por qué usar programación orientada a objetos para este algoritmo?
Esta es la primera vez en el curso que se emplea programación orientada a objetos para implementar un algoritmo de machine learning [10:20]. La ventaja es clara: los diccionarios y variables calculados durante el entrenamiento quedan almacenados como atributos de la instancia, por lo que al momento de predecir no es necesario recalcular ni reescribir código. La estructura fit → predict replica el diseño de librerías como scikit-learn, facilitando la reutilización y el mantenimiento.
Si deseas profundizar en el manejo de clases, métodos y atributos en Python, complementa con el curso de Programación Orientada a Objetos disponible en Platzi. ¿Qué parte de la implementación te resultó más interesante? Comparte tu experiencia en los comentarios.