Clasificación de Reseñas con Naive Bayes y Scikit-Learn
Clase 8 de 16 • Curso de NLP con Python
Resumen
El análisis de sentimientos en reseñas de productos se ha convertido en una herramienta fundamental para las empresas que buscan entender la percepción de sus clientes. Mediante técnicas de procesamiento de lenguaje natural y aprendizaje automático, podemos clasificar automáticamente si una opinión es positiva o negativa, lo que permite a las organizaciones responder de manera oportuna a las críticas y mejorar la experiencia del cliente. Veamos cómo implementar un clasificador de sentimientos utilizando técnicas tradicionales de machine learning.
¿Cómo crear un modelo de clasificación de sentimientos con Naive Bayes?
Después de haber limpiado y vectorizado nuestro dataset de reseñas, el siguiente paso es crear un modelo que pueda clasificarlas automáticamente. Para nuestro caso de uso, utilizaremos un clasificador Naive Bayes, que es un modelo probabilístico basado en el teorema de Bayes.
Este clasificador presenta características particulares:
- Asume la independencia entre las características (palabras)
- Calcula la probabilidad de que un documento pertenezca a una clase específica
- Es ideal cuando tenemos hardware limitado
- Ofrece baja latencia en las predicciones
- Resulta muy práctico de implementar y manejar
Para nuestro modelo, definiremos como reseña positiva aquella que tiene más de tres estrellas (asignándole un valor de 1), mientras que las reseñas negativas son las que tienen una o dos estrellas (valor 0).
# Creamos una variable binaria para el sentimiento
df['sentiment_bin'] = (df['stars'] > 3).astype(int)
¿Cómo dividir los datos para entrenamiento y evaluación?
Para entrenar nuestro modelo, necesitamos dividir nuestros datos en conjuntos de entrenamiento y prueba:
# La matriz TFIDF será nuestra variable X (características)
X = tfidf_matrix
# La columna sentiment_bin será nuestra variable y (etiquetas)
y = df['sentiment_bin']
# Dividimos los datos: 80% para entrenamiento, 20% para prueba
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
En la industria, generalmente se utiliza una proporción de 80% para entrenamiento y 20% para pruebas. En algunos casos más complejos, se puede usar una división de 70% para entrenamiento, 20% para pruebas y 10% para validación.
¿Cómo entrenar y evaluar el modelo Naive Bayes?
El entrenamiento del modelo es bastante sencillo con scikit-learn:
# Importamos el clasificador
from sklearn.naive_bayes import MultinomialNB
# Creamos y entrenamos el modelo
model = MultinomialNB()
model.fit(X_train, y_train)
Una de las grandes ventajas de Naive Bayes es su tiempo de entrenamiento reducido, lo que permite disminuir los costos computacionales. Si estás utilizando una GPU, el entrenamiento será prácticamente instantáneo, mientras que en CPU podría tomar algunos segundos más.
Para evaluar el rendimiento del modelo, utilizamos métricas estándar:
# Evaluamos el modelo
from sklearn.metrics import classification_report, accuracy_score
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
En nuestro caso, obtuvimos un 79% de accuracy, lo cual es un buen resultado considerando que en la industria un modelo se considera aceptable a partir del 70%. También es importante revisar el F1-score, especialmente cuando trabajamos con datasets desbalanceados. Nuestros valores de F1-score (0.84 y 0.70) también indican un buen rendimiento.
¿Cómo guardar y cargar el modelo para su uso posterior?
Una vez entrenado el modelo, es fundamental guardarlo para poder utilizarlo en el futuro con nuevos datos:
# Guardamos el modelo
import pickle
model_path = "nb_classifier.pkl"
with open(model_path, 'wb') as file:
pickle.dump(model, file)
# Para cargar el modelo posteriormente
with open(model_path, 'rb') as file:
loaded_model = pickle.load(file)
El modelo se guarda con extensión .pkl
o .pickle
, lo que nos permite recuperarlo fácilmente cuando necesitemos hacer predicciones con nuevos datos.
¿Cómo utilizar el modelo para clasificar nuevas reseñas?
Para utilizar nuestro modelo con nuevas reseñas, debemos seguir el mismo proceso de preprocesamiento que aplicamos durante el entrenamiento:
- Limpiar el texto con nuestra función
clean
- Aplicar la eliminación de stopwords y lematización
- Transformar el texto al espacio vectorial usando TF-IDF
- Realizar la predicción con el modelo
# Ejemplo de una nueva reseña
new_review = "Este producto es excelente y superó mis expectativas"
# Preprocesamiento
cleaned_review = clean(new_review)
processed_review = remove_stopwords_and_lemmatize(cleaned_review)
# Vectorización
review_vector = tfidf_vectorizer.transform([processed_review])
# Predicción
prediction = loaded_model.predict(review_vector)
print("Sentimiento:", "Positivo" if prediction[0] == 1 else "Negativo")
Al ejecutar este código con la reseña "Este producto es excelente y superó mis expectativas", el modelo correctamente la clasifica como positiva (1).
Limitaciones de los modelos tradicionales
Es importante destacar que estos modelos tradicionales tienen ciertas limitaciones:
- No comprenden el sarcasmo en el texto
- No interpretan correctamente los emojis
- No captan bien el contexto de las expresiones
Por ejemplo, al probar con la reseña "Lo odio 🙂", el modelo la clasifica como negativa (0), sin entender que el emoji podría indicar sarcasmo. De manera similar, con "Me encantó?", el modelo la clasifica como positiva (1), sin detectar que el signo de interrogación podría cambiar el sentido de la frase.
Estas limitaciones se deben a que nuestra función de limpieza elimina signos de puntuación y a que el modelo no está diseñado para entender contextos complejos. Para superar estas limitaciones, existen métodos más modernos como los Transformers, que tienen una mayor capacidad para comprender el lenguaje natural en toda su complejidad.
El análisis de sentimientos mediante técnicas de machine learning tradicionales ofrece una solución efectiva para clasificar automáticamente reseñas de productos, permitiendo a las empresas identificar rápidamente opiniones negativas y actuar en consecuencia. Aunque estos modelos tienen sus limitaciones, representan un excelente punto de partida para implementar sistemas de análisis de opiniones. ¿Has implementado alguna vez un sistema similar? Comparte tu experiencia en los comentarios.