jueves, 31 de octubre de 2019

Frecuencia de caracteres en El Quijote

Esta entrada forma parte de un grupo de artículos donde trabajamos con caracteres y palabras usando como libro de ejemplo El Quijote.
  1. Leer el Quijote en Python
  2. Buscar una palabra en un libro con Python
  3. Frecuencia de caracteres en El Quijote ← (es el post en el que estamos)
En esta ocasión el objetivo consiste en calcular la frecuencia con la que aparece cada uno de los caracteres que podemos encontrar en El Quijote.

El código se puede ver en:


Hemos tomado la versión de El Quijote completa (primera parte y segunda parte) que está publicada en el proyecto Gutenberg en formato de texto plano (UTF-8).
Se han obtenido 91 caracteres diferentes entre los que se encuentra el espacio vacío y el retorno de carro.


#abrimos el libro y buscamos todos los caracteres que contiene
# http://www.gutenberg.org/ebooks/2000
f=open("quijote_completo_proyectoGutenberg.txt")
libro=f.read()
#texto contiene todos los caracteres del libro
texto="" #string inicializado como cadena vacia
for letra in libro:
 if not(letra in texto):
  texto+=letra
texto="".join(sorted(texto))
print(texto)
#mostramos el número total de caracteres
#se incluye el retorno de carro como caracter /n
print("Número de caracteres de la variable 'texto'=",len(texto))
#convertimos en lista el string
caracteres=list(texto)
#mostramos la longitud de la lista
#que ha de coincidir con la anterior
print("Elementos de la lista 'caracteres'=",len(caracteres))
#print(caracteres)
print('\n') #salto de línea
#creamos un diccionario del tipo Clave:Valor
#donde la clave se obtiene de la lista 'caracteres'
#y el valor inicialmente es cero para todos
parejas = dict.fromkeys(caracteres, 0)
#la siguiene línea hace lo mismo que la anteriror
#parejas=dict((el,0) for el in caracteres)
#recorremos todos los caracteres del string texto y por cada uno de ellos
#recorremos todos los caracteres del libro
#si coinciden anotamos uno más al marcador
for caracter in texto:
  for letra in libro:
    if letra==caracter:
      parejas[letra]+=1
#print(parejas) #esto imprimiría las parejas pero sin ordenar
print('\n')
#Imprimimos una relación de caracteres ordenados por frecuencia de aparición
for i in sorted(parejas, key=parejas.get, reverse=True):
  print(i,parejas[i])
f.close() 

Un diccionario en Python es una estructura no ordenada de parejas Clave:Valor. Decimos que es iterable pero no ordenada ya que no funciona como una lista que es un array que si podemos ordenar. Buscando por StackOverflow hemos encontrado una opción para mostrar por pantalla los valores de esas parejas ordenados por su valor de mayor a menor.