Compter des occurrences
Exercice bonus : Compter des occurrences
On souhaite écrire un programme qui compte les occurences de mots dans un texte afin de connaître les mots les plus fréquents.
Question
Écrire une fonction occurrences telle que :
L'entrée (
sequence) est une séquence (tuple,list,str, ...)La sortie est un dictionnaire tel que :
Les clefs sont les valeurs de la séquence
Les valeurs sont le nombre d'occurrence de ces clefs dans la séquence
Solution
def occurrences(sequence):
""" Compte les occurences dans une liste :param sequence: Une séquence (tuple, list ou str) :return: dictionnaire tel que : - les clefs sont les valeurs de la séquence - les valeurs sont les occurrences de ces clefs dans la séquence >>> occurrences([4, 2, 3, 4, 1, 4, 3, 4]) {4: 4, 2: 1, 3: 2, 1: 1} >>> occurrences("abracadrabra") {'a': 5, 'b': 2, 'r': 3, 'c': 1, 'd': 1} """dico = {}
for valeur in sequence:
if valeur in dico:
# Si la valeur est déjà dans le dico, on incrémentedico[valeur] += 1
else: # Sinon on l'ajoutedico[valeur] = 1
return dico
Question
Écrire une fonction compte_mots telle que :
L'entrée (
phrase) est une chaîne de caractères comportant des espacesLa sortie est un dictionnaire tel que :
Les clefs sont les mots de la phrase
Les valeurs sont le nombre d'occurrence des mots dans la phrase
Solution
def compte_mots(phrase: str):
""" Compte les occurences de mots dans une chaîne de caractères :param phrase: une chaîne de caractère comportant des espaces :return: dict – dictionnaire tel que : - les clés sont les mots de la chaine - les valeurs sont les occurrences des mots >>> compte_mots("a b a c ab") {'a': 2, 'b': 1, 'c': 1, 'ab': 1} """ # On découpe la phrase à chaque espace (méthode split)liste = phrase.split()
# On se sert de la fonction précédentereturn occurrences(liste)
Le « Petit Chaperon Rouge »
Pour pouvoir réaliser des tests, on va utiliser le texte du « Petit Chaperon Rouge ».
On veillera donc à télécharger le fichier suivant.
Télécharger ce fichier dans le même dossier que votre code Python.
Question
Dans le programme principal, importer ce texte puis écrire les instructions nécessaires pour afficher, dans la console, chaque mot de ce texte suivi de son nombre d'occurrences dans le texte.
Indice
La fonction open, permet d'ouvrir un fichier.
Ainsi le code suivant ouvre le fichier (fichier.txt) en lecture et obtient un référence (f).
with open("fichier.txt", 'r') as f:
# Faire quelque choseIndice
Si f est le nom d'une variable faisant référence à un fichier texte, alors f.read() renvoie le contenu de ce fichier texte sous la forme d'une unique chaîne de caractères.
Solution
with open("Petit_Chaperon_Rouge_Sans_Ponctuation.txt", 'r') as f:
texte = f.read()
Question
Écrire une fonction compte_mots_par_longueur telle que :
L'entrée (
phrase) est une chaîne de caractères comportant des espacesLa sortie est un dictionnaire tel que :
Les clefs sont la longueur des mots de l'entrée
Les valeurs sont le nombre de mots dans la phrase qui ont cette longueur
Appliquer ensuite, dans le programme principal, cette fonction au texte du « Petit Chaperon Rouge ».
Solution
def compte_mots_par_longueur(phrase):
""" Compte le nombre de mots selon la taille dans une chaîne de caractères :param phrase: une chaîne de caractère comportant des espaces :return: dict – dictionnaire tel que : - les clés sont des entiers (longueurs possibles pour un mot) - les valeurs sont les occurrences des mots ayant cette longueur >>> compte_tous_mots("a b a c ab") {1: 4, 2: 1} """dico_mots = compte_mots(phrase)
dico_taille = {}
for mot, nombre in dico_mots.items():
taille = len(mot)
if taille in dico_taille:
# Si la taille du mot est déjà dans le dico, on ajoute son nombre d'occurencesdico_taille[taille] += nombre
else: # Sinon on le rajoutedico_taille[taille] = nombre
return dico_taille
Question
Écrire une fonction plus_frequent telle que :
Les entrées :
Un dictionnaire (
dico) tel que :Les clefs sont des mots
Les valeurs sont le nombre d'occurrence de ces mots dans un texte
Un entier (
longueur), la longueur des mots que l'on considére
La sortie est un tableau constitués des chaînes de caractères de la longueur spécifiée et associées à la plus grande valeur dans le dictionnaire.
Indice
C'est un algorithme de recherche du maximum légèrement modifié :
lorsqu'on rencontre un nouveau maximum, on ré-initialise le tableau ;
lorsqu'on rencontre un mot de même « valeur », on l'incorpore au tableau.
Solution
def plus_frequent(dico, longueur):
""" Renvoie les mots les plus fréquents de la longueur donnée. En cas d'égalité en fréquence, on renverra tous les mots de cette égalité. :param dico: dictionnaire de chaines avec leur occurence :param longueur: longueur à regarder pour trouver les mots :return: string – chaine de taille longueur ayant l'occurence la plus grande. >>> plus_frequent({'a': 3, 'b': 2, 'c': 3, 'ab': 5}, 1) ['a', 'c'] """ # Intitialisation à une liste vide et une fréquence nullemaximum = []
frequence_maximum = 0
for mot in dico:
# Vérification de la contrainte de longueurif len(mot) == longueur:
# Vérification de la fréquence du motif dico[mot] > frequence_maximum:
# Si plus grand, on remet à zéromaximum = [mot]
frequence_maximum = dico[mot]
elif dico[mot] == frequence_maximum:
# Si égalité, on ajoute dans notre liste de maximumsmaximum.append(mot)
# Sinon, on ne fait rienreturn maximum