LTAL, TP 15.09
Vérifiez SVP si les solutions/commentaires sont déjà en ligne.
Je vous demande la gentillesse de travailler à la maison les exercices qui n'ont pas été terminés en TP. C'est important. Pour certains, je ne vous donnerai jamais de solutions, – par ex. l'exercice 1 ci-dessous... – un minimum de décence oblige, les solutions sont dans la littérature...
Exercice 1. Revenez aux TP de la semaine dernière. J'y donne des références à deux ouvrages littéraires, The Gold Bug et The Dancing Men. Vous trouverez les textes en ligne, cherchez-les (pas d'aide de ma part, si quelqu'un n'arrive pas, c'est la honte). Ils contiennent des textes cryptés de manière triviale (substitution fixe), et la solution exploite l'analyse fréquentielle dans la langue anglaise (pas besoin d'être un spécialiste de Shakespeare, mais si quelqu'un est vraiment faible, il faudra travailler dessus, c'est essentiel pour votre carrière. Si besoin, écrivez-moi.).
Le texte dans le livre de Poe est :
5 3 ‡ ‡ † 3 0 5 ) ) 6 * ; 4 8 2 6 ) 4 ‡ . ) 4 ‡ ) ; 8 0 6 * ; 4 8 † 8 ¶
6 0 ) ) 8 5 ; 1 ‡ ( ; : ‡ * 8 † 8 3 ( 8 8 ) 5 * † ; 4 6 ( ; 8 8 * 9 6 *
? ; 8 ) * ‡ ( ; 4 8 5 ) ; 5 * † 2 : * ‡ ( ; 4 9 5 6 * 2 ( 5 * — 4 ) 8 ¶
8 * ; 4 0 6 9 2 8 5 ) ; ) 6 † 8 ) 4 ‡ ‡ ; 1 ( ‡ 9 ; 4 8 0 8 1 ; 8 : 8 ‡
1 ; 4 8 † 8 5 ; 4 ) 4 8 5 † 5 2 8 8 0 6 * 8 1 ( ‡ 9 ; 4 8 ; 8 8 ; 4 ( ‡
? 3 4 ; 4 8 ) 4 ‡ ; 1 6 1 ; : 1 8 8 ; ‡ ? ;
60))85;]8*:+*8!83(88)5*!;
46(;88*96*?;8)*+(;485);5*!2:*+(;4956*2(5*-4)8`8*; 4069285);)6
!8)4++;1(+9;48081;8:8+1;48!85;4)485!528806*81(+9;48;(88;4(+?3
4;48)4+;161;:188;+?;
(Les espaces ne comptent pas. Attention, Wikipédia cite ce texte avec erreurs !!)
La correspondance entre les fréquences de ces symboles et les fréquences dans l'Anglais permet de reconstituer la source ; il faut quand même connaître la langue, et corriger les exceptions. Travaillez sur l'un de deux messages cryptés (cherchez les dans les originaux, j'espère que ci-dessus est correct, mais je ne suis pas sûr...), écrivez un programme qui efectue la conversion, en utilisant une table des fréquences dans l'Anglais, et en corrigeant le résultat à la main. Les livres vous donnent la solution, essayez de ne pas la regarder trop tôt (les seules personnes que vous allez duper c'est vous...)
Exercice 2. Dans une institution les adresses mail des employés suivent le pattern : prenom.nom@domaine.pays. Écrire un programme qui décortique ce texte, et sépare les éléments. Ensuite le programme imprime ces éléments (prénom, nom, domaine et pays) en mettant les premières lettres du nom et du prénom en majuscules. Il faut le faire sans expressions réguilères (cela viendra...). Voici quelques procédures (et méthodes) Python utiles, pour votre mémoire. Le mot chn ci-dessous signifie une chaîne quelconque.
-
chn.capitalize() met la première lettre de la chaîne en majuscule. La nouvlle chaîne est retournée, l'original n'est pas modifié (rappelons-nous que les chaînes sont immuables).
-
chn.find(sub[, start[, end]]) cherche la sous-chaîne sub dans la chaîne. On peut limiter le segment de recherche, les paramètres optionnels sont les indices du début ou/et de la fin. La méthode retourne l'index du début de la chaîne, ou -1 si elle n'a pas été trouvée. [Ceci est considéré comme une mauvaise idée, car l'index -1 est légitime ; la méthode devrait retourner None. Une autre :
chn.index
déclenche une erreur dans ce cas. Lisez la doc.]
-
chn.split(sep=None, maxsplit=-1) sépare la chaîne en morceaux délimités par sep, s'il n'est pas défini (ou None), les séquences "blanches" (espaces, fins de ligne, tabulations) sont considérées comme séparateurs. Le paramètre maxsplit limite le nombre de séparations.
Ceci est un exercice de 5 minutes ou moins - concernant le codage - mais vous devriez passer un peu plus de temps sur la lecture de la documentation.
Exercice 3.
Tokenisez un long texte littéraire (par ex. la Déclaration, ou mieux, car c'est plus long : le livre de Verne). Les spécifications de nettoyage sont :
-
Le résultat doit être une liste de mots. Pas besoin d'effectuer une analyse quelconque, ou de constituer un dictionnaire. Cela viendra.
-
Les majuscules doivent être converties en minuscules.
-
La gestion des séparateurs et des caractères de ponctuation est compliquée. Les fins de ligne doivent être transformées en espaces, et les séquences d'espaces seront éliminées lors de la tokénisation. Les caractères "." et "," seront des mots, les autres caractères de ponctuation seront convertis en l'un de deux (par ex. "?", ou ";") ou éliminés (par ex. "-"). Lisez le texte pour voir ce que vous attend.
-
Utilisez les expressions régulières, utilisez aussi .split, .join, et autres procédures et métodes Python que vous connaissez (ou voulez connaître ; elles ne sont pas trop nombreuses). Travaillez doucement, problème après problème, n'essayez pas de concevoir une machine qui fait tout d'un seul coup !
-
Lisez sur les dispositifs de tokenisation dans NLTK. Ce paquetage peut faire tout pour vous, mais il faut le maîtriser correctement, et cela vous prendra du temps.
Exercice 4.
Prenez le livre de Verne, sans nettoyage de l'exercice précédent. Trouvez une expression régulière, ou une séquence, si faire cela en une seule fois s'avère difficile – et éliminez les numéros de chapitres en chiffres romains. Attention à des erreurs triviales, si vous éliminez "XII" avec une telle regexp, le fragment "XIII" sera apparié, et "I" restera.
Solutions (à venir)
Semaine suivante
Retour à l'index