{"word_count": 2137, "character_count": 14411}
Il y a quelques années (en décembre 2010, pour être précis), Josquin Debaz avait rédigé un billet sur le réseau des blogs de la plateforme Hypothèses, “Hypothesosphère”, où il reconstituait le réseau des blogs indexés par la plateforme à partir des hyperliens entre les articles de ces blogs. Je me suis demandé si ça ne valait pas le coup d&#8217;actualiser son analyse, en récoltant des données permettant d&#8217;assembler ce réseau à différents points temporels, puis d'identifier les thèmes traités par les communautés qui forment ce réseau.Le résultat montre qu&#8217;environ un tiers des blogs de la plateforme Hypothèses a, au moins une fois, renvoyé ses lecteurs vers un autre blog de la plateforme. Au cours des années 2009 à 2015, la plateforme s&#8217;est enrichie de nombreux blogs, ce qui donne, même lorsque l&#8217;on se concentre sur un échantillon de ces blogs, comme ci-dessous, un réseau qui contient de nombreuses “sous-communautés” (linguistiques, notamment), et quelques blogs (dont Polit'bistro !) nettement plus centraux que les autres :Cliquer le graphe ci-dessus pour la version PDF plus lisible, où l'on aperçoit clairement le blog des concepteurs de la plateforme (en plein milieu), ainsi que la partie germanophone d'Hypothèses (au sud). Ci-dessous, une longue notice technique, avec une visualisation temporelle du réseau à chaque année d'existence de la plateforme, et une modélisation des thématiques abordées dans les billets de chacune des communautés au fil du temps.Échantillonnage des donnéesDepuis le billet de Josquin Debaz, l&#8217;index d&#8217;Hypothèses s&#8217;est beaucoup enrichi, et a aussi certainement changé au niveau du code, car les “vieux” billets (ceux de la page 300, par exemple) n&#8217;y sont pas indexés comme les nouveaux. Du coup, pour actualiser l&#8217;Hypothesosphère, mieux vaut peut-être passer par le catalogue OpenEdition, qui recense actuellement 1 071 blogs dont on peut ensuite récupérer les articles&#160;:Pour effectuer cette dernière opération, j&#8217;ai simplement essayé de lire chaque “page” de chaque blog, de la première à la dernière. Certains blogs, comme celui-ci par exemple, n&#8217;utilisent pas de pagination (ce que l&#8217;on peut raisonnablement considérer comme un événement survenant de manière aléatoire parmi les blogs de la plateforme), et sont en conséquence exclus de l&#8217;échantillon que l&#8217;on va constituer ((Le meilleur moyen de travailler sur l&#8217;intégralité de la base serait bien sûr de l&#8217;obtenir auprès de la plateforme (à laquelle je contribue très épisodiquement), mais le texte intégral pèse certainement trop lourd pour pouvoir être facilement transféré. De plus, la base intégrale doit contenir les brouillons des articles des blogs, ou ceux publiés de manière privée. Pour ne pas rentrer dans ces problèmes, je n&#8217;ai accédé qu&#8217;aux données publiques de la plateforme.)).Dans un premier temps, il faut donc lister les blogs et essayer de lister tous leurs articles. En une demi-heure d&#8217;essais-erreurs avec le code HTML des blogs, qui tournent tous sur WordPress mais pas avec les mêmes gabarits et donc avec des balises HTML différentes, j&#8217;en suis arrivé à ce script, qui est certainement plus lent que celui qu&#8217;a rédigé Josquin Debaz (en Python), mais qui fonctionne suffisamment bien sur la plateforme Hypothèses actuelle.Le résultat est un échantillon qui contient 622 blogs, soit 60 % du catalogue total d&#8217;OpenEdition, et un total de 77 608 articles, soit 124 articles par blog en moyenne ((En relançant le script plusieurs fois pour pallier aux erreurs réseau, je suis arrivé jusqu'à 885 blogs et 104 844 articles, soit 118 articles par blog en moyenne.)). Si l&#8217;on compare les années de création des blogs du catalogue OpenEdition à celles des blogs contenus dans l&#8217;échantillon, les différences de proportion de chaque année à l&#8217;intérieur de chaque groupe sont minimes et aléatoires, ce qui est plutôt bon signe pour la qualité de l&#8217;échantillon.AnnéeCatalogue%Échantillon%20097676510201081861102011138137813201228226149242013233221181920141261261102015133128814Construction des réseaux temporelsDans un second temps, il faut ensuite scanner le contenu des articles des blogs sélectionnés, et en extraire les liens vers des adresses de blogs hébergés sur Hypothèses. Alors que l&#8217;opération précédente n&#8217;a pas demandé plus de quelques heures, celle-ci risquait de prendre beaucoup plus longtemps, étant donné la quantité de données à parcourir. Du coup, j&#8217;ai à nouveau échantillonné dans les données, en ne téléchargeant que 25% des 77 608 articles, soit 19 402 articles ((Il est fortement recommandé, à ce stade, de laisser une seconde entre chaque téléchargement, pour ne pas stresser la plateforme.)).Vu que l&#8217;on va vouloir observer la manière dont l&#8217;Hypothesesosphère a changé au cours du temps, on va ensuite scanner ces articles pour y trouver les inter-citations entre blogs, en notant également la date de parution des articles et le nombre d&#8217;inter-citations par article, qui pourra faire office de coefficient de pondération si besoin. Je ne vais pas jusqu&#8217;à sous-échantillonner pour limiter le nombre d&#8217;articles par blog, mais c&#8217;est envisageable ((Cette étape serait nécessaire si l&#8217;on souhaitait contrôler (éliminer) les différences de volume de publication d&#8217;une année sur l&#8217;autre, de manière comparer des probabilités d'occurrence (ou plutôt, des écarts par rapport à une hypothèse d'équiprobabilité, qui peut s'estimer de différentes manières) dans chacun des réseaux temporels.)).Enfin, on va écrire le code de visualisation de l&#8217;Hypothesesosphère de chaque année, en mettant des couleurs sur les huit “communautés” de blogs les plus larges, que l&#8217;on identifie grâce à un algorithme qui maximise la modularité (le degré de ségrégation) du réseau. Le code ressemble fortement à ce que j&#8217;ai déjà décrit dans plusieurs billets précédents, et notamment dans ce petit tutoriel, qui couvre aussi la récupération des données.Ci-dessous, un exemple de visualisation produit par ce code. Je dis “exemple” car le placement des blogs est en partie aléatoire, comme l&#8217;exige n&#8217;importe quel algorithme de placement à force dirigée. À noter aussi : la visualisation ne montre pas que le réseau est dirigé, mais il suffit de faire attention à la couleur des liens pour la deviner (lorsque les liens sont plus foncés, c&#8217;est qu&#8217;ils sont réciproques : les blogs se font mutuellement référence). Pour obtenir un résultat plus exhaustif, il suffit d&#8217;augmenter le seuil précité de 25%, ce qui permettra de scanner un plus grand nombre d&#8217;articles, et donc potentiellement de rendre l&#8217;Hypothesesosphère de chaque année un peu plus dense. Le seuil que j'ai choisi devrait toutefois suffire pour se faire une première idée de ce à quoi ressemble le réseau complet des inter-citations entre les blogs de la plateforme.Modélisation des communautésLes réseaux présentés ci-dessus contiennent des blogs, liés entre eux par des articles. Chacun de ces articles contient des mots-clés, ou a minima une catégorie qui correspond, elle-même, à un mot-clé. La plupart des mots-clés sont en français, sauf dans les sous-communautés linguistiques d'Hypothèses, qui utilisent des mots-clés, en allemand, en anglais, en espagnol.De plus, on a segmenté chaque réseau de manière algorithmique, en communautés optimales. Par conséquent, il est facile de créer des groupes de mots-clés correspondant à une communauté de blogs connectés par leurs inter-citations, ce qui est ici une manière de passer de la forme “réseau” à la forme textuelle en intégrant l'information structurelle du réseau dans la constitution du corpus textuel.On va donc représenter les données de nos réseaux temporels sous la forme d'un corpus, où chaque document correspond aux mots-clés d'une communauté. Le corpus produit par cette opération contient autant de documents que n'apparaissent de communautés au fil des sept années d'existence de la plateforme, soit un corpus de 127 documents : 3 pour 2009, 7 pour 2010, jusqu'à 29 documents pour 2015.On peut nettoyer des documents de manière approximative, en nettoyant les termes comme s'ils étaient tous français—ce qui n'est pas très grave : la langue va, quoique l'on fasse, fortement discriminer les communautés de blogs non francophones. Et enfin, on envoie ces documents à un topic model structurel, qui, un peu comme dans cet exemple, prend en compte l'année et la communauté de chaque document ((Très grossièrement, un topic model structurel est un topic model (soit une technique de regroupement de termes discriminants en thèmes, ou topics) qui peut prendre en compte de l'information supplémentaire sur les documents (des “méta-données”, comme ici l'année de “parution” du document formé par les mots-clés, et la communauté qui a “produit” ce document cette année-là, au fil de ses billets de blogs). Pour des exemples de topic models, cf. cette synthèse, cet article, et ce projet, sur le même thème que ce billet.)).Le résultat de cette opération sera un certain nombre de “thèmes” traités par les sous-communautés d'Hypothèses, identifiés à partir de quelque chose qui se rapproche d'un modèle multi-niveaux quant au type d'information qu'on fournit à l'estimateur. Le nombre de thèmes identifiés est arbitraire : j'ai choisi d'en identifier 20, un chiffre proche du nombre moyen de communautés identifiées dans chacun des réseaux (18) ((À noter : il y a de plusieurs manières d'identifier le nombre de thèmes à rechercher dans un corpus. Certaines d'entre elles sont expliquées dans les documents cités dans la note précédente.)).Résultats : les thèmes de l'HypothesesosphèreDans les résultats ci-dessous, chaque ligne correspond à un regroupement thématique, ordonné du plus au moins fréquent dans le corpus, et représenté par ses trois premiers mots-clés (sans les suffixes, qui ont sauté au nettoyage). On aperçoit les thèmes constitués autour des billets en langue allemande, ou ceux créés autour de zones géographiques (“chin” ou “arab”) :On aperçoit aussi, dans les thèmes, certains sujets bien précis : “polit” et “scienc”, par exemple, dans le thème n°2, correspond au séminaire “Politique des Sciences” de l'EHESS. Ce dernier constat est un peu embêtant : concrètement, le modèle que l'on a utilisé a “sur-identifié” certains sujets, plutôt que d'identifier des thèmes réellement transverses au corpus.Le modèle fournit une probabilité d'occurrence de chaque thème dans chaque document, ce qui permet de connecter les thèmes entre eux en corrélant ces probabilités. On obtient ainsi, pour terminer, le réseau de thèmes suivants, où les couleurs correspondent à nouveau aux communautés optimales, et où l'on aperçoit distinctement l'espace thématique germanophone de la plateforme Hypothèses, de même que les thèmes les plus génériques (“actualités”, “lectures”, “colloques”, …) :Pour améliorer cette visualisation, il faudrait déjà envisager d'augmenter l'échantillon des articles au-delà des 25% précités. Ensuite, il faudrait réfléchir à un découpage temporel plus intelligent que celui proposé ici. En effet, segmenter l'Hypothesesosphère par année civile n'est probablement pas très pertinent : on pourrait essayer d'utiliser plutôt les années universitaires, ou même un découpage plus fin se rapprochant des semestres.Enfin, et surtout, une modélisation plus robuste des thèmes de l'Hypothesesosphère nécessiterait d'affiner trois des paramètres de la modélisation proposée ci-dessus : (1) le nettoyage des mots-clés en fonction de leur langue, (2) le nombre de thèmes à identifier, et (3) l'identification des thèmes, de manière à jouer à la fois sur la prévalence et le contenu des termes du corpus, comme l'explique la documentation du package stm :Ces améliorations demanderaient de passer plus de temps sur la collecte des données et sur le calibrage du modèle. Avis aux intéressé(e)s !Pour aller plus loinCe billet explique comment actualiser les données initialement imaginées par Josquin Debaz, et suggère de modéliser ces données à mi-chemin entre l'analyse de réseaux et l'analyse textuelle. Ce croisement méthodologique est assez fréquent : voir, par exemple, ce papier récemment présenté au Congrès de l'AFSP, qui étudie la “web-sphère” créée autour du hashtag #CharlieHebdo sur Twitter.Quelques liens, donc, pour terminer.Pour reproduire l'analyse, allez voir ce dossier, qui inclut la liste des blogs à partir de laquelle on a constitué l'échantillon, et l'exemple de corpus sur lequel on a travaillé pour ce billet. Le code n'est pas particulièrement compliqué, et il est facilement amendable (on pourrait, par exemple, étudier le réseau bipartite des blogs d'Hypothèses citant des articles publiés sur revues.org).Pour analyser du texte, la méthode que j'ai employée (et que j'avais déjà évoquée ici et là, notamment) n'est pas la plus simple, ni même la plus conclusive. Pour des alternatives aux topic models, cf. notamment les méthodes de classification hiérarchiques implémentées par Iramuteq, ainsi que ce billet d'Étienne, qui explique clairement ce qu'est un topic model et qui recense d'autres autres méthodes disponibles.Pour visualiser des réseaux, je passe systématiquement par la fonction ggnet (voir le billet de présentation et d'autres exemples), mais vous voudrez peut-être passer par igraph (qui vient de passer en version 1.0.0 ! et le bouquin a l'air génial), ou par une librairie permettant de visualiser le réseau par périodes. Dans ces deux cas, jetez un coup d'oeil à cet excellent tutoriel de visualisation réseau, par Katherine Ognyanova.Pour illustrer ce que l'on peut apprendre en lisant le tutoriel ci-dessus, voici un dernier graphe, qui montre la croissance cumulée de l'Hypothesesosphère, de janvier 2009 à juin 2015. Si vous utilisez Google Chrome, vous pouvez également jouer avec la version interactive, réalisée avec le package (encore très expérimental) ndtv, que j'ai découvert grâce au tutoriel.Contrairement aux autres graphes du billet, ces deux animations utilisent un échantillon beaucoup plus large de presque 85 000 billets publiés sur la plateforme, au fil desquels 340 blogs ont renvoyé leurs lecteurs vers 484 blogs, pour un total de 605 blogs différents actuellement présents dans l'Hypothesesosphère.