site de Fabien Torre, université de Lille


Travaux pratiques Perl

Des exercices de programmation Perl dédiée à la manipulation de textes.

Prise en main de perl

[ 1 ] Affichages et premières boucles

  1. Écrire une boucle perl qui affiche les entiers de 1 à 10. Utiliser d'abord une boucle while puis essayer avec une boucle for.
  2. Généraliser au sein d'une procédure avec un paramètre.
  3. Définir un tableau d'entiers, puis un tableau de mots.
  4. Proposer une procédure permettant d'afficher le contenu de tels tableaux.

Production automatique de textes

[ 2 ] Nom d'agent dérivé d'un verbe

  1. Définir une variable contenant le verbe chanter.
  2. Supprimer les deux dernières lettres de ce mot et les remplacer par les lettres eur.
  3. Produire une phrase intégrant ces deux mots et explicitant leur lien sémantique.
  4. Généraliser ce code en écrivant une procédure traitant n'importe quel verbe du premier groupe.
  5. Définir un tableau perl contenant plusieurs verbes du premier groupe.
  6. Ajouter au programme perl une boucle sur ce tableau et un appel à la procédure pour chacun des verbes.

[ 3 ] Construction de verbes par préfixation en dé-

  1. Écrire une fonction qui prend une lettre en entrée et qui renvoie vrai ou faux selon que la lettre est une voyelle ou non. Cette fonction définira un tableau perl contenant les voyelles et utilisera une boucle pour parcourir ce tableau à la recherche de la lettre fournie.
  2. Fournir une procédure qui à partir d'un verbe construit le verbe décrivant le processus inverse. La méthode doit tester la première lettre du verbe, lui ajouter le préfixe adéquat et afficher une phrase présentant le résultat.
  3. Définir un tableau perl contenant suffisamment de verbes pour représenter tous les cas envisagés dans la procédure.
  4. Ajouter une boucle pour tester la procédure écrite vis-à-vis de chaque verbe du tableau.

[ 4 ] Conjugaison automatique

  1. Définir une variable contenant un verbe, soit du premier groupe, soit du deuxième groupe.
  2. Définir un tableau à six cases contenant les pronoms personnels.
  3. Définir un tableau contenant les marques de conjugaison au présent de l'indicatif pour les verbes du premier groupe, et un autre pour les terminaisons des verbes du deuxième groupe.
  4. Écrire un test qui décide si le verbe défini appartient au premier ou au deuxième groupe.
  5. Produire l'affichage des formes conjuguées de ce verbe au présent de l'indicatif, chaque forme étant précédée du ou des pronom(s) personnel(s) adéquat(s).
  6. Définir tableau de verbes et produire à l'aide d'une boucle les conjugaisons pour chaque verbe.
  7. Revenir sur le code déjà écrit et proposer des procédures pertinentes.
  8. Travailler la sortie (apparence utilisant HTML) et les entrées (lire ce qui peut l'être dans des fichiers).

[ 5 ] Pipotron façon radio Londres

  1. Définir un tableau de verbes et un tableau de groupes nominaux.
  2. Tirer au hasard un groupe nominal, un verbe et un cod.
  3. Conjuguer automatiquement le verbe en fonction du groupe nominal choisi. Utiliser pour cela le code de l'exercice précédent, placé dans une fonction.
  4. Combiner les trois éléments pour obtenir une phrase.
  5. Lire verbes et groupes nominaux dans des fichiers et produire un fichier html de cent phrases produites aléatoirement.

Lecture de fichiers et production html

[ 6 ] Catalogue de jouets

  1. Récupérer le fichier kdos.csv et le dossier kdos-images.
  2. Avec perl, parcourir le fichier et pour chaque jouet récupérer chacune des informations disponibles (numéro, intitulé et description).
  3. Produire ces informations dans un fichier html auquel est associé une feuille css.
  4. Faire apparaître l'image associée à chaque jouet.
  5. Mettre en avant l'âge éventuellement associé à chaque jouet.
  6. Détecter les palindromes présents dans le texte.

[ 7 ] Production d'une FAQ en html

  1. Récupérer le fichier FAQ-LaTeX.txt.
  2. Parser le contenu et le présenter en html, en particulier faire apparaître les titres de sections et de sous-sections.
  3. Rendre cliquable les url présentes dans le fichier texte.
  4. Activer également les références internes au document.
  5. Détecter les palindromes présents dans le texte.
  6. Idem en produisant une page de sommaire et un fichier html par sous-section. Ce rendu serait par exemple jugé satisfaisant.

Interrogation du web

[ 8 ] Interrogation et extraction du web

Récupérer à l'aide de perl une page sur le web puis la parser pour en extraire une information pertinente, nettoyée de tout habillage.

Devoir maison

[ 9 ] Travaux sur un dictionnaire

Nous voulons d'abord trouver dans le dictionnaire les verbes susceptibles d'avoir été construits par une préfixation en dé- d'un verbe existant et décrivant donc un processus inverse. Il s'agit d'obtenir tous les verbes plausiblement construits par cette méthode de préfixation, tout en minimisant le nombre de mots sélectionnés qui ne sont pas de tels verbes.

  1. Lire le fichier-dictionnaire (un mot par ligne) et passer en revue les mots du dictionnaire.
  2. Retenir ceux qui d'après leurs terminaisons sont susceptibles d'être des verbes à l'infinitif.
  3. Ne garder que ceux présentant l'un des préfixes vus en cours.
  4. Vérifier que le mot privé de son préfixe est bien dans le dictionnaire.
  5. Enfin, stocker les candidats dans un fichier texte.

Nous nous posons maintenant les mêmes questions pour les noms d'agent dérivés d'un verbe. Comme précédemment, il s'agit d'obtenir tous les noms plausiblement construits par le processus discuté en cours (et seulement par lui), en écartant au mieux les erreurs.

  1. Parcourir le dictionnaire à la recherche des mots se terminant par -eur.
  2. S'assurer pour chaque candidat que le verbe correspondant existe bien dans la langue française (ou autrement dit, qu'il est bien présent dans notre dictionnaire).
  3. Stocker les candidats dans un fichier texte.

