

## Text mining : NOUVEAUX EMBAUCHES / Mesures de prévention (variable PREVEN)


###########################################################################################################
## Lecture et création du corpus

library(tm)

file<-read.csv2("Nouveaux embauchés.csv",header=TRUE,sep=";")
file$IDENT<-as.factor(file$IDENT)
filetxtP<-Corpus(VectorSource(file$PREVEN),readerControl=list(language="fr"))
#filetxt<-Corpus(DirSource("Données/Nouveaux embauchés"),readerControl=list(language="fr"))
inspect(filetxtP[10:20])
inspect(filetxtP)


## Transformation du texte (PREVEN)
filetxtP<-tm_map(filetxtP,gsub,pattern="'",replacement=" ")
filetxtP<-tm_map(filetxtP,gsub,pattern="’",replacement=" ")
filetxtP<-tm_map(filetxtP,gsub,pattern="‘",replacement=" ")
filetxtP<-tm_map(filetxtP,gsub,pattern=" ’ ",replacement=" ")
filetxtP<-tm_map(filetxtP,gsub,pattern="intérimaires",replacement="intérimaire")
filetxtP<-tm_map(filetxtP,gsub,pattern="postes",replacement="poste")
filetxtP<-tm_map(filetxtP,gsub,pattern="dispositifs",replacement="dispositif")
filetxtP<-tm_map(filetxtP,gsub,pattern="risques",replacement="risque")
filetxtP<-tm_map(filetxtP,gsub,pattern="consignes",replacement="consigne")
filetxtP<-tm_map(filetxtP,gsub,pattern="'",replacement=" ")
filetxtP<-tm_map(filetxtP,gsub,pattern="-",replacement=" ")
filetxtP<-tm_map(filetxtP,tolower)
filetxtP<-tm_map(filetxtP,removePunctuation)
filetxtP<-tm_map(filetxtP,removeNumbers)
#stopwords("french") # affiche les mots outils
mystopwordsP<-c(stopwords("french"),"mesure","principale","accident","la","le","un","une","plus","environ","travail","mesures","prévention","accidents","salariés","notamment")
mystopwordsP<-c(mystopwordsP,"etc","afin","cette","lors","cas","toute","toutes","après","ainsi","entre","autres","cet","exemple","lorsque","pendant","mise","mettre","place")
filetxtP<-tm_map(filetxtP,removeWords,mystopwordsP) # on enlève les mots outils du corpus
filetxtP<-tm_map(filetxtP,stripWhitespace) # enlève les blancs en trop
inspect(filetxtP)

#mystopwordsP<-mystopwordsP[which(mystopwordsP=="travail")] # pour enlever un mot de la liste des mots outils (par exemple "travail")


## Création du tableau lexical (PREVEN)
#filetxtP<-tm_map(filetxtP,PlainTextDocument) # avec la version 3.1.2
filetxtP<-Corpus(VectorSource(filetxtP)) # avec la version 3.1.2
tablexicalP<-DocumentTermMatrix(filetxtP) # mots en colonne, individus en ligne - par défaut ne garde que les mots de plus de 3 caractères
inspect(tablexicalP)
inspect(tablexicalP[1:10,1:10])
dim(tablexicalP)


## Nombre de mots des mesures de prévention
motsomP<-colSums(t(as.matrix(tablexicalP))) # nombre de mots par document
range(colSums(t(as.matrix(tablexicalP)))) # nombre de mots présents dans le moins documents et dans le plus de documents
sort(motsomP) # pour avoir l'individu ayant le plus grand nombre de mots
motsomP[order(motsomP)] # idem que ligne précédente
summary(motsomP)
boxplot(motsomP)
stripchart(motsomP)
sort(table(motsomP),decreasing=T) # mode : valeur la plus fréquente - Table permet aussi de calculer les fréquences de l'histogramme
hist(motsomP,main="Mesures de prévention des accidents des nouveaux embauchés",col="chocolate2",ylab="Fréquence",
xlab="Nombre de mots par mesure : moyenne = 23 mots / mode = 1 mot (valeur la plus fréquente)")
sum((motsomP<51)) # 2976 individus
inspect(filetxtP[3397]) # mesures les plus longues
inspect(filetxtP[17]) # mot le plus court : "néant"
file$PREVEN[3397] # mesures initiales
file["3397",]


