LTAL, TP 07.09
Commencez par la préparation de votre environnement de travail. Construisez un dossier pour vos programmes, et (éventuellement) un autre pour vos données : textes, grammaires, etc. Pensez à sauvegarder régulièrement vos ressources (par ex. sur les clés USB). Renouvelez votre connaissance avec Python (nécessaire en toute indépendance de cette option)
Vérifiez SVP si les solutions/commentaires sont déjà en ligne.
Analyse des textes (1)
Le traitement informatisé des entités linguistiques ne se réduit pas à l'analyse des textes, un texte est une représentation statique, discrète d'un flot d'information correspondant aux entités infiniment plus complexes : dynamiques, contextuelles, souvent ambiguës. Mais il faut commencer par quelque chose...
Puisque nous allons travailler sur des textes (en Python : chaînes de caractères et fichiers, locaux et distants), vous devez disposer d'une base textuelle, d'un corpus. On aura besoin de quelques textes en vrac, pour votre propre travail d'analyse, ainsi que de textes annotés, bases de données étiquetées et cherchables, dictionnaires lexicaux, etc. L'Internet vous offre plusieurs échantillons textuels, et le paquetage NLTK [introduit plus tard] dispose également de plusieurs sources. Pour commencer, je vous recommande de faire connaissance avec les suivantes (cette liste pourra évoluer !).
- Centre National de Ressources Textuelles et Lexicales (CNRTL). Ceci est un méta-site, contenant des liens vers le Frantext, le corpus de la revue Sciences Humaines, etc. Vous y trouverez plusieurs ressources structurées, typiquement en format XML (qui sera introduit plus tard), non pas en vrac.
- Le Projet Gutenberg, avec plusieurs livres gratuits en ligne, en différents formats. (Le paquetage NLTK a des facilités pour y accéder).
- Plus tard nous aurons (peut-être) besoin d'un corpus français à l'Université de Leipzig (Allemagne) – base de données permettant la recherche par les mots-clés, contenant les mots "voisins", statistiques, relations sémantiques, etc. .
-
Un certain nombre de textes stockés localement (pas trop grand, nos ressources sont limités, et tous ces textes sont disponibles ailleurs).
1. Données textuelles en Python, manipulation de base
On considère que vous disposez de Python en état de marche, et que vous savez comment écrire et lancer les programmes typiques, en utilisant une des interfaces disponibles sur votre plate-forme (Idle, IPython, SPYder, Eclipse, Geany, Emacs, ... tout ce que vous voulez). En cas de problèmes avertissez-moi.
Ici vous trouverez, en texte HTML le contenu de la Déclaration universelle des droits de l'homme de 1948 en français. Si vous voulez, la rubrique "Traductions" en contient d'autres versions nationales, ce qui pourra nous être utile un jour.
Exercice 1. Effectuez les deux opérations suivantes.
- Importez le texte dans votre répertoire de travail, stockez-le dans un fichier textuel "raw", "nu", sans balisage. (Utilisez simplement copier-coller, prenez le texte sans logo ni autres décorations). Écrivez un programme Python qui l'ouvre, et le charge, en construisant son contenu en tant que chaîne de caractères. Voir la documentation de Python E/S. Utilisez open() et read(). Pas besoin d'importer des modules auxiliaires.
- Importez les mêmes données directement dans votre programme Python sans passer par un fichier local. Utilisez la librairie
urllib
(voir la documentation). Importer urllib.request, lancer urlopen(), qui retourne un descripteur similaire à un descripteur de fichier, et ensuite read(), comme avant.
Affichez le contenu. Comparez les deux chaînes (ou séquences, si vous voulez) obtenues par ces deux moyens. Montrez-moi la comparaison. Est-ce que la reconnaissance du codage était correcte? [D'ailleurs, si vous voulez copier dans un fichier local ce texte avec les balises HTML, je vous en prie, pour l'instant ceci n'a pas d'importance, mais les balises "< ... >", c'est du bruit].
Le texte sur le site a été encodé en UTF-8, qui est devenu le standard le plus populaire pour les textes multilingues sur le Web. Cela signifie que la lecture qui passe par l'URL, si l'ouverture de l'adresse n'a pas prévu le paramètre charset
, risque de donner des résultats différents de la lecture locale ; elle peut utiliser par défaut le codage ISO-Latin 1 (ou ISO 8859-1 un autre standard international, mais restreint à quelques langages occidentaux)... Ceci dépend de la configuration du réseau.
De toute façon, puisque le contenu d'un site Web peut être non-textuel, read() appliqué au résultat de urlopen produit une donnée d'un autre type qu'une chaîne (str
, liste de caractères). Quel est ce type? Vérifiez le type des éléments de cette collection.
Appliquez decode('utf-8') à cette donnée. Est-ce que le résultat est égal à la chaîne lue localement? Si nous voulons traiter une chaîne comme une liste/tableau de caractères, quelle représentation semble propice?
Exercice 2. Revisez vos connaissances des dictionnaires Python.
C'est la structure de données composite la plus importante pour nous, et également fondamentale pour la construction des entités orientées-objet !
-
Effectuez l'analyse fréquentielle des caractères dans le texte de la "Déclaration" (sans balises !). Construisez un programme qui opère avec un dictionnaire dont les clés sont des caractères. Parcourez la chaîne en question caractère par caractère, et pour chacun incrémentez de 1 la valeur de l'entrée dans le dictionnaire. Bien sûr, si la clé était absente (le caractère est apparu pour la première fois), vous initialisez cette entrée à 1.
(Utilisez l'opérateur in, ou les méthodes .__contains__, ou .get() afin de discriminer les cas : clé présente/absente).
Normalisez les valeurs dans le dictionnaire, divisez les valeurs par le nombre total de caractères, afin d'obtenir les fréquences relatives comme probabilités entre 0 et 1. Imprimez le contenu du dictionnaire, clés et valeurs. Comparez avec les données publiées :
Wikipédia
Crypto
Lexique
Constatez que les fréquences publiées sont différentes selon la source. Réfléchissez pourquoi...
-
Le programme qui mécaniquement parcourt la chaîne, fait la distinction entre les minuscules et les majuscules. Ceci n'est pas très raisonnable. Compléter le programme par un mécanisme qui oublie cette différence pour l'analyse des fréquences, et qui – par exemple – transforme tous les caractères en minuscule. Il vous faudra "bricoler" la transformation des codes numériques des caractères, ce qui n'est pas évident (mais faisable), ou profiter des méthodes des chaînes comme .upper, etc. Voir la documentation.
Exercice 3.
Envoyez à mon adresse mail les résultats de votre analyse fréquentielle. Le but de cette manipulation est la vérification si vous arrivez depuis vos postes dans la salle des machines, envoyer correctement quelque chose à mon adresse. Considérez ceci comme un travail obligatoire, sans note.
2. Premier rencontre avec NLTK
Exercice 4. Le chapitre 3 du livre sur NLTK contient plusieurs informations sur le traitement des chaînes en Python, sans ou avec le paquetage.
En particulier, NLTK possède une classe FreqDist qui effectue l'analyse fréquentielle des caractères dans une chaîne ou des mots dans une liste, etc. (c'est universel : dct=nltk.FreqDist(sequence)
. Ensuite dct peut être utilisé comme un dictionnaire, et en utilisant items() vous pouvez imprimer la liste résultante). Voir le chapitre 1 du livre.
Si vous avez encore un peu de temps, apprivoisez cet outil, lancez-le pour la Déclaration DH, et comparez les résultats avec les vôtres.
Bien sûr, cet exercice est soumis à la condition que NLTK approprié avait été installé sur nos machines, ce qui n'est pas évident. Si le paquetage ne marche pas ici, rien ne vous empêche de faire cette expérience chez vous.
Exercice 5. Wikipédia présente un graphique avec ces fréquences. Matplotlib vous permet de le faire en 3 - 5 lignes de code. Faites-le, si vous connaissez Matplotlib, sinon commencez son apprentissage. Il nous sera utile tout le temps.
Solutions (à venir)
Semaine suivante
Retour à l'index