Fréquence d’apparition d’une lettre en Python

Nous allons voir ici comment calculer la fréquence d’apparition d’une lettre dans un texte donné en Python.

fréquence apparition lettre en Python

Notions de dictionnaire (nécessaire pour calculer la fréquence d’apparition d’une lettre en Python)

En Python, un dictionnaire est une collection d’éléments auxquels sont associées des valeurs. Pour ce qui nous intéresse, on va constituer un dictionnaire de la forme:

'a' : 8
'b' : 2
'c' : 3
...

Les valeurs représenteront le nombre de fois où apparaissent les lettres (les lettres sont appelées les clés du dictionnaire).

En Python, un dictionnaire peut être déclaré de deux manières:

d = dict()
# ou
d = {}

La deuxième manière est plus utilisée que la première car plus courte à écrire.

Calcul effectif de la fréquence d’apparition des lettres dans un texte avec Python

Introduction

L’idée est de parcourir un texte. À chaque caractère que l’on rencontre, on regarde dans le dictionnaire (initialement vide) si le caractère est présent. Si tel n’est pas le cas, on créé la clé avec pour valeur “1”; sinon on ajoute 1 à la valeur déjà existante.

Je vais ici m’appuyer sur un poème de Charles Baudelaire : L’albatros.

car = [ ' ' , ',' , ':' , ';' , '.' , "'" , '-' , '!' , '?' ]

def freq(texte):
    d = {}
    for c in texte:
        if c.lower() not in d:
            if c not in car:
                d[c.lower()] = 1
        else:
            d[c.lower()] += 1
            
    return d

texte = ""

with open('albatros.txt' , encoding='utf8') as poeme:
    for ligne in poeme:
        texte += ligne.replace('\n','')
        
L = sorted(freq(texte).items(), key = lambda colonne: colonne[1] , reverse = True)
for i in L:
    print('{} : {}'.format(i[0],i[1]))

qui donne:

e : 93
s : 56
a : 42
l : 39
u : 37
i : 35
n : 33
t : 33
r : 30
o : 25
m : 21
d : 17
c : 17
p : 12
g : 12
v : 10
h : 10
é : 9
b : 8
q : 7
x : 4
f : 3
y : 2
à : 2
è : 2
ê : 2
z : 1
î : 1
ô : 1
û : 1

Explications

La ligne 1 du programme construit une liste des caractères que je souhaite ignorer lors de l’analyse du texte. Inutile de compter le nombre de virgules, de point d’exclamation et autres sigles superflus).

Lignes 3 à 12 : la fonction qui construit le dictionnaire contenant toutes les lettres du texte.

  • On initialise le dictionnaire (→ ligne 4);
  • on parcourt tout le texte en faisant une boucle de variable c (→ ligne 5);
  • si la minuscule de la lettre sur laquelle on est n’est pas encore dans le dictionnaire (→ ligne 6)
  • et si le caractère n’est pas dans notre blacklist car (→ ligne 7) alors on l’insère dans le dictionnaire;
  • sinon (→ ligne 9), on incrémente la valeur (car on rencontre une fois de plus la lettre) → ligne 10;
  • on finit par retourner le dictionnaire d (→ ligne 12).

Ensuite (→ ligne 14) on initialise la variable texte comme une chaîne de caractères vide.

Les lignes 16 à 18 construisent la variable texte:

  • on ouvre le fichier nommé “albatros.txt”; il contient le poème de Charles Baudelaire: L’albatros (→ ligne 16) et ce fichier est désigné par la variable poeme;
  • ensuite, on parcours ce fichier ligne par ligne (→ ligne 17);
  • on ajoute au fur et à mesure chaque ligne à la variable texte (→ ligne 18) en supprimant “\n”; il faut savoir que “\n” désigne en Python un retour à la ligne.

Ensuite (→ ligne 20), on construit une liste avec les éléments du dictionnaire. Pour cela, on a avant tout ordonné les valeurs des occurrences; ainsi, la première valeur de la liste est le caractère qui est répété le plus de fois.

Tout ceci est très technique pour des élèves ne suivant pas l’enseignement NSI. Mais ce qui compte est ce qui suit pour l’enseignement des mathématiques. Car pour l’instant, nous n’avons pas encore les fréquences.

Calcul des fréquences

On va donc modifier le programme précédent afin qu’il affiche non plus les nombre d’occurrences des lettres, mais leur fréquence.

car = [ ' ' , ',' , ':' , ';' , '.' , "'" , '-' , '!' , '?' ]

def freq(texte):
    d , compteur = {} , 0
    for c in texte:
        if c.lower() not in d:
            if c not in car:
                d[c.lower()] = 1
                compteur += 1
        else:
            d[c.lower()] += 1
            compteur += 1
            
    return d , compteur

texte = ""

with open('albatros.txt' , encoding='utf8') as poeme:
    for ligne in poeme:
        texte += ligne.replace('\n','')
        
d , compteur = freq(texte)
        
L = sorted(d.items(), key = lambda colonne: colonne[1] , reverse = True)
for i in L:
    print('{} : {}'.format(i[0],i[1]/compteur))

J’ai modifié la ligne 4 ; j’ai ajouté une variable compteur qui a pour mission de compter toutes les lettres du texte.

Aux lignes 9 et 12, j’ai ajouté une incrémentation de cette variable; à chaque fois que j’ajoute une clé au dictionnaire (un caractère) et à chaque fois que je modifie une valeur.

Je retourne désormais non plus uniquement le dictionnaire mais aussi le compteur (→ ligne 14). C’est pourquoi j’ai mis la ligne 14.

Et ensuite, j’affiche (→ ligne 26) “i[1]/compteur” qui correspond à la fréquence de la lettre (nombre d’occurrences par rapport au nombre total de lettres).

Notez qu’en français, les lettres accentuées sont dissociées des lettres non accentuées; par exemple, on voit un “û” et un “u” dans le dictionnaire.

On s’aperçoit alors que la lettre “e” est la voyelle la plus fréquente dans ce poème; elle est suivie du “a”. Le “s” est la consonne la plus fréquente.

Et en anglais, ça donne quoi ?

J’ai testé ce script sur le poème de Samuel Beckett (trouvé sur cette page), et voici le résultat:

e : 0.11328125
t : 0.095703125
i : 0.080078125
o : 0.07421875
a : 0.068359375
s : 0.068359375
h : 0.06640625
n : 0.064453125
d : 0.056640625
r : 0.05078125
w : 0.041015625
l : 0.041015625
u : 0.03515625
g : 0.025390625
v : 0.021484375
c : 0.01953125
f : 0.017578125
y : 0.017578125
b : 0.013671875
m : 0.013671875
p : 0.0078125
k : 0.005859375
z : 0.001953125

Le “e” arrive aussi en tête des voyelles, suivi du “i”. Quant à la consonne la plus fréquence, il s’agit du “t”, suivi du “s”.

N’oubliez pas que si vous avez des problèmes en maths, je peux vous aider par webcam !

Vous pouvez revenir à la liste des ressources Python au lycée.