# Graphe des mots les plus fréquents (sur tableau lexical PREVEN non compressé)
#motsfrqP<-rowSums(t(as.matrix(tablexicalP))) # fréquence des mots à travers tous les documents
motsfrqP<-colSums(as.matrix(tablexicalP)) # fréquence des mots à travers tous les documents
motsfrqP<-subset(motsfrqP,motsfrqP>=100)
#barplot(motsfrq,las=2,main="Accidents routiers - Mots présents au moins 50 fois",cex.names=.6)
barplot(motsfrqP[rev(order(motsfrqP))],las=2,main="Accidents des nouveaux embauchés - Mots des mesures présents au moins 100 fois",cex.names=.4)

# Nuage de mots
library(wordcloud)
wordcloud(words=names(motsfrqP),motsfrqP,min.freq=3,random.order=F,colors=c("blue3","green3","blueviolet","orange","brown","azure4","bisque3","burlywood4",
"cadetblue4","chartreuse4","chocolate2","cornflowerblue","cornsilk4","darkblue","darkcyan","darkgreen","darkorange","goldenrod3","hotpink4",
"lightblue4","red3","yellow3"),random.color=T)


# Associations de mots et fréquences
findAssocs(tablexicalP,"sécurité",0.20) # Association de mots dans un même document
findAssocs(tablexicalP,c("sécurité","nouveaux"),0.20) # Association de mots dans un même document
findFreqTerms(tablexicalP,lowfreq=500) # affiche les mots qui apparaissent 500 fois ou plus
findFreqTerms(tablexicalP,highfreq=2) # affiche les mots qui apparaissent 2 fois ou moins
findFreqTerms(tablexicalP,20,25)
colSums(as.matrix(tablexicalP[,"formation"])) # le mot apparaît x fois (attention aux pluriels)
colSums(as.matrix(tablexicalP))
inspect(tablexicalP[,c("sécurité","formation")]) # prend en compte le mot juste
inspect(tm_filter(filetxtP,pattern="\\<formation"))
inspect(tm_filter(filetxtP,FUN = searchFullText,"formation")) # en donne plus

inspect(tablexicalP[c("3358","3384","3397"),c("formation", "sécurité")])
inspect(tablexicalP[1:50,c("formation","sécurité")])


file$PREVEN[grep("formation|sécurité",file$PREVEN)] # deux ou plusieurs mots
file$PREVEN[grep("formation|sécurité",file$PREVEN,invert=T)] # donne le complémentaire
file$PREVEN[grep("(formation sécurité)",file$PREVEN,value=F)] # conjonction des mots
file$PREVEN[grep("(consignes rappel)",file$PREVEN,value=F)]
grep("formation|sécurité",filetxtP,value=F) # value = F : donne les indices - | équivaut à un "ou"
grep("formation|sécurité",filetxtP,value=T) # value = T : donne les valeurs
grep("(formation sécurité)",filetxtP,value=T) # conjonction des mots


inspect(tm_filter(filetxtP,FUN = function(x)any(grep("nouveaux embauchés",content(x))))) # avec la version 3.1.2
which(tm_index(filetxtP,FUN = function(x)any(grep("nouveaux embauchés",content(x))))) # avec la version 3.1.2
inspect(tablexicalP[1:10,which(dimnames(tablexicalP)$Terms=="usag")+(0:5)]) # les 5 mots suivant "usag" pour les 10 premiers documents

# Réduction du nombre de mots du tableau lexical
tablexicalP1<-removeSparseTerms(tablexicalP,sparse=0.995) # 1 098 mots au lieu de 9 240
dim(tablexical1)
inspect(tablexicalP1[1:10,1:10])



###########################################################################################################
## Recherche de thèmes et d'une structure intra-document

library(topicmodels)

# LDA model (latent Dirichlet allocation) : méthode VEM (variational expectation-maximization algorithm) ou Gibbs pour grand corpus.
# CTM model (correlated topics model) : les corrélations entre topics sont autorisées. Seulement méthode VEM.

