Chapter 7. Twitter

1. script.twitter

script.twitter.R can be downloaded from:

* in Windows format (latin1)  http://www.xplortext.org/Rdata/script.twitter.R

* in Mac & Linux format (UTF-8)  http://www.xplortext.org/Rdata/mac/script.twitter.R

2. Charger le logiciel (Xplortext)

library(Xplortext)

3. En plus du package (Xplortext, on doit charger les packages suivants)

library(DescTools)
library(stringr)
library(FactoMineR)

En cas de vouloir décharger ces propres tweets, ce qui obliqe a s’inscrire sur Twitter

library(mvtnorm)

library(manipulate)

library(twitteR)

Pour l’autorisation d’accès au site Twitter, il faut avoir les valeurs de certaines clés :

 setup_twitter_oauth(Consumer key, Consumer secret, Access token, Access token secret)

Des tweets de la part de @Lesmatinsfcult, Matins FranceCulture : Tweets from @Lesmatinsfcult, Matins FranceCulture:

 FCult <- userTimeline("Lesmatinsfcult", n = 1198)

En fait, la récolte doit faite plusieurs fois avec le nombre maximimal n = 3200 et avec le paramètre sinceID, “Minimum (not inclusive) ID to search for”.

 tweets.df <- twListToDF(FCult)  # Convert to data frame. 
 dim(tweets.df)       #  1198 16

4. Pour reproduire les résultats vus dans la section Twitter, partir du fichier indiqué ci-dessous


Prétraitement

Tout d’abord, voir le pré-traitement jusqu’à arriver au corpus analysé avec Xplortext

File can be downloaded from the Internet and save it to some directory:

Windows format: http://www.xplortext.org/Rdata/copy_tweets_dot_df.RData

Mac & Linux format: http://www.xplortext.org/Rdata/mac/copy_tweets_dot_df.RData

Charger les données

load("C:/RData/copy_tweets_dot_df.RData")
str(tweets.df)
'data.frame':   1198 obs. of  16 variables:
 $ text         : chr  "Sylvia Desazars : \"Il n'y a pas en #Espagne de représentation de l'extrême droite au parlement, et il n'y en a"| __truncated__ "Bruno Aguilera Barchet : \"C'est #Podemos qui a bouleversé le paysage politique, #Ciudadanos est arrivé après\" #Espagne" "Un militant de #Podemos au micro d'@AugusteSaravah : \"Ce que fait Pablo Iglesias, c'est mettre un visage sur l"| __truncated__ "Bruno Aguilera Barchet \"Il y a des affaires de corruption tous azimuts: à droite ds les partis catalans, à gau"| __truncated__ ...
 $ favorited    : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ favoriteCount: num  2 1 0 0 0 1 2 5 1 1 ...
 $ replyToSN    : chr  NA NA NA NA ...
 $ created      : POSIXct, format: "2015-12-18 07:35:34" "2015-12-18 07:32:19" ...
 $ truncated    : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ replyToSID   : chr  NA NA NA NA ...
 $ id           : chr  "677754061492457472" "677753242634346496" "677752865105031168" "677751963686187009" ...
 $ replyToUID   : chr  NA NA NA NA ...
 $ statusSource : chr  "<a href=\"http://twitter.com/download/android\" rel=\"nofollow\">Twitter for Android</a>" "<a href=\"http://twitter.com/download/android\" rel=\"nofollow\">Twitter for Android</a>" "<a href=\"http://twitter.com/download/android\" rel=\"nofollow\">Twitter for Android</a>" "<a href=\"http://twitter.com/download/android\" rel=\"nofollow\">Twitter for Android</a>" ...
 $ screenName   : chr  "Lesmatinsfcult" "Lesmatinsfcult" "Lesmatinsfcult" "Lesmatinsfcult" ...
 $ retweetCount : num  2 2 0 2 1 2 2 6 0 0 ...
 $ isRetweet    : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ retweeted    : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ longitude    : logi  NA NA NA NA NA NA ...
 $ latitude     : logi  NA NA NA NA NA NA ...
dim(tweets.df)
[1] 1198   16
colnames(tweets.df)
 [1] "text"          "favorited"     "favoriteCount" "replyToSN"    
 [5] "created"       "truncated"     "replyToSID"    "id"           
 [9] "replyToUID"    "statusSource"  "screenName"    "retweetCount" 
[13] "isRetweet"     "retweeted"     "longitude"     "latitude"     

Filtrage et extraction des parties souhaitées des données de source

Le nombre de urls n’est pas grand. Nous les effaçons :

tweets.sans.urls <- gsub("http[^[:space:]]*", "", tweets.df[,1])

Les première et dernière dates sont : 2015-06-26, 2015-12-18.

A partir d’une telle heure d’envoi du tweet, “2015-12-18 07:35:34 UTC”, extraire “2015-12-18” : Le jour va être pris ici comme indicateur du temps de l’émission du tweet.

lejour <- substr(grep("2015[^[:space:]]*", value = TRUE, tweets.df[,5]), 1, 10)
length(lejour)
[1] 1198
lejour[1:5]
[1] "2015-12-18" "2015-12-18" "2015-12-18" "2015-12-18" "2015-12-18"

Auteurs des tweets, signalés dans la grande majorité des tweets.

Pour commencer : l’extraction des noms d’auteurs des tweets.

Souvent ce nom de personne précéde le texte du tweet. On détermine ces noms, moyennant le caractère deux points. Il est possible qu’il n’y ait pas de nom Un nom de personne peut comporter 1, 2 ou 3 mots. (Exemple: “Bruno Aguilera Barchet :”. Mais aussi : A partir de 7h40 :“, ou absence de nom.

Prenons ces noms de personne potentiels

tweetacknowledge <- substr(tweets.sans.urls, 1, 
                  attr(regexpr(".*?:", tweets.sans.urls), which = "match.length") )

Pour avoir un vrai nom de personne, on exigera que cette partie du texte qui vient d’être déterminée comporte au maximum 3 mots ou suites de charactères.

Le nombre de mots dans ce que nous cherchons comme le prénom, ou la ou les initiales.

tweetacknowledgecnt <- StrCountW(tweetacknowledge) # library(DescTools)

A noter que l’absence de caractère donne 1, ce qui nous arrange.

Ici on met à jour la liste des noms personnels pour le cas où il ne s’agit pas du nom, mais plutôt un ensemble de mots

tweetacknowledge[tweetacknowledgecnt > 3] <- "NoAck"  

On retient des noms. Autrement, “NoAck”.

tweetacknowledge[tweetacknowledge == ""] <- "NoAck"

Maintenant on retient les tweets sans ces noms personnels :

tweetsnew <- rep(" ", length(tweets.sans.urls))
for (i in 1:length(tweets.sans.urls)) {
  if (tweetacknowledgecnt[i] <= 3) 
  {tweetsnew[i] <- gsub(".*?:", "", tweets.sans.urls[i]) }
  else {tweetsnew[i] <- tweets.sans.urls[i]} }

NOS DONNÉES: un tweet, l’auteur, le jour d’envoi : tweet.ack.day sont les données à analyser.

tweet.ack.day <- as.data.frame(cbind(tweetsnew, tweetacknowledge, lejour))

Analyse: AC + classification

colnames(tweet.ack.day)   
[1] "tweetsnew"        "tweetacknowledge" "lejour"          

Sélection des mots: voir les arguments de TextData Variables contextuelles : l’auteur du tweet, le jour d’envoi. “&”, en html “&”, est devenu “amp”; l’effacer : Le mot “7h40” se répète toujours (dans “A partir de 7h40”), l’effacer : Pour mémoire: analyse directe des tweets (non réellement utilisée)

str(tweet.ack.day)
'data.frame':   1198 obs. of  3 variables:
 $ tweetsnew       : Factor w/ 1197 levels "  ","  !","  \"Le bateau européen est au milieu du gué, et nous en subissons toutes les conséquences negatives\"  #lesmatins",..: 143 36 1189 933 201 400 313 277 524 74 ...
 $ tweetacknowledge: Factor w/ 258 levels "\"Figaro ou Gorafi ?\" :",..: 249 102 217 217 249 102 192 192 102 102 ...
 $ lejour          : Factor w/ 90 levels "2015-06-26","2015-07-03",..: 90 90 90 90 90 90 90 90 90 90 ...
resTD <- TextData(tweet.ack.day, var.text=c(1), idiom="fr", lminword=3, Fmin=8, Dmin=4,
  stop.word.tm=TRUE, stop.word.user=c("amp","7h40","et"), context.quali=c("tweetacknowledge","lejour"))
summary(resTD,ndoc=0,nword=10)

TextData summary

                       Before   After
Documents             1198.00 1134.00
Occurrences          13938.00 3391.00
Words                 4241.00  202.00
Mean-length             11.63    2.99
NonEmpty.Docs         1196.00 1134.00
NonEmpty.Mean-length    11.65    2.99

Index of the  10  most frequent words
        Word Frequency N.Documents
1  lesmatins       448         448
2  faut             90          87
3  plus             86          75
4  peut             57          57
5  france           49          48
6  politique        48          47
7  tout             46          45
8  fait             45          45
9  comme            44          41
10 faire            40          39

Summary of the contextual categorical variables
           tweetacknowledge        lejour   
 NoAck             :481     2015-08-24: 29  
 . @wdesaintjust : : 14     2015-07-31: 27  
 Michel Rocard :   : 13     2015-08-05: 26  
 .@FrancoisFillon :: 12     2015-08-12: 25  
 Marcel Gauchet :  : 12     2015-08-25: 25  
 Michel Onfray :   : 10     2015-09-25: 25  
 (Other)           :592     (Other)   :977  
resCA <- LexCA(resTD,graph=FALSE)
plot(resCA)

summary(resCA,ndoc=0,nword=0,nsup=0)  
Correspondence analysis summary

Eigenvalues
      Variance % of var. Cumulative % of var. 
dim 1    0.754     1.113                1.113 
dim 2    0.677     0.999                2.112 
dim 3    0.663     0.977                3.089 
dim 4    0.658     0.970                4.059 
dim 5    0.647     0.955                5.014 

Cramer's V  0.581    Inertia  67.81 

Sélection des mots

resTDparjour <- TextData(tweet.ack.day, var.text=c(1), idiom="fr", remov.number=TRUE, Fmin=8, Dmin=4,
  stop.word.tm=TRUE, stop.word.user=c("amp","7h40","et"), lminword=3, var.agg="lejour")
summary(resTDparjour,ndoc=0,nword=10)

TextData summary

                       Before   After
Documents             1198.00   90.00
Occurrences          13938.00 3391.00
Words                 4241.00  202.00
Mean-length             11.63   37.68
NonEmpty.Docs         1196.00   90.00
NonEmpty.Mean-length    11.65   37.68

Index of the  10  most frequent words
        Word Frequency N.Documents
1  lesmatins       448          53
2  faut             90          50
3  plus             86          45
4  peut             57          38
5  france           49          32
6  politique        48          33
7  tout             46          33
8  fait             45          34
9  comme            44          24
10 faire            40          33

AC agrégée sur les jours x mots. ncp = 5

resCAparjour <- LexCA(resTDparjour,graph=FALSE)
summary(resCAparjour,ndoc=0,nword=0) #  
Correspondence analysis summary

Eigenvalues
      Variance % of var. Cumulative % of var. 
dim 1    0.548     5.076                5.076 
dim 2    0.395     3.662                8.739 
dim 3    0.382     3.542               12.281 
dim 4    0.354     3.283               15.564 
dim 5    0.337     3.126               18.690 

Cramer's V  0.348    Inertia  10.787 

Graphiques

par(mfrow=c(1,2))
plot(resCAparjour, axes=c(1,2), selWord="meta 3", selDoc="meta 3", plot.new=FALSE, cex=0.8,
   col.doc="black",col.word="black")
plot(resCAparjour, axes=c(3,4), selWord="meta 3", selDoc="meta 3", plot.new=FALSE, cex=0.8,
   col.doc="black",col.word="black")

par(mfrow=c(1,1))

Classification hiérarchique sous contrainte de contiguité chronologique

resCHCca <- LexCHCca(resCAparjour, nb.clust=-1,graph=FALSE)
plot(resCHCca, choice="tree", title=" ", tree.barplot=TRUE)

Effectifs et contenu en jours des classes

summary(resCHCca$data.clust$clust)
 1  2  3  4  5  6  7  8  9 10 
 1  1 30 15  1 14  1 14  1 12 
split(rownames(resCHCca$data.clust),resCHCca$data.clust[ncol(resCHCca$data.clust)])
$`1`
[1] "2015-06-26"

$`2`
[1] "2015-07-03"

$`3`
 [1] "2015-07-06" "2015-07-10" "2015-07-13" "2015-07-16" "2015-07-17"
 [6] "2015-07-19" "2015-07-20" "2015-07-23" "2015-07-24" "2015-07-27"
[11] "2015-07-28" "2015-07-29" "2015-07-30" "2015-07-31" "2015-08-03"
[16] "2015-08-04" "2015-08-05" "2015-08-06" "2015-08-07" "2015-08-09"
[21] "2015-08-10" "2015-08-11" "2015-08-12" "2015-08-13" "2015-08-14"
[26] "2015-08-17" "2015-08-18" "2015-08-19" "2015-08-20" "2015-08-21"

$`4`
 [1] "2015-08-24" "2015-08-25" "2015-08-26" "2015-08-27" "2015-09-01"
 [6] "2015-09-02" "2015-09-09" "2015-09-10" "2015-09-17" "2015-09-18"
[11] "2015-09-24" "2015-09-25" "2015-09-28" "2015-10-01" "2015-10-02"

$`5`
[1] "2015-10-05"

$`6`
 [1] "2015-10-09" "2015-10-12" "2015-10-13" "2015-10-14" "2015-10-15"
 [6] "2015-10-16" "2015-10-19" "2015-10-20" "2015-10-21" "2015-10-22"
[11] "2015-10-23" "2015-10-26" "2015-10-27" "2015-11-04"

$`7`
[1] "2015-11-05"

$`8`
 [1] "2015-11-06" "2015-11-12" "2015-11-13" "2015-11-14" "2015-11-18"
 [6] "2015-11-19" "2015-11-20" "2015-11-23" "2015-11-25" "2015-11-26"
[11] "2015-11-27" "2015-11-29" "2015-11-30" "2015-12-01"

$`9`
[1] "2015-12-03"

$`10`
 [1] "2015-12-04" "2015-12-07" "2015-12-08" "2015-12-09" "2015-12-10"
 [6] "2015-12-11" "2015-12-13" "2015-12-14" "2015-12-15" "2015-12-16"
[11] "2015-12-17" "2015-12-18"

Mots caractéristiques des classes; documents paragons et spécifiques des classes

resCHCca$desc.doc
$para
Cluster: 1
 2015-06-26
          0
---------------------------------------------------------------------------------- 
Cluster: 2
 2015-07-03
          0
---------------------------------------------------------------------------------- 
Cluster: 3
2015-08-13 2015-07-30 2015-08-17 2015-08-20 2015-07-29 
 0.1020846  0.1136833  0.1444138  0.1480590  0.1749716 
---------------------------------------------------------------------------------- 
Cluster: 4
2015-09-02 2015-09-18 2015-08-27 2015-09-10 2015-08-24 
 0.1853107  0.1892581  0.2541155  0.3034671  0.3196016 
---------------------------------------------------------------------------------- 
Cluster: 5
 2015-10-05
          0
---------------------------------------------------------------------------------- 
Cluster: 6
2015-10-14 2015-10-23 2015-11-04 2015-10-26 2015-10-21 
 0.1237710  0.1490519  0.1779565  0.2173569  0.2261163 
---------------------------------------------------------------------------------- 
Cluster: 7
 2015-11-05
          0
---------------------------------------------------------------------------------- 
Cluster: 8
2015-11-13 2015-11-18 2015-11-27 2015-11-12 2015-11-26 
 0.2676283  0.2801455  0.3542808  0.3757317  0.4236230 
---------------------------------------------------------------------------------- 
Cluster: 9
 2015-12-03
          0
---------------------------------------------------------------------------------- 
Cluster: 10
2015-12-10 2015-12-07 2015-12-08 2015-12-17 2015-12-09 
 0.1309594  0.1680596  0.1951949  0.2660942  0.2874583 

$dist
Cluster: 1
2015-06-26 
 0.2131823 
---------------------------------------------------------------------------------- 
Cluster: 2
2015-07-03 
  7.136872 
---------------------------------------------------------------------------------- 
Cluster: 3
2015-08-21 2015-07-24 2015-07-27 2015-08-05 2015-07-23 
  2.629430   1.216489   1.139054   1.092672   0.974578 
---------------------------------------------------------------------------------- 
Cluster: 4
2015-09-25 2015-09-28 2015-09-17 2015-09-09 2015-08-26 
 0.8685128  0.4651223  0.4568006  0.4406112  0.4389585 
---------------------------------------------------------------------------------- 
Cluster: 5
2015-10-05 
  5.033687 
---------------------------------------------------------------------------------- 
Cluster: 6
2015-10-16 2015-10-09 2015-10-12 2015-10-19 2015-10-13 
 0.8140945  0.6009703  0.4087506  0.3753682  0.3601705 
---------------------------------------------------------------------------------- 
Cluster: 7
2015-11-05 
  3.733366 
---------------------------------------------------------------------------------- 
Cluster: 8
2015-12-01 2015-11-14 2015-11-20 2015-11-19 2015-11-25 
 1.4592005  1.1991258  0.9249853  0.6942094  0.5954441 
---------------------------------------------------------------------------------- 
Cluster: 9
2015-12-03 
  7.671268 
---------------------------------------------------------------------------------- 
Cluster: 10
2015-12-18 2015-12-14 2015-12-16 2015-12-15 2015-12-17 
 2.2896494  0.4742129  0.4319673  0.4017197  0.3848844 
resCHCca$desc.word
$`1`
          Intern %     glob % Intern freq Glob freq       p.value    v.test
afrique   15.38462  0.3243881           4         11 1.729873e-06  4.782664
lesmatins  0.00000 13.2114421           0        448 4.950895e-02 -1.964182

$`2`
          Intern %    glob % Intern freq Glob freq       p.value   v.test
pajol           32 0.2359186           8          8 5.030064e-18 8.652687
font             8 0.2654084           2          9 3.640700e-03 2.907724
personnes        8 0.4128576           2         14 8.997214e-03 2.612160

$`3`
                  Intern %     glob % Intern freq Glob freq       p.value    v.test
lesmatins      23.87566138 13.2114421         361        448 1.212671e-62 16.704635
martinsdété     1.45502646  0.6487762          22         22 3.523208e-08  5.513223
joannsfar       0.85978836  0.3833677          13         13 5.351529e-05  4.039719
garaud          0.85978836  0.3833677          13         13 5.351529e-05  4.039719
arctique        0.72751323  0.3243881          11         11 2.714631e-04  3.641112
primaires       0.66137566  0.2948983          10         10 6.110631e-04  3.426656
rouzioux        0.59523810  0.2654084           9          9 1.374994e-03  3.199849
michelbarnier   0.59523810  0.2654084           9          9 1.374994e-03  3.199849
hollydaysband   0.59523810  0.2654084           9          9 1.374994e-03  3.199849
christine       0.59523810  0.2654084           9          9 1.374994e-03  3.199849
cecileallegra   0.52910053  0.2359186           8          8 3.092822e-03  2.958359
adriengoetz     0.52910053  0.2359186           8          8 3.092822e-03  2.958359
quelques        0.79365079  0.4423474          12         15 1.137221e-02  2.531049
matin           0.79365079  0.4423474          12         15 1.137221e-02  2.531049
public          0.59523810  0.3243881           9         11 2.734524e-02  2.206554
marché          0.59523810  0.3243881           9         11 2.734524e-02  2.206554
françois        0.46296296  0.2359186           7          8 3.398405e-02  2.120261
crise           1.05820106  0.7077558          16         24 4.816714e-02  1.975891
rapport         0.06613757  0.2948983           1         10 4.905936e-02 -1.968075
gouvernement    0.06613757  0.2948983           1         10 4.905936e-02 -1.968075
car             0.06613757  0.2948983           1         10 4.905936e-02 -1.968075
travail         0.19841270  0.5013270           3         17 3.953393e-02 -2.058586
discours        0.06613757  0.3243881           1         11 2.954746e-02 -2.176104
guerre          0.39682540  0.7962253           6         27 2.728862e-02 -2.207364
élections       0.06613757  0.3538779           1         12 1.767291e-02 -2.372401
réécouter       0.00000000  0.2359186           0          8 1.765754e-02 -2.372722
reçoit          0.00000000  0.2359186           0          8 1.765754e-02 -2.372722
pol             0.00000000  0.2359186           0          8 1.765754e-02 -2.372722
passé           0.00000000  0.2359186           0          8 1.765754e-02 -2.372722
pajol           0.00000000  0.2359186           0          8 1.765754e-02 -2.372722
halakodmani     0.00000000  0.2359186           0          8 1.765754e-02 -2.372722
hakan           0.00000000  0.2359186           0          8 1.765754e-02 -2.372722
fculture        0.00000000  0.2359186           0          8 1.765754e-02 -2.372722
enard           0.00000000  0.2359186           0          8 1.765754e-02 -2.372722
attentats       0.00000000  0.2359186           0          8 1.765754e-02 -2.372722
cop21           0.13227513  0.4718372           2         16 1.425396e-02 -2.450799
france          0.85978836  1.4450015          13         49 1.372786e-02 -2.464307
penser          0.00000000  0.2654084           0          9 9.765671e-03 -2.584018
palmyre         0.00000000  0.2654084           0          9 9.765671e-03 -2.584018
médias          0.00000000  0.2654084           0          9 9.765671e-03 -2.584018
irak            0.00000000  0.2654084           0          9 9.765671e-03 -2.584018
font            0.00000000  0.2654084           0          9 9.765671e-03 -2.584018
personnes       0.06613757  0.4128576           1         14 6.215274e-03 -2.736203
entre           0.52910053  1.0911236           8         37 6.147358e-03 -2.739816
faut            1.78571429  2.6540843          27         90 5.862129e-03 -2.755395
espagne         0.00000000  0.2948983           0         10 5.399706e-03 -2.782168
après           0.00000000  0.2948983           0         10 5.399706e-03 -2.782168
questions       0.00000000  0.3243881           0         11 2.984931e-03 -2.969286
erriders        0.00000000  0.3243881           0         11 2.984931e-03 -2.969286
guillaumeerner  0.00000000  0.3538779           0         12 1.649660e-03 -3.146980
vote            0.00000000  0.3833677           0         13 9.114871e-04 -3.316512
syrie           0.06613757  0.5603067           1         19 4.241470e-04 -3.524585
worms           0.00000000  0.4423474           0         15 2.780675e-04 -3.634919
droite          0.13227513  0.7077558           2         24 2.675143e-04 -3.644882
gauche          0.00000000  0.5013270           0         17 8.474866e-05 -3.930559

$`4`
              Intern %    glob % Intern freq Glob freq       p.value    v.test
réécouter    1.4184397 0.2359186           8          8 1.123498e-06  4.868674
halakodmani  1.4184397 0.2359186           8          8 1.123498e-06  4.868674
hakan        1.4184397 0.2359186           8          8 1.123498e-06  4.868674
médias       1.0638298 0.2654084           6          9 2.205822e-03  3.061023
question     2.1276596 0.9731643          12         33 9.650021e-03  2.588124
élections    1.0638298 0.3538779           6         12 1.546540e-02  2.421293
direct       1.0638298 0.3538779           6         12 1.546540e-02  2.421293
réfugiés     0.8865248 0.2654084           5          9 1.755626e-02  2.374846
parce        0.8865248 0.2654084           5          9 1.755626e-02  2.374846
gouvernement 0.8865248 0.2948983           5         10 3.036947e-02  2.165238
personnes    1.0638298 0.4128576           6         14 3.733875e-02  2.082041
très         1.7730496 0.9141846          10         31 4.792485e-02  1.978034
migrants     0.8865248 0.3243881           5         11 4.819402e-02  1.975654
martinsdété  0.0000000 0.6487762           0         22 3.606256e-02 -2.096221
fait         0.3546099 1.3270422           2         45 2.662850e-02 -2.216921
guerre       0.0000000 0.7962253           0         27 1.441970e-02 -2.446634

$`5`
           Intern %     glob % Intern freq Glob freq       p.value    v.test
erriders  26.829268  0.3243881          11         11 3.760490e-22  9.677430
quand      9.756098  0.4718372           4         16 6.033055e-05  4.011514
comme      9.756098  1.2975523           4         44 3.522427e-03  2.918037
après      4.878049  0.2948983           2         10 1.207457e-02  2.509957
années     4.878049  0.3833677           2         13 2.045447e-02  2.317905
être       7.317073  1.1501032           3         39 2.218053e-02  2.287262
lesmatins  0.000000 13.2114421           0        448 5.779182e-03 -2.760054

$`6`
          Intern %     glob % Intern freq Glob freq       p.value    v.test
travail   2.601156  0.5013270           9         17 2.506484e-05  4.214215
questions 1.734104  0.3243881           6         11 6.402898e-04  3.413947
france    3.757225  1.4450015          13         49 1.790850e-03  3.122889
assiste   1.445087  0.2654084           5          9 1.914768e-03  3.103143
politique 3.179191  1.4155116          11         48 1.493833e-02  2.433871
droite    2.023121  0.7077558           7         24 1.615589e-02  2.405375
histoire  1.734104  0.5603067           6         19 1.851839e-02  2.355087
vie       1.445087  0.4128576           5         14 1.976315e-02  2.330814
doit      1.445087  0.4718372           5         16 3.634915e-02  2.093000
chômage   1.156069  0.3243881           4         11 3.931184e-02  2.060908
afrique   1.156069  0.3243881           4         11 3.931184e-02  2.060908
lesmatins 0.867052 13.2114421           3        448 2.073723e-18 -8.753208

$`7`
          Intern %     glob % Intern freq Glob freq       p.value    v.test
enard           16  0.2359186           8          8 2.496853e-15  7.913782
mathias         16  0.3243881           8         11 3.984897e-13  7.256073
monde            6  0.7372457           3         25 1.104446e-02  2.541289
reste            4  0.2948983           2         10 1.778413e-02  2.370082
rapport          4  0.2948983           2         10 1.778413e-02  2.370082
avant            4  0.4128576           2         14 3.463664e-02  2.112581
autre            4  0.4718372           2         16 4.482679e-02  2.006276
lesmatins        0 13.2114421           0        448 1.584959e-03 -3.158661

$`8`
            Intern %     glob % Intern freq Glob freq       p.value    v.test
worms       3.232759  0.4423474          15         15 1.811473e-13  7.362020
palmyre     1.724138  0.2654084           8          9 1.847596e-06  4.769417
guerre      2.586207  0.7962253          12         27 1.850018e-04  3.738663
terroristes 1.293103  0.2359186           6          8 2.794006e-04  3.633686
jeunesse    1.724138  0.4128576           8         14 3.266729e-04  3.593175
après       1.293103  0.2948983           6         10 1.640366e-03  3.148632
attentats   1.077586  0.2359186           5          8 3.685105e-03  2.903930
penser      1.077586  0.2654084           5          9 7.364636e-03  2.679890
france      3.017241  1.4450015          14         49 9.168952e-03  2.605690
syrie       1.508621  0.5603067           7         19 1.959422e-02  2.334029
museelouvre 1.077586  0.3243881           5         11 2.133416e-02  2.302018
kurdes      1.077586  0.3243881           5         11 2.133416e-02  2.302018
cop21       1.293103  0.4718372           6         16 3.026981e-02  2.166542
passé       0.862069  0.2359186           4          8 3.074565e-02  2.160349
moment      1.077586  0.3833677           5         13 4.704587e-02  1.985887
irak        0.862069  0.2654084           4          9 4.945046e-02  1.964687
lesmatins   2.586207 13.2114421          12        448 5.671493e-17 -8.371862

$`9`
          Intern %     glob % Intern freq Glob freq       p.value    v.test
pol       25.80645  0.2359186           8          8 3.668797e-17  8.423027
fculture  25.80645  0.2359186           8          8 3.668797e-17  8.423027
lesmatins  0.00000 13.2114421           0        448 2.422379e-02 -2.253561

$`10`
          Intern %     glob % Intern freq Glob freq       p.value    v.test
espagne   3.012048  0.2948983          10         10 1.430431e-10  6.412616
gauche    3.012048  0.5013270          10         17 1.477414e-06  4.814267
trump     2.409639  0.3243881           8         11 1.976353e-06  4.755827
droite    3.313253  0.7077558          11         24 1.044025e-05  4.407849
vote      2.108434  0.3833677           7         13 1.652978e-04  3.766884
questions 1.506024  0.3243881           5         11 4.904044e-03  2.813270
discours  1.506024  0.3243881           5         11 4.904044e-03  2.813270
cop21     1.807229  0.4718372           6         16 5.760264e-03  2.761125
élections 1.506024  0.3538779           5         12 7.739973e-03  2.663207
pose      1.204819  0.2359186           4          8 9.181227e-03  2.605231
obama     1.204819  0.3243881           4         11 3.412795e-02  2.118557
lesmatins 2.710843 13.2114421           9        448 8.810566e-12 -6.824706

attr(,"class")
[1] "descfreq" "list "   

Extraction des hashtags pour les utiliser comme colonnes supplémentaires de l’AC

Extraction des hashtags: Pour str_evtract_all

hashtags <- str_extract_all(tweets.sans.urls, "#\\S+")
hashtags <- hashtags[hashtags != "character(0)"]
length(hashtags) # 671 tweets ont 1 ou plusieurs hashtags
[1] 671

Un exemple :

hashtags[6] # "#Catalogne" "#Espagne"
[[1]]
[1] "#Catalogne" "#Espagne"  
hashtagsset <- unique(unlist(hashtags))
length(hashtagsset) # 204
[1] 204

Effacer de la ponctuation, sauf # :

hashtagsset <- gsub("[^#[:^punct:]]", "", hashtagsset, perl=T)
hashtagsset <- unique(sort(hashtagsset)) # 171 hashtags

A noter : #COP21 #cop21 ; #lematins #lesmatins #les ; #syrie #Syrie ; primaires #primairesamericaines ; #martindete #martinsdete ; etc. On les laisse pour avoir une analyse preliminaire sur ces donnees. Initialiser la matrice qui croise tweets par themes :

themes <- matrix(rep(0, length(tweets.sans.urls)*length(hashtagsset)),
nrow <- length(tweets.sans.urls), ncol = length(hashtagsset))
colnames(themes) <- hashtagsset
for (i in 1:length(hashtagsset)) { themes[grepl(hashtagsset[i], tweets.sans.urls), i] <- 1 }
dim(themes) #  
[1] 1198  171

Pour sélectionner les themes qui sont dans > 5 tweets

themes2 <- themes[, apply(themes,2,sum) > 5]
dim(themes2) #  
[1] 1198   16
# seulement 16 thèmes sont présents dans plus de 5 tweets:
colnames(themes2)
 [1] "#COP21"        "#Espagne"      "#finkielkraut" "#FN"           "#Klarsfeld"    "#kurde"       
 [7] "#les"          "#lesmatins"    "#martinsdété"  "#Obama"        "#palmyre"      "#primaires"   
[13] "#Russie"       "#Syrie"        "#Trump"        "#Turquie"     

Ici, on fait une etude par AC, avec les themes definis par les hashtags comme supplementaires.

dim(themes)
[1] 1198  171

Juxtaposition du jour et des thèmes

mat1 <- cbind(themes, tweet.ack.day)
dim(mat1)  
[1] 1198  174

Eliminer tweets vides

mat2 <- mat1[-as.numeric(resTD$remov.docs),]
dim(mat2) 
[1] 1134  174

Eliminer thèmes de frequence nulle

mat3 <- mat2[,-colSums(mat2[1:(ncol(mat2)-1)] == 0)]
mat4 <- mat3[, colSums(mat3 != 0) >0]
dim(mat4)
[1] 1134  165

Juxtaposition des mots selectionnès et des thèmes

mat5 <- cbind(as.matrix(resTD$DocTerm),mat4)
dim(mat5)
[1] 1134  367

Aggregate tweets par jour pour avoir ainsi tweet en ligne, en colonnes mots suivis de hashtags

ag2 <- aggregate(mat5[,c(1:(ncol(mat5)-3))], 
                  by = list(mat5[, ncol(mat5)]), FUN = sum, na.rm = TRUE)
dim(ag2)
[1]  90 365

CA from FactoMineR

ct <- CA(ag2, col.sup=c(204:365), quali.sup=c(1))

plot.CA(ct, invisible = c("row", "col", "row.sup", "quali.sup"),cex=0.8)

Représentation des hashtags ou thèmes présents dans plus de 5 tweets

plot.CA(ct, invisible = c("row", "col", "row.sup", "quali.sup"),cex=0.8, xlim=c(-1,1), ylim=c(-2,2),
col.col.sup="black", selectCol = colnames(themes2))

Représentation des hashtags les plus extrêmes

plot.CA(ct, invisible = c("row", "col", "row.sup", "quali.sup"),cex=1, xlim=c(-1,1), ylim=c(-4,2),selectCol = "coord 20")