[ 10 ] Travaux conjoints dictionnaire et corpus

Nous souhaitons dans cet exercice croiser un corpus et un dictionnaire.

  1. Signaler les mots utilisés dans les paragraphes du corpus qui ne sont pas présents dans le dictionnaire.
  2. Indiquer le numéro de la ligne où le problème a été détecté.
  3. Produire ce compte-rendu d'erreurs probables dans un fichier texte.

[ 11 ] Comptages et nuage

  1. Pour chaque mot présent dans la top-list mais absent de la stop-list, compter le nombre d'occurrences de ce mot dans le corpus. On pourra envisager différentes variations : avec tableaux classiques ou tableaux associatifs, avec tri par ordre alphabétique ou par nombre d'occurrences décroissant, etc.
  2. Présenter les résultats obtenus dans un fichier html, sous forme d'une liste ou d'un tableau html.
  3. Présenter les mêmes résultats sous la forme d'un nuage de mots.

Découpages et comptages

[ 12 ] Décryptage d'un texte codé

Nous nous intéressons aux méthodes de codage par substitution (une lettre est systématiquement remplacée par une autre). Avant de commencer, vous pouvez lire la page wikipedia sur ce sujet.

Dans un premier temps, nous souhaitons déchiffer un texte codé par une technique de substitution mais sans disposer de la clef utilisée. L'objectif est de décoder le texte mystère suivant.