k<-8 # nombre de topics : doit être fixé a priori

#tpmd<-LDA(tablexicalP1,15,method="VEM",control=list(alpha=0.1))

tpmdG<-LDA(tablexicalP1,k,method="Gibbs")
sink("8 topics.txt")
terms(tpmdG,40) # les 40 mots les plus fréquents par topic
sink()
topicMatrix<-as.matrix(terms(tpmdG,40)) # mots dans les topics : les 40 mots les plus fréquents par topic
topicsG1<-topics(tpmdG,1) # topics dans les documents : topic le plus probable par document
table(topicsG1)
terms(tpmdG,10)[,which.max(tabulate(topicsG1))] # donne les 10 premiers mots du topic contenant le plus de mots
barplot(table(topicsG1),main="Distribution des huit topics",col="chocolate2",ylab="Fréquence")
topicsG8<-topics(tpmdG,8) # les 8 topics par ordre décroissant de probabilité
postG<-posterior(tpmdG)
summary(postG)
round(postG$topics[1:10,],digits=2) # probabilités postérieures pour les k topics pour les 10 premiers individus
probaTopics<-round(postG$topics,digits=2) # probabilités postérieures pour les k topics
probaMots<-round(postG$terms,digits=2) # probabilités postérieures pour les k topics pour les 8 premiers individus
sum(postG$topics[3411,]) # la sommes des probabilités des 8 topics pour un individu est égale à 1
sum(postG$terms[8,]) # la sommes des probabilités des 1098 mots par topic est égale à 1


#topics3397<-topicsG[3397]
round(postG$topics[3397,],digits=2) # donne les probabilités postérieures, i.e. les probabilités des topics pour l'individu 3397
barplot(round(postG$topics[3397,],digits=2)) # donne les probabilités postérieures, i.e. les probabilités des topics pour l'individu 3397
barplot(probaTopics[3397,]) # idem


# Afficher les k topics par ordre décroissant de probabilité dans une matrice
for(i in 1:k){
	topicsGk<-topics(tpmdG,k) 
}



###########################################################################################################
## Exemple de sortie graphique

library(wordcloud)


# Courbes par individu
depInd<-1
plot(probaTopics[depInd,],type="l",ylab="probabiltés postérieures",xlab="Topics",main="Structure en topics pour un nombre choisi d'individus consécutifs")
minInd<-depInd+1
maxInd<-5
cpt<-1
for(i in minInd:maxInd){
	cpt<-cpt+1
	lines(probaTopics[i,],type="l",col=i,lwd=cpt) # pour 5 individus
}


# Représentation des thèmes par nuages de mots

for(i in 1:k){
	freqWords<-round(postG$terms[i,],digits=2) # fréquence des mots par topic
	mat<-as.matrix(freqWords)
	fichier<-paste("Topics",i,".pdf")
	pdf(fichier)	
	wordcloud(rownames(mat),mat,random.order=F,rot.per=0.08,max.words=300,colors=c("blue3","green3","blueviolet","orange","brown","azure4","bisque3","burlywood4",
	"cadetblue4","chartreuse4","chocolate2","cornflowerblue","cornsilk4","darkblue","darkcyan","darkgreen","darkorange","goldenrod3","hotpink4",
	"lightblue4","red3","yellow3"),random.color=T)
	dev.off()
}

# Les cinq nuages dans le même fichier
pdf("Topics.pdf")	
for(i in 1:k){
  	#freqWordMatrix[,i]<-round(postG$terms[i,],digits=2) # fréquence des mots par topic
	freqWords<-round(postG$terms[i,],digits=2) # fréquence des mots par topic
	mat<-as.matrix(freqWords)
	wordcloud(rownames(mat),mat,random.order=F,rot.per=0.08,max.words=300,colors=c("blue3","green3","blueviolet","orange","brown","azure4","bisque3","burlywood4",
	"cadetblue4","chartreuse4","chocolate2","cornflowerblue","cornsilk4","darkblue","darkcyan","darkgreen","darkorange","goldenrod3","hotpink4",
	"lightblue4","red3","yellow3"),random.color=T)
}
dev.off()

#pdf("mots et topics.pdf")
freqWordMatrix<-t(probaMots)
colnames(freqWordMatrix)<-c("Topic1","Topic2","Topic3","Topic4","Topic5","Topic6","Topic7","Topic8")
comparison.cloud(freqWordMatrix,random.order=FALSE,title.size=1.7,rot.per=0.08) # mots en fonctions des thèmes
#dev.off()


###########################################################################################################
## Concaténation avec les variables codées

fileTM<-cbind(file,topicsG1) # concaténation des topics au fichier de départ (topic le plus probable par individu)
fileTM$topicsG1<-as.factor(fileTM$topicsG1)
fileTM<-cbind(fileTM,probaTopics) # concaténation des proportions de topics par individu
names(fileTM)[167:174]<-c("Topic1","Topic2","Topic3","Topic4","Topic5","Topic6","Topic7","Topic8")
#fileSortie<-fileTM[,-c(82,83)] # moins RESUME et PREVEN qui contiennent des ";"
#write.table(fileSortie,file="NouvEmbPreventm.csv",sep=";",row.names=FALSE)

var<-fileTM$CONTYP # CONTYP ou AGE.en.classes
barplot(table(var,fileTM$topicsG1),main="Nouveaux embauchés : Topics modèles - Distribution de CONTYP dans les différents topics",col=rainbow(length(levels(var)),s=.8))
legend(3,900,levels(var),text.col=rainbow(length(levels(var))),cex=0.7)
barplot(table(fileTM$topicsG1,var),main="Nouveaux embauchés : Topics modèles - Distribution des thèmes selon les types de contrat",col=rainbow(length(levels(fileTM$topicsG1)),s=.8))
legend(10,1100,levels(fileTM$topicsG1),text.col=rainbow(length(levels(var))),cex=0.7)

chisq.test(var,fileTM$topicsG1) # pour voir s'il y a un lien



###########################################################################################################
## Analyse factorielle et classification descendante hiérarchique

library(FactoMineR)


# Analyse des correspondances multiples

fileTMACM<-fileTM[,c(12,85,166:174)]
ACM<-MCA(fileTMACM,quali.sup=3,quanti.sup=4:11)
dimdesc(ACM)
plot(ACM)
plot(ACM,col.ind="blue",invisible=c("var","quali.sup"),cex=0.7,label="none") # nuage des individus
plot(ACM,invisible=c("quali.sup"),cex=0.7,label="var") # représentation superposée
plot(ACM,invisible=c("ind","quali.sup"),cex=0.7) # nuage des modalités actives
plot(ACM,invisible=c("ind","quali.sup"),cex=0.7,axes=2:3) # nuage des modalités actives
plot(ACM,invisible="ind",cex=0.8) # nuage des modalités actives et illustratives
plot(ACM,col.quali.sup="brown",invisible=c("ind","var","IDENT"),cex=0.8) # nuage des modalités illustratives
plot(ACM,choix="quanti")


cluster<-HCPC(ACM,consol=T,iter.max=200000) # 5 classes
round(cluster$call$t$inert.gain,3) # l'inertie de la partition en deux classes est toujours inférieure à la première valeur propre de l'ACM
cluster$desc.var # description des classes par les modalités caractéristiques
cluster$desc.var$test.chi2 # détail du fichier desc.var
cluster$desc.var$category # détail du fichier desc.var : Excel + diagramme en secteurs
cluster$desc.axe # description des classes par les facteurs
cluster$desc.ind # parangons des classes et individus spécifiques des classes

table(cluster$data.clust$clust) # pour avoir le nombre d'individus par classe



###########################################################################################################
## Réseaux sur les topics modèles


library(igraph)

# 1 - Réseaux des mots (co-occurence des mots) - 1 098 sommets dans le graphes (1 098 mots)
motmot<-t(probaMots)
motmot[motmot>=0.01]<-1 # matrice transformée en matrice booléenne (on garde 395 mots)
motmot<-motmot %*% t(motmot) # matrice d'adjacence (il faut que les deux matrices soient compatibles : col(1)=row(2)
which(motmot>3,arr.ind=T)
motmot[10:20,30:40]
gMots<-graph.adjacency(motmot,weighted=T,mode="undirected")
gMots<-simplify(gMots) # suppression des boucles
plot(gMots)
degree(gMots)
which(degree(gMots)>0)
V(gMots)$degree<-degree(gMots)
barplot(table(V(gMots)$degree),main="Réseau des mots basé sur leurs co-occurences")
gMotsS<-delete.vertices(gMots,V(gMots)[degree(gMots)<1])
barplot(table(V(gMotsS)$degree),main="Réseau des mots basé sur leurs co-occurences après suppression des liens nuls")
plot(gMotsS,layout=layout.fruchterman.reingold,vertex.size=15)
plot(gMotsS,vertex.size=3)
plot(gMotsS,vertex.size=3,vertex.label.dist=1.5)
V(gMotsS)$size<-degree(gMotsS)/6 # taille des sommets en fonction du nombre de liens)
V(gMotsS)$label.cex<-2*V(gMotsS)$degree/max(V(gMotsS)$degree)+.2
plot(gMotsS)
V(gMotsS)$label.color<-"black"
V(gMotsS)$color<-"lightsteelblue"
V(gMotsS)$size<-degree(gMotsS)/6 # taille des sommets en fonction du nombre de liens)
V(gMotsS)$label.cex<-2*V(gMotsS)$degree/max(V(gMotsS)$degree)+.2
plot(gMotsS)
V(gMotsS)$label.cex<-0.6
plot(gMotsS,layout=layout.kamada.kawai)


barplot(table(E(gMots)$weight),main="Réseau des mots basé sur leurs co-occurences : poids des arrêtes")
which(E(gMotsS)$weight==0.0001)
gMotsS1<-delete.edges(gMotsS,E(gMotsS)[E(gMotsS)$weight==1]) # suppression des arrêtes de poids faible (cf. barplot)
barplot(table(E(gMotsS1)$weight),main="Réseau des mots basé sur leurs co-occurences après suppression des arrêtes faibles")
plot(gMotsS1,vertex.size=5,vertex.label.dist=1.2)
V(gMotsS1)$label.color<-"black"
V(gMotsS1)$color<-"lightsteelblue"
V(gMotsS1)$label.cex<-0.6
plot(gMotsS1,vertex.size=8)
plot(gMotsS1,layout=layout.kamada.kawai,vertex.size=7)
V(gMotsS1)$size<-degree(gMotsS1)/6 # taille des sommets en fonction du nombre de liens)
V(gMotsS1)$label.cex<-2*V(gMotsS1)$degree/max(V(gMotsS1)$degree)+.2
plot(gMotsS1,layout=layout.kamada.kawai)

clique.number(gMotsS) # 59 cliques - sommets tous inter-connectés
cliques(gMotsS,min=6)
clic<-largest.cliques(gMotsS)
V(gMotsS)[largest.cliques(gMotsS)[[1]]]
V(gMotsS)$label.color<-"black"
V(gMotsS)$label.cex<-8
V(gMotsS)$size<-10
V(gMotsS)[unlist(clic)]
V(gMotsS)$color<-"steelblue"
V(gMotsS)[unlist(clic)]$color<-"yellow"
plot(gMotsS)

maximal.cliques(gMotsS) # la clique maximale n'est pas toulours la plus grande
V(gMotsS)[maximal.cliques(gMotsS)[[1]]]
V(gMotsS)[unlist(V(gMotsS)[maximal.cliques(gMotsS)[[3]]])]$color<-"red"
V(gMotsS)[maximal.cliques(gMotsS)[[3]]]

clusters(gMotsS) # Composantes connexes


# Recherche de communautés : beaucoup d'arêtes dans la communauté, peu avec les sommets des autres communautés - sommets en chaîne
comM<-spinglass.community(gMotsS,spins=15) 
comM$membership
table(comM$membership) # 8 communautés
spinglass.community(gMotsS,vertex=74) # individu 74
V(gMotsS)$color <- comM$membership+200
#V(gMotsS)$label.color<-"white"
V(gMotsS)$label.cex<-0.7
plot(gMotsS,layout=layout.kamada.kawai)
plot(gMotsS,layout=layout.kamada.kawai,vertex.label.dist=1.5,vertex.size=5)


V(gMotsS)[comM$membership==1] # donne les sommets de la première communauté
sink("Sorties/Nouveaux embauchés/Topics et graphes/Communautés.txt")
for (i in 1:length(table(comM$membership))){
	cat("\n",paste("Communauté",i," : "),"\n")
	print(V(gMotsS)[comM$membership==i]) # sommets de la communauté (individus)
	cat("\n","\n")
}
sink()



# 2 - Réseau des individus : topics qu'ils ont en commun
indind<-probaTopics
indind[indind<0.2]<-0 # on garde les probabilités > 0.2 (392 individus)
#indind[indind>=0.2]<-1
indind<-indind %*% t(indind)
gInd<-graph.adjacency(indind,weighted=T,mode="undirected")
gInd<-simplify(gInd) # suppression des boucles
V(gInd)$degree<-degree(gInd)
barplot(table(V(gInd)$degree),main="Réseau des individus basé sur les topics communs : nombre de degrés des sommets") # donne les minimum et maximum de degrés
barplot(table(E(gInd)$weight),main="Réseau des individus basé sur les topics communs : poids des arêtes")
V(gInd)$label<-V(gInd)$name # paramétrage des étiquettes et du degré des sommets
V(gInd)$label.cex<-1

gIndS<-delete.vertices(gInd,V(gInd)[degree(gInd)<1])
barplot(table(V(gIndS)$degree),main="Réseau des individus après suppression des individus isolés",cex.names=0.7)
plot(gIndS,main="Réseau des individus")
plot(gIndS,layout=layout.kamada.kawai,vertex.size=7)

barplot(table(E(gIndS)$weight),main="Réseau des indfividus basé sur les topics communs : poids des arêtes",cex.names=0.5)
which(E(gIndS)$weight<0.07)
gIndS1<-delete.edges(gIndS,E(gIndS)[E(gIndS)$weight<0.07]) # suppression des arêtes de poids faible (cf. barplot)
barplot(table(E(gIndS1)$weight),main="Réseau des indfividus après suppression des arêtes faibles",cex.names=0.5)
barplot(table(V(gIndS1)$degree),main="Réseau des individus après suppression des individus isolés",cex.names=0.7)
plot(gIndS1)

V(gIndS1)$label.cex<-0.6
E(gIndS1)$color<-"white" # pour ne pas voir les arêtes
plot(gIndS1,layout=layout.kamada.kawai,vertex.size=5)
plot(gIndS1,vertex.size=5)

idx<-V(gIndS1)$degree<210 # individus ayant le moins de liens - topics "purs"
idx1<-(V(gIndS1)$degree>289 & V(gIndS1)$degree<310) # individus avec nombres de liens centraux
idx2<-V(gIndS1)$degree>310 # individus avec beaucoup de liens - topics mélangés
V(gIndS1)$label.color<-"black"
V(gIndS1)$color<-"white"
V(gIndS1)$color[idx]<-"mistyrose2"
V(gIndS1)$color[idx1]<-"lightsteelblue"
V(gIndS1)$color[idx2]<-"tan2"
V(gIndS1)$size<-degree(gIndS1)/15 # taille des sommets en fonction du nombre de liens)
plot(gIndS1,layout=layout.kamada.kawai)

V(gIndS1)$color<-"lightsteelblue"
V(gIndS1)$size<-degree(gIndS1)/15 # taille des sommets en fonction du nombre de liens)
E(gIndS1)$color<-"white" # pour ne pas voir les arêtes
V(gIndS1)$label.cex<-0.55
plot(gIndS1,layout=layout.kamada.kawai)
#plot(gIndS1)

clique.number(gInd)
#cliques(gInd,min=6)
clicInd<-largest.cliques(gInd)
V(gInd)[unlist(clicInd)]$color<-"red"
plot(gInd)

V(gInd)[largest.cliques(gInd)[[1]]]
maximal.cliques(gInd)
V(gInd)[maximal.cliques(gInd)[[1]]]

clusters(gIndS1)

file$IDENT[c(110,307,243,171,264,8,46,66,273,177,131,27,146)] # identification des accidents selon le graghe du réseau
fileTM[2120,]
barplot(probaTopics[2120,])
file$PREVEN[2120]

# Recherche de communautés
com<-spinglass.community(gIndS1,spins=15) 
com$membership
table(com$membership) # 11 communautés
spinglass.community(gIndS1,vertex=74) # individu 74
V(gIndS1)$color <- com$membership+2
#V(gInd)$label.color<-"white"
V(gIndS1)$label.size<-2
plot(gIndS1,layout=layout.kamada.kawai)
plot(gIndS1,layout=layout.kamada.kawai,vertex.label.dist=1.5,vertex.size=5)


V(gIndS1)[com$membership==1] # donne les sommets de la première communauté
sink("Sorties/Nouveaux embauchés/Topics et graphes/Communautés.txt")
for (i in 1:length(table(com$membership))){
	cat("\n",paste("Communauté",i," : "),"\n")
	print(V(gInd)[com$membership==i]) # sommets de la communauté (individus)
	cat("\n","\n")
}
sink()



# 3 - Réseau des mots et des topics (mots x topics)
gMI<-graph.incidence(t(probaMots),mode=c("all"),weighted=T) # idem si on prend la matrice non transposée
#gMI<-graph.incidence(t(probaMots),weighted=T)
plot(gMI)
plot(gMI,layout=layout.kamada.kawai)

V(gMI)$degree<-degree(gMI)
barplot(table(V(gMI)$degree))
barplot(table(E(gMI)$weight))
gMIS<-delete.vertices(gMI,V(gMI)[degree(gMI)<1])
#gMIS<-delete.edges(gMIS,E(gMIS)[E(gMIS)$weight<0.02])
barplot(table(V(gMIS)$degree),main="Réseau des mots et topics : sommets")
barplot(table(E(gMIS)$weight),main="Réseau des mots et topics : arêtes")
V(gMIS)$label.cex<-0.8
plot(gMIS,vertex.size=6)


# Couleurs et taille
V(gMIS)$label.color<-"black"
V(gMIS)[1:352]$color<-"lightseagreen" # couleurs différentes pour les mots et pour les topics
V(gMIS)[353:360]$color<-"yellow"
V(gMIS)[353:360]$size<-degree(gMIS)[353:360]/5 # taille des sommets en fonction du nombre de liens
V(gMIS)[353:360]$label.cex<-2*V(gMIS)[353:360]$degree/max(V(gMIS)[353:360]$degree)+.2
V(gMIS)[1:352]$size<-degree(gMIS)[1:352]*3 # taille des sommets en fonction du nombre de liens
V(gMIS)[1:352]$label.cex<-2*V(gMIS)[1:352]$degree/max(V(gMIS)[1:352]$degree)+.2
plot(gMIS)

clique.number(gMIS)
cliques(gMIS,min=6)
largest.cliques(gMIS)
V(gMIS)[largest.cliques(gMIS)[[1]]]
maximal.cliques(gMIS)
V(g)[maximal.cliques(g)[[1]]]
clusters(gMIS) # une seule classe ?



# 4 - Réseau des topics
topictopic<-probaMots
topictopic[topictopic>=0.02]<-1 # matrice transformée en matrice booléenne
topictopic[topictopic<0.02]<-0
topictopic<-topictopic %*% t(topictopic) # matrice de proximité
gTpTp<-graph.adjacency(topictopic,weighted=T,mode="undirected")
gTpTp<-simplify(gTpTp) # suppression des boucles
V(gTpTp)$degree<-degree(gTpTp)
V(gTpTp)$size<-degree(gTpTp)*5 # taille des sommets en fonction du nombre de liens
#V(gTpTp)$label.cex<-2*V(gTpTp)$degree/max(V(gTpTp)$degree)+.2
V(gTpTp)$label.cex<-V(gTpTp)$degree
plot(gTpTp)
plot(gTpTp,edge.label=round(E(gTpTp)$weight,3)) # affiche le poids des arrêtes




