11. Representación Bag of Words

11.1 Introducción

En los temas anteriores estudiamos cómo limpiar texto, tokenizarlo, normalizarlo y reducir parte de su variación morfológica. El paso siguiente es convertir ese texto en una representación numérica concreta que pueda usarse en modelos de Machine Learning.

Una de las representaciones más clásicas y fundamentales en NLP es Bag of Words, o bolsa de palabras. Aunque hoy existen enfoques más sofisticados, Bag of Words sigue siendo una excelente herramienta para entender cómo puede transformarse texto en vectores numéricos de manera simple y efectiva.

En este tema veremos qué es Bag of Words, cómo se construye, qué información conserva, qué información pierde y por qué fue tan importante en la historia del NLP.

11.2 Idea intuitiva

La idea de Bag of Words es muy simple: representar un texto según las palabras que contiene, sin prestar atención al orden en que aparecen. Es decir, el documento se trata como una "bolsa" donde importan las palabras presentes y, muchas veces, cuántas veces aparece cada una.

Por ejemplo, si dos oraciones contienen las mismas palabras pero en distinto orden, Bag of Words puede representarlas de manera muy parecida o incluso igual.

Este enfoque simplifica mucho el problema y permite convertir texto en vectores numéricos fácilmente utilizables por algoritmos clásicos.

Bag of Words representa un texto por sus palabras y frecuencias, pero ignora el orden en que esas palabras aparecen.

11.3 ¿Por qué se llama "bolsa de palabras"?

La expresión "bolsa de palabras" se usa porque el modelo imagina el documento como un conjunto desordenado de términos. No importa si una palabra aparece al principio o al final. Lo que importa es si está y con qué frecuencia.

Por eso, una oración como:

el perro mordió al hombre

y otra como:

el hombre mordió al perro

pueden terminar con una representación muy similar, aunque su significado no sea el mismo.

Ese ejemplo anticipa una de las principales limitaciones del método.

11.4 El papel del vocabulario

Para construir una representación Bag of Words primero necesitamos definir un vocabulario, es decir, el conjunto de palabras o tokens que el sistema considerará relevantes.

Supongamos que nuestro pequeño corpus contiene estas palabras:

gato, perro, casa, duerme

Ese conjunto puede convertirse en el vocabulario base del modelo. A partir de ahí, cada texto se representará como un vector con una posición para cada palabra del vocabulario.

11.5 Cómo se construye el vocabulario

En general, el vocabulario se construye recorriendo un conjunto de textos de entrenamiento y recolectando los tokens que aparecerán como dimensiones del vector.

Según el caso, puede decidirse:

  • Incluir todas las palabras observadas.
  • Excluir palabras muy raras.
  • Excluir palabras demasiado frecuentes.
  • Limitar el vocabulario a las n palabras más comunes.

Estas decisiones afectan tamaño del vector, memoria y capacidad de generalización.

11.6 Vectorización básica

Una vez definido el vocabulario, cada texto se convierte en un vector numérico. Cada posición del vector corresponde a una palabra del vocabulario.

Por ejemplo, si el vocabulario es:

[gato, perro, duerme, casa]

y el texto es:

gato duerme

entonces una representación simple podría ser:

[1, 0, 1, 0]

Esto indica que aparecen las palabras gato y duerme, pero no perro ni casa.

11.7 Presencia versus frecuencia

Bag of Words puede construirse de dos maneras frecuentes:

  • Presencia binaria: indica si una palabra aparece o no.
  • Conteo de frecuencia: indica cuántas veces aparece.

Por ejemplo, si el texto es:

gato gato duerme

con un vocabulario [gato, duerme, perro], podríamos tener:

  • Presencia binaria: [1, 1, 0]
  • Frecuencia: [2, 1, 0]

Ambas variantes son Bag of Words, pero la segunda conserva más información sobre repetición.

11.8 Ejemplo completo con varios documentos

Supongamos este pequeño corpus:

  1. el gato duerme
  2. el perro duerme
  3. el gato corre

Si el vocabulario fuera:

[el, gato, perro, duerme, corre]

entonces las representaciones Bag of Words por frecuencia serían:

  • Documento 1: [1, 1, 0, 1, 0]
  • Documento 2: [1, 0, 1, 1, 0]
  • Documento 3: [1, 1, 0, 0, 1]

Así, cada texto queda convertido en un vector numérico de longitud fija.

11.9 Matriz documento-término

Cuando representamos varios documentos a la vez con Bag of Words, el resultado natural es una matriz documento-término.

En esa matriz:

  • Las filas representan documentos.
  • Las columnas representan palabras del vocabulario.
  • Cada celda contiene una presencia o frecuencia.

Esta matriz es una de las estructuras más clásicas del NLP y de la recuperación de información.

11.10 ¿Qué información conserva Bag of Words?

Bag of Words conserva información útil como:

  • Qué palabras aparecen en un texto.
  • Cuáles no aparecen.
  • Con qué frecuencia aparece cada una, si usamos conteos.