or z f kcgrkcgh fnnggh mg ug rofo onaougugna fqgb cn u eorrofu rgswfny or gafoa y cng fnbognng xfuorrg iwpaghafnag ga mfyoh or fqfoa gag woblg ufoh cng hgwog yg ufrlgcwh r fqfoa wgycoa f rf uohgwg ipcw gqoagw r lcuorofaopn yg hgh yghfhawgh or kcoaaf rf npcqgrrg pwrgfnh rf qorrg yg hgh fogcj ga gafdroa hf ygugcwg yfnh r org yg hcrroqfn iwgh blfwrghapn yfnh rf bfwprong yc hcy bgaag org gha ygh irch honscrogwgh grrg n gha scgwg bpuiphgg kcg yg hfdrg yg ugw ga f gnqowpn awpoh uorrgh yg rpns gn rfwsgcw grrg n f mfufoh irch y cn kcfwa yg uorrg grrg gha hgifwgg yc bpnaongna ifw cng bwokcg f igong qohodrg kco xorawg f awfqgwh cng ufhhg yg wphgfcj ga yg qfhg wgnygt qpch lfdoacgr ygh ipcrgh y gfc rf qgsgafaopn bpuug pn igca rg hciiphgw gha ifcqwg pc ipcw fonho yowg nfong pn n z awpcqg ifh y fwdwgh y cng bgwafong yougnhopn qgwh r gjawguoag pbboygnafrg f r gnywpoa pc h grgqgna rg xpwa upcrawog ga kcgrkcgh uohgwfdrgh dfaohhgh yg dpoh lfdoaggh ignyfna r gag ifw rgh sgnh kco xcogna rgh ipchhogwgh ga rgh xogqwgh yg blfwrghapn pn wgnbpnawg or gha qwfo rg ifruogw nfon hgaosgwg ufoh apcag r org f r gjbgiaopn yg bg ipona pbboygnafr ga y cn ghifbg awohag ga drfnblfawg kco dpwyg rf ugw gha bpcqgwag y gifohhgh dwpchhforrgh yg uzwag pypwoxgwfna ho ghaoug ifw rgh lpwaobcragcwh fnsrfoh r fwdchag z upnag hpcqgna f cng lfcagcw yg kcontg pc qonsa iogyh or z xpwug cn aforroh iwghkcg ouigngawfdrg ga blfwsg r fauphilgwg yg hgh ifwxcuh fc irch iwpxpny yg bg aforroh npn rpon yg r gjawguoag pwognafrg yg r org b gha f yowg yg rf irch grposngg rgswfny h gafoa dfao rco ugug cng igaoag lcaag kc or pbbcifoa kcfny ipcw rf iwguogwg xpoh ga ifw lfhfwy mg xoh hf bpnnfohhfnbg bgaag bpnnfohhfnbg ucwoa dogn qoag gn fuoaog bfw or z fqfoa bgwagh yfnh rg blgw wgbrch yg kcpo gjboagw r onagwga ga r ghaoug mg qoh kc or fqfoa wgbc cng xpwag gycbfaopn lgcwgchgugna hgwqog ifw ygh xfbcragh hiowoacgrrgh igc bpuucngh ufoh kc or gafoa onxgbag yg uohfnalwpiog ga hcmga f yg ufrlgcwgchgh fragwnfaoqgh y gnalpchofhug ga yg ugrfnbprog dogn kc or gca blgt rco dgfcbpci yg roqwgh or h gn hgwqfoa wfwgugna hgh iwonboifcj fuchgugnah bpnhohafogna f blfhhgw ga f igblgw pc f xrfngw hcw rf irfsg ga f awfqgwh rgh uzwagh gn kcgag yg bpkcorrfsgh ga y gblfnaorrpnh gnapuprpsokcgh hf bprrgbaopn fcwfoa ic xfowg gnqog f cn hefuugwyfu yfnh bgh gjbcwhopnh or gafoa pwyonfowgugna fbbpuifsng ifw cn qogcj ngswg npuug mcioagw kco fqfoa gag fxxwfnblo fqfna rgh wgqgwh yg rf xfuorrg ufoh kc pn n fqfoa ic ygboygw no ifw ugnfbgh no ifw iwpughhgh f fdfnypnngw hpn mgcng ufhhf eorr or bpnhoygwfoa bpuug hpn ywpoa yg rg hcoqwg ifwapca or n gha ifh ouiwpdfdrg kcg rgh ifwgnah yg rgswfny mcsgfna kcg bgrco bo fqfoa rf agag cn igc ygwfnsgg hg hpogna fiirokcgh f bpnxowugw mcioagw yfnh hpn pdhaonfaopn yfnh rg dca yg ugaawg cng ghigbg yg sfwyogn ga yg hcwqgorrfna fciwgh yc xcsoaox hpch rf rfaoacyg yg r org yg hcrroqfn rgh loqgwh hpna wfwgugna wospcwgcj ga b gha cn gqgngugna kcfny fc ygbron yg r fnngg rg xgc ygqogna onyohignhfdrg bgignyfna qgwh rg uorogc y pbapdwg or z gca cng mpcwngg y cn xwpoy wgufwkcfdrg mchag fqfna rg bpcblgw yc hprgor mg ug xwfzfoh cn blguon f awfqgwh rgh aforroh qgwh rf lcaag yg upn fuo kcg mg n fqfoh ifh qc ygicoh kcgrkcgh hgufongh mg ygugcwfoh frpwh f blfwrghapn f cng yohafnbg yg ngcx uorrgh yg r org ga rgh xfboroagh ipcw frrgw ga wgqgnow gafogna dogn uponh swfnygh kc fcmpcwy lco gn fwwoqfna f rf lcaag mg xwfiifo hgrpn upn lfdoacyg ga ng wgbgqfna ifh yg wgipnhg mg blgwblfo rf brgx pc mg hfqfoh kc grrg gafoa bfblgg m pcqwoh rf ipwag ga m gnawfo cn dgfc xgc xrfudfoa yfnh rg xpzgw b gafoa cng hcwiwohg ga f bpci hcw cng ygh irch fswgfdrgh mg ug ygdfwwfhhfo yg upn ifrgapa mg awfonfo cn xfcagcor fciwgh ygh dcblgh igaorrfnagh ga m faagnyoh ifaoguugna r fwwoqgg yg ugh lpagh igc fiwgh rf apudgg yg rf ncoa orh fwwoqgwgna ga ug xowgna cn fbbcgor apca f xfoa bpwyofr mcioagw apca gn wofna y cng pwgorrg f r fcawg hg ypnnfoa yc upcqgugna ga iwgifwfoa kcgrkcgh ipcrgh y gfc ipcw rg hpcigw rgswfny gafoa yfnh cng yg hgh bwohgh y gnalpchofhug bfw yg kcgr fcawg npu fiigrgw bgrf or fqfoa awpcqg cn doqfrqg onbpnnc xpwufna cn sgnwg npcqgfc ga uogcj gnbpwg or fqfoa blfhhg ga faawfig fqgb r fhhohafnbg yg mcioagw cn hbfwfdgg kc or bwpzfoa apca f xfoa npcqgfc ga hcw rgkcgr or yghowfoa fqpow upn pionopn rg rgnygufon ufaon

