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]