05 — Analyseur de texte
Niveau requis : 3 (chaînes, listes, dictionnaires) / Difficulté : 3/5 / Durée estimée : 2–3 h
Objectif
L'utilisateur colle un texte (ou le programme utilise un texte d'exemple intégré), et le programme affiche un rapport : nombre de caractères, de mots, de phrases, longueur moyenne des mots, les 5 mots les plus fréquents et la fréquence de chaque lettre.
--- Rapport ---
Caracteres : 486
Mots : 89
Phrases : 6
Longueur moyenne d'un mot : 4.4
Top 5 des mots : le (7), de (5), python (4), est (3), code (3)
C'est le premier projet où un dictionnaire est la SEULE bonne réponse — tu vas sentir pourquoi cette structure existe.
Notions utilisées
- Méthodes de chaînes :
lower(),split(),strip(),count(),isalpha()— niveau 3 - Listes : parcours,
len(),append()— niveau 3 - Dictionnaires : création, accès,
dict.get(key, 0), parcours avec.items()— niveau 3 - Tri d'un dict par valeurs :
sorted(d.items(), key=...)— niveau 3 (section avancée ; un indice est donné à l'étape 6) - Boucles
for— niveau 2
Cahier des charges
- Fichier
text_analyzer.py. Le texte à analyser est dans une variableTEXTen haut du fichier (multiligne,"""...""") — au moins 80 mots. - Le comptage de mots est insensible à la casse (
Leetle= même mot) et ignore la ponctuation collée aux mots (code,=code). - Le nombre de phrases = nombre de
.,!et?. - La longueur moyenne des mots est affichée avec 1 décimale et se calcule sur les mots nettoyés.
- Le top 5 affiche mot et nombre d'occurrences, ordonné par fréquence décroissante.
- La fréquence des lettres ne compte que les lettres (
isalpha()), en minuscules, et s'affiche triée par ordre alphabétique.
Étapes de construction
- Crée le fichier avec
TEXTet affiche les deux stats triviales : nombre de caractères (len(TEXT)) et nombre de mots (len(TEXT.split())). Lance : tu as déjà un mini-rapport. - Compte les phrases avec
TEXT.count(".")+!+?. Ajoute au rapport. - Construis la liste des mots nettoyés :
lower(),split(), puisstrip(".,;:!?\"'()")sur chaque mot. Affiche les 10 premiers pour contrôler visuellement. Ceprintde contrôle est temporaire mais OBLIGATOIRE : tu ne construis jamais sur une liste que tu n'as pas vue. - Longueur moyenne : somme des longueurs / nombre de mots, formatée
:.1f. - Fréquence des mots : dictionnaire
word_counts, rempli avec le motifword_counts[word] = word_counts.get(word, 0) + 1. Affiche le dict brut pour vérifier sur un petit texte de 10 mots dont tu connais la réponse. - Top 5 : trie
word_counts.items()par valeur décroissante et prends les 5 premiers. Indice :sorted(word_counts.items(), key=lambda pair: pair[1], reverse=True)— lelambdaest expliqué au niveau 4 ; si tu n'es pas à l'aise, une fonction nomméedef get_count(pair): return pair[1]fait exactement pareil. - Fréquence des lettres : même motif que les mots, en filtrant avec
isalpha(). Affiche trié par ordre alphabétique (sorted(letter_counts.items())). Retire les prints de contrôle, mets en forme le rapport final.
Extensions possibles
- Ignorer les « mots vides » (le, la, de, un…) dans le top 5, via une liste
STOP_WORDS. - Demander le texte à l'utilisateur avec
input()au lieu de la constante (une seule ligne — le multi-ligne au clavier viendra avec les fichiers, niveau 5). - Afficher un histogramme texte des lettres :
e : #########(une multiplication de chaîne par valeur). - Compter les mots UNIQUES et le pourcentage de vocabulaire unique — un
setfait ça en une ligne, c'est son métier.
Erreurs fréquentes sur ce projet
KeyError: 'python': accès àword_counts[word]avant de l'avoir créé. C'est exactement ce quedict.get(word, 0)résout — comprends ce motif, tu le réutiliseras toute ta vie.- Nettoyer APRÈS avoir compté :
codeetcode,deviennent deux entrées. L'ordre du pipeline (minuscules → découpage → nettoyage → comptage) n'est pas négociable. strip()au lieu destrip(".,;:!?"): sans argument,stripn'enlève que les espaces — orsplit()les a déjà enlevés. Résultat : la ponctuation reste et fausse tout, silencieusement.- Diviser par zéro sur un texte vide :
len(words)peut être 0. Unifde garde suffit. - Trier
word_countsdirectement (sorted(word_counts)) : ça trie les CLÉS par ordre alphabétique, pas par fréquence. Il faut trier les.items()avec une clé de tri.
Critères de réussite
- Sur un texte de contrôle de 10 mots dont je connais les comptes, chaque stat est exacte.
-
Le,leetle,comptent comme le même mot. - Le top 5 est bien ordonné par fréquence décroissante.
- Un texte vide ne fait pas planter le programme.
- Je peux expliquer le motif
d.get(key, 0) + 1sans regarder la fiche.
Commit conseillé
git add projects/mini-projects/05-analyseur-de-texte/
git commit -m "project: add text analyzer"
Puis entrée de journal + git push.