Partiel du 12/12/2005
Durée : 2h00
Les documents sont autorisés. Vous rendrez votre travail sous format numérique (format .doc), en envoyant un fichier attaché à Olivier.Kraif@u-grenoble3.fr. L'enseignant accusera réception avant votre sortie de la salle d'examen.
Pour chaque exercice, vous donnerez d'abord une explication en français de votre code (structures de données, algorithmes) et argumenterez vos choix. Soyez concis ! Vous donnerez ensuite le code Perl comportant des commentaires appropriés, faisant apparaître les différentes étapes de vos traitements. Les barèmes sont donné à titre indicatif et pourront être modifiés à la correction.
Si des bogues persistent ne vous acharnez pas : un code légèrement bogué pourra recevoir néanmoins une excellente note.
Exercice 1
Le dictionnaire Wiktionary, initialement en XML, a été converti en structure de donnée Perl (implémentée par le module DBM_Deep). On a :
-	Un hachage %dico contenant pour chaque entrée du dictionnaire :
	* un couple clé->valeur 	Lemme_NumLex -> CAT_TRAITS
	* des couples clé->valeur 	Lemme_NumLex_NumAccep -> DEF#EX1#...#EXn
-	Une liste @indexDico des clés triées par ordre alphabétique des lemmes et ordre numérique des lexies et des acceptions

a) pour les valeurs CAT_TRAITS, la catégorie est une chaîne de la liste suivante : 'nom', 'verb', 'adj', 'adv', 'interj', etc. Ecrire un script donnant, dans un fichier texte, triée par ordre alphabétique, la liste exhaustive des catégories codées dans le dictionnaire, ainsi que le nombre d'entrées pour chaque catégorie. (4 points)

b) Ecrire une fonction categoriesPossibles(\DICO,LEMME) renvoyant la liste des catégories auxquelles un lemme peut appartenir. Par exemple, pour 'bleu' on aurait ('adj','nom') pour 'être' on aurait ('verb','nom'), etc. (3 points)

c) Ecrire une fonction rechercherLoc(\DICO,\INDEXDICO,PATRON) permettant d'extraire toutes les locutions correspondant à un certain patron syntaxique. Cette fonction renverra la liste des lemmes correspondant aux locutions trouvées.
Par exemple le patron 'NOM PREP NOM' devrait extraire une liste contenant des expressions telles que : 'fin de semaine', 'fleur de sel', etc. On pourra utiliser la fonction categoriesPossibles() de la question précédente. (8 points)

d) Modifier la fonction pour quelle puisse intégrer des expressions mélangeant des catégories (en majuscules) et des lemmes (en minuscules) : 'mettre en NOM' devrait extraire 'mettre en forme', 'mettre en lumière', etc. (3 points)

e) créer un index @antiDictionnaire, donnant les clés @indexDico triées par ordre alphabétique, mais en partant de la fin des lemmes (utile pour trouver des rimes). On créera une fonction de tri spécifique opérant une transformation de la clé de tri (inversion des lettres du lemme, mais pas des nombres qui le suivent). (2 points)

f) BONUS : mettre en forme la sortie de la fonction rechercherLoc pour que les expressions apparaissent dans un fichiers HTML, triées en ordre inverse, accompagnées de leurs définitions ainsi que des exemples correspondants. Les entrées et définitions se verront attribuer des classes de style spécifique (via des balises <span>). Les exemples seront numérotés.