Technologies de l'information et de la communication (2)

Sommaire

  1. Objectifs
  2. Exercices
  3. Micro projet 1
  4. Micro projet 2
  5. Sujets d'examen

Objectif
Les 8 séances de TP permettent d'approfondir les notions vues en première année sur le langage Python à travers différents programmes qui gravitent autour de l'analyse lexicale de texte. Un lexique du français est fourni (il s'agit d'une version appauvrie du lexique des formes fléchies du français), il contient les adjectifs, verbes, noms propres, noms communs et leurs formes fléchies (formes conjuguées, masculin/féminin, singulier/pluriel, etc.).

On veut progressivement créer un programme python contenant de multiples fonctions d'analyses de la langue française. Par exemple, connaître toutes les anagrammes d'un mot, les palindromes, les anacycliques, les mots contenant la plus grande proportion de voyelles, les mots ne contenant que des voyelles, les mots contenant le plus d'occurence d'une voyelle donnée (par exemple, le mot indivisibilité contient 6 fois la voyelle i), etc. Si le temps le permet, on cherchera à écrire une fonction qui fournit les mots les plus longs du lexique contenant une liste de lettres données (à la manière du jeu Le mot le plus long).

Exercices

Sauvegardez le lexique à partir duquel nous allons faire ces analyses ainsi que le fichier analyse.py dans votre répertoire de travail. Ce programme vierge contient la structuration d'un programme général en Python et vous servira de base de travail pour toute la suite. Les fonctions qui sont demandées dans les exercices sont à intégrer au fur et à mesure de l'avancement des TP dans ce programme.

On rappelle qu'il existe une multitude de tutoriels bien écrits sur le langage Python, une simple recherche sur internet avec la requête tutoriel python vous fournira tous les liens nécessaires. Jettez un oeil sur les listes, dictionnaires, structures conditionnelles et les fonctions.

