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.
f=open(...)
for s in f:
... # s contient UNE LIGNE.
et après avoir la ligne dans une variable, exécutez split(), et séparez le premier mot, le reste, la fréquence, sera jeté. Attention, gérez les lignes vides (chaîne vide, ou contenant seulement "\n").
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.
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.
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.)
Semaine suivante
Retour à l'index