Análisis de Colocaciones con NLTK y Pandas en Python

Clase 12 de 24Curso de Fundamentos de Procesamiento de Lenguaje Natural con Python y NLTK

Contenido del curso

Fundamentos con NLTK

Resumen

Detectar combinaciones de palabras que aparecen juntas con una frecuencia inusualmente alta es una de las tareas más reveladoras del procesamiento de lenguaje natural. Utilizando bigramas extraídos del texto de Moby Dick, es posible construir una métrica estadística que señale con precisión cuáles de esas combinaciones son verdaderas colocaciones del idioma. A continuación se explica paso a paso cómo lograrlo con NLTK, Pandas y NumPy.

¿Qué son las colocaciones y por qué importan los bigramas filtrados?

Las colocaciones son secuencias de palabras que aparecen en textos y conversaciones con una frecuencia inusualmente alta, y existe evidencia estadística que lo respalda [0:42]. Esto quiere decir que no basta con contar cuántas veces aparece un par de palabras: se necesita una métrica que compare esa frecuencia con lo que se esperaría si las palabras fueran independientes.

El punto de partida es la lista de bigramas calculada previamente con NLTK sobre el texto de Moby Dick. Para trabajar solo con palabras significativas, se aplica un umbral de longitud (threshold) igual a dos caracteres [1:28]. De este modo se descartan artículos, preposiciones de una letra y otros elementos que aportan poco a la identificación de colocaciones.

  • Se construye una lista llamada filtered_bigrams donde cada palabra del bigrama tiene al menos dos caracteres.
  • Sobre esa lista se genera una distribución de frecuencias con FreqDist, almacenada en filtered_bigram_dist [2:08].

¿Cómo organizar los datos en un dataframe de Pandas?

Para calcular la métrica de forma ordenada se utiliza un dataframe de la librería Pandas, que funciona como una hoja de cálculo gestionada con código Python [2:30]. Se crea un dataframe vacío y se le añade una columna bigrams con los bigramas únicos, obtenidos mediante set() para eliminar repeticiones.

¿Cómo separar las palabras de cada bigrama?

Con la función apply y una función lambda se extraen la primera y la segunda palabra de cada tupla [3:50]:

  • df['word_0'] almacena el elemento cero de la tupla.
  • df['word_1'] almacena el elemento uno.

Esto genera un dataframe con tres columnas: el bigrama completo y sus dos palabras por separado.

¿Qué columnas de frecuencia se necesitan para el cálculo?

Además de la distribución de bigramas, se requiere una distribución de palabras filtradas (filtered_word_dist) construida con el mismo umbral de longitud [6:00]. Con ella se agregan tres columnas de frecuencia al dataframe:

  • bigram_freq: frecuencia de aparición del bigrama, obtenida con filtered_bigram_dist.
  • word_0_freq: frecuencia de la primera palabra, obtenida con filtered_word_dist.
  • word_1_freq: frecuencia de la segunda palabra [7:05].

Cada columna se calcula aplicando apply con una lambda que consulta la distribución correspondiente.

¿Cómo se calcula la métrica PMI para detectar colocaciones?

La PMI (pointwise mutual information o información mutua punto a punto) cuantifica cuánta información contiene un bigrama respecto a la aparición independiente de sus palabras [5:10]. Su fórmula divide la probabilidad conjunta del bigrama entre el producto de las probabilidades individuales de cada palabra, y al resultado se le aplica un logaritmo en base dos [9:20].

En Pandas se implementa seleccionando las tres columnas de frecuencia con doble corchete y aplicando una lambda que opera sobre x.values [8:40]:

python df['PMI'] = df[['bigram_freq','word_0_freq','word_1_freq']].apply( lambda x: np.log2(x.values[0] / (x.values[1] * x.values[2])), axis=1 )

El parámetro axis=1 indica que la operación se realiza fila por fila, no columna por columna; sin él, los valores resultan no numéricos (NaN) [10:15].

¿Qué significan los valores negativos del PMI?

Al ordenar el dataframe con sort_values en orden descendente sobre la columna PMI [10:50], se observa que la mayoría de valores son negativos. Esto ocurre porque la división dentro del logaritmo suele dar números menores a uno, y el logaritmo de un número menor a uno es negativo [11:25].

  • Los bigramas con PMI cercano a cero (los menos negativos) tienen mayor probabilidad de ser colocaciones.
  • Los bigramas con valores muy negativos corresponden a combinaciones poco informativas.

Ordenar y visualizar estos resultados permite identificar de forma sistemática las colocaciones reales del texto, apoyándose en evidencia estadística y no solo en la intuición.

Si has trabajado con otras métricas para identificar colocaciones o tienes dudas sobre la implementación, comparte tu experiencia en los comentarios.