====== 1. But du TP ====== Nous allons manipuler une collection de documents avec le langage python et illustrer empiriquement la loi de Zipf. Le langage python est un langage interprété fortement typé. Il prend en charge les expressions régulières avec le module re (regular expression). Vous pouvez trouver une référence à python en https://docs.python.org/2.7/. * Les structures de contrôles sont les mêmes qu'en langage C avec syntaxe un peu différente. * Le mot-clef def FonctionTest permet de définir des fonctions en python. } => Appel: FonctionTest * Pour ouvrir un fichier f = open("Chemin/Nom de fichier"); *Pour découper les chaines de caractères en mots, on utilisera la librairie python nltk, qu'on installe dans un terminal en lançant la commande 'pip install --user nltk'. Pour découper les mots, on créée un : tokenizer = RegexpTokenizer('[A-Za-z]\w{1,}') qui utilise un expression régulière qui découpe en token et garde les mots commenĉant par une lettre, suivi d'au moins une lettre ou d'un chiffre, et les place dans le tableau words, suivant leur ordre d'apparition. Infaut alors importer en début de programme "from nltk.tokenize import RegexpTokenizer". Utiisation d'un tokenizer : words = "This is random 23 we are going to split apart" words2 = tokenizer.tokenize(words) words2 => ['This', 'is', 'random', 'text', 'we', 'are', 'going', 'to', 'split', 'apart' ] * Pour afficher des courbes, il est possible de passer par matplotlib de python : https://matplotlib.org/tutorials/introductory/pyplot.html#sphx-glr-tutorials-introductory-pyplot-py. * Il ne faut pas oublier que python est très sensible aux tabulations, car il n'utilise pas de séparateurs comme les parenthèses du language C. * Une structure de donnée très utile en python est le dictionnaire. C'est un tableau dont les indices ne sont pas des entiers mais des chaînes de caractères. dico={} dico["toto"]=12 print dico["toto"] affiche 12. * Il est possible de passer en revue les éléments d'un dictionnaire en le triant par ses valeurs en utilisant : from operator import itemgetter dico={} ... for elem in reversed(sorted(dico.items(), key = itemgetter(1))): ... * Ne pas oublier de passer les mots en minuscule avant de calculer le nombre d'occurrences (s2 = s1.lower()) ====== 2. Déroulement ====== ===== La collection utilisée et son traitement préliminaire ===== On consière un ensemble de 3204 documents, stockés dans un fichier zip en [[http://mrim.imag.fr/User/philippe.mulhem/MIASHS/cacm.zip]]). On vous fournit un squelette de code python capable de passer en revue les documents, si vous donnez le répertoire dans lequel ces fichiers sont. Ce fichier est en {{ :split_cacm_miashs.py.zip |}}. Il ouvre tous les fichiers d'un répertoire et prépare les traitements sur les mots lus. ===== Travail attendu ===== - Vous devez commencer par rapatrier les données et le code. - A partir du squelette fourni, écrire le programme qui: 1. calcule la fréquence d'apparition de tous les termes de la collection, 2. affiche le nombre d'occurrences de mots, 3. affiche la taille du vocabulaire, 4. affiche les 10 termes les plus fréquents suivant leur ordre décroissant d'occurrence. - Affichez la courbe qui présente d'occurrences des mots en fonction de leur rang (utiliser matplotlib). - Bonus : déterminez l'évolution de la taille du vocabulaire en considérant uniquement les 100 premiers documents, les 200 premiers, etc., jusqu'à l'ensemble complet des documents. Cette évolution est-elle linéaire ?