8 · N-gramas (bigramas y trigramas)
Recupera el orden parcial de palabras tratando pares y tríos de tokens como features — para que 'not good' y 'good' ya no sean lo mismo.
BOW pierde el orden de las palabras — los n-gramas lo recuperan parcialmente al tratar pares y tríos consecutivos de tokens como features.
Sin esto:
'not good' y 'good not' tienen representaciones BOW idénticas — los n-gramas detectan la diferencia.
BOW trata cada palabra de forma independiente. Eso suele estar bien — pero en algunas tareas la relación entre palabras adyacentes lleva información crítica. La palabra "not" por sí sola significa poco; "not good" como par significa lo contrario de "good".
Un n-grama es una secuencia contigua de n tokens:
- Unigrama (n=1): cada token individual — el feature estándar de BOW
- Bigrama (n=2): cada par consecutivo — "not good", "highly recommend", "machine learning"
- Trigrama (n=3): cada triple consecutivo — "not at all", "state of the art"
El CountVectorizer de sklearn soporta n-gramas de forma nativa mediante el parámetro ngram_range=(min_n, max_n). Establecer ngram_range=(1, 2) incluye tanto unigramas como bigramas, dando contexto más rico sin descartar los conteos de palabras crudos.
El inconveniente: el tamaño del vocabulario crece rápidamente. Un corpus con 1,000 palabras únicas podría tener hasta 1,000,000 bigramas posibles — la mayoría de los cuales aparecen raramente o nunca. Por eso min_df (frecuencia mínima de documento) es tu mejor aliado con n-gramas.
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).
Intercambios de rango de n-gramas y directrices prácticas
Si un vocabulario tiene 1,000 unigramas únicos, ¿cuántos bigramas podrían existir teóricamente?
- `CountVectorizer(ngram_range=(1, 2))` incluye tanto unigramas como bigramas — el punto medio más común que añade contexto de negación y frases sin explotar demasiado el vocabulario.
- Los bigramas capturan señales de sentimiento críticas como 'not good', 'barely acceptable', 'highly recommend' que son invisibles para BOW de unigramas.
- El vocabulario crece como k² para bigramas y k³ para trigramas — usa siempre umbrales `min_df` para podar n-gramas raros.
- Los n-gramas recuperan el orden LOCAL dentro de una ventana; la auto-atención en Transformers recupera el orden global de TODOS LOS PARES — conceptualmente los n-gramas son el ancestro.
Las tablas de clasificación de texto clásicas (sentimiento en Kaggle, categorización de noticias) casi siempre tenían bigrama + TF-IDF en las mejores soluciones. Los Transformers modernos reemplazan los n-gramas con las interacciones de todos los pares de la auto-atención — pero entender los n-gramas hace que los mecanismos de atención sean intuitivos.
Si lo quitas: Sin n-gramas, el texto con mucha negación (reseñas, sentimiento) es mucho más difícil para los modelos clásicos. 'Not good' y 'good' se vuelven features indistinguibles.