Aller au contenu

Exercices : Traitement de texte

Trois mini-projets de difficulté croissante sur des données textuelles réelles.

Projet 1 — Parser un fichier CSV

Lire un texte brut, nettoyer les données, extraire les champs. Manipulation de split, strip, replace.

Projet 2 — Statistiques dyslexie

Analyser un texte et calculer des indicateurs de lisibilité. Itération sur les chaînes, regex, NumPy.


Ton collègue t’a transmis une liste d’étudiants dans un fichier texte. Malheureusement, les données sont sales : séparateurs incohérents, espaces en trop, casse mélangée. Ton travail est de nettoyer le texte et de l’afficher sous forme de tableau.

texte = """prenom ; nom ; age ; note
alice ; tremblay ; 19 ; 85.5
BOB;Lévesque;20;72
Charlie ; NGUYEN ;21 ; 91.0
diana;o'connor ;18; 68.5
Eve ;Martin; 22;79"""

Écris un programme qui sépare le texte en lignes et affiche chacune d’elles avec son numéro.

Ligne 0 : prenom ; nom ; age ; note
Ligne 1 : alice ; tremblay ; 19 ; 85.5
Ligne 2 : BOB;Lévesque;20;72
Ligne 3 : Charlie ; NGUYEN ;21 ; 91.0
Ligne 4 : diana;o'connor ;18; 68.5
Ligne 5 : Eve ;Martin; 22;79

Exercice 1.2 — Séparer les champs d’une ligne

Section intitulée « Exercice 1.2 — Séparer les champs d’une ligne »

Écris un programme qui prend une seule ligne de données et la sépare en champs. Attention : le séparateur peut être ; avec ou sans espaces autour.

ligne = "alice ; tremblay ; 19 ; 85.5"
['alice', 'tremblay', '19', '85.5']
💡 Indice

Utilise .split(";") pour séparer, puis .strip() sur chaque champ pour enlever les espaces. Une boucle sur la liste des champs fait l’affaire.


Les prénoms et noms doivent être en Titre (première lettre majuscule, reste en minuscules). Écris une fonction qui normalise un champ texte.

print(normaliser("alice")) # Alice
print(normaliser("BOB")) # Bob
print(normaliser(" NGUYEN ")) # Nguyen
print(normaliser("o'connor")) # O'Connor

Écris une fonction parser_ligne(ligne) qui retourne une liste avec les 4 champs correctement typés :

  • prenom (str, normalisé)
  • nom (str, normalisé)
  • age (int)
  • note (float)
# Test
resultat = parser_ligne("alice ; tremblay ; 19 ; 85.5")
print(resultat)
# ['Alice', 'Tremblay', 19, 85.5]

Assemble tout : lis le texte, saute la ligne d’en-tête, parse chaque ligne et affiche un tableau propre.

Prénom Nom Âge Note
------------------------------------------
Alice Tremblay 19 85.5
Bob Lévesque 20 72.0
Charlie Nguyen 21 91.0
Diana O'Connor 18 68.5
Eve Martin 22 79.0
------------------------------------------
Moyenne du groupe : 79.2
💡 Indice

Pour l’alignement des colonnes, utilise format() avec les spécificateurs de largeur : "{:<12}" aligne à gauche sur 12 caractères, "{:>6}" aligne à droite sur 6 caractères.


La dyslexie rend la lecture plus difficile selon certaines caractéristiques du texte : longueur des mots, fréquence de certaines lettres, présence de lettres facilement confondues (comme b/d, p/q, m/n).

Tu vas écrire un analyseur qui produit des statistiques de lisibilité pour aider à évaluer la difficulté d’un texte.

texte = """Le petit chat noir dort paisiblement sur le canapé beige.
Il rêve probablement de poissons dorés nageant dans une rivière.
Son ronronnement doux berce la maisonnée tout entière."""

Écris une fonction qui compte le nombre total de caractères d’un texte, sans compter les espaces ni les retours à la ligne.

print(compter_caracteres(texte)) # 180

Écris une fonction qui retourne le nombre de mots dans le texte. Un mot est délimité par des espaces ou des sauts de ligne.

print(compter_mots(texte)) # 33
💡 Indice

.split() sans argument découpe sur tous les espaces blancs consécutifs (y compris \n).


Écris une fonction qui retourne la longueur moyenne des mots. Ignore la ponctuation finale (., ,, !, ?).

print(format(longueur_moyenne(texte), ".2f")) # 4.76

Retourne la liste des mots de plus de 8 caractères. C’est un indicateur de difficulté : les mots longs sont plus ardus à lire pour les personnes dyslexiques.

print(mots_longs(texte))
# ['paisiblement', 'probablement', 'ronronnement', 'maisonnée']

Utilise NumPy pour calculer la fréquence de chaque lettre de l’alphabet dans le texte. Retourne un tableau NumPy de 26 valeurs (ordre alphabétique).

Ignore la casse et les accents (traite é comme e).

freq = frequence_lettres(texte)
print(freq)
# Les 26 fréquences
💡 Indice
  1. Normalise le texte : en minuscules, sans accents.
  2. Convertis en tableau NumPy avec np.array(list(texte)).
  3. Pour chaque lettre de a à z, compte les occurrences avec np.sum(tableau == lettre).

Combine les indicateurs précédents en un score de lisibilité simple entre 0 (difficile) et 100 (très facile) :

score=1005×longueur_moyenne3×mots_longs\text{score} = 100 - 5 \times \text{longueur\_moyenne} - 3 \times \text{mots\_longs}

mots_longs est le pourcentage de mots de plus de 8 caractères.

print("Score :", format(score_lisibilite(texte), ".1f"), "/ 100")

Écris une fonction analyser(texte) qui affiche un rapport complet.

=== Analyse de lisibilité ===
Nombre de caractères : 180
Nombre de mots : 33
Longueur moyenne : 4.76
Mots longs (> 8 lettres) : 4
- paisiblement
- probablement
- ronronnement
- maisonnée
Lettres les plus fréquentes :
e : 30
n : 17
t : 13
s : 13
o : 12
Score de lisibilité : 62.3 / 100