Tag Archives: discours

De quoi a parlé le Président de la République pendant 5 ans ?

En juillet 2010, le Canard Enchaîné évoquait, en première page, les drôles de guerres de Nicolas Sarkozy. L’article notait que le Président de la République Française avait tendance à voir des guerres partout. N’ayant pas les outils d’archivage suffisant pour creuser, je me suis dis qu’il serait toutefois assez facile de voir si le Président de la République utilise souvent cette rhétorique guerrière dans ses discours. Un peu dans le même esprit qu’un vieux billet montrant que l’on peut reconnaître le Président au travers du discours de fin d’année.

On peut aller sur la page http://www.elysee.fr/ pour trouver des liens vers tous les discours du président, que l’on va scanner, et parcourir,

elysee=scan(
"http://www.elysee.fr/president/les-actualites/
discours/discours.18.html",
what="character")
which(elysee=="id=\"mainContent\">")
nl=nchar("/president/les-actualites/discours/")
n=pmin(nchar(elysee),nl)
L=which(substr(elysee,1,n)==
"/president/les-actualites/discours/")
LIST=elysee[L]
ULIST=unique(LIST)
ULIST=ULIST[-length(ULIST)]
ULIST=strsplit(ULIST, '\'>')
pages=unlist(ULIST)
pages=pages[substr(pages,1,4)=="/pre"]

Ensuite, on va balayer toutes les pages de discours, et extraire les mots. La difficulté est d’identifier le discours, i.e. le début et la fin. Pour le début, je cherche les messieurs et les mesdames, voire les altesses et autre majestés. Dans un discours, je cherche un lieu car le discours ne commence pas par une interpellation, comme les autres. Quant à la fin, je cherche les vive et les merci. Là encore, il y a un discours qui ne fini pas. Je cherche alors un lien vers la biographie du président. Après, on cherche la date, souvent avant le début du discours.

longueur=0
DATEDISCOURS=rep(NA,length(pages))
for(i in 1:length(pages)){
discours=scan(paste("http://www.elysee.fr",
pages[i],sep=""),what="character")
if(length(discours)!=longueur){
(indice1=which(discours%in%c("Mesdames,","Mesdames","chers",
"Madame","Monsieur","Messieurs","Majesté,","Altesse,","L'Ile")))
(indice2=which(discours%in%c("Vive","remercie.")))
(indice3=which(discours==
"href='/president/la-presidence/le-president-de-la-republique/
nicolas-sarkozy-biographie/nicolas-sarkozy-
biographie-officielle.482.html'"))
if(length(indice2)==0){indice2=indice3[length(indice3)-1]}
LD=discours[(indice1[1]+2):(indice2[1]-1)]
banir=c("<br","<p>","</p>","/>","--","-",":")
sentence=LD[-which(LD%in%banir)]
#mots=lower.case(mots)
sentence = gsub('[[:punct:]]', '', sentence)
sentence = gsub('[[:cntrl:]]', '', sentence)
sentence = gsub('\\d+', '', sentence)
#sentence = lower.case(sentence)
sentence = tolower(sentence)
word.list = strsplit(sentence, '\\s+')
words = unlist(word.list)
sdate=discours[indice1[1]+((-200):1)]
isd=which(sdate%in%c("Lundi","Mardi","Mercredi","Jeudi",
"Vendredi","Samedi","Dimanche"))
MOIS=c("janvier","février","mars","avril","mai","juin",
"juillet","août","septembre","octobre","novembre","décembre")
mois=which(MOIS==sdate[isd+2])
date=paste(mois,"-",substr(sdate[isd+3],1,4),sep="")
if(length(mois)==0){date="99-9999"}
if(length(mois)>0){if(mois<10){date=paste("0",mois,"-",
substr(sdate[isd+3],1,4),sep="")}}
print(paste(i," --- ",date," ----- ",length(words)))
write.table(words,paste("/home/discours/discours",i,".txt",sep=""))
DATEDISCOURS[i]=date}
longueur=length(discours)
}

La stratégie est de stocker les listes de mots, discours par discours, dans des fichiers séparés. On va ensuite aller balayer ces fichiers, à la recherche de mots intéressants. C’est ce que fait la petite fonction suivante

DATEDISCOURS0=DATEDISCOURS
for(i in 1:length(DATEDISCOURS0)){
if(is.na(DATEDISCOURS0[i])){
DATEDISCOURS0[i]=DATEDISCOURS0[i=1]}
if(DATEDISCOURS0[i]=="-9900"){
DATEDISCOURS0[i]=DATEDISCOURS0[i=1]}
}
comptage=function(MOT="devoir",normalise=TRUE){
DATES=paste(rep(c(paste("0",1:9,sep=""),
10:12),6),rep(2007:2012,each=12),sep="-")
COMPTE=rep(0,length(DATES))
COMPTENorm=COMPTE
Li=(1:length(pages))[-133]
for(i in Li){
if(is.na(DATEDISCOURS[i])==FALSE){
listemots=read.table(paste(
"/home/discours/discours",i,".txt",sep=""))
COMPTE[DATES==DATEDISCOURS0[i]]=
COMPTE[DATES==DATEDISCOURS0[i]]+
sum(listemots==MOT)
COMPTENorm[DATES==DATEDISCOURS0[i]]=
COMPTENorm[DATES==DATEDISCOURS0[i]]+
sum(listemots=="le")+sum(listemots=="la")+
sum(listemots=="une")+sum(listemots=="un")
}
}
if(normalise==FALSE){
plot(seq(2007+1/24,2012+11/24,by=1/12),
COMPTE[1:66],type="s",col="red",xlab="",
ylab="",axes=FALSE);
axis(1);axis(2);title(MOT)}
if(normalise==TRUE){
ratio=COMPTE[1:66]/COMPTENorm[1:66]*
mean(COMPTENorm[1:66])
ratio[is.nan(ratio)]=NA
plot(seq(2007+1/24,2012+11/24,by=1/12),
COMPTE[1:66]/COMPTENorm[1:66]*mean(
COMPTENorm[1:66]),type="p",col="red",xlab="",
ylab="",axes=FALSE);
axis(1);axis(2);title(MOT)
tp=seq(2007+1/24,2012+11/24,by=1/12)
reg=lm(ratio~bs(tp,7))
lines(seq(2007+15/24,2012+3/24,by=1/24),
predict(reg,newdata=data.frame(tp=
seq(2007+15/24,2012+3/24,by=1/24))))
}}

Comme il n’y a pas des discours toutes les semaines, on peut normaliser le comptage. Pour ça, je compare avec un comptage de mots basiques, comme le, la, une ou un. Pour revenir à la question qui nous intéressait au début de ce billet,

comptage("guerre")

C’est un mot important, visiblement, qui a eu son heure de gloire fin 2007, que l’on retrouve ponctuellement depuis, et qui semble être revenu dans la bouche du Président au cours des derniers mois. Par comparaison, la justice est à peine plus évoquée, et semble en perte de vitesse depuis quelques années

comptage("justice")

On peut noter que la sécurité,

comptage("sécurité")

ou la police

comptage("police")

ont eu leur heure de gloire au milieu du quinquennat. Parmi les mots qui ont gardé une importance constante, mais à peine plus présent que la guerre, il y a le travail,

comptage("travail")

alors que la santé peine, mais remonte depuis quelques mois,

comptage("santé")

Cela dit, le Président veut que l’on soit heureux,

comptage("heureux")

même si cela reste globalement assez faible. Ou bien il nous dit qu’il est heureux. Parce qu’avec mon comptage je ne sais pas trop de qui il parle dans ses discours… Enfin… si, on le sait de qui il parle…

comptage("je")

Comment parle un président français le 31 décembre ?

Il y a pas mal d’agitation présidentielle sur les blogs (français) cette semaine, que ce soit au sujet des 30 ans de l’élection de François Mitterrand, ou l’annonce de la date de la prochaine élection présidentielle (et probablement d’autres raisons). Un peu naïvement je me suis demandé si les présidents étaient vraiment si différents que ça ? Ou plus précisément, est-ce qu’une fois investis par la fonction, tous ces hommes ne se comporteraient-ils pas – finalement – tous pareils ?

Pour cela je me suis simplement demandé si on pouvait distinguer les discours des différents Présidents. J’ai donc pris quelques discours entendus les 31 décembre, lors de vœux retransmis à la télévision (en ligne ici, en excluant les discours aux forces armées, qui me semblaient biaiser un peu mon échantillon). On commence par récupérer la liste de tous les mots prononcés (les fichiers csv sont en ligne ici)

setwd("/home/arthur/Documents/r-data/voeux/")
FILES=list.files()
library(tau)
BASE=scan(FILES[1],what="character")
WORD=fixEncoding(BASE,latin1=TRUE)
 for(i in 2:length(FILES)){
BASE=scan(FILES[i],what="character")
 WORD=c(WORD,fixEncoding(BASE,latin1=TRUE))
 }

Ensuite on regarde le top 500 (j’exclue les mots communs genre le ou la, mais je garde les pronoms, comme mon ou notre),

> WORD=toupper(WORD)
> LW=rev(sort(table(WORD)))
> LISTE=names(LW[1:500])
> LISTE=LISTE[-c(1,2,3,4,5,6,7,8,9,10,11,14,15,18,19,20,21,22,23,25,
               27,43,40,36,41,60)]
> LISTE[1:25]
 [1] "NOUS"   "JE"     "VOUS"   "NOTRE"  "PLUS"   "FRANCE" "PAS"    "NOS"   
 [9] "EST"    "AVEC"   "SE"     "MES"    "CEUX"   "MAIS"   "SONT"   "OU"    
[17] "CETTE"  "AUSSI"  "TOUS"   "SUR"    "SI"     "PAYS"   "LEUR"   "FAIRE" 
[25] "VOTRE"

et créer une base de décompte, par discours,

ANNEE=as.numeric(substr(FILES,6,7))
AN=1900+ANNEE*(ANNEE>15)+(100+ANNEE)*(ANNEE<15)
PRES=c("CHIRAC","CHIRAC","CHIRAC","SARKOZY","SARKOZY",
"SARKOZY","VGE","VGE","VGE","MITTERRAND","MITTERRAND",
"MITTERRAND","MITTERRAND","MITTERRAND")
NOM=paste(PRES,AN,sep="-")
COMPTE=matrix(NA,length(FILES),length(LISTE))
for(i in 1:length(FILES)){
BASE=scan(FILES[i],what="character")
WORD=toupper(fixEncoding(BASE,latin1=TRUE))
for(j in 1:length(LISTE)){
COMPTE[i,j]=sum(WORD==LISTE[j])
}}
colnames(COMPTE)=LISTE
rownames(COMPTE)=NOM

On peut alors faire tourner des procédures d’analyse de données, comme une ACP

library("FactoMineR")
res.pca = PCA(COMPTE, scale.unit=TRUE, ncp=5, graph=FALSE)
plot.PCA(res.pca, axes=c(1, 2), choix="ind")

Les projections des individus (les discours) sont les suivantes

alors que celles pour les variables (les mots) sont, toujours sur les deux premiers axes factoriels,

On peut jouer des heures à se demander qui dit quoi, mais ce qui m’intéressait était de voir si les présidents étaient proches, en terme de discours. On peut alors faire des classifications hiérarchiques,

DISTANCE = dist(COMPTE)
h = hclust(DISTANCE) 
plot(as.dendrogram(h), horiz = TRUE)

ou ici avec un autre algorithme de classification

On notera les regroupements dépendent peu des distances et des méthodes de constitution de classes… et que les regroupements se font par président: tous les discours de François Mitterrand semblent proches, et tous ceux de Jacques Chirac aussi (en tous les cas ceux que j’ai téléchargé, mais l’analyse n’est pas exhaustive). On notera aussi la proximité entre Valéry Giscard d’Estaing l’année de son élection, et Nicolas Sarkozy l’année de son élection….

C’est finalement un peu rassurant de voir que les Présidents ne sont pas tous les mêmes, et qu’on peut les reconnaitre en fonction de leur discours… c’est tout du moins la prochaine étape, ou on va voir si on peut affecter des nouveaux discours (que je n’ai pas utilisés pour l’analyse) dans des classes, et repérer qui l’a écrit…