TD Fouille de textes Sujet : Fouille de textes avec R Auteur(s) du sujet : J. Velcin Pr´ eambule Les TD de fouille de textes seront r´ealis´es `a l’aide du langage R. Il s’agit d’un langage interpr´et´e tr`es adapt´e au calcul scientifique et ` a la fouille de donn´ees. Il poss`ede une large collection d’outils statistiques et graphiques, relay´ee par une communaut´e tr`es active. Si vous souhaitez installer R sur votre ordinateur personnel, plusieurs sites web sont consacr´es ` a ce logiciel. En particulier, le site http://www.r-project.org offre une description exhaustive sur le langage R et fournit les liens indispensables pour les diff´erents t´el´echargements, acc´eder aux diff´erentes biblioth`eques de fonctions ainsi que les des documents d’aide. Des versions compil´ees de R sont disponibles pour Linux, Windows et Mac OS. Pour une interface graphique plus avanc´ee (IDE), vous pouvez pr´ef´erer l’utilisation de RStudio ici : http://www.rstudio.com. Attention : pensez ` a commenter abondamment le code et `a ins´erer (en commentaire, bien sˆ ur, et en veillant `a conserver une bonne lisibilit´e) les r´esultats de vos exp´erimentations. En effet, il faudra envoyer le fichier ` a l’issue de la formation et celui-ci comptera pour partie dans votre ´evaluation finale. 1 Premiers pas avec la librairie TM Cr´eez un premier fichier intitul´e votrenom d´ ebut.R dans lequel vous recopierez le code R et les diff´erents tests effectu´es dans les exercices qui suivent, en pensant `a inclure les r´esultats obtenus `a l’aide de commentaires. 1. Commencez par installer et charger en m´emoire la librairie TM (pour Text Mining) fournie par R. En cas de besoin, n’h´esitez pas a` recourir `a la documentation que vous trouverez en ligne : http://cran.r-project.org/web/packages/tm/vignettes/tm.pdf. 2. Chargez grˆ ace ` a la commande readLines un corpus textuel au choix. Il s’agit par exemple du livre de H. Melville qui illustre le cours (accessible via le projet Gutenberg : http://www. gutenberg.org/cache/epub/2701/pg2701.txt), mais vous ˆetes libre d’en choisir un autre. V´erifiez le nombre de lignes qui ont ´et´e charg´ees en m´emoire. Si le corpus choisi s’av`ere trop volumineux pour un traitement en temps raisonnable sur votre machine, n’h´esitez pas ` a ne prendre qu’une fraction du vecteur retourn´e par readLines. 3. Transformez le vecteur de texte en un corpus grˆace `a la commande Corpus. Cette commande prend en param`etre un objet de type Source. De nombreuses possibilit´es existent (DirSource pour des fichiers provenant d’un r´epertoire, XMLSource pour un fichier .xml, etc.). Ici, la source qui nous int´eresse est VectorSource puisque les textes se trouvent pr´ecis´ement dans un vecteur. 4. Regardez ce qui se trouve dans la variable corpus puis dans les trois premiers textes grˆace ` a la commande inspect. Ensuite, visualiser le texte d’un seul texte. Pour cela , n’oubliez pas que le corpus est consid´er´e comme une liste. 5. R´ealiser un premier nettoyage du corpus en utilisant la commande tm map. Pour le moment, contentez-vous de passer toutes les lettres en minuscules et de retirer les signes de ponctuation. Visualiser le r´esultat produit sur les premiers documents de votre corpus. c 2014-2015 DU Analyste Big Data – IUT Paris 5 Responsable du cours : Julien Velcin 2 Du corpus ` a la matrice de donn´ ees 1. Transformez le corpus en une matrice Terms x Documents avec la commande TermDocumentMatrix. La pond´eration par d´efaut est le nombre d’occurrences de chaque terme dans les documents (TF pour Term Frequency). Plus tard, vous pourrez changer cette pond´eration selon vos besoins. 2. Affichez quelques statistiques simples sur la matrice en regardant ce qu’il y a dans la variable R ainsi cr´e´ee. Que remarquez-vous, en concordance avec ce que nous avons vu en cours ? 3. Affichez les valeurs correspond ` a l’un des documents de votre matrice, une fois encore `a l’aide de la commande inspect. Pour cela, il faut utiliser une repr´esentation compacte qui ignore les cellules vides grˆ ace ` a la commande which. Vous devriez obtenir ce type de sortie : Terms dick ebook gutenberg herman melville moby project the whale 1 1 1 1 1 1 1 1 2 1 4. Affichez les mots les plus fr´equents dans le corpus `a l’aide de la commande findFreqTerms. Commentez la liste que vous obtenez. 5. Choisissez deux mots int´eressants au vu du corpus choisi (par ex., pour Moby Dick, ils peuvent ˆetre “whale” et “ahab”). Calculez les mots qui leur sont le plus souvent associ´es `a l’aide de la commande findAssocs. 3 Premi` eres manipulations de la matrice 1. Chargez la matrice Termes x Documents dans une variable R standard afin de proc´eder aux manipulations qui suivent. Pour cela, vous aurez besoin de la commande as.matrix. 2. Vous pouvez ` a pr´esent visualiser le texte de votre choix mais sans passer par la commande inspect. Essayez-le. 3. Affichez le vocabulaire, ou au moins les premiers termes de la matrice, `a l’aide de la commande rownames. 4. En sommant les lignes de la matrice avec la commande rowSums, vous pouvez calculer facilement le nombre d’occurrences total pour chaque mot du vocabulaire. Triez cette valeur afin de pouvoir sauvegarder la liste des termes par ordre d´ecroissant de leur importance. 5. Construisez l’histogramme des 50 termes de fr´equence la plus ´elev´ee `a l’aide d’un barplot. Pour information, l’option las=2 permet d’afficher les ´etiquettes de l’axe des x de mani`ere verticale. 4 Pr´ etraitements suppl´ ementaires 1. Supprimez les nombres et les mots-outils du corpus, puis relancez le calcul et l’affichage des 50 mots les plus fr´equents. Que constatez-vous ? 2. Profitez-en pour supprimer suffisamment de termes du vocabulaire pour conserver entre 1000 et 5000 mots. Pour ce faire, vous utiliserez la commande removeSparseTerms. 3. Observez la diff´erence que cela fait en terme de proportion de cellules vides avant et apr`es ces traitements. 4. Afficher une nouvelle fois les termes les plus fr´equents mais, cette fois, en utilisant un nuage de mots grˆ ace ` a la librairie wordcloud de R. Limitez-vous aux premiers termes de la liste, par exemple 100 ou 200. N’h´esitez pas a` une utiliser une palette de couleur grˆace `a l’option colors et la librairie RColorBrewer. 2 5 Mon premier moteur de recherche (pr´ eparation) Cr´eez un nouveau script votrenom moteur.R qui contiendra votre code R ainsi que vos diff´erents tests, en pensant `a inclure les r´esultats obtenus `a l’aide de commentaires. 1. R´einitialisez toute la proc´edure, mais en incluant cette fois-ci la racinisation (stemming) et on utilisant la pond´eration TFxIDF. La racinisation n´ecessite l’emploi de la librairie SnowballC avec l’argument stemDocument pour tm map. La pond´eration peut ˆetre pr´ecis´ee dans la commande TermDocumentMatrix grˆ ace au param`etre control = list(weighting=weightTfIdf). 2. V´erifiez la taille du vocabulaire obtenu `a la suite de ces pr´etraitements. Cela correspond-il ` a ce que vous avez vu durant le cours ? 3. Affichez les termes les plus fr´equents et commentez l’effet de la racinisation sur votre vocabulaire. 4. Cr´eez une fonction R intitul´ee printdoc dont l’objectif est d’afficher le vecteur correspondant `a un ensemble (vecteur) de textes [df (1) , df (2) . . . df (p) ] issus de la matrice Termes x Documents m (matrice dans le format natif R). Attention : l’id´ee est d’obtenir un affichage pr´esentant uniquement les termes qui sont pr´esents dans le texte, comme par exemple : > printdoc(melville.data, c(1)) Docs Terms 1 dick 1.0093411 ebook 1.2931023 gutenberg 1.1847606 herman 1.5540351 melvill 1.5540351 mobi 1.0093411 project 0.9664801 whale 0.4975050 5. Cr´eez une fonction R intitul´ee printdoc raw dont l’objectif est cette fois d’afficher un ensemble de textes dans leur format original. Pour le mˆeme document que pr´ec´edemment, cela donnerait : > printdoc_raw(corpus.original, c(1)) The Project Gutenberg EBook of Moby Dick; or The Whale, by Herman Melville 6 Mon premier moteur de recherche (formuler une requˆ ete) A pr´esent, l’objectif consiste ` a d´evelopper une fonction R pour trier les documents en fonction d’une requˆete compos´ee de mots-clefs. 1. Ecrivez la fonction cosine qui calcule la mesure du cosinus entre deux vecteurs. Pour rappel, le cosinus se calcule ainsi ` a partir de deux vecteurs x et y : x.y cos(x, y) = ||x||2 .||y||2 Testez cette fonction sur des vecteurs issus de votre matrice de donn´ees. 2. Ecrivez la fonction query2vector qui construit le vecteur `a partir de la matrice de donn´ees m et l’ensemble des mots q entr´es par l’utilisateur. Pour cela, initialisez avec des 0 un vecteur de longueur ´egale au nombre de termes dans le vocabulaire, puis attribuez la valeur 1 aux dimensions correspondant aux termes de q. 3. Ecrivez la fonction run query qui retourne la liste tri´ee des documents (ou plutˆot de leur index dans la matrice) en fonction de leur similarit´e du cosinus avec l’ensemble des mots q entr´es par l’utilisateur. Cette fonction utilisera les deux fonctions que vous avez ´ecrites dans les exercices pr´ec´edents. 4. Testez votre fonction requˆete avec plusieurs entr´ees possibles (notamment en faisant varier le nombre de mots) et commentez les r´esultats. 3 7 Extraire des donn´ ees textuelles du Web Dans cet exercice, on cherche ` a extraire des informations textuelles `a partir d’un document structur´e de type .html ou .xml, tels que ceux qu’on trouve partout sur le Web. Une fois cela fait, il est facile d’automatiser le processus afin de construire un aspirateur d’articles de presse ou d’autres types d’informations en temps r´eel, avant de leur appliquer les techniques de fouille que l’on a vues pr´ec´edemment. Cr´eez un nouveau script votrenom rss.R dans lequel vous mettrez, comme pour les exercices pr´ec´edents, le code R et les tests effectu´es au fur et `a mesure. 1. Installer et chargez les libraires XML et RCurl. 2. Cherchez sur le Web un site qui propose plusieurs flux d’information au format .rss. Vous en trouverez beaucoup sur les sites d’actualit´e, comme le Huffington Post 1 ou Le Monde 2 , indiqu´es par l’icˆ one . 3. Chargez l’URL du flux RSS grˆ ace a` la commande getURL de la librairie RCurl, puis analysez-la (parsing) en utilisant la commande xmlParse. V´erifiez que la variable R contient bien l’arbre qui contient les donn´ees issues du flux. Pour cela, n’h´esitez pas `a utiliser n’importe quel navigateur et aller voir le code source de la page concern´ee. 4. A l’aide de la commande xpathSApply, sauvegardez le titre, la date et le contenu textuel (description) des diff´erents items du flux. Vous trouverez en annexe, `a la fin de ce document, de l’aide sur le fonctionnement des requˆete xPath. 5. Automatisez le processus pour l’ensemble des flux que vous avez rep´er´e et mettez le tout dans un data.frame, structure standard de R pour stocker des jeux de donn´ees. Ainsi, une ex´ecution de votre programme permet de construire un tel data.frame `a partir duquel vous pourrez r´ealiser vos analyses. 6. Il est possible que vous soyez oblig´es de nettoyer les donn´ees textuelles de certaines balises HTML. C’est une proc´edure assez simple sur les donn´ees issues de flux RSS puisqu’il suffit d’avoir recourir ` a des expressions r´eguli`eres (voir la commande gsub de R). 7. Appliquez les diff´erentes analyses que nous avons vues ensemble `a l’aide de la librairie TM et des outils de R. N’h´esitez pas ` a enrichir la liste de mots-outils suivant vos besoins. 8 Pour aller plus loin A partir de l`a, de nombreuses pistes sont envisageables : 1. Am´eliorer le moteur de recherche en utilisant une base lexicale grˆace `a la librairie wordnet. 2. Enrichir l’analyse descriptive exploratoire des donn´ees textuelles avec une ACP, via la librairie FactoMineR, ou un multidimensional scaling (MDS), via la librairie cmdscale. 3. Construire un classifieur pour les textes, comme par exemple en utilisant un arbre de d´ecision via la librairie rpart. 4. On peut en imaginer d’autres... Annexe : XPath XPath est un langage qui permet de d´ecrire le chemin `a parcourir dans l’arborescence d’une page web (HTML ou XML) pour atteindre les balises qui nous int´eressent (ici du texte). La base de la syntaxe XPath est semblable ` a celle de l’adressage du syst`eme de fichiers. Si le chemin commence par ‘/’, alors il repr´esente un chemin absolu vers l’´el´ement requis. Le double ‘//’ permet de chercher toutes les occurences d’un item de mani`ere r´ecursive. Pour une documentation exhaustive, vous pouvez vous reporter `a http://www.zvon.org/xxl/XPathTutorial/General_fre/examples.html. Voici les structures syntaxiques les plus utiles `a retenir : 1. http://huffingtonpost.fr 2. http://lemonde.fr 4 //parent : ´el´ements “parent” (ex. : p) qui se situent n”importe o` u dans la page //parent/enfant : ´el´ements “enfant” contenus dans des ´el´ements “parent” //parent/* : tous les ´el´ements contenus dans des ´el´ements “parent” //parent/enfant[1] : premier ´el´ement “enfant” de chaque ´el´ement “parent” //parent/enfant[last()] : dernier ´el´ement “enfant” de chaque ´el´ement “parent” //parent/enfant[last() - 1] : avant-dernier ´el´ement “enfant” de chaque ´el´ement “parent” //parent[@attr] : ´el´ements “parent” poss´edant un attribut “attr” //parent[@attr=”valeur”] : ´el´ements “parent” (ex. : div) dont l”attribut “attr” (ex. : id) vaut exactement “valeur” Enfin, si vous voulez pointer un ´el´ement pr´ecis et que cet ´el´ement a un attribut id, vous pouvez utiliser la syntaxe suivante : id(‘valeur de l”id’) 5
© Copyright 2024