TD Fouille de textes

Transcription

TD Fouille de textes
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