Clasificación de Comentarios con Bag of Words y TF-IDF en Python

Clase 6 de 16Curso de NLP con Python

Resumen

La clasificación de sentimientos en comentarios es una tarea fundamental en el análisis de datos textuales. Mediante técnicas de procesamiento de lenguaje natural y aprendizaje automático, podemos transformar opiniones escritas en información valiosa para la toma de decisiones. En este contenido, exploraremos cómo convertir texto limpio en representaciones vectoriales que permitan entrenar modelos de clasificación efectivos.

¿Cómo preparar nuestros datos para el entrenamiento del modelo?

Antes de comenzar con el proceso de vectorización y entrenamiento, es crucial asegurarnos de que nuestros datos estén correctamente preparados. Para optimizar el rendimiento, utilizaremos una GPU T4 en Google Colab, lo que acelerará significativamente los tiempos de procesamiento.

Para cargar nuestro dataset previamente limpio, seguimos estos pasos:

  1. Accedemos a la sección "Archivos" en Google Colab.
  2. Seleccionamos "Cargar" y buscamos nuestro archivo "review_clean_advance".
  3. Es recomendable trabajar con archivos comprimidos (.zip o .rar) para agilizar el proceso de carga.

Una vez cargado el archivo, procedemos a descomprimirlo y verificar su contenido:

# Descomprimir el archivo
!unrar x archivo.rar

# Cargar el dataset
filter_data = pd.read_csv('ruta_al_archivo')

# Visualizar las primeras filas
filter_data.head(3)

# Verificar valores nulos
filter_data.isnull().sum()

Un aspecto crucial es la verificación de valores nulos. En nuestro caso, detectamos una sola fila con un valor nulo, la cual decidimos eliminar debido a la abundancia de datos disponibles:

# Eliminar filas con valores nulos
filter_data = filter_data.dropna()

¿Qué métodos existen para convertir texto en representaciones vectoriales?

La transformación de texto a vectores numéricos es esencial para que los algoritmos de aprendizaje automático puedan procesar información textual. Analizaremos dos métodos principales:

Bag of Words (BoW)

Este método convierte el texto en representaciones numéricas mediante el conteo de frecuencias de palabras:

  • Funcionamiento: Cuenta cuántas veces aparece cada palabra en un documento (fila de nuestro dataset).
  • Características principales:
    • Ignora el orden de las palabras y la gramática.
    • Cada documento se representa como un vector donde cada dimensión corresponde a una palabra del vocabulario.
    • El valor en cada dimensión es la frecuencia de esa palabra en el documento.

Term Frequency-Inverse Document Frequency (TF-IDF)

Este método mejora la representación de Bag of Words al ponderar las frecuencias:

  • Funcionamiento: Combina dos métricas:
    • TF (Term Frequency): Frecuencia de una palabra en un documento.
    • IDF (Inverse Document Frequency): Inversa de la frecuencia de documentos que contienen esa palabra.
  • Ventajas:
    • Reduce la influencia de palabras comunes (como "el", "la", "y").
    • Da mayor importancia a términos más informativos y distintivos.
    • Mejora la calidad de la representación vectorial para tareas de clasificación.

¿Cómo implementar estas técnicas de vectorización en la práctica?

Para implementar estos métodos utilizaremos la biblioteca scikit-learn, que proporciona herramientas eficientes para el procesamiento de texto:

# Importar las herramientas necesarias
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer

# Definir el corpus (conjunto de documentos)
corpus = filter_data['columna_de_texto'].tolist()

# Implementar Bag of Words
bow_vectorizer = CountVectorizer()
bow_matrix = bow_vectorizer.fit_transform(corpus)

# Ver dimensiones y características
print(f"Número de documentos: {bow_matrix.shape[0]}")
print(f"Tamaño del vocabulario: {len(bow_vectorizer.get_feature_names_out())}")
print(f"Primeras 10 palabras del vocabulario: {bow_vectorizer.get_feature_names_out()[:10]}")

# Implementar TF-IDF
tfidf_vectorizer = TfidfVectorizer()
tfidf_matrix = tfidf_vectorizer.fit_transform(corpus)

# Ver dimensiones y características
print(f"Número de documentos: {tfidf_matrix.shape[0]}")
print(f"Tamaño del vocabulario: {len(tfidf_vectorizer.get_feature_names_out())}")

Ambos métodos generan matrices con la misma cantidad de documentos (filas de nuestro dataset) y el mismo tamaño de vocabulario (palabras únicas encontradas en todo el corpus). La diferencia radica en cómo se calculan los valores dentro de estas matrices.

Estas representaciones vectoriales serán la base para entrenar modelos de clasificación que puedan determinar si un comentario expresa un sentimiento positivo o negativo. En próximas etapas, podremos utilizar estas matrices para identificar temas relevantes que aparecen a lo largo de todas las reseñas.

La vectorización de texto es un paso fundamental en el procesamiento de lenguaje natural que permite transformar información cualitativa en datos cuantitativos procesables por algoritmos de aprendizaje automático. ¿Has utilizado alguna de estas técnicas en tus proyectos? Comparte tu experiencia en los comentarios.