Esto ya es suficiente para muchas tareas clásicas, especialmente cuando el contenido temático importa más que la estructura detallada de la oración.

11.11 ¿Qué información pierde Bag of Words?

La gran limitación de Bag of Words es que pierde información de orden y estructura. No sabe si una palabra aparece antes o después de otra, ni cómo se organizan sintácticamente.

Por eso no distingue bien entre frases como:

  • el perro mordió al hombre
  • el hombre mordió al perro

Desde el punto de vista de Bag of Words, ambas contienen casi las mismas palabras. Pero semánticamente son muy distintas.

Bag of Words ve qué palabras hay, pero no cómo se relacionan entre sí dentro de la secuencia.

11.12 Ventajas del enfoque

A pesar de su simplicidad, Bag of Words tiene ventajas importantes:

  • Es fácil de entender e implementar.
  • Produce vectores numéricos directamente utilizables por modelos clásicos.
  • Funciona razonablemente bien en muchas tareas de clasificación.
  • Es interpretable: cada dimensión corresponde a una palabra.
  • Sirve como base conceptual para representaciones más avanzadas.

11.13 Limitaciones del enfoque

Bag of Words también tiene limitaciones fuertes:

  • Ignora el orden de las palabras.
  • No capta contexto ni relaciones semánticas profundas.
  • Puede generar vocabularios muy grandes.
  • Produce vectores dispersos, con muchos ceros.
  • No maneja bien sinónimos o similitudes semánticas.

Estas limitaciones explican por qué más adelante surgieron representaciones como TF-IDF y embeddings.

11.14 Vectores dispersos

Una característica importante de Bag of Words es que suele producir vectores dispersos. Eso significa que la mayoría de sus posiciones son cero, porque en cada documento solo aparece una pequeña parte del vocabulario total.

Si el vocabulario tiene miles de palabras, un documento corto activará solo unas pocas. Esto no impide usar la representación, pero sí influye en eficiencia y memoria.

11.15 Tamaño del vocabulario y dimensionalidad

La longitud de cada vector Bag of Words es igual al tamaño del vocabulario. Por eso, a medida que el vocabulario crece, también crece la dimensionalidad de la representación.

Esto puede causar varios problemas:

  • Mayor uso de memoria.
  • Mayor costo computacional.
  • Más dispersión en los datos.
  • Mayor dificultad para generalizar con pocos ejemplos.

Por eso, en la práctica suele aplicarse algún criterio para limitar el vocabulario.

11.16 Relación con stopwords y preprocesamiento

Bag of Words está muy influido por las decisiones de preprocesamiento. Si no limpiamos, tokenizamos o normalizamos de manera consistente, el vocabulario puede llenarse de variantes superficiales innecesarias.

Además, la eliminación de stopwords suele combinarse con Bag of Words porque las palabras muy frecuentes pueden ocupar muchas dimensiones sin aportar demasiado valor discriminativo.

11.17 Bag of Words binario y de conteo

Vale la pena insistir en que Bag of Words no es una sola representación rígida. Dos variantes muy comunes son:

  • Binaria: solo indica presencia o ausencia.
  • De conteo: registra cuántas veces aparece cada término.

La versión de conteo conserva más detalle, pero la binaria puede ser suficiente en ciertos problemas simples.

11.18 Bag of Words y clasificación de texto

Una de las aplicaciones más clásicas de Bag of Words es la clasificación de texto. Por ejemplo, podemos representar correos electrónicos como vectores Bag of Words y luego entrenar un clasificador para distinguir spam de no spam.

También puede usarse para:

  • Clasificación temática.
  • Análisis de opiniones.
  • Detección básica de categorías documentales.
  • Filtrado de contenido textual.

En estos casos, la simple presencia o frecuencia de ciertas palabras ya puede ser muy informativa.

11.19 Bag of Words y recuperación de información

Bag of Words también fue fundamental en recuperación de información. Si documentos y consultas se representan por términos presentes, entonces podemos comparar coincidencias y relevancia de manera relativamente simple.

Esta lógica fue una base importante para muchos sistemas clásicos de búsqueda documental.

11.20 ¿Cuándo sigue siendo útil hoy?

Aunque existen técnicas más modernas, Bag of Words sigue siendo útil cuando:

  • Se necesita una línea base simple e interpretable.
  • El problema no requiere capturar contexto complejo.
  • Se trabaja con poco cómputo o modelos clásicos.
  • Se quiere enseñar o entender la lógica de la vectorización de texto.

También es valioso como punto de comparación frente a métodos más avanzados.

11.21 Ejemplo conceptual final

Imaginemos dos reseñas:

  • producto excelente y entrega rápida
  • entrega rápida y producto excelente

Bag of Words probablemente las representaría casi igual, porque contienen las mismas palabras. En este caso eso no es grave. Pero si cambiamos el orden de una frase donde el sentido depende de la estructura, la representación ya no será suficiente.

Este ejemplo resume bien tanto la potencia como el límite del enfoque.

11.22 Resumen comparativo

Aspecto Bag of Words
Unidad básica Palabras o tokens del vocabulario.
Información principal Presencia o frecuencia de términos.
Orden de palabras No se conserva.
Interpretabilidad Alta.
Complejidad Baja.
Principal debilidad No captura contexto ni relaciones semánticas profundas.

11.23 Ejemplo en Python: mini recomendador de películas con Bag of Words

Una aplicación bastante más interesante de Bag of Words consiste en construir un recomendador simple a partir de sinopsis. La idea es transformar cada descripción en un vector y luego medir qué películas se parecen más entre sí.

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import pandas as pd

peliculas = pd.DataFrame({
    "titulo": [
        "Mision Marte",
        "Amor en Paris",
        "La Ultima Fortaleza",
        "Codigo Oceano",
        "Planeta Rojo"
    ],
    "sinopsis": [
        "astronautas viajan a marte para investigar una señal misteriosa",
        "dos musicos se enamoran en paris durante un festival de verano",
        "un guerrero protege una fortaleza medieval en guerra",
        "un hacker descubre una conspiracion global en alta mar",
        "una expedicion espacial sobrevive en marte con pocos recursos"
    ]
})

vectorizador = CountVectorizer(stop_words=None)
matriz_bow = vectorizador.fit_transform(peliculas["sinopsis"])

similitud = cosine_similarity(matriz_bow)

def recomendar(titulo, topn=2):
    idx = peliculas.index[peliculas["titulo"] == titulo][0]
    puntajes = list(enumerate(similitud[idx]))
    puntajes = sorted(puntajes, key=lambda x: x[1], reverse=True)
    similares = [i for i in puntajes if i[0] != idx][:topn]

    print(f"\nSi te gusto '{titulo}', tambien podrian interesarte:")
    for i, score in similares:
        print(f"- {peliculas.iloc[i]['titulo']} (similitud={score:.3f})")

print("Vocabulario aprendido:")
print(vectorizador.get_feature_names_out())

recomendar("Mision Marte")
recomendar("Amor en Paris")

Conviene detenerse en estas líneas, porque ahí ocurre el corazón del recomendador:

  • vectorizador = CountVectorizer(stop_words=None) crea el objeto que recorrerá todas las sinopsis para construir automáticamente el vocabulario.
  • matriz_bow = vectorizador.fit_transform(peliculas["sinopsis"]) hace dos tareas al mismo tiempo: primero aprende qué palabras aparecen en el conjunto de sinopsis y luego transforma cada sinopsis en un vector numérico de frecuencias. El resultado es una matriz documento-término donde cada fila representa una película y cada columna una palabra del vocabulario.
  • similitud = cosine_similarity(matriz_bow) compara cada fila de esa matriz con todas las demás usando similitud coseno. El resultado es una nueva matriz cuadrada donde cada posición indica cuánto se parecen dos películas según sus palabras.

Si dos sinopsis comparten muchos términos, su similitud será alta; si usan vocabularios muy distintos, la similitud será baja. Por eso, una película como Mision Marte tenderá a parecerse más a Planeta Rojo que a Amor en Paris, ya que ambas comparten vocabulario relacionado con exploración espacial y Marte.

La diagonal principal de la matriz de similitud siempre vale 1, porque cada película es idéntica a sí misma. Luego, la función recomendar toma la fila correspondiente al título buscado, ordena los puntajes de mayor a menor y descarta la propia película para quedarse con las más parecidas.

Este ejemplo es didácticamente fuerte porque muestra algo importante: Bag of Words no solo sirve para clasificar textos. También permite construir buscadores, sistemas de recomendación y detección de similitud entre documentos. En este caso, películas con sinopsis parecidas terminan cerca en el espacio vectorial.

11.24 Qué debes recordar de este tema

  • Bag of Words representa un texto por las palabras que contiene y, a menudo, por sus frecuencias.
  • Primero se construye un vocabulario y luego cada documento se convierte en un vector.
  • La representación puede ser binaria o basada en conteos.
  • Bag of Words es simple, interpretable y útil en muchos problemas clásicos.
  • Su principal limitación es que ignora el orden y el contexto.
  • Produce vectores dispersos y puede generar alta dimensionalidad.

11.25 Conclusión

Bag of Words fue una de las primeras grandes respuestas prácticas a la pregunta de cómo transformar texto en números. Su importancia histórica y pedagógica es enorme, porque muestra con claridad cómo pasar de documentos a vectores utilizables por algoritmos.

Aunque hoy sabemos que este enfoque tiene límites importantes, sigue siendo una base excelente para entender representaciones textuales y para resolver ciertos problemas clásicos de manera simple y efectiva.

En el próximo tema estudiaremos TF-IDF, una evolución natural de Bag of Words que no solo cuenta palabras, sino que también pondera su importancia relativa dentro del corpus.