7 · Bolsa de palabras (BOW)
Convierte cualquier documento en un vector de conteo de tamaño fijo con CountVectorizer — el boleto de entrada a la clasificación de texto en sklearn.
BOW representa un documento como el vector de CONTEO de sus tokens — una fila, columnas igual al tamaño del vocabulario, ignorando el orden de las palabras.
Sin esto:
No puedes ejecutar LogisticRegression ni NaiveBayes de sklearn en texto sin convertir primero los documentos en vectores de tamaño fijo.
El one-hot encoding dio a cada palabra su propia dimensión — pero nos dejó con secuencias de longitud variable y esparsidad extrema. La bolsa de palabras (BOW) resuelve el problema de longitud variable con un movimiento elegante: en lugar de mantener cada palabra como una fila OHE separada, sumamos todas las filas OHE en un único vector de conteos.
El resultado es un vector de conteo de longitud igual al tamaño del vocabulario. Cada documento — independientemente de su longitud — se representa como una única fila con columnas iguales al vocabulario. La columna i contiene el número de veces que la palabra i apareció en ese documento.
¿Por qué se llama "bolsa"? Porque metes todas las palabras en una bolsa y cuentas cuántas veces aparece cada una. El orden de las palabras se descarta por completo. "Dog bites man" y "Man bites dog" tienen vectores BOW idénticos — una limitación real para tareas sensibles a la secuencia, pero suficiente para muchos escenarios de clasificación.
El CountVectorizer de sklearn maneja todo el pipeline: tokenización, construcción del vocabulario y creación de matrices dispersas. Es la primera herramienta habitual para clasificación de texto.
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Pros y contras de BOW — cuándo usarlo y cuándo no
¿Qué representa `CountVectorizer().fit_transform(docs).shape[1]`?
- `CountVectorizer().fit_transform(docs)` devuelve una matriz dispersa de forma `(n_docs, vocab_size)` donde cada celda es el conteo de esa palabra en ese documento.
- Usa `stop_words='english'` y `max_features=N` para mantener el vocabulario manejable y eliminar palabras de ruido de alta frecuencia.
- BOW descarta el orden de las palabras por completo — 'dog bites man' y 'man bites dog' producen el mismo vector. Para tareas donde el orden importa (sentimiento con negación), se necesitan n-gramas o embeddings.
- Nunca llames `.toarray()` en matrices dispersas grandes — trabaja con clasificadores de sklearn que aceptan entrada dispersa directamente.
Clasificadores de spam, clasificadores de sentimientos, modelos de temas (LDA), clustering de documentos — todo sistema clásico de NLP comienza con BOW o TF-IDF. Los ejemplos de clasificación de texto en la documentación oficial de sklearn casi siempre usan CountVectorizer.
Si lo quitas: Sin BOW no puedes alimentar texto crudo a ningún clasificador de sklearn — LogisticRegression, SVM, RandomForest y NaiveBayes todos requieren matrices de features numéricas.