LTAL, TP 21.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 pas de solutions, – un minimum d'ambition et de travail personnel oblige, les solutions sont dans la littérature...


Exercice 1. Analyse fréquentielle, continuation.

Je comprends que vous tous savez faire l'analyse fréquentielle des lettres dans un texte, et de présenter son graphique. Je vous ai présenté le programme, à l'aide d'un dictionnaire. Si quelqu'un a toujours des doutes, alarmez, je répéterai l'explication. Revenez aux TP de la semaine précédente, si besoin. J'ai mis en ligne les solutions des exercices, et vous avez mon cours. Et je suis là pour vous dépanner.

A. Fréquence des mots dans un texte. Tokénisation.

Ouvrez, et lisez dans une variable - chaîne, un texte littéraire, par exemple notre copie de Verne (ici). Vous devez connaître les techniques élémentaires du traitement des chaînes, en particulier comment séparer un texte en mots : chaine.split() produit une liste de "mots" séparés par les espaces blancs.
Hélas, cela ne nous satisfait pas, car il y a d'autres caractères de ponctuation : virgules, points, pts. d'exclamation et interrogation, points-virgules, etc. Alors, d'abord convertissez tous les caractères "bruit" (ponctuation) en espaces. Utilisez la méthode chaine.replace(old,new) ; il faudra le faire plusieurs fois, avec les caractères non-alphabétiques qui vous sont connus...

Ensuite, transformez toutes les lettres majuscules en minuscules. Accessoirement (ne vous occupez pas trop de cela, si d'autres problèmes restent à résoudre !) vous pourrez virer à la poubelle tous les mots qui représentent les numéros des chapitres en chiffres romains. Ce ne sont pas des vrais mots en français... Lisez le texte pour voir ce que vous attend. Faites le maximum de "nettoyage" que vous pourrez.

Phase essentielle. Après avoir constitué la liste de mots, initialisez un dictionnaire, comme pour les fréquences des lettres, et parcourez cette liste. Cependant l'entrée dans le dictionnaire ne sera pas le mot proprement dit, seulement sa longueur. Nous voulons vérifier quelle est la répartition des fréquences des mots en fonction de leurs longueurs.

Vous pourrez effectuer cette opération en deux étapes, d'abord constituer le dictionnaire des mots, chacun avec son nombre d'occurrences, exactement comme avec les lettres, et ensuite rammasser ensemble les occurrences de tous les mots différents, mais qui ont la même longueur.

Finalement, convertissez le dictionnaire (avec items) en liste contenant les tuples : [(longueur1,nombre1), (longueur2,nombre2), ...]. Triez cette liste selon les longueurs, avec la longueur croissante. Récupérez les longueurs dans une liste, et séparément la liste de nombres d'occurrences, les seconds éléments des tuples. Affichez le graphique des fréquences en fonction de longueur.


B. Variante : fréquence des mots dans la langue.

Après la tokénisation (séparation en mots) et la création du dictionnaire des mots, nous allons oublier leurs fréquences. Passons entre "un texte dans la langue" et "la langue", en observant que le dictionnaire de la langue contient UNE SEULE occurrence de chaque mot qui y est défini. Ainsi, si dans le texte on trouve le mot "les" en 1000 exemplaires, cela ne nous intéressera plus.

Avec ce nouveau dictionnaire, où chaque mot est apparié avec le nombre 1 (il existe, c'est tout ; on n'a même pas besoin de stocker ce "1"), effectuez la même opération qu'auparavant - la création du dictionnaire : longueur, contre le nombre d'occurrences. Ici on aura des longueurs plus et moins fréquentes, mais chaque mot contribue une seule fois.
Tracer le graphique, comme auparavant. Comparez les deux.

C. Fréquence des mots dans la langue, vérification..

Ceci est une partie de l'exercice précédent, mais avec d'autres données.


La tokénisation, nettoyage, manipulation des mots, avancées, aura besoin d'un module Python très puissant : re, les expressions régulières. Une grande partie de la semaine prochaine sera consacrée aux regexps, et nous allons les utiliser jusqu'à la fin de ce cours.


Exercice 2. Analyse syntaxique des documents HTML.

La tokénisation, et l'analyse de la structure des documents - justement - structurés, comme les pages HTML, est considérablement plus tordu. Vous avez des balises, à l'intérieur des balises il y a des paramètres, par ex <img src="..." width="640"> etc. Les balises sont hiérarchiques, certaines contiennent des non-textes (styles, scripts...).

Vérifiez si notre système Python contient le module Beauttiful Soup (L'année dernière il était là, mais dans d'autres salles). La documentation est ici. La page d'accueil, qui contient les liens vers le téléchargement, etc., vous donnera des infos supplémentaires.

Si le paquetage n'est pas là, on peut essayer de l'installer localement, dans vos répertoires accessibles en écriture, par exemple :

easy_install --prefix=$HOME/local package_name
ou

pip install --install-option="--prefix=$HOME/local" package_name
(éventuellement, si cela marche : pip install --user package_name). Pour mes "fidèles suivants", qui travaillent sur Anaconda, c'est conda install beautifulsoup4. Le paquetage DOIT être "installé", car s'il est simplement placé dans un endroit accessible, le système marche mal.

Lisez un minimum de documentation. Accédez à la page Master.html (dans CE répertoire), et écrivez un simple programme qui l'analyse, par ex. qui récupère tous les liens (a href) présents.


Exercice 3. Synthèse de texte selon un modèle statistique

En L1 vous avez appris l'essence etl'usage du module random, contenant un générateur de nombres aléatoires. Vous savez que random() engendre un nombre pseudo-aléatoire réel entre 0 et 1, et randint(a,b) - un nombre entier aléatoire entre a et b inclus. La fonction choice([a,b,c,d,...]) parametrée avec une liste, retourne un élément aléatoire de cette liste.
Cependant, nous voulons engendrer des caractères appartenant à une séquence, avec des fréquences (probabilités) différentes. Ceci est absolument essentiel pour toute simulation statistique, pour des méthodes Monte-Carlo, pour la modélisation statistique des textes, etc..

Lisez mon texte (cours de l'année dernière)

Engendrez une séquence (chaine) de 500 (le nombre exacte n'est pas important ; il faut seulement avoir un échantillon significatif) caractères selon les fréquences découvertes par l'analyse du livre de Verne (ou autre, peu importe).
Est-ce que le résultat ressemble à un texte français? Pourquoi?

L'étape suivante sera la génération des n-grames (2-, 3-, etc.) - des combinaisons de caractères, dont la distribution correspond à des vrais textes. Pour cela nous aurons besoin des probabilités conditionnelles, ce qui est décrit dans la section suivante de mon cours.

Si votre temps vous le permet,
A. Lisez la doc de Python sur le module re ; Essyez de tokeniser un texte grâce au pattern "\w". Posez des questions, ce module est importantissime !
B. Lisez mon autre texte ; Effectuez l'analyse fréquentielle des paires de lettres dans un texte. (Prenez Verne, ou la Déclaration DH, ou autre chose, selon vos souhaits.)


Solutions (à venir)

Semaine suivante
Retour à l'index