Mining matrimonial ads - Département de Mathématiques
Transcription
Mining matrimonial ads - Département de Mathématiques
Université de Caen Basse-Normandie 1 6 janvier 2014 Département de Mathématiques et Mécanique Text mining sur des annonces matrimoniales Sommaire 1.1 1.2 Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Préparation des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.1 Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.2 Sujet verbe compléments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.3 Extraction d’informations, age, taille, nombre de phrases . . . . . . . . . . . . . 1.3 Création des corpus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.1 Analyse factorielle des correspondances simple id × dictionnaire . . . . . . 1.3.2 Positionnement multidimensionnel . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.3 Graphes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.4 Régle d’association . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4 Package text-mining tm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2 2 3 5 6 7 9 10 11 12 Description On veut étudier une base de données de 330 annonces matrimoniales Suisse. La base de données provient du site du Professeur Jean Pierre Müller de l’université de Lausanne http://wwwpeople.unil.ch/jean-pierre.mueller. L’objectif est d’étudier les mots cles et les relations qu’il peut y avoir dans ces annonces. Le fichier http://www.math.unicaen.fr/~kauffman/data/annonces.csv contient une table à 330 lignes et 6 colonnes, le séparateur de champs est le caractère TAB, il utilise le codage latin1. Chaque ligne correspond à une annonce. id annee age sexe num texte nom id annee age sexe num texte type quanti quanti label identifiant de l’annonce année de naissance age sexe ? texte de l’annonce quanti modalites Table 1: Description de la table id 1 id 1 annee 1960 age n def sexe F id 2 2 1960 20-30 F num 198 139 texte jeune personne avec petit avoir, présentant très bien, sérieuse, gaie cherche en vue de mariage monsieur 35-45, voiture ou moto, présentant bien, sérieux affectueux étranger accepté ; photo récente . jolie 22, milieu bourgeois, dot et expérience, études secondaires épouserait monsieur, maximum 28, catholique pratiquant, bonne situation . Table 2 – Deux premières annonces On pourra consulter la page web sur le traitement naturel des langues avec R Natural Language Processing. On utilise les packages suivants : tm de fouille de données textuelles d’Ingo Feinerer [6, 5] RWeka interface de R avec Weka [10, 12] ade4 d’analyse des données [3, 4, 1] igraph sur les graphes [2] arules sur les règles d’association [7, 8] Snowball pour la lemmatisation [9] MASS [11] http://www.math.unicaen.fr/~kauffman/cours 1 [email protected] Université de Caen Basse-Normandie 6 janvier 2014 Département de Mathématiques et Mécanique Références [1] D. Chessel, A.B. Dufour, and J. Thioulouse. The ade4 package-I- One-table methods. R News, 4:5–10, 2004. 1.1 [2] Gabor Csardi and Tamas Nepusz. The igraph software package for complex network research. InterJournal, Complex Systems:1695, 2006. 1.1 [3] S. Dray and A.B. Dufour. The ade4 package: implementing the duality diagram for ecologists. Journal of Statistical Software, 22(4):1–20, 2007. 1.1 [4] S. Dray, A.B. Dufour, and D. Chessel. The ade4 package-II: Two-table and K-table methods. R News, 7(2):47–52, 2007. 1.1 [5] Ingo Feinerer. tm: Text Mining Package, 2010. R package version 0.5-4.1. 1.1 [6] Ingo Feinerer, Kurt Hornik, and David Meyer. Text mining infrastructure in r. Journal of Statistical Software, 25(5), March 2008. 1.1 [7] Michael Hahsler, Christian Buchta, Bettina Gruen, and Kurt Hornik. arules: Mining Association Rules and Frequent Itemsets, 2010. R package version 1.0-2. 1.1 [8] Michael Hahsler, Bettina Gruen, and Kurt Hornik. arules – A computational environment for mining association rules and frequent item sets. Journal of Statistical Software, 14(15):1–25, October 2005. 1.1 [9] Kurt Hornik. Snowball: Snowball Stemmers, 2009. R package version 0.0-7. 1.1 [10] Kurt Hornik, Christian Buchta, and Achim Zeileis. Open-source machine learning: R meets Weka. Computational Statistics, 24(2):225–232, 2009. 1.1 [11] W. N. Venables and B. D. Ripley. Modern Applied Statistics with S. Springer, New York, fourth edition, 2002. ISBN 0-387-95457-0. 1.1 [12] Ian H. Witten and Eibe Frank. Data Mining: Practical Machine Learning Tools and Techniques. Morgan Kaufmann, San Francisco, 2nd edition, 2005. 1.1 1.2 1.2.1 Préparation des données Configuration Chargez les librairies tm, RWeka, ade4, igraph, lire la table X des annonces, définir les noms des lignes de la table X en "id n" ou n est l’identifiant de l’annonce et définir les options suivantes : options(stringsAsFactors = FALSE) options(width=200) X=read.table(paste(DATA,'annonces.csv',sep=""), sep="\t",header=TRUE,fileEncoding="latin1", stringsAsFactors=FALSE,na.strings="n_def") rownames(X)=paste('id',X$id)#$ 1.2.2 Sujet verbe compléments Dans cette partie on veut segmenter chacune des annonces en trois thèmes : – les caractéristiques de la personne ayant fait l’annonce moi, – le verbe liant sa présentation à ses souhaits verbe – les caractéristiques de la personne cherchée toi. On modélise les verbes par une expression régulière (aide ?regexp puis on recherchera dans chaque annonce les occurences de cette expression. Par exemple l’annonce suivante : Jeune personne avec petit avoir, présentant très bien, sérieuse, gaie cherche en vue de mariage monsieur 35-45, voiture ou moto, présentant bien, sérieux affectueux étranger accepté ; photo récente. est découpée de façon non ambigue si on prend comme verbe chercher ? moi="jeune personne avec petit avoir, présentant très bien, sérieuse, gaie" verbe="cherche" toi="en vue de mariage monsieur 35-45, voiture ou moto, présentant bien, sérieux affectueux étranger accepté; photo récent". 1. Charger les deux fonctions decoupes(), decoupe(). TP="http://www.math.unicaen.fr/~kauffman/cours/text-mining/annonces/" source(paste(TP,'annonces-bib.R',sep="")) http://www.math.unicaen.fr/~kauffman/cours 2 [email protected] Université de Caen Basse-Normandie 6 janvier 2014 Département de Mathématiques et Mécanique 2. Tester la fonction decoupes avec les exemples suivants. Que fait la fonction decoupes() ?. Donnez la sigification des variables n, idi de la table résultat. decoupes(X['id 1',] ,regexp="cherche") decoupes(X['id 177',],regexp="désire") decoupes(X['id 177',],regexp="aimer.* +conna[i^ ı]") decoupes(X[c('id 1','id 177'),],regexp="désire|cherche") 3. On va définir un ensemble de verbes que l’on va chercher dans ces annonces. On utilise des expressions régulières pour par exemple définir des fautes d’orthographe, des espaces de longueurs variables, des radicaux des verbes de façon à ne pas chercher parmi toutes les conjugaisons. verbes.regexps=c( "aimer.* +conna[i^ ı]","aimer[^ ]* +trouv","aimer.* +refaire","aimer.*rencontrer", "désire en vue","désire.*conna[^ ıi]","désir[^,]* rencontrer","désire .*trouver", "désire lier","désire rompre", "ferai.*connai","souhaite[^,]* conna[i^ ı]tre", "créer foyer", "épouse", "partagerait", "lierait amitié", "sortirait", "cherche", "correspondrait", "rencontrerait","souhaite.* rencontrer","serait.*de rencontrer", "épous", "comment.* +trouver","souhaiterait trouver", "voudr.* offrir" ) regexp=paste("[^ ]*(",paste(verbes.regexps,collapse="|"),")[^ ,.]*",sep="") verbes=decoupes(X,regexp) 1 id 1 idi 1 n 1 permute FALSE moi jeune personne avec petit avoir, présentant très bien, sérieuse, gaie pattern cherche 2 2 1 1 FALSE épouserait 3 3 1 1 FALSE jolie 22, milieu bourgeois, dot et expérience, études secondaires monsieur, divorcé sans tort, jolie situation aimerait trouver toi en vue de mariage monsieur 35-45, voiture ou moto, présentant bien, sérieux affectueux étranger accepté ; photo récente . monsieur, maximum 28, catholique pratiquant, bonne situation . en vue de mariage compagne quarantaine pouvant l’aider dans son travail de pierres fines. Table 3 – Découpage des trois premières annonces Donnez l’élément de la liste des verbes qui a été utilisé pour découper ces trois annonces. 4. Dans cette question on détecte les annonces ayant au moins deux détections de verbes. table(verbes$n[verbes$idi==1]) n 1 2 effectif 328 2 Table 4 – nombre d’occurences trouvées par annonce http://www.math.unicaen.fr/~kauffman/cours 3 [email protected] Université de Caen Basse-Normandie 6 janvier 2014 Département de Mathématiques et Mécanique Avec cette expression régulière, on voit que 328 annonces ont été découpées de façon non ambigues, 2 annonces ont deux occurences de l’expression régulière. Quelles sont ces deux annonces ? 5. Dans la suite de cette question, on traite les annonces dont le verbe n’a pas été détecté dans la question précédente excepté l’annonce 272. test.verbe=nchar(verbes$pattern)==0 (ids=setdiff(X$id[test.verbe],272)) Ces annonces ont les id 121,204, 208 et 267. De quel type syntaxique sont ces annonces ? Construire une nouvelle liste d’expression régulière de verbes, mettre à jour votre table verbes. interrogatif.verbes=c( "vous plairait-il", "est cherché", "écrira-t-elle", "contactez-moi" ) regexp.int=paste("[^ ]*(",paste(interrogatif.verbes,collapse="|"),")[^ ,.]*",sep="") verbes=rbind( verbes[!(verbes$id %in% ids),], decoupes(X[X$id %in% ids,],regexp=regexp.int,permute=TRUE) ) 6. Dans cette question on traite l’annonce id 272 manuellement qui n’a pas de verbe. verbes$moi[verbes$id==272] =gsub('pour.*$','',X$texte[272]) verbes$pattern[verbes$id==272] ="" verbes$toi[verbes$id==272] =gsub('^.*physiquement,','',X$texte[272])#$ 7. Dans cette question, corriger les annonces ayant au moins deux occurences (id 177 et 301) de l’expression régulière. (ids=unique(verbes$id[verbes$n>1])) verbes=rbind( verbes[!(verbes$id %in% ids),], decoupes(X[X$id %in% ids,],regexp= "désire rencontrer| cherche",permute=FALSE) ) 8. A la suite de ces corrections la table verbe ne doit comporter aucune ambiguité, le nombre d’occurences trouvées n doit toujours être égal à 1, fusionner alors les tables X, verbes dans X. verbes=verbes[order(verbes$id),] X=merge(X,verbes[,c('id','moi','toi','pattern')]) #$cle id http://www.math.unicaen.fr/~kauffman/cours 4 [email protected] Université de Caen Basse-Normandie id 1 id 2 id 3 id 4 id 5 id 6 6 janvier 2014 texte jeune personne avec petit avoir, présentant très bien, sérieuse, gaie cherche en vue de mariage monsieur 35-45, voiture ou moto, présentant bien, sérieux affectueux étranger accepté ; photo récente . jolie 22, milieu bourgeois, dot et expérience, études secondaires épouserait monsieur, maximum 28, catholique pratiquant, bonne situation . monsieur, divorcé sans tort, jolie situation aimerait trouver en vue de mariage compagne quarantaine pouvant l’aider dans son travail de pierres fines. jeune homme, bonne situation, voiture, dur d’oreille, physiquement bien désire rencontrer en vue de mariage demoiselle ou dame 25-33, avec enfant accepté, présentant bien, sérieuse, affectueuse, photo. jeune homme 30, place stable, de la campagne, sobre désire faire la connaissance en vue de mariage demoiselle simple, affectueuse, aimant la campagne, photo. seule, indépendante, désire faire la connaissance en vue de mariage monsieur, quarantaine, situation libérale, distingué, affectueux, photo, agence s’abstenir. Département de Mathématiques et Mécanique moi jeune personne avec petit avoir, présentant très bien, sérieuse, gaie pattern cherche toi en vue de mariage monsieur 35-45, voiture ou moto, présentant bien, sérieux affectueux étranger accepté ; photo récente . jolie 22, milieu bourgeois, dot et expérience, études secondaires épouserait monsieur, maximum 28, catholique pratiquant, bonne situation . monsieur, divorcé tort, jolie situation aimerait trouver en vue de mariage compagne quarantaine pouvant l’aider dans son travail de pierres fines. jeune homme, bonne situation, voiture, dur d’oreille, physiquement bien désire rencontrer en vue de mariage demoiselle ou dame 25-33, avec enfant accepté, présentant bien, sérieuse, affectueuse, photo. jeune homme 30, place stable, de la campagne, sobre désire faire la connaissance en vue de mariage demoiselle simple, affectueuse, aimant la campagne, photo. seule, indépendante, désire faire la connaissance en vue de mariage monsieur, quarantaine, situation libérale, distingué, affectueux, photo, agence s’abstenir. sans Table 5 – Table X après segmentation 1.2.3 Extraction d’informations, age, taille, nombre de phrases 1. A l’aide de la fonction gregexpr compter le nombre de points dans chaque annonce. Par exemple l’annonce id 238 contient cinq points et donc cinq phrases. X$nb.phrases=unlist(lapply(gregexpr('\\.',X$texte),function(x) length(x))) 2. A l’aide d’une expression régulière déterminer l’age de la personne ayant fait l’annonce quand cet information est présente, et créez la variable age.moi. regexp.age='[^m] [0-9]{2} *(an[^ ]*|,)' tmp=data.frame(id=verbes$id,texte=verbes$moi) age.moi=decoupes(tmp,regexp.age) age.moi=age.moi[age.moi$idi==1,] # suppression aux deuxièmes occurences enfants age.moi$age.moi=as.numeric(gsub("(an[^ ]*|,)","",substr(age.moi$pattern,2,3000))) X=merge(X,age.moi[,c('id','age.moi')])#$ 3. Faire de même avec la taille de la personne ayant fait l’annonce et créez la variable numérique taille.moi tmp=data.frame(id=verbes$id,texte=verbes$moi) http://www.math.unicaen.fr/~kauffman/cours 5 [email protected] Université de Caen Basse-Normandie 6 janvier 2014 Département de Mathématiques et Mécanique regexp.taille='1 ?m? ?\\.?[0-9]{2}' taille.moi=decoupes(tmp,regexp.taille) taille.moi$taille.moi=as.numeric(gsub("[ . m]","",taille.moi$pattern)) X=merge(X,taille.moi[,c('id','taille.moi')]) X[,c('id','age','age.moi','taille.moi')] 4. Faire de même avec l’age de la personne recherchée, (centre de l’intervalle si c’est un intervalle qui est indiqué). Créez la variable age.toi. 1 2 3 4 5 6 id 1 2 3 4 5 6 age n def 20-30 n def n def 30-40 n def age.moi 22.00 taille.moi age.toi 40.00 28.00 29.00 30.00 Table 6 – Premières lignes des nouvelles variables 1.3 Création des corpus Dans cette question, on va créer un corpus de mots fréquents à l’aide de la fonction de lemmatisation du package Snowball. Pour les deux premières annonces et pour les caractéristiques de la personne ayant passée l’annonce, on va transformer le texte succesivement de 1 2 id 1 2 moi jeune personne avec petit avoir, présentant très bien, sérieuse, gaie jolie 22, milieu bourgeois, dot et expérience, études secondaires Table 7 – X[1:2,c(’id’,’moi’)] aux mots lemmatisés > liste[c('id 1','id 2')] $`id 1` [1] "jeun" "person" "pet" $`id 2` [1] "jol" "milieu" "présent" "bien" "bourgeois" "dot" "sérieux" "gai" "expérient" "étud" "secondair" au dictionnaire des mots lemmatisés apparaissant dans plus de 10 annonces différentes http://www.math.unicaen.fr/~kauffman/cours 6 [email protected] Université de Caen Basse-Normandie 6 janvier 2014 Département de Mathématiques et Mécanique 120 100 80 60 40 20 an jeun bon situat homm monsieur présent dam bien affectu veuv sérieux célibatair aim physiqu voitur agréabl gai grand jol femm cinquantain quarantain stabl veuf natur ais demoisel divorc seul trentain enfant sympath caracter sportif libr retrait 0 Figure 1 – Tableau de contingence des mots du dictionnaire puis aux indicatrices du dictionnaire. 1 2 affectu 0 0 agréabl 0 0 aim 0 0 ais 0 0 an 0 0 bien 1 0 bon 0 0 caracter 0 0 célibatair 0 0 cinquantain 0 0 1. Charger la table http://www.math.unicaen.fr/~kauffman/data/annonces.RData résultat des précédentes questions. (load(file(paste(DATA,"annonces.RData",sep=""),open="rb"))) 2. Que fait la fonction stem.chaine() du fichier http://www.math.unicaen.fr/~kauffman/data/../cours/text-mining/annonces/annonces-bib.R? 3. Créez le corpus.moi à l’aide du code suivant fichier=file(paste(DATA,'annonces-stopwords.txt',sep="")) mots=readLines(fichier) close(fichier) liste=lapply(X$moi,stem.chaine,stopwords=mots) names(liste)=rownames(X) liste[c('id 1','id 2')] occurences=table(unlist(liste)) dictionnaire=names(occurences)[occurences>10] occurences[dictionnaire] corpus.moi=data.frame(t(sapply(liste,function(x,...) table(factor(x,...)), levels=dictionnaire,simplify=TRUE))) corpus.moi$autre=unlist(lapply(liste,length))-apply(corpus.moi,1,sum) 4. Puis créez de la même façon le corpus corpus.toi des mots lemmatisés du texte concernant les personnes recherchées. 1.3.1 Analyse factorielle des correspondances simple id × dictionnaire Dans cette partie on veut réaliser une classification des annonces. 1. Réalisez une analyse des corespondances simples ade4::dudi.coa du tableau des indicatrices corpus.moi. Interpretez les axes. http://www.math.unicaen.fr/~kauffman/cours 7 [email protected] Université de Caen Basse-Normandie 6 janvier 2014 Département de Mathématiques et Mécanique # afc afc=dudi.coa(corpus.moi,nf=10,scannf=FALSE) scatter.dudi(afc) # biplot iso individus/sexe couleurs=c(C="yellow",F="red",M="blue") s.class(afc$li,fac=factor(X$sexe),cstar=0,col=couleurs[X$sexe])#$ d=2 Eigenvalues dam cinquantain idid290 55 idid305 169 96 id 188 veuv id 215 retraitid 83 agréabl caracter enfant idid103 id265 154 id 148 id 135 physiqu 44 id 259 id id 71 id 67id 149 idid233 87 id affectu 159 281 idid id 65 femm id 251 id195 123 105 idid39 id287 167 id id 160 grand id 89 id 152 id 48 id 261 id 266 aim natur id 237 id 166 146 id 182 id 51 id 206 27 idid 191 id 177 idid 80 id 262 idid 204 117 id 209 id 318 250 gai id 185 id 201 id 198 286 id 10 164 id 131 84 id200 90 autre id 283 330 id 126 id 291 id 322 sympath id 53 id 219 id 278 226 id 312 id id 47 id 241 id 157 id 190 id 247 121 quarantain id 269 id id 107 184 267 301 311 326 13 25 76 82 id 142 7 id 229 260 id 293 id 238 id 125 id 12 id 187 23 id 258 246 263 id 2 id 230 222 id 34 252 id 255 id 228 240 id 163 id 280 divorc id 18 id 127 id 81 id 193 id 50 118 170 171 id 207 id 61 57 253 id 270 ididbien 136 id 277 6id id id 295 113 143 289 id 329 id 158 id 180 id 327 id 186 id 309 ididsportif 307 308 31id 300 id 232 id 155 id 63 73 id 317 id 297 11 321 id 120 285 id 210 275 294 304 315 324 id 1 idid214 282 268 38 189 id 272 id 248 130 id 8id 310 id 101 id 132 211 id 128 134 213 216 224 124 id 242 id 9 299 jol idid id 78 idseul 109 id 202 id id 122 id 234 id 153 id 151 id 21 id 208 id id 235 jeun id 92 id 60 id 174 id 98 41 id 325 271 id 156id 292 idid221 id 197 id 20 id 316 id 257 demoisel 17 id 30 id 15 id 115 id70 86id id 205 id279 id 88 id100 178 idid 59 id 218 id 99 id 254 179 ais id 161 id 77 id256 93 id 74 trentain id 313 id 72 id 199 id 181 présent id 141 52 id 284 id 273 id 97 id 165 id id 319 62 id 14 id 95 id 33 id 5 id 4 id 183 94106idid192 314 323 id 145 227 id 245 264 35 42 id id librid id 102 idid296 173 176 223 276 303 id 137 id 243 idid203 sérieux 24 id 43 212 147 id 46 an 56 id id 3 id 85 id 111 114 id 144 id 244 id 302 306 320 328 id 26 id id 220 239 69 id 40 id id 168 id29 2245bon id 28 58 id id célibatair id id 298 110 36 idid 119 id 19 id 162 id 274 id 75 id 108 id 150 id 16 id 112 id 68 id 54 id 140 id 116 id 49 situat id 138 194 idid288 175 id 64 id id231 225 66 172 217 id 79 monsieur id 196 id 249 homm voitur stabl id 133id 32 id 236 id 139 idid104 37 91 id 129 veuf Figure 2 – Biplot iso individus 2. Réalisez typologie des annones (classification hierarchique ascendante) hclust des annonces à partir des coordonnées factorielles des annonces. h=hclust(dist(afc$li)^2,method="ward") plot(h) classes=cutree(h,k=5) s.class(afc$li,fac=factor(classes),cstar=0,col=rainbow(5)) http://www.math.unicaen.fr/~kauffman/cours 8 [email protected] Université de Caen Basse-Normandie 6 janvier 2014 Département de Mathématiques et Mécanique d=2 1 5 3 2 4 Figure 3 – Classification en 5 classes 1.3.2 Positionnement multidimensionnel Dans cette partie on veut réaliser une classification des mots pour le corpus corpus.moi à l’aide d’un positionnement multidimensionnel MASS::isoMDS 1. Calculer la table corpus des indicatrices des mots du dictionnaire. 2. Le tableau de contingence croisant les mot affectu et agréabl, est affectu=0 affectu=1 agréabl=0 n0,0 = 284 n1,0 = 27 agréabl= 1 n0,1 = 14 n1,1 = 5 Il y a donc par exemple 5 annonces ou les mots lemmatisés agréabl et affectue apparaissent au moins une fois ensemble. La distance de Jaccard entre les deux vecteurs du tableau des indicatrices est définie par r n1,1 d(af f ectu, agreabl) = 1 − n1,1 + n1,0 + n0,1 C’est donc la proportion des annonces ayant les deux occurences parmi les les annonces ayant au moins une occurence. Faire le lien avec le support et la confiance de la règle affectu ⇒ agréabl Calculez le tableau des distances de Jaccard entre les colonnnes des indicatrices à l’aide de la fonction ade4::dist.binary. Calculez le positionnement. Interprétez la figure suivante http://www.math.unicaen.fr/~kauffman/cours 9 [email protected] Université de Caen Basse-Normandie 6 janvier 2014 Département de Mathématiques et Mécanique d=5 libr sportif divorc enfant caracter gai physiqu natur aim célibatair trentain agréabl femm grand homm jeun an affectu sérieux autre bon dam bien présent veuv jol monsieur stabl cinquantain quarantain ais sympath demoisel retrait voitur situat veuf seul Figure 4 – Poistionnement distance de Jaccard corpus.moi 3. Faire un positionnement sur les deux corpus corpus.moi, corpus.toi d=1 ami.toi natur.toi famill.toi trentain.moi indifférent.toi écrir.toi sportif.moi jol.toi plus.toi vi.toi sympath.toi femm.toi entent.toi libr.moi natur.moi douc.toi fill.toi aim.toicélibatair.moi durabl.toi divorc.moi jeun.toi aim.moi souhait.toi homm.moi lettr.toi simpl.toi physiqu.moi amiti.toi entre.toi téléphon.toi numéro.toi répons.toi voitur.moi enfant.toi goût.toi gai.moi jeun.moi sort.toi photo.toi an.moi accept.toi situat.moi libr.toi femm.moi assur.toi bon.moi demoisel.toi discret.toi monsieur.moi an.toi stabl.moi grand.moi compagn.toi autre.moi affectu.toi homm.toi grand.toi mariag.toi quarantain.moi dam.toi sincer.toi sérieux.toi vu.toi foi.toi présent.moi bien.moi affectu.moibon.toi gentill.toi caracter.moi sympath.moi sérieux.moi dam.moi veuv.toi situat.toi éduc.toi cinquantain.moi bien.toi monsieur.toi agréabl.moi veuf.moi cultiv.toi ais.moi heureux.toi fond.toi person.toi enfant.moi présent.toi s.absten.toi jol.moi veuv.moi demoisel.moi solitud.toi rompr.toi agréabl.toi seul.moi age.toi gentil.toi stabl.toi retrait.moi Figure 5 – Positionnement distance de Jaccard 1.3.3 Graphes Dans cette question, on veut construire le graphe non orienté pondéré dont les sommets sont les mots lemmatisés du dictionnaire, avec la relation deux mots sont en relation si et seulement si ils apparaissent ensemble un nombre minimal de fois et dont la pondération d’un arc est le nombre d’annonces ou les deux sommetes de l’arc apparaisent en même temps. Construire la table des indicatrices des mots, puis la matrice d’adjacence comptant le nombre d’annonces contenant les deux sommets de l’arête. A l’aide de la fonction igraph::graph.adjacency contruire le graphe. Essayer le graphe interactif du graphe avec la fonction igraph::tkplot. http://www.math.unicaen.fr/~kauffman/cours 10 [email protected] Université de Caen Basse-Normandie 6 janvier 2014 Département de Mathématiques et Mécanique corpus=(corpus.moi>0)+0 G=t(as.matrix(corpus))%*%as.matrix(corpus) # matrice d'adjacence seuil=10 # à regler g=graph.adjacency(G>seuil,mode="undirected",weighted=TRUE,add.rownames="nb") plot(g) libr trentain sérieux physiqu stabl allur jol seul ais bien agréabl intérieur présent situat monsieur sympath homm bon voitur autre an cinquantain affectu caracter jeun célibatair veuv grand dam femm aim gai demoisel sportif natur enfant veuf divorc quarantain retrait Figure 6 – Graphe des relations >10 occurences 1.3.4 Régle d’association Pour le corpus moi, construire la liste des règles ayant un support d’au moins 3% en support et une confiance de 60%, puis construire le graphe des relations. On construire les règles pour la réunion des corpus moi et toi. # construction des règles d'associations liste=lapply(X$moi,stem.chaine,stopwords=mots,unique=TRUE) names(liste)=rownames(X) trans=as(liste, "transactions") rules=apriori(trans,parameter=list(support=0.03,confidence=0.6)) # graphe des relations l.terms=as(lhs(rules),"list") l.df=data.frame(left=unlist(l.terms), n.rule=rep(1:length(rules),sapply(l.terms,length))) r.terms=as(rhs(rules),"list") r.df=data.frame(right=unlist(r.terms), n.rule=rep(1:length(rules),sapply(r.terms,length))) df=merge(l.df,r.df) g <- graph.edgelist(as.matrix(df[,-1])) g <- set.graph.attribute(g, "layout", layout.star(g)) plot(g) #$ http://www.math.unicaen.fr/~kauffman/cours 11 [email protected] Université de Caen Basse-Normandie 6 janvier 2014 Département de Mathématiques et Mécanique divorc an situat voitur stabl jeun allur monsieur natur bon présent aim homm Figure 7 – Graphe des relations 1.4 Package text-mining tm On peut utilser le packahge tm pour des textes plus importants. En Linux, je n’ai pas eu de pb pour installer tm, ce n’a pas été le cas pour windows. Voici le code qui permet de contruire les mots lemmatisés, et les tables disjonctives à partir des chaines X$moi. docs=data.frame(texte=X$moi,row.names=paste("id",X$id)) ds=DataframeSource(docs) XCorpus=Corpus(ds,readerControl = list(language = "fr")) tm::inspect(XCorpus[1:2]) tmp=tm_map(XCorpus, removePunctuation) tmp=tm_map(tmp, stripWhitespace) tmp=tm_map(tmp, tolower) tmp=tm_map(tmp, removeWords, stopwords("french")) tmp=tm_map(tmp, stemDocument,language="french") dtm=DocumentTermMatrix(tmp) inspect(dtm[1:2]) tm::inspect(dtm[1:5, 100:105]) apply(dtm,2,sum) colnames(dtm) # création table disjoctive avec dico (d <- Dictionary(c("homme", "age", "célibataire"))) tm::inspect(DocumentTermMatrix(tmp, list(dictionary = d))) http://www.math.unicaen.fr/~kauffman/cours 12 [email protected]