Sauvegardez le script Python contenu dans ce fichier dans votre programme. Ce script lit le contenu d'un fichier et renvoie une liste de chaînes de caractères constituées par les lignes de ce fichier. Transformez ce script en fonction Python LireFichier(nomfichier) qui renvoie cette liste au lieu de l'afficher. Testez cette fonction sur le lexique dico.txt, en affichant par exemple la taille de ce lexique ainsi que le contenu de la 15ème entrée (qui est en l'occurrence .
Le fichier Dico.txt contient exactement une entrée par ligne contenant le ou les mots constituant l'entrée (par exemple arbre ou ad hoc) suivi(s) d'un code indiquant la nature du mot ou du groupe de mot, comme adv pour adverbe ou nc pour nom commun par exemple.
Echauffement: écrivez une procédure qui demande à l'utilisateur de saisir un verbe du premier groupe et qui affiche la conjugaison de ce verbe au futur de l'indicatif. Utilisez une liste des pronoms et une liste des terminaisons correspondantes. Améliorez le script pour que l'élision soit faite si le verbe commence par une voyelle pour la première personne du singulier.
Ecrivez une fonction Coupler(entree) qui, à partir d'une chaîne de caratère entree renvoie un couple clef,valeur, la valeur étant le dernier mot à droite dans la chaîne, la clef étant constituée par le reste de la chaîne à gauche.
Par exemple, si entree = "à long terme adv", la fonction Coupler(ligne) devra renvoyer le couple "à long terme", "adv".
Ecrire une fonction CreerDico(lexiquebrut) qui renvoie un dictionnaire dont les clés sont les éléments lexicaux du lexique brut (la liste des lignes du lexique) fourni et les valeurs sont les classes grammaticales. Vous utiliserez la fonction Coupler pour transformer chaque entrée du lexique brut en couple pour pouvoir créer une nouvelle entrée dans le dictionnaire.

Attention ! On peut très bien trouver des éléments lexicaux qui ont plusieurs classes grammaticales, il faut donc tester si un couple (clé,valeur) a déjà été entré dans le dictionnaire. Si tel est le cas, concaténez la nouvelle classe à l'ancienne en séparant les classes par une virgule. Par exemple l'entrée lexicale noyer peut apparaître deux fois dans le lexique, une fois en tant que verbe, une autre en tant que nom commun, il faut donc qu'à la fin du traitement le dictionnaire CG contienne la chaîne "nc,v" comme valeur de la clé "noyer".
Ecrivez une fonction HistoValeurs(dico) qui à partir d'un dictionnaire dico renvoie un autre dictionnaire dont les clés sont les valeurs du dictionnaire et les valeurs associées sont le nombre d'occurences de ces valeurs, autrement dit un histogramme des valeurs. Cette fonction va permettre de connaître le nombre d'entrées dans le lexique pour chacun des groupes de classes grammaticales.
Ecrivez une fonction Filtrer(lexique,classe) qui renvoie la liste des mots du lexique dont la classe grammaticale classe.
Ecrivez une fonction EstPalindrome(mot) qui renvoie True si mot est un palindrome et False sinon. Ecrivez une fonction ChercherPalindromes(lexique) qui renvoie la liste des palindromes du lexique.
Ecrivez une fonction PlusLong(lexique) qui renvoie la liste des mots les plus longs de la langue française.
Ecrivez une fonction MaxVoyelles(lexique) qui renvoie la liste des mots qui contiennent le plus de voyelles. Similairement définissez les fonctions MaxConsonnes(lexique).
Solutions des exercices.

Micro projet 1

Ecrivez une fonction Maj(mot) qui met en majuscule la première lettre de la chaîne de caractère mot et renvoie cette nouvelle chaîne. Ainsi en supposant que votre fonction ait été définie au préalable dans le script suivant:

mot = "charlotte"
Mot = Maj(mot)
print(mot)
print(Mot)
l'interprète Python affichera:
>>> charlotte
>>> Charlotte

Utilisez la fonction Maj(mot) pour écrire une nouvelle fonction Capitaliser(phrase) qui renvoie la phrase dont chaque mot a été mis en majuscule à partir de la chaîne phrase. Utilisez la méthode split(séparateur) qui découpe une chaîne de caractères en "morceaux" suivant un séparateur (un caractère) et renvoie la liste de ces morceaux (chaînes de caractères). Par défaut, si aucun paramètre n'est fourni, le caractère séparateur est l'espace. Exemples:
  1. Pour la chaîne message = "le:projet:est:dur", l'instruction message.split(":") renvoie la liste ["le","projet","est","dur"].
  2. Pour la chaîne etatcivil = "Bob|22/03/83|Toulon|0606006660", l'instruction etatcivil.split("|") renvoie la liste ["Bob","22/03/83","Toulon","0606006660"].
  3. Pour la chaîne phrase = "il était une fois" , l'instruction etatcivil.split() renvoie la liste ["Il","était","une","fois"].
Ecrivez une fonction Corriger(texte) qui demande à l'utilisateur de saisir le nom d'un fichier contenant du texte, et qui corrige le contenu du texte de la manière suivante:
  1. Chaque début de phrase doit commencer par un espace. Autrement dit après chaque symbole "point" il faut rajouter un espace s'il manque.
  2. La première lettre de chaque mot qui débute une phrase doit être en majuscule
La fonction doit renvoyer le texte corrigé. Vous utiliserez la fonction suivante qui s'occupe de renvoyer le contenu du fichier dont le nom est passé en paramètre:
def lire(nomfic):
    fichier = open(nomfic,"r")
    return(fichier.read())
Ainsi si le contenu d'un fichier est le suivant:
un chemin creux s'enfonçait.tout disparut. L'homme avait à droite
une palissade.il fit environ deux cents pas.
Le script suivant
nomdufichier = input("Quel est le nom de votre fichier ? ")
contenu = lire(nomdufichier)
corrige = Corriger(contenu)
print(contenu)
print(corrige)
doit afficher
>>> un chemin creux s'enfonçait.tout disparut. L'homme avait à droite
une palissade.il fit environ deux cents pas.
>>> Un chemin creux s'enfonçait. Tout disparut. L'homme avait à droite
une palissade. Il fit environ deux cents pas.

Micro projet 2

Ecrivez une fonction Ordonner(chaine) qui renvoie une chaîne de caractère constituée par l'ensemble des symboles de la chaîne d'entrée triés dans l'ordre alphabétique. Par exemple, si chaine = "arborerai" alors la fonction Ordonner(chaine) doit renvoyer la chaîne "aabeiorrr". Utilisez l'opérateur de jonction join et la fonction de tri sorted. Cette fonction doit remplacer les majuscules par des minuscules et éliminer les signes diacritiques, donc "é" devient "e", etc.
Déduisez de l'exercice précédent une fonction EstAnagramme(a,b) qui renvoie True si la chaîne a est une anagramme de la chaîne b, False dans le cas contraire.
Ecrivez une fonction OrdonnerLexique(dicolex) qui renvoie un dictionnaire dont les entrées sont les mots du lexique ordonnés à l'aide de la fonction Ordonner et tel que la valeur associée à un mot ordonné est la liste des entrées du lexique dont l'ordonnancement donne la clé. Par exemple, si le lexique contient les entrées argent, gérant, grenat, garent, ragent, Tanger, gréant, régnat, ganter elles ont le même ordonnancement "aegnrt". Pour cette clé le dictionnaire doit donc renvoyer la liste
["argent", "gérant", "grenat", "garent", "ragent", "Tanger", "gréant", "régnat", "ganter"].
On dit qu'une chaîne de caractère u est une sous-séquence d'une chaîne de caractère v si l'on peut obtenir u en effaçant certains caractères de v.

Exemple : A = {a,b,c}, v = baabc est une sous-séquence du mot u = abbaabac (notez qu'il peut y avoir plusieurs façons de créer une même sous-séquence à partir d'une séquence donnée).

Ecrivez une fonction Python EstSSeq(u,v) qui renvoie True si u est une sous-séquence de v et False sinon.

Indication algorithmique: on initialise deux index i et j à 0, le premier va servir à balayer u, l'autre v. Écrire une boucle dans laquelle on compare u[i] avec v[j], s'ils sont égaux, on incrémente i et dans tous les cas on incrémente j. La sortie de la boucle se fait dès que l'un des index dépasse la longueur de la chaîne associée. Il suffit alors de tester la valeur de i pour conclure.

Ecrivez une fonction ChercherMotsDeLongueur(lettres,lexique,longueur) qui renvoie la liste des mots du lexique lexique de longueur longueur que l'on peut constituer avec chacune des lettres fournies dans la chaîne de caractère lettres. On suppose que longueur ≤ #lettres. En outre, le nombre d'occurences d'une lettre de la chaîne lettres fixe le nombre maximum de fois où cette lettre peut apparaître dans le mot cherché.

Indication: Il suffit d'ordonner tout d'abord les symboles de la chaîne lettres et de parcourir le lexique ordonné en ne traitant que les entrées de la bonne longueur. On rajoutera chaque mot trouvé dans une liste initialement vide.
Ecrivez une fonction ChercherMotsLesPlusLongs(lettres,lexique) qui renvoie la liste des mots les plus longs du lexique que l'on peut écrire avec les lettres contenues dans la chaîne de caractères lettres.

Indication algorithmique: Il suffit d'utiliser la fonction précédente en faisant varier les longueurs en partant de la longueur de la chaîne lettres.

Exemples:

Sujets d'examen

  1. TP 2014-2015