Cálculo de frecuencias con NLTK y diccionarios en Python

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

Contenido del curso

Fundamentos con NLTK

Resumen

Calcular cuántas veces aparece cada palabra en un texto es una de las operaciones fundamentales del procesamiento de lenguaje natural. Este conteo, aplicado sobre todo el vocabulario, permite construir una distribución de probabilidad que revela patrones lingüísticos ocultos en cualquier corpus. A continuación se explica cómo hacerlo en Python, desde el enfoque manual hasta la solución optimizada con NLTK.

¿Cómo construir un diccionario de frecuencias con Python puro?

Una primera aproximación consiste en usar diccionarios de Python [0:30]. Un diccionario es una estructura de datos donde cada elemento tiene una llave y un valor. En este caso, la llave es cada palabra del vocabulario y el valor es el número de veces que esa palabra aparece en el texto.

El proceso manual funciona así:

  • Se define un diccionario vacío.
  • Se recorre cada palabra del vocabulario con un ciclo for.
  • Para cada palabra, se usa el método .count() del texto completo para contar sus apariciones.
  • El resultado se almacena como un par llave-valor en el diccionario.

Por ejemplo, la palabra monster aparece cuarenta y nueve veces en el texto de Moby Dick, y la palabra boat aparece cincuenta y cuatro veces [0:48].

¿Por qué este método no es eficiente?

Aunque funciona, este enfoque tiene un problema importante de rendimiento computacional [2:15]. El texto de Moby Dick contiene más de doscientos sesenta mil tokens, y para cada palabra del vocabulario se recorre todo el texto buscando coincidencias. Esto hace que el cálculo sea extremadamente lento, incluso para un corpus relativamente pequeño. No es una solución viable cuando se busca construir aplicaciones escalables.

¿Qué es FreqDist en NLTK y cómo se usa?

La alternativa recomendada es utilizar la función FreqDist de NLTK [3:05]. Esta herramienta calcula la distribución de frecuencia de forma optimizada y prácticamente instantánea.

Su uso es muy sencillo:

  • Se importa FreqDist desde NLTK.
  • Se pasa el objeto de texto como argumento.
  • El resultado es un objeto que funciona como un diccionario enriquecido con métodos adicionales.

¿Qué información revela el método most_common?

El objeto fdist incluye el método most_common [3:30], que recibe como argumento el número de tokens más frecuentes que se desean consultar. Al pedir las veinte palabras más repetidas en Moby Dick, los resultados muestran que:

  • La coma es el token más frecuente con dieciocho mil setecientas trece apariciones.
  • Le siguen palabras como the, of, and, a, to.
  • Estas palabras, conocidas como stopwords, no aportan información lingüística significativa por sí solas.

Es importante recordar que la tokenización no solo separa palabras, sino también signos de puntuación y otros símbolos, por lo que estos aparecen en el conteo [3:50].

¿Cómo visualizar distribuciones de frecuencia con plot?

El objeto fdist también ofrece el método plot [4:20], que genera una gráfica donde cada punto representa el número de apariciones de una palabra. Esta visualización está construida sobre matplotlib, por lo que hereda su estilo gráfico.

La curva resultante puede interpretarse como un histograma o diagrama de barras, donde se observa cómo desciende la frecuencia conforme se avanza hacia palabras menos comunes. Este patrón es típico de la ley de Zipf, que describe cómo unas pocas palabras dominan la mayor parte de cualquier texto.

Además, se puede consultar directamente la frecuencia de una palabra específica usando la sintaxis de diccionario sobre fdist [4:55]. Por ejemplo, fdist["monster"] devuelve cuarenta y nueve, confirmando el resultado obtenido previamente con el método manual.

Las palabras más frecuentes no siempre son las más relevantes para el análisis lingüístico. El siguiente paso lógico es aplicar filtrados finos sobre estas distribuciones para obtener histogramas más significativos, eliminando signos de puntuación y palabras vacías que no aportan contenido semántico. ¿Qué criterios usarías tú para filtrar las palabras más interesantes de un texto?