Collecter des tweets à partir d'une liste de hashtags
Dans le billet précédent, je suis revenu sur les conditions dans lesquelles il est intéressant de faire la sociologie d'un événement, de tenter de suivre ce qu'il se passe dans une situation d'ampleur et de voir ce qu'il est possible d'en comprendre au fur-et-à-mesure. j'ai repris ensuite les interventions duworkshop just-in-time-sociology pour en lister, synthétiser les points méthodologiques et épistémologiques principaux que soulèvent les événements contemporains de plus en plus liés, soit dans leur développement soit dans leur couverture médiatique et le plus souvent les deux, aux technologies numériques, web et réseaux sociaux en première ligne. J'ai fini ce précédent billet en introduisant la collecte de tweets contenant les hashtags #manifpourtous et #mariagepourtous que j'ai engagée à la fin de l'hiver avec F. Clavert, collecte qui est en train de donner lieu à une petite étude menée en compagnie de M. Cervulle.
Dans le cas de cette étude, un faisceau de 4 dimensions nous a mené à travailler sur des corpus de tweets :
- Twitter est un site de réseautage qui, contrairement à d'autres, offre l'accès à une certaine portion des données qui passent par ses serveursil faudra revenir sur le fait que cet accès étant facilité par rapport à facebook, twitter tend à devenir la solution-clé-en-main au datamining d'actualité, ce qui est, pour le coup, un réflexe qui mérite des remarques, critiques pour la plupart.
- Nous n'étions pas capables techniquement de collecter des données issues d'un autre site que twitter : le format court et la syntaxe très structurée des tweets sont relativement faciles à manipuler (cf. ce tutoriel sur l'organisation d'un corpus de tweets pour générer un graphe),plus facile à manipuler que les contenus d'un forum par exemple, sans que l'analyse en soit véritablement simplifiée pour autant.
- Se pencher sur twitter permet d'offrir une place à l'expression d'acteurs qui ne sont ni des dirigeants de parti politiques, ni des idéologues médiatisés sans pour autant que l'observation se situe au beau milieu d'une foule de manifestants...
- Last but not least : les internautes utilisent twitter parmi d'autres réseaux sociaux, mais l'utilisent en priorité dès lors qu'ils commentent la télévision ou les événements en direct, car il s'y est développé une véritable culture du LiveTweet. Dans cette dynamique, les utilisateurs de twitter se sont servi du réseau très largement à l'occasion des débats sur le mariage pour tous, au point de générer des formes de pratiques jusque là totalement inédites en France. Ceci fait de twitter non seulement un objet de médiatisation des événements qui nous intéressent ET un élément de transformation même de ces événements.
Déployer les outils de collecte et... faire comme on peut.
Comment avons-nous entamé cette collecte ? F. Clavert avait ouvert la voie fin janvier 2013 en utilisant un ensemble de scripts php, le framework 140dev. Connecté à l'API twitter, celui-ci demande de spécifier une liste de mots significatifs qui va déterminer la collecte. Une fois cette liste indiquée, le script sélectionne les tweets contenant ces mots dans le flux de tweets que twitter met à disposition du public, et les archive dans une base de données accessible par une interface simplifée , c'est-à-dire, pour faire vite, un gros fichier ou un gros tableau de type libre-office Calc ou microsoft excel, qui enregistre un tweet par ligne, avec son identifiant dans une première colonne, le nom de l'auteur du tweet dans une deuxième colonne, le tweet lui-même dans une troisième, la date et l'heure dans une quatrième, etc. ainsi de suite. Le tableau gagne une ligne à chaque nouveau tweet contenant un mot-clé requis au départ repéré par l'API de twitter et copié par le script 140dev. Au final, il est possible soit de faire des requêtes directement dans la base de données, soit d'exporter les informations ainsi collectées et les explorer à l'aide d'autres méthodes et d'autres logiciels.
La première installation des scripts de 140dev en janvier avait largement sursauté, ne collectant des tweets que de temps à autres, et, le reste du temps, plantant pour des raisons obscures. À la fois par manque de temps pour trouver ou (apprendre à) coder un outil adapté à l'API de twitter et par manque de moyens (puisque nous n'avons pas engagé cette collecte à partir des services informatiques de nos labos/universités respectifs), nous avons continué à utiliser cet ensemble de scripts, qui avait somme toute l'avantage d'être facile à comprendre et donc facile à utiliser. Afin d'éviter de perdre des heures de tweets si d'aventure le serveur s'acharnait à planter en douce nous avons simplement triplé la capture : le script était installé sur 2 serveurs à distance chez deux hébergeurs différents et sur un serveur privé chez F. Clavert, et à chaque fois nous avions créé une base de données différente. Il faut imaginer que la surveillance d'un captage de flux de tweets peut être tout à fait désespérante : tout va bien pendant 3 jours, alors qu'on vérifie 10 fois par jour l'état du serveur, et c'est au moment d'une réunion de 4h, d'une sortie au ciné, ou encore d'une nuit de sommeil, que le serveur décide de ne plus être en mesure de fournir la cadence, et s'interrompt.
J'ai bien installé un système de monitoring qui m'envoyait un message sur mon téléphone lorsque le serveur plantait, mais c'est ce même système qui a commencé par faire planter le serveur o_0 , donc, j'ai laissé tomber et me suis résigné à passer les 3 mois suivants à vérifier-si-le-serveur-n'avait-pas-planté chaque fois que j'approchais un ordinateur ou un téléphone mobile (qui reste un ordinateur - mais plus petit - malgré les efforts des marques pour faire croire le contraire)... Parfois, l'incompétence technologique (la mienne) peut être compensée par un investissement en temps ou en attention (les miens). Et, si il est assurément plus confortable de bénéficier de technologies stables et bien contrôlées, cela n'invalide pas les montages fragiles techniquement tant qu'ils font leur office, ici, ramasser des tweets (au détriment de ma tranquilité...). Au final, nous avons constitué un corpus d'environ un million six cent mille tweets sur la période de mi-mars à début juin. La première opération faite sur les données a consisté à panser la base de données la moins "percée" avec des morceaux des autres captages. Grâce à cette triple collecte, nous n'avons subi aucune perte et le corpus ne comporte pas de blancs dans sa chronologie.
Qu'est-ce qu'un corpus construit à partir d'une liste de hashtags ?
À quoi correspond ce genre de corpus ? Comme je l'ai dit plus haut, les tweets sélectionnés sont extraits d'un flux contenant l'ensemble des tweets, et sont sélectionnés en fonction des mots qu'ils contiennent. Le branchement sur l'API de twitter fait que nous avons obtenu un corpus de tweets qui contenaient chacun un ou plusieurs mots d'une liste que nous avions préalablement établie. En effet, l'un des principes de twitter réside dans le fait que l'on peut soit lire les tweets produits par une seule personne (sa timeline), soit lire les tweets contenant un même hashtag, un même mot-clé, #manifpourtous, par exemple. Cette indexation est volontaire, c'est-à-dire qu'elle indique l'envie de l'auteur que son tweet soit lu au beau milieu des tweets contenant le même hashtag et pas seulement lu comme SON tweet à lui. En conséquences de quoi, notre corpus existe parce que des gens ont utilisé un mot dans un tweet, voire l'on désigné comme un mot important et spécial, en lui assignant un # pour le transformer en hashtag et ainsi participer à une activité collective d'indexation des tweets.
Ce point est déterminant pour comprendre le statut du corpus que l'on a construit et cadrer les hypothèses que l'on pourra formuler par la suite : nous n'avons pas collecté l'ensemble des tweets qui évoquent le débat sur le mariage des personnes de même sexe, nous avons collecté les tweets qui mentionnent des mots spécifiques, le plus souvent des noms propres, des substantifs spéciaux ou des phrases compactes, qui représentaient selon nous les éléments forts de ce débat, des mots tels que #manifpourtous, #mariagepourtous, #veilleurs, #directsenat, #manifdelahonte, et une dizaine d'autres. Nous supposons que nous couvrons une bonne part des échanges liés à ce débat, mais nous ne pouvons considérer notre corpus ni comme exhaustif, ni comme lieu neutre d'un débat définissant ensuite des parties adverses. Au contraire, c'est parce qu'il existe des mots qui marquent déjà une adversité, qui marquent déjà un usage collectif quel qu'il soit, que nous avons eu l'occasion de collecter les tweets. La nuance peut sembler tirée par les cheveux au regard des mentions massives de #manifpourtous et #mariagepourtous, qui ont bien entendu structuré les échanges et la production discursive lié à la question du mariage.
Elle devient vraiment essentielle dès lors que l'on s'intéresse à des notions ou des événements qui ne sont même pas mentionnés comme hashtags au départ, émergent de façon lente et paraissent d'abord tout à fait secondaires, et, parfois, prennent suffisamment d'ampleur à un moment donné pour devenir un hashtag, et parfois même encore un hashtag qui s'autonomise de ceux qui l'ont "incubé" au départ. Si ces nouveaux hashtags apparaissent au sein d'un hashtag que nous avions déjà commencé à capter, alors nous avons eu de la chance. Dans le cas contraire, c'est par la presse, la consultation de twitter ou les suggestions d'autres personnes (suivant, elles, des personnes sur twitter très différentes que celles que nous suivions nous-mêmes) que nous penseront à enregistrer les tweets contenant un nouveau mot-clé, mot-clé, qui, peut-être ne fera pas long feu du tout. Il faut préciser ici que nous avons augmentée notre liste de mots-clés au fur-et-à-mesure de la collecte quand les événements mettaient en avant un nouveau type de hashtag par exemple (l'apparition des #veilleurs courant mars, par exemple). Dans ce cas, il est tout à fait possible que le hashtag ajouté soit déjà présent dans le corpus avant la date de son ajout à la liste, car indirectement collecté au côté d'un hashtag que nous avions déjà listé avant lui. Il est important alors de pouvoir retracer l'historique et le caractère (involontairement) ciselé d'un corpus, qui, parce qu'il est suffisamment gros pour ne pas être lisible de part en part par une seule personne donne rapidement l'impression de contenir la totalité de ce qui est lié à l'événement ayant présidé à sa constitution.
De la même manière, si l'on peut envisager que les corpus constitués autour de gros hashtags sont complets, l'idée que la pertinence de l'API stream de twitter ne soit pas toujours au rendez-vous (comme tendent à l'indiquer Mortstatter et al. dans 'Is the Sample Good Enough? Comparing Data from Twitter’s Streaming API with Twitter’s Firehose" . En fait c'est plus compliqué que cela, twitter fourni un matériau exhaustif[ si le nombre de tweets pour une requête ne dépasse pas le nombre de tw produit par jours au-delà il ne fournit plus qu'un pourcentage ](https://dev.twitter.com/docs/faq\#6861|en](https://dev.twitter.com/docs/faq#6861). dans notre cas, il est probable que les corpus #mariagepourtous et #manifpourtous soient complets dans le sens où l'on ne pouvait pas en récupérer plus, mais pas exhaustifs au sens où l'on aurait collecté tous les tweets produits avec l'un de ces hashtags , ainsi que tous les autres hashtags, il serait bien prétentieux de statuer sur l'ensemble des hashtags présents dans notre collecte. En fait, il faut retenir que la politique de twitter est relativement obscure quant à la constitution de l'échantillon mis à disposition des utilisateurs. Par ailleurs, du côté des pratiques des internautes, il faut d'abord imaginer qu'il arrive régulièrement qu'une personne associe plusieurs hashtags au sein d'un même tweet, dans ce cas, soit notre script cherchait déjà à collecter l'ensemble de ces mots, soit il cherchait à n'en collecter qu'un seul, et se retrouve à en enregistrer d'autres, comme bonus. Si ces hashtags collectés indirectement sont tout à fait importants pour analyser les contenus des tweets enregistrés et se faire une idée de l'insertion du débat dans un paysage sémantique plus vaste, on ne peut en aucun cas présumer de leur envergure, ni de la proportion qui occupe chez eux le croisement avec les hashtags que nous avons collectés en première instance. Ainsi, deux exercices s'offrent à nous : tenter de dessiner une carte des associations systématiques, des croisements hasardeux ou humoristiques, des chevauchements problématiques de hashtags au sein du corpus que l'on a construit, et par ailleurs tenter de lister, a posteriori, ceux des hastags ou des mots importants en général que l'on a raté, ou pris au sérieux seulement en cours de route.
Une fois que l'on arrive à se représenter la forme intriquée de ce corpus de tweets, il reste nécessaire de se rappeler que les mots ne signifient pas systématiquement quelque chose de figé à jamais. Au contraire, l'indexation des tweets à l'aide des hashtags est prise dans des pratiques conversationnelles, dans des tensions qui ne reposent pas sur une adversité brute ou une sympathie sans faille, mais au contraire se nourrissent d'humour, d'ironie, d'erreurs aussi. L'idée même que des tweets soient retweetés est assez riche en complexité pour engager nombre de questions qui doivent trouver une nouvelle réponses à chaque nouvelle étude : comme l'expliquent boyd, Golder et Lotan dans leur article sur le retweet comme activité conversationnelle le fait de reproduire un message rédigé par quelqu'un et de l'envoyer à sont tour peut être investi d'une variété de significations : promouvoir, présenter un avis sans y adhérer pour autant, solliciter l'attention de l'auteur, participer à une conversation autour d'un hashtag même si l'on ne se sent pas d'exprimer soi-même son opinion, etc. Bref, il ne faut pas considérer qu'une analyse de la répartition des hashtags suffirait à donner une idée de ce que pensent les internautes, de ce qu'ils en disent, etc. L'exemple le plus simple reste tout simplement, que l'on ne sait pas, lorsque l'on ne fait que compter les effectifs d'un hashtag comme #manifpourtous, s'il est employé comme signe d'appartenance, comme signe "d'adressivité" dirait Honeycutt & Herring dans une forme équivalente au @nomdutilisateur mais désignant cette fois-ci un collectif vague. j'en reparlerai dans un prochain billet.
Collecter des données antérieures à notre propre collecte et composer avec des matériaux hétérogènes
Revenons entre temps à notre corpus de tweets. Aussi complexe soit-il en terme d'imbrication des hashtags, ce corpus, seul et sur la période de courant Mars à début Juin, ne raconte pas grand chose de l'événement qui fut le point de départ de la collecte. En effet, malgré son poids certain, il ne couvre pas la période du premier débat à l'Assemblée Nationale tout début février, qui a pourtant vu se déployer le rôle central de twitter à la fois dans les débats entre les députés à l'Assemblée, et dans la capacité à commenter et interagir, le plus souvent en direct, des internautes avec les députés. Il ne couvre pas non plus la période des manifestations de 2012 et d'avant mars 2013. Heureusement, le concours de personnes extérieures a permis de compenser en partie les inconvénients. Jonathan Chibois, anthropologue qui a pris pour terrain de sa thèse l'Assemblée Nationale , nous a offert différentes opportunités. Nous avons ainsi pu bénéficier de son expertise sur les usages de twitter par les députés, mais en plus, il nous a mis en contact avec l'association RegardsCitoyens qui, entre autres activités, constitue de façon systématique une archive du hashtag #directAN, le fil twitter des gens qui commentent... les débats à l'assemblée, tous les débats, tout au long de l'année. De cette façon nous avons pu extraire 2 nouveaux sous-corpus comprenant environ 100.000 tweets pour chacun des passages à l'Assemblée. C'est une chance et une misère à la fois.
C'est une archive qui est tombée "just-in-time", pour le coup, puisque nous récupérions alors le moyen de définir différents sous-corpus facilitant la comparaison de ce qu'il s'est passé en février à l'assemblée, puis en avril au sénat, puis de nouveau à l'assemblée pour la seconde lecture de la proposition de loi, avant le passage final devant le conseil constitutionnel. Ces petites unités de corpus, couvrant chacune une quinzaine de jours maximum, facilitent à la fois la manipulation formelle des corpus (réagencer les colonnes de données, formater et normaliser les caractères ou les syntaxes des tweets ou des dates, etc.) et offrent les moyens d'une comparaison statistique entre les tweets des différents périodes couvertes : alors que nous étions en possession des seuls tweets correspondant aux débats d'avril (sénat puis assemblée pour le 2nd passage), sans pouvoir les comparer véritablement, il devient envisageable, si besoin, de chercher à identifier des logiques spécifiques aux deux débats de l'assemblée Nationale que l'on ne retoruverait pas, ou différemment, dans le débat au sénat. En revanche, si l'archive du #directAN nous épargne bien des soucis techniques en compensant le fait que nous n'ayons même pas pensé à utiliser en février l'APIsearch de twitter pour retrouver des traces du 1er débat à l'assemblée Nationale, le fait que nous ne l'ayons pas anticipée dans nos propres collectes créé quelques complications.
En effet, d'abord, le corpus aimablement fourni par Regardscitoyens n'a pas été collecté de la même manière que nos propres corpus, puisque RegardsCitoyens utilise un gazouilleur branché sur les services de IceRocket puis Topsy pour faire sa veille et que nous sommes bien en peine d'évaluer l'ampleur des différences de résultats. Il nous faudra donc tenter de comparer sur une période test les résultats des deux méthodes avant d'engager quelques comparaisons que ce soit. Ensuite, la veille de RegardsCitoyens étant uniquement centrée sur le hashtag #directAN tout en étant notre seule source stable couvrant cette période de février 2013, le corpus produit ne permet pas d'évaluer si les hashtags #manifpourtous et #mariagepourtous étaient alors peu ou beaucoup utilisés en dehors des LiveTweets avec #directAN. Sur le même principe d'imbrication des hashtags et de la découpe que génère la collecte "par hashtags" de l'APIstream de twitter que j'ai évoqué plus haut, la circonscription automatique du corpus #directAN ne nous permet à aucun moment d'avoir un panorama plus large que ce qui concernait la retransmission en direct des débats entre les députés (selon l'idée que la présence d'un hashtag dans un tweet désigne la volonté de participer à une indexation collective de la part de l'auteur du tweet). Si nous observons bien la présence des deux hashtags #manifpourtous et #mariagepourtous dans ce sous-corpus autour de #directAN, ils sont la trace des seuls utilisateurs qui désiraient les associer au commentaire des débats à l'assemblée Nationale, par exemple, soit pour affirmer la liaison entre les débats et leur propre préférence pour l'un des deux #manifpourtous ou #mariagepourtous, soit pour lier aux débats de l'assemblée des propos tenus sous le joug de l'un ou l'autre des hashtags.
Dans tous les cas, le corpus ne nous autorise aucunement à extrapoler de ce qui a pu se dire "en général" à l'aide de l'un des deux hashtags principaux, et ce même si on peut les compter par dizaines de milliers, et nous ne pourrons pas comprendre dans quel contexte global l'usage du #directAN s'est placé, en tant que hashtag secondaire/temporaire, s'il a occupé momentanément tout "l'espace" des hashtags #manifpourtous et #mariagepourtous, ou bien seulement l'un des deux, etc. Nous devons garder à l'esprit que si des tweets ont bien contenu ces hashtags sans contenir en même temps #direcdtAN, c'est problablement qu'il y avait une raison, cependant le déroulement et les logiques techniques et contingentes de notre collecte nous empêchent de la dessiner... Toutefois, nous ne sommes pas totalement démunis, puisque nous pourrons aisément comprendre la place que les LiveTweets on pris durant les débats d'avril au sénat et les débats lors du retour en seconde lecture à l'assemblée de la proposition de loi, puisque nous avons pu, cette fois-ci produire des corpus comprenant à la fois les hashtags des LiveTweets et ceux plus vastement employés des anti- et des pro- mariage pour tous.
Voici à peu près les éléments essentiels qui ont participé à notre collecte de tweets à propos de #mariagepouttous et #manifpourtous. J'aborderai dans le prochain post les opérations qu'il m'a fallu engager, à partir de là, pour nettoyer ce matériau, définir les corpus de tweets les plus pertinents, etc., ainsi que l'impact de ces manipulations sur la manière dont on pourra interroger les tweets récoltés.
(à suivre...)