Consignes

Vous devrez utiliser l'interface TPLab pour envoyer vos devoirs aux encadrants de TD.

Attention : soumettez bien votre devoir à la maison au bon enseignant :

La note ne valide pas seulement le résultat de votre programme, mais également son style :

Vérifiez ces points avant de demander à votre intervenant de valider votre code.

Liens utiles

Objectifs

Travailler avec :

1. Analyse fréquentielle : lettres

La page Wikipedia Fréquence d'apparition des lettres en français contient la fréquence d'apparition des lettres dans un corpus de textes en français.

Par exemple, on y trouve que la lettre "e" a une fréquence d'apparition d'environ 14.7%.

Le but de cette partie est de recalculer ces fréquences pour des corpus de texte différents. Le site du projet Gutenberg contient de nombreux livres du domaine public au format texte, ce qui rend leur analyse relativement aisée.

La fonction principale de cette partie sera une fonction

def frequence_lettres(liste_fichiers):
    """calcule la frequence des lettres de l'alphabet dans les fichiers
donnés en argument.

paramètre : liste_fichiers, de type liste de chaines de caractères : liste des
noms de fichier qu'il faudra utiliser pour l'analyse

valeur de retour : dictionnaire où les clés sont des caractères, et les valeurs
sont leurs fréquences d'apparition.
"""
  1. N'oubliez pas de regarder les fichiers que vous utilisez. Les livres téléchargés sur le site du projet Gutenberg commencent tous par des entêtes d'une cinquantaine de lignes qu'il faudra supprimer (soit à la main, soit avec une fonction spécifique).

  2. D'autre part, il n'est pas nécessaire de faire toutes les questions pour obtenir une bonne note. Traitez les questions dans l'ordre, éventuellement en sautant la question 3 (gestion des accents), et écrivez une procédure d'affichage pour votre dernière fonction (question 9).

  3. N'oubliez pas de faire des commentaires sur les résultats que vous observez. (Exemples de choses à tester : regarder des livres en plusieurs langues, comparer des livres de différents auteurs, de différentes époques, du théâtre ou des romans, etc.)

1.1. Préliminaires

Préliminaire : programmez une fonction qui prend en argument un nom de fichier et qui calcule la liste des caractères alphabétiques apparaissant dans le fichier. (Vous pouvez utiliser la méthode .isalpha() pour savoir si un caractère est alphabétique.)

Modifiez votre fonction lettres pour qu'elle ne fasse pas la différence entre les majuscules et les minuscules.

Modifiez votre fonction lettres pour qu'elle identifie les lettres accentuées avec leurs variantes non accentuées.

Vous pouvez par exemple vous servir du dictionnaire suivant :

correspondance = {
    'á': 'a', 'à': 'a', 'ã': 'a', 'â': 'a', 'å': 'a', 'ä': 'a',
    'ç': 'c',
    'é': 'e', 'è': 'e', 'ë': 'e', 'ê': 'e',
    'í': 'i', 'ì': 'i', 'ï': 'i', 'î': 'i',
    'ñ': 'n',
    'ð': 'd',
    'ó': 'o', 'ò': 'o', 'õ': 'o', 'ô': 'o', 'ö': 'o', 'ø': 'o',
    'ù': 'u', 'û': 'u', 'ú': 'u', 'ü': 'u',
    'ý': 'y', 'ÿ': 'y'}

qui devrait suffire pour toutes les langues européennes.

Écrivez maintenant une fonction qui calcule la liste des lettre présentes dans une liste de fichiers. (Autrement dit, au lieu de chercher dans un seul fichier, il faudra chercher dans plusieurs fichiers...)

1.2. Fréquences

Au lieu de simplement calculer la liste des lettres présentes, nous allons maintenant compter combien de fois chaque lettre apparait. Pour ceci, nous allons utiliser un dictionnaire nb_occ qui associe à chaque lettre rencontrée, son nombre d'occurrences.

Ce dictionnaire est initialisé au dictionnaire vide :

    nb_oc = {}

Et on peut incrémenter le compteur d'un caractère c avec :

    nb_oc[c] = nb_oc.get(c,0) + 1

(Notez que la ligne précédente fonctionne également quand le caractère c n'est pas présent dans le dictionnaire.)

Écrivez une fonction compte_lettres qui compte le nombre de chacune des lettres dans une liste de fichiers :

def compte_lettres(liste_fichiers):
    """compte le nombre d'occurrence de chaque caractère alphabétique dans
une liste de fichiers

paramètre : liste_fichier, de type liste de chaines de caractères : liste
des noms de fichiers à regarder

retour : dictionnaire associant à chaque caractère trouvé, son nombre d'occurrences
"""

Note : cette fonction commence de la même manière que la fonction lettres, mais il ne faut pas utiliser la fonction lettres pour écrire compte_lettres.

1.3. Fonction principale

Vous pouvez maintenant écrire la fonction principale :

def frequence_lettres(liste_fichiers):
    """calcule la frequence des lettres de l'alphabet dans les fichiers
donnés en argument.

paramètre : liste_fichiers, de type liste de chaines de caractères : liste des
noms de fichier qu'il faudra utiliser pour l'analyse

valeur de retour : dictionnaire où les clés sont des caractères, et les valeurs
sont leurs fréquences d'apparition.
"""

2. Analyse fréquentielle des bigrammes

En vous inspirant des fonctions précédentes, essayez de faire une analyse sur les bigrammes (couples de lettres). La page Wikipedia Analyse fréquentielles des bigrammes nous indique que les bigrammes les plus fréquents sont :

Écrivez la fonction frequences_bigramme correspondante :

def frequence_bigrammes(liste_fichiers):
    """calcule la frequence des bigrammes dans les fichiers donnés en argument.

paramètre : liste_fichiers, de type liste de chaines de caractères : liste des
noms de fichier qu'il faudra utiliser pour l'analyse

valeur de retour : dictionnaire où les clés sont des caractères, et les valeurs
sont leurs fréquences d'apparition.
"""

Écrivez maintenant une procédure affiche_frequences qui appelle votre fonction frequences_lettres ou frequence_bigrammes et affiche le résultat de manière lisible :

Attention : il y a théoriquement 676 bigrammes. Il ne faut donc peut-être pas tout afficher !