Pour décrypter un texte sans connaître la règle de chiffrement, il est courant d'utiliser la fréquence d'apparition des lettres dans la langue choisie. Nous considérerons qu'en français les lettres se rangent comme suit, de la plus fréquente à la moins fréquente :

e a i t s n l u r o d m c p v q h f b g j x y z w k
  1. Définir une variable perl contenant le texte crypté fourni ci-dessus et une autre variable contenant le tableau des lettres de l'alphabet par ordre de fréquence dans la langue française.
  2. Proposer un code perl qui construit un tableau associatif faisant correspondre chaque lettre apparaissant dans la phrase mystère à son nombre d'occurrences dans cette même phrase.
  3. Ordonner les clefs du tableau associatif obtenu par valeurs décroissantes, autrement dit obtenir la liste des lettres présentes dans le texte mystère classées par nombre d'occurrences décroissant.
  4. Construire un tableau associatif dont les clefs correspondent au tableau obtenu à la question précédente et dont les valeurs correspondent au tableau des lettres de l'alphabet classées par fréquences décroissantes dans la langue française (la correspondance se fait position par position dans les deux tableaux).
  5. Utiliser ce tableau pour finalement décrypter la phrase mystère.

Dans un second temps, nous pouvons généraliser le travail accompli et nous donner en Perl les moyens de coder et décoder un texte.

  1. Définir un tableau associatif mettant en correspondance chaque lettre de l'alphabet avec une autre lettre.
  2. De la même manière, définir un tableau associatif définissant le codage ROT13 dans lequel une lettre et sa remplaçante sont à une distance de 13 dans l'alphabet (le a est mis en correspondance avec le n, le b avec le o, etc.).
  3. Écrire la fonction chiffrement_lettre($l,%t) qui renvoie la correspondance de la lettre $l dans le tableau associatif %t si cette correspondance existe, et renvoie la lettre $l elle-même sinon.
    Tester à l'aide des tableaux précédemment définis.
  4. Écrire la fonction chiffrement_phrase($p,%t) qui construit une chaîne de caractères correspondant au chiffrement caractère par caractère de la phrase $p à l'aide du tableau associatif %t.
    Tester en codant une phrase quelconque, à l'aide des tableaux précédemment définis.
    Comment décoder le résultat obtenu ?
  5. Proposer une fonction inverse_code(%t) qui renvoie un tableau associatif, lequel reprend les clefs et les valeurs du tableau associatif %t mais en les inversant.
    Tester en déchiffrant les phrases précédemment codées.

[ 13 ] Classification de documents

  1. Dans chaque section du corpus, compter les mots de la top-list et produire une ligne présentant les compteurs, séparés par une virgule.
  2. On compte maintenant, toujours par section, les apparitions de digrammes, puis de trigrammes.
    Combien y a-t-il de n-grammes différents ?
  3. Utiliser C5.0 pour apprendre un arbre de décision sur ces données.

Tableaux de tableaux

[ 14 ] Une aide pour le scrabble

Pour cet exercice, nous nous référerons à la page wikipedia dédiée au scrabble.

  1. Définir un tableau associatif qui à chacune des 26 lettres non accentuées de l'alphabet associe le nombre de jetons correspondant.
  2. Produire un tableau classique correspondant au sac de lettres : on doit y trouver les lettres de l'alphabet et le nombre d'occurrences de chaque lettre correspond à ce qui a été défini au tableau associatif précédent.
  3. Définir un tableau associatif qui à chacune des 26 lettres non accentuées de l'alphabet associe le nombre de points correspondant.
  4. Proposer une fonction perl qui à partir d'un tableau de lettres calcule le nombre de points correspondant à ces lettres.
  5. Proposer une fonction semblable qui cette fois travaille à partir d'un mot vue comme une chaîne de caractères perl.
  6. Lire le fichier des mots français nous servant de dictionnaire et pour chaque mot :
    1. remplacer les lettres accentuées par leurs versions non accentuées, normaliser au besoin,
    2. découper le mot en lettres,
    3. classer les lettres par ordre alphabétique,
    4. construire la chaîne de caractères correspondant à ces lettres ordonnées,
    5. associer cette clef au mot d'origine dans un tableau associatif.
    On pourra éventuellement écarter les mots composés et ceux manifestement trop longs.
  7. Simuler le tirage aléatoire de sept jetons dans le sac. De préférence, on s'assurera que le tirage se fait sans remise...
  8. Déterminer quel mot peut être écrit avec ces sept lettres choisies au hasard et indiquer le nombre de points associé.

Pour poursuivre...

  • Intégrer la possibité de tirer un ou deux jokers.
  • Prendre en compte, en plus des lettres tirées, d'autres lettres dont on nous indique qu'elles sont disponibles sur le plateau de jeu (avec éventuellement les positions qu'elles doivent occuper dans les mots proposés).
  • S'il n'existe pas de mots longs répondant aux contraintes du tirage et du plateau, considérer des mots plus petits.
  • Produire tous les mots possibles (en évitant si possible les doublons) à partir du tirage, classés par nombre de points décroissant.

[ 15 ] Écriture intuitive avec un pavé numérique

  1. Définir à l'aide d'un tableau associatif perl la corresponsance entre les lettres de l'alphabet et les touches du clavier (par exemple on associera la valeur 2 à chacune des lettres a, à, â, ä, b, c et ç).
  2. Lire le fichier des mots français nous servant de dictionnaire et associer chaque mot et sa version numérique (par exemple 268268 => coucou).
  3. Proposer une interprétation de la phrase suivante, le chiffre 0 délimitant les mots :
    268268026663680220820243605370267246706603248033052077647266284660283203370822532890277624284370876702665

[ 16 ] Cartographie d'un vocabulaire

  1. Dans chaque section du corpus, compter des co-occurences des mots de la top-list c'est-à-dire déterminer, pour chaque couple de mots, combien de fois ces deux mots apparaissent dans une même section du corpus.
    Nous envisagerons de stocker les compteurs soit dans un tableau associatif d'entiers, soit dans un tableau associatif de tableaux associatifs.
  2. Produire un fichier texte contenant la matrice des co-occurences, les valeurs étant séparées par des points-virgules.
    On n'oubliera pas un première ligne et une première colonne contenant les mots de la top-list.
  3. Vérifier l'ouverture du fichier produit dans un tableur.
  4. Finalement, il s'agit de visualiser les résultats dans le logiciel gephi, en suivant les indications suivantes :
    • créer un nouveau projet en ouvrant le fichier déjà créé, indiquer que le graphe non dirigé,
    • classer les nœuds en fonction du Degré, régler les tailles des nœuds (icône diamant) entre 20 et 75,
    • choisir force atlas comme méthode de spatialisation avec 100,000 comme force de répulsion et la case ajustement par taille cochée, exécuter,
    • dans les paramètres, vue générale du réseau, lancer les calculs de la modularité avec une valeur de la résolution entre 0.5 et 1 (par exemple 0.6),
    • lancer la partition en fonction de la modularité.
    • prévisualiser avec affichage des labels non proportionnel et une police Arial gras 48, rafraîchir.
graphe cooccurrences cartographie

[ 17 ] Concordancier

Par exemple, un tel concordancier serait-il satisfaisant ?

[ 18 ] Comptage lemmes et formes

Utilisation de modules perl

[ 19 ] Orthographe et distance de Levenshtein

Écrire un code perl qui, en utilisant le module lttac.pm :

  1. charge le dictionnaire,
  2. ouvre le fichier horla.txt, le parcourt et le découpe en mots,
  3. trouve les mots d'au moins trois lettres non présents dans le dictionnaire,
  4. pour chacune des erreurs supposées, propose les mots les plus proches dans le dictionnaire au sens de la distance de Levenshtein (on se restreint aux distances d'édition inférieures ou égale à 2),
  5. met en forme les résultats dans un fichier html.
Fabien Torre Valid HTML5! Valid CSS!
Accueil > Enseignement > En pratique > Programmation > Perl
(contenu mis à jour )
site de Fabien Torre, université de Lille

Description

Survoler un lien de navigation pour lire sa description ici...