Contar la frecuencia de palabras en un fichero utilizando Python

¿Te has preguntado alguna vez sobre si existe una manera rápida de saber en lo que se centra un documento? ¿Cuál es su tema principal? Te voy a dar este sencillo truco. Enumera las palabras mencionadas en el documento, y después, comprueba cuántas veces se ha mencionado cada palabra (su frecuencia). De esta manera tendremos una ligera idea de lo que trata el documento. Seguramente habrás pensado, en hacer esto tardaré mucho más tiempo que en leerme el documento en sí. Es por eso que necesitamos un proceso automatizado sí o sí.

Sí, un proceso automatizado hará esto mucho más fácil. Vamos a ver cómo podemos enumerar las diferentes palabras únicas en un archivo de texto y comprobar la frecuencia de cada palabra usando Python.

Archivo de prueba

En este tutorial, vamos a utilizar test.txt como nuestro archivo de prueba. Antes que nada, descárgate el archivo, ¡pero no lo abras! Vamos a hacer un pequeño juego. El texto dentro de este archivo de prueba es de los tutoriales de Abder-Rahman Ali. En base a la frecuencia de las palabras, vamos a adivinar de qué trata dicho tutorial.

¡Que comience el juego!

Expresiones regulares

Ya que vamos a aplicar un patrón a nuestro juego, tenemos que utilizar expresiones regulares (regex). Si el término "expresiones regulares" es nuevo para ti, esta es su definición extraída de la Wikipedia:

Una expresión regular, a menudo llamada también regex, es una secuencia de caracteres que forma un patrón de búsqueda, principalmente utilizada para la búsqueda de patrones de cadenas de caracteres u operaciones de sustituciones.

Si quieres aprender más sobre expresiones regulares puedes echarle un ojo al tutorial sobre Expresiones regulares en Python que redactamos hace unas semanas, y volver luego a este tutorial.

Implementando el programa

Vamos a ir paso por paso para construir este juego juntos. Lo primero que tenemos que hacer es almacenar el texto del fichero en una variable de tipo string.

document_text = open('test.txt', 'r')
text_string = document_text.read()

Ahora, para que el hecho de aplicar nuestra expresión regular sea más sencillo, vamos a convertir todas las palabras del documento a minúsculas, utilizando la función lower(), tal que así:

text_string = document_text.read().lower()

Vamos a escribir nuestra expresión regular. Su función será la de devolver todas la palabras que su longitud se encuentra en un rango dado. Para este ejemplo, y para quitarnos de palabras banales (de, en, su, los), daremos un rango de 3 a 15 caracteres. La expresión regular para dicho patrón sería una cosa así:

b[a-z]{3,15}b

b hace referencia al límite de caracteres. Para más información sobre el patrón de límite de caracteres, echa un vistazo a este tutorial.

La expresión regular de antes puede implementarse de la siguiente manera:

match_pattern = re.search(r'b[a-z]{3,15}b', text_string)

Dado que queremos navegar a través de las distintas palabras del documento, podemos utilizar la función findall. En este punto, queremos encontrar la frecuencia de cada palabra en el documento. El concepto a utilizar aquí es Diccionarios de Python, ya que necesitamos pares de valores clave, donde la clave es la palabra, y el valor representa las frecuencia de palabras aparecidas en el documento.

Suponiendo que hemos declarado un diccionario vacío frecuency = {}, el párrafo anterior quedaría como sigue:

for word in match_pattern:
    count = frequency.get(word,0)
    frequency[word] = count + 1

Ahora podemos ver nuestras claves utilizando:

frequency_list = frequency.keys()

Finalmente, para obtener todas las palabras y su frecuencia (número de veces aparece en el fichero de texto), podemos hacer lo siguiente:

for words in frequency_list:
    print words, frequency[words]

Ahora veremos todos los códigos expuestos juntos, y hayaremos la respuesta a este emocionante juego.

Poniéndolo todo junto

Habiendo ya visto la implementación paso por paso de nuestro programa, vamos a ver cómo luciría todo junto:

import re
import string
frequency = {}
document_text = open('test.txt', 'r')
text_string = document_text.read().lower()
match_pattern = re.findall(r'b[a-z]{3,15}b', text_string)
 
for word in match_pattern:
    count = frequency.get(word,0)
    frequency[word] = count + 1
     
frequency_list = frequency.keys()
 
for words in frequency_list:
    print words, frequency[words]

Si ejecutas el programa, obtendrás algo tal que así:

Con este resultado, ¿eres capaz de adivinar de qué iba el tutorial de Abder-Rahman Ali? No es muy complicado, solo hace falta un poquito de concentración. ¡Animo!

Fuente: Abder-Rahman Ali

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP