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.
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.
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.
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.
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:
Estas decisiones afectan tamaño del vector, memoria y capacidad de generalización.
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.
Bag of Words puede construirse de dos maneras frecuentes:
Por ejemplo, si el texto es:
gato gato duerme
con un vocabulario [gato, duerme, perro], podríamos tener:
[1, 1, 0][2, 1, 0]Ambas variantes son Bag of Words, pero la segunda conserva más información sobre repetición.
Supongamos este pequeño corpus:
el gato duermeel perro duermeel gato correSi el vocabulario fuera:
[el, gato, perro, duerme, corre]
entonces las representaciones Bag of Words por frecuencia serían:
[1, 1, 0, 1, 0][1, 0, 1, 1, 0][1, 1, 0, 0, 1]Así, cada texto queda convertido en un vector numérico de longitud fija.
Cuando representamos varios documentos a la vez con Bag of Words, el resultado natural es una matriz documento-término.
En esa matriz:
Esta matriz es una de las estructuras más clásicas del NLP y de la recuperación de información.
Bag of Words conserva información útil como:
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.
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 hombreel hombre mordió al perroDesde el punto de vista de Bag of Words, ambas contienen casi las mismas palabras. Pero semánticamente son muy distintas.
A pesar de su simplicidad, Bag of Words tiene ventajas importantes:
Bag of Words también tiene limitaciones fuertes:
Estas limitaciones explican por qué más adelante surgieron representaciones como TF-IDF y embeddings.
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.
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:
Por eso, en la práctica suele aplicarse algún criterio para limitar el vocabulario.
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.
Vale la pena insistir en que Bag of Words no es una sola representación rígida. Dos variantes muy comunes son:
La versión de conteo conserva más detalle, pero la binaria puede ser suficiente en ciertos problemas simples.
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:
En estos casos, la simple presencia o frecuencia de ciertas palabras ya puede ser muy informativa.
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.
Aunque existen técnicas más modernas, Bag of Words sigue siendo útil cuando:
También es valioso como punto de comparación frente a métodos más avanzados.
Imaginemos dos reseñas:
producto excelente y entrega rápidaentrega rápida y producto excelenteBag 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.
| 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. |
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.
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.