Je pars du principe, que le fichier original provient d'une extraction directe depuis une base de données telle celle que le framework 140dev écrit par Adam Green et disponible sur son site permet de construire aisément (je remercie en passant F. Clavert de m'avoir expliqué tout ça il y a quelques temps). Ce fichier comporte les colonnes suivantes au moins : numéro d'identification unique d'un tweet, date de création du tweet, nom de l'auteur, pseudonyme (@)

s'il faut les extraire d'une base php/mysql comme 140dev, avant l'export il s'agit de mettre le tableau en forme avec :

SELECT `tweet_id` , `tweet_text` , `created_at` , `screen_name` , `name`
FROM `tweets`

[si vous utilisez l'interface de phpmyadmin, vous aurez probablement "WHERE 1" qui s'ajoutera, ainsi qu'une ligne du genre LIMIT : 0 to 30, ce n'est pas un problème]

Open/gggle Refine accepte un grand nombre de formats de fichiers au départ, partons du principe que l'on travaille en .csv.
Ne pas oublier de préciser le signe utilisé pour séparer les colonnes, si ce n'est pas déjà une virgule, (moi j'ulitise systématiquement le ; ) et l'encodage des caractères (car Refine, reprendra ces indications pour encoder le fichier final)
Il est essentiel de ne pas cocher la case proposant une reconnaissance automatiquement de la nature des contenus des colonnes ("parse cells text into numbers, dates, etc."), sinon Refine va se mettre à arrondir les identifiants des tweets ou pire à les exprimer sous forme xxx e17.

((/public/.REfine_twitoriel_m.jpg

l'opération va consister à :

  1. * -isoler les informations permettant de générer un graphe correcte les auteurs de tweets et leurs destinataires
  2. * -produire des informations supplémentaires permettant de qualifier chacun des tweets. Ces informations deviendront des informations permettant de tester la correspondance dans Gephi entre des caractéristiques de réseaux des noeuds ou des liens et des caractéristiques expressives ou documentaires des usages des tweets:


* = le type de tweets (si c'est un RT, si c'est un tweet adressé à la TL, ou à quelqu'un en particulier, un @, etc.)

  • = ainsi que les hashtags associées à chacun des tweets.


Extraction des mentions (@) et des hashtags(#)

windowREfine_twitoriel.jpg

l'extraction des mentions et citations est simple, il suffit d'opérer les commande suivante sur la colonne des tweets :

tout d'abord il s'agit de nettoyer les signes de ponctuations qui 'collent' régulièrement aux mentions et aux hashtags :

sur la colonne des tweets
clic sur /edit column / add column based on this column avec l'opération suivante

replace(value,/[\,\;\:\.\?\/\!\=\+\"\'\-\(\)\[\]]/," ")

clic sur /edit column/ add column based on this column avec l'opération suivante

replace(value,/(\s|^)([^\@]+)/,' ')

on peut renommer cette colonne 'Target'

dans la foulée, on recommence immédiatement l'opération (toujours à partir de la colonne des tweets) en créant une seconde colonne appelée '#' pour isoler cette-fois-ci les hashtags clic sur /edit column/ add column based on this column avec l'opération suivante :

replace(value,/(\s|^)([^\#]+)/,' ')

on peut réordonner les colonnes pour avoir la colonne des screennames en face de celle des mentions/'Target'
clic sur all / edit columns /reorder or remove columns


passage d'une liste de tweets à une base de relations

ensuite on doit passer en mode 'records' pour pouvoir autonomiser chacune des différentes mentions au sein d'une relation unique et distincte des autres mention du même tweet d'origine tout en manipulant comme des ensembles uniques et cohérents les différentes lignes ainsi créées :

sur la colonne 'Target' clic sur edit cells /common transform / trim leading and ending spaces ainsi que 'collapses consecutive spaces'
clic sur edit columns /split into several columns : on utilise l'espace comme caractère de séparation et on ne spécifie aucune valeur limite pour le nombre de colonne (en général il y en a une dizaine maximum de créées pour la longueur très limitée d'un tweet)

À ce moment une opération terrifiante doit être menée jusqu'à son terme, c'est la transposition des cellules ordonnées dans différentes colonnes en cellules ordonnées dans différentes lignes : alors que l'on vient de répartir l'ensemble des '@' de chaque tweets sur différentes colonnes, on va faire en sorte qu'ils restent au sein de la même entité que leur tweet d'origine, sans être inscrit pour autant sur la même ligne : en fait, on va les déplacer dans ce que l'on peut appeler des "sous-lignes", c'est-à-dire des lignes qui dépendent de leur ligne d'origine et ainsi former un 'record' contenant une ligne principale (avec le tweet d'origine) et des lignes différentes pour chacune des mentions/@ que comportait le tweet.

clic sur edit columns / transpose cells across columns into rows : on sélectionne la première et la dernière colonne des 'Target' (par ex. Target1 et Target9, on indique un nouveau nom de colonne pour (1column) : 'Target' de nouveau, par exemple, on coche 'ignore blank cells' et 'fill down in other columns'

remarque importante : si d'aventure, on a oublié de cocher 'fill down', alors on ne lance surtout pas l'opération de 'fill down' seule ensuite : les lignes vides pour la raison que le tweet ne contient véritablement aucun hashtag seraient malgré tout remplies par le hashtag de la ligne qui les précède... Donc si on a oublié de cocher la case 'fill down' dans la fenêtre,' un simple 'undo' fera l'affaire et permettra de recommencer la manipulation en entier

à partir de là, on peut déjà se lancer dans gephi, il suffit de changer le nom de la colonne 'screennames' en 'Source' d'enregistrer le tout en .csv et c'est parti !


séparer les hashtags

Sinon on peut prendre le temps de séparer les hashtags dans des colonnes différentes pour pouvoir plus tard les trier, et pour pouvoir les faire apparaître dans le graphe comme des caractéristiques des liens entre deux nœuds sur la colonne '#' clic sur edit cells /common transform //trim leading and ending spaces & ' collaspes consecutive spaces' clic sur edit columns /split into several columns : on utilise l'espace comme caractère de séparation et on ne spécifie aucune valeur limite pour le nombre de colonne (en général, il y a une bonne douzaine de colonnes créées)

là je n'ai pas encore réfléchi à la manière de les ordonner dans l'ordre alphabétique ou autre... il faut que je teste un peu l'usage dans gephi, et j'updaterai le post bientôt


Identifier les types de tweets

ce qui est intéressant avec open refine, c'est qu'à ce niveau-là il devient relativement aisé de qualifier les types de tweets à partir de leur syntaxe (NOTE : ces infos sont indicatives et il ne faut en aucun cas se fier uniquement et totalement à ce type de données par la suite, je développerai plus tard si besoin... En somme elles permettent d'évaluer grossièrement la nature du corpus, rien de plus...) : l'objectif ici consistera à distinguer dans une même colonne 'types', les retweets (RT), des tweets adressés à certaines personnes tels que les mentions @ (AT), des tweets adressés de façon générale aux followers d'une timeline (TL)
(NOTE : il est probable que cette liste évolue, après discussion avec C. Prieur / @twytof il manquerait le type des tweets avec mention ET url, j'updaterai ASAP)

en reprenant la colonne des tweets clic sur facet /text filter (case sensitive), on indique 'RT' comme valeur

il est possible que des erreurs se glissent (les caractères'PORTE' dans un tweet répondront positivement à ce filtre) mais la proportion n'est pas importante, surtout que nombre des RT sans mention sont des demandes de RT le plus souvent. Sinon il suffira d'écrire une regex plus précise
[UPDATE : en régie, C. Prieur m'indique que sous unix/linux/etc., l'usage de <RT> évite la correspondance avec des caractères inclus dans un mot entier comme "PORTE", à tester sous Refine, donc]

clic sur /edit column/ add column based on this column : on l'appelle 'type' puis on tape 'RT' et on déselectionne le filtre de texte

sur la colonne 'Target'
clic sur facet/ customized facet /facet by blanks : on inclut les 'true' pour n'afficher que les tweets qui ne comportent pas de mention

sur la colonne 'Types'
clic sur facet/ customized facet /facet by blanks : on inclut les 'true' pour n'afficher que les tweets qui ne sont pas déjà des RT ou des demandes de RT
clic sur edit cells/trasform... puis on tape 'TL' et on déselectionne le filtre de texte

enfin toujours sur la colonne 'Types'
facet/ customized facet /facet by blanks : on inclut les 'true' pour n'afficher que les tweets qui ne sont pas déjà des RT ou des demandes de RT ou des adresses aux TL uniquement
clic sur edit cells/transform... puis on tape 'TL' et on déselectionne le filtre de texte

voilà, c'est déjà une bonne base pour explorer ensuite le graphe dans gephi... même si à ce stade les interprétations plausibles sont nombreuses (trop) et donc fragiles (très) ;-) , il faudra alors se pencher sur la forme et les usages qui sont fait des tweets récoltés, il faudra prendre en compte les singularités du corpus de tweets, qui peuvent pour le coup contrecarrer toute méthode de traitement des données bêtement appliquée sans une once de problématisation

Il reste encore à exporter le fichier, tel qu'indiqué au milieu du post, et choisir un bon algorithme de visualisation, le Force Atlas 2 étant devenu une norme pour ce qui concerne la visualisation des tweets, ce qui n'est peut-être pas si évident que cela (Martin Grandjean propose de le cumuler avec fruchtermann-Rheingold sur des petits réseaux). En tout cas, voici, en dessous, la première visualisation (particulièrement touffue) dans gephi d'un graphe de 20.000 nœuds et environ 80.000 liens pondérés, qui représente un corpus d'environ 120.000 tweets et 20.000 twitters (chacun des tout petits points bleus représente une personne qui twitte). Sur ce type de corpus, l'usage de l'algo OpenOrd peut être intéressant ... le travail ne fait donc que commencer, bien entendu...

Gephi_twitoriel.jpg