En el mundo de los programadores, uno de los conceptos más importantes es la estructura de datos. Y dentro de las estructuras de datos, una de las que más nos vamos a encontrar es el tipo de variable llamado diccionario. Por eso, hoy te voy a explicar por qué este tipo de variable es el adecuado para contar la frecuencia de palabras en Python.
Vamos a ver primero qué es un diccionario y luego te mostraré cómo utilizarlo para crear un contador de palabras sencillo, paso a paso.
Diccionario como nuevo tipo de variable
El diccionario es un tipo de variable al que no le puedes acceder con índices, sino que tienes que indicarle claves o palabras que tienen asociadas determinados valores. Cuando creas un diccionario, lo que haces es definir pares de elementos que van a ser almacenados en él. En cada uno de esos pares, la clave va a ser una palabra, y su valor numérico será la cantidad de veces que esa palabra aparece.
Por ejemplo, si quieres crear un diccionario que cuente las frecuencias de las palabras 'hola', 'adiós' y 'hola', tendrás que escribir:
d = {'hola': 2, 'adiós': 1}
Cuando tengas creado un diccionario así, podrás acceder a sus elementos introduciendo la clave entre corchetes, como d['hola'], que devolverá el valor asociado a esa clave, que en este caso sería 2.
Ahora, imagina que quieras crear un diccionario con todos los elementos de una lista. La forma más básica de hacerlo es usando el método count() de las listas, que cuenta cuántas veces aparece un elemento en ella. Si queremos crear un diccionario donde cada palabra sea una clave y su valor sea la frecuencia, tenemos que recorrer todas las palabras de la lista, y para cada una, obtener su número de apariciones.
Lo que necesitamos entonces es una función que, dado una lista de palabras, devuelva un diccionario con cada palabra y su frecuencia. Para ello, usaremos una comprensión de listas, y dentro del bucle de la comprensión, utilizaremos la función count() de las listas.
def listaPalabrasDicFrec(listaPalabras):
return {p: listaPalabras.count(p) for p in listaPalabras}
Si ahora ejecutamos la función, tendremos un diccionario donde cada palabra de la lista se ha convertido en una clave, y su valor es la cantidad de veces que aparece en la lista. Es decir, la primera vez que se llama a la función, se crea un diccionario vacío, y después, en cada iteración del bucle, se añade una clave y su valor correspondiente.
Una vez creada la función, podemos utilizarla para generar cualquier diccionario de frecuencias. Por ejemplo, para contar cuántas veces aparecen las palabras 'hola', 'adiós' y 'hola' en una lista, simplemente pondríamos:
palabras = ['hola', 'adiós', 'hola']
print(listaPalabrasDicFrec(palabras))
Esto imprimiría {'hola': 2, 'adiós': 1}.
La principal ventaja de usar diccionarios es que no tienes que preocuparte por tener las palabras ordenadas, ni por saber cuál es el índice de cada una. Lo único que debes saber es cómo crearlos, y ya estarás bien. Además, también puedes mezclar tipos de variables, ya que las claves pueden ser números o cadenas, mientras que los valores son siempre numéricos.
También podrías haber utilizado strings e índices numéricos para realizar este proceso, pero en ese caso tendrías que asegurarte de que las palabras estén ordenadas, y también tendrías que prestar atención a los índices para no cometer errores. Con los diccionarios, todo es mucho más fácil, y aunque no sepas exactamente dónde está cada palabra, sabrás cómo buscarla.
Retirar palabras vacías
Antes de empezar a contar las palabras, hay algo que tienes que tener en cuenta: tu lista debe estar lo suficientemente limpia. Esto significa que antes de crear el diccionario, debes asegurarte de que no haya palabras vacías. Las palabras vacías son aquellas que son demasiado cortas, y que por tanto no tienen sentido.
Por ejemplo, en el español, las palabras más comunes son las preposiciones, como la, de, en, etc., que suelen ser palabras muy cortas. Por eso, cuando cuentas las frecuencias, suele ser útil retirarlas, ya que son muy comunes, y su presencia puede sesgar los resultados. Pero claro, dependiendo de lo que quieras analizar, puede que no quieras retirarlas, porque tal vez sean ellas las que te interesen.
Pero independientemente de esto, debes asegurarte de que tu lista tenga las palabras lo suficientemente limpias como para que el resultado sea analíticamente útil. Puedes intentarlo por ti mismo, y si ves que el resultado no tiene sentido, prueba a retirar algunas palabras.
Notas sobre las palabras en español
Este artículo se centra en contar palabras, pero también es importante pensar en cómo afectan las particularidades del idioma que estamos tratando. Por ejemplo, en el español, las vocales acentuadas á, é, í, ó, ú deben incluirse para que no se traten las palabras con acento como distintas. Por ejemplo, la palabra 'café' no debería considerarse diferente de 'cafe'.
Un comentario de la comunidad menciona esto, y dice que cuando trabajas con un corpus de texto en español, tienes que asegurarte de que las palabras se procesen correctamente. Si no, vas a tener problemas a la hora de comparar palabras con acento. Por ejemplo, si la palabra 'casa' aparece muchas veces, y la palabra 'casá' también, las dos son diferentes y no tendrán relación. Pero si no hay acento, ambas son iguales.
Como ejemplo práctico, el comentario sugiere que cuando proceses tus palabras, conviertas las vocales acentuadas en sus versiones sin acento. Así, tendrás una base común para comparar las palabras.
Extender la lógica a archivos de texto
Y aquí viene la parte práctica. Como has visto, el proceso es bastante simple, pero hasta ahora hemos estado trabajando solo con listas de palabras escritas directamente en nuestro código. Sin embargo, en muchos casos, vamos a querer trabajar con archivos de texto reales, en lugar de con listas.
Pues bien, la lógica de conteo es la misma, y por tanto, puedes adaptar el script anterior para leer un archivo de texto y crear un diccionario con las frecuencias de sus palabras. Solo tienes que cambiar la lista de palabras por el contenido del fichero.
Para hacer esto, puedes crear una función que abra el fichero, lea su contenido, y devuelva un diccionario con las frecuencias de sus palabras. Aquí tienes un ejemplo de cómo podría quedar:
import sys
def contar_palabras(fichero):
with open(fichero, 'r') as f:
texto = f.read()
palabras = texto.split()
return {p: palabras.count(p) for p in palabras}
if name == 'main':
if len(sys.argv) != 2:
print('Uso: {} <nombre_fichero>'.format(sys.argv[0]))
sys.exit(1)
else:
print(contar_palabras(sys.argv[1]))
De esta manera, ya no tendrás que escribir las palabras tú mismo, sino que simplemente tendrás que pasarle el nombre del archivo al script, y automáticamente contará las palabras.