Women Also Know Stuff, édition personnelle 2017/02

La suite de ce billet. Édition précédente : 2017/01. Les règles de cette série de billets se précisent : tous les liens pointent vers des textes ou des morceaux de musique composés par des femmes (ou co-composés par au moins une femme, dans le cas des compositions multi-auteurs). Chaque billet de la série est publié à la fin du mois et contient 10 items, plus une « mention spéciale » (spéciale en quoi ? je ne sais toujours pas). Les domaines couverts sont variés, mais vu ce que je lis et j’écoute, attendez-vous à de la science politique (évidemment), de l’analyse de données1, et de la musique bizarre.

  1. Emily Barry, « Applying Data Science to the Supreme Court: Topic Modeling Over Time with NMF (and a D3.js bonus) » :

    barry-scotus-topics

  2. Jenny Andersson et Egle Rindzeviciute, « The Political Life of Prediction. The Future as a Space of Scientific World Governance in the Cold War Era » :

    This working paper explores the role of the future as a space of scientific exchange and dialogue in the Cold War period. We argue that in East and West the governance of the future were understood as both intellectual and technical problem that, importantly, challenged existing notions of the nature of liberal democratic and communist political regimes. Casting the future as a governable sphere led to the development of new forms of scientific governance which sought explicitly to depoliticize the future and turn it into a new transnational domain of technocratic politics. The paper focuses on the parallels and exchanges among American and Soviet futurologists. East-West collaboration was essential to the invention of the future as a governable technoscientific space, situated beyond political dispute.

  3. Daphne Oram2, Andrea Parker3 et Daz Quayle, « Are You There? » (Live from the Roundhouse), tiré de Private Dreams And Public Nightmares (2011) :

  4. Valerie J. Bunce et Mark R. Beissinger, « Taking Democracy for Granted » (sur l’excellent blog collectif Duck of Minerva, qui devrait plaire à tous les lecteurs de Crooked Timber et de The Monkey Cage) :

    … The costs of nationalist tropes for democracy are many. They give candidates a license to avoid talking about policy. They silence the opposition, since it cannot possibly come out against the nation. They sow divisions among the public. But perhaps their greatest danger is that they give rise to the demand for strong leadership—leaders who will do anything to defend the nation from its enemies.

    To those who view American politics as exceptional, Trump is an anomaly that is difficult to explain. To us, his politics are disconcertingly familiar.

  5. Katharina A. Zweig, Network Analysis Literacy. A Practical Approach to the Analysis of Networks (Springer, 2016) — un bouquin qui clarifie l’analyse de réseaux par le biais des modélisations complexes parues ces dernières années. Fort utile.

  6. Elisabeth S. Clemens : What is Political Sociology? (Wiley, 2016). Ayant lu quelques-uns des articles de l’auteur, je m’attends à une excellente synthèse couvrant un énorme spectre spatio-temporel, à la Sewell.

    Note : j’ai reçu, depuis la rédaction de ce billet, ma copie de l’ouvrage, et je ne suis pas déçu. Comme prévu, c’est une vaste mais brève synthèse de la sous-discipline.

  7. DJ Mutamassik (et Spit), « Complicity (M28 Mix)« , remix déjanté d’une chanson d’Arto Lindsay, sur l’excellent album d’illbient Hyper Civilizado (1996) :

    L’album de Mutamassik Symbols Follow (2015), où celle-ci joue tous les instruments, vaut aussi le détour si vous aimez l’ambient expérimental façon Nobukazu Takemura, qui reste le maître absolu, inégalé et inégalable du genre.

  8. Amelia Tait : « The Movie That Doesn’t Exist and the Redditors Who Think It Does » – sur un phénomène qui peut paraître invraisemblable, mais qui est bien connu des chercheurs faisant des entretiens sur des faits distants : le cerveau humain fabrique de très intéressants souvenirs de faits n’ayant jamais existé.

  9. Lucie Beraud-Sudreau et Hugo Meijer, « Enjeux stratégiques et économiques des politiques d’exportation d’armement. Une comparaison franco-américaine » (Revue internationale de politique comparée, 2016) :

    […] Cet article propose un schéma explicatif [montrant] que le poids relatif des considérations stratégiques et économiques dans l’élaboration des politiques d’exportation d’armes dépend, sur le plan international, du positionnement de l’État dans la hiérarchie mondiale des producteurs d’armement et, sur le plan national, du degré de dépendance à l’exportation de son industrie de défense. Cette typologie est ensuite testée à travers une comparaison des politiques américaine et française d’exportation d’armement, à partir d’entretiens réalisés à Washington D.C. et à Paris et de câbles diplomatiques fuités par Wikileaks. […]

  10. Anoushka Shankar, « Red Sun« , de l’album Rise (2005) :

Mention spéciale : Fernanda Martins, l’une des rares femmes dans le sous-genre hard techno/schranz, qui est quasi-exclusivement dominé par des hommes (Kvitta, Liebing, Natus, Ranieri, Rush). Le mix ci-dessous a été réalisé avec Sheefit, a.k.a Gabriela Mariano, la moitié féminine du duo de hard techno Motormorfoses.

  1. Généralement avec R, parfois avec Python. []
  2. Une pionnière du genre (synthétiseurs et musique concrète). Mon billet de 2016 en cite d’autres. []
  3. Oui, c’est la même que dans l’édition 2017/01. []

Women Also Know Stuff, édition personnelle 2016

how_it_works

En travaillant sur le programme définitif d’un panel de conférence (j’en reparlerai en temps voulu), j’ai réalisé que nous avions, avec mon co-équipier, éliminé toutes les communications incluant des femmes parmi les auteurs, sauf une. Tous les organisateurs et discutants de l’événement seront des hommes.

Autre contexte : en comité de rédaction, l’un des deux éditeurs d’une revue qui sort bientôt son n°1 (j’en reparlerai aussi) nous annonce que le pourcentage de femmes parmi les auteurs est hyper-bas. Je me souviens que nous avions déjà fait tout notre possible pour féminiser le comité de rédaction.

Autre contexte : une amie m’explique qu’elle postule à un financement dans une agence nationale. Elle m’explique qu’elle sait que ses chances de succès sont plus faibles : elle est jeune, et femme. Les chiffres sont là pour le prouver, et des biais similaires existent pour la publication en revue scientifique.

Ces inégalités sont difficiles à corriger. Si je scanne vite fait mes liens et lectures du jour, je dois en être à 80-90% d’hommes, aussi en sciences sociales qu’en trucs informatiques1. En science politique, sur certains sujets, et alors même qu’il y a de l’offre, on passe très facilement à 100% d’hommes2.

La liste ci-dessous ne changera rien, mais voici dix femmes dont j’ai découvert ou redécouvert les travaux/oeuvres cette année.

  1. Masha Gessen, pour « The Putin Paradigm » et « Autocracy: Rules for Survival » (sur Donald J. Trump)

  2. Dasha Rush, pour toute sa production musicale (le mix ci-dessous commence à proprement parler vers 2:30)

  3. Julia Silge (qui vient d’être embauchée par Stack Overflow), pour Tidy Text Mining with R (avec David Robinson)

  4. Jenny Bryan, pour Happy Git and GitHub for the useR

  5. Isis Lovecruft, du Tor Project, pour cette conférence sur les systèmes anonymes

  6. Jocelyn Pook, pour l’album Untold Things et la chanson « Yellow Fever Psalm » en particulier (ci-dessous ; à écouter aussi à l’envers)

    Je ne m’attarde pas sur le sujet, mais tous les amateurs de musique ambient savent qu’il y a plein de femmes parmi les pionniers du genre, à l’époque du bidouillage de synthétiseurs analogiques pesant super lourd ; allez donc écouter Else Marie Pade en 1962 ou Laurie Spiegel en 19793.

  7. Joan C. Williams, pour « What So Many People Don’t Get About the U.S. Working Class » – où l’on trouve un paragraphe qui mériterait à lui seul six heures de cours sur la stratification socio-éducative :

    One little-known element of that gap is that the white working class (WWC) resents professionals but admires the rich. Class migrants (white-collar professionals born to blue-collar families) report that “professional people were generally suspect” and that managers are college kids “who don’t know shit about how to do anything but are full of ideas about how I have to do my job,” said Alfred Lubrano in Limbo. Barbara Ehrenreich recalled in 1990 that her blue-collar dad “could not say the word doctor without the virtual prefix quack. Lawyers were shysters…and professors were without exception phonies.” Annette Lareau found tremendous resentment against teachers, who were perceived as condescending and unhelpful.

  8. Béatrice Cherrier, pour son blog The Undercover Historian [of Economics]

  9. Casey, pour l’ensemble de ses albums (extrait du dernier ci-dessous), et pour ses concerts à Gennevilliers et à Paris cette année

  10. Sonia Kronlund, pour Les Pieds sur terre (France Culture)

Mention spéciale à Katherine Ognyanova, pour « Network visualization with R » (tutoriel découvert au moment de sa première publication l’an dernier, mais mis à jour depuis).

  1. Le biais sexiste en informatique est moins fort que prévu, si j’en crois mes dernières lectures (langage R). []
  2. Les biais varient d’un pays et d’un sujet à l’autre. Comparer, par exemple, la France et les États-Unis, ou bien la couverture médiatique et scientifique de l’État islamique avec celles de la Russie. []
  3. Le biais masculin varie aussi selon les styles musicaux. Jetez un coup d’oeil, par exemple, à la jungle/drum and bass. []

Hypothesosphère : le réseau des blogs d’Hypothèses, (presque) cinq ans plus tard

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’actualiser son analyse, en récoltant des données permettant d’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’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’est enrichie de nombreux blogs, ce qui donne, même lorsque l’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 :

hyponet

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ées

Depuis le billet de Josquin Debaz, l’index d’Hypothèses s’est beaucoup enrichi, et a aussi certainement changé au niveau du code, car les “vieux” billets (ceux de la page 300, par exemple) n’y sont pas indexés comme les nouveaux. Du coup, pour actualiser l’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 :

openedition-catalogue

Pour effectuer cette dernière opération, j’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’utilisent pas de pagination (ce que l’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’échantillon que l’on va constituer1.

Dans un premier temps, il faut donc lister les blogs et essayer de lister tous leurs articles. En une demi-heure d’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’en suis arrivé à ce script, qui est certainement plus lent que celui qu’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’OpenEdition, et un total de 77 608 articles, soit 124 articles par blog en moyenne2. Si l’on compare les années de création des blogs du catalogue OpenEdition à celles des blogs contenus dans l’échantillon, les différences de proportion de chaque année à l’intérieur de chaque groupe sont minimes et aléatoires, ce qui est plutôt bon signe pour la qualité de l’échantillon.

Année Catalogue % Échantillon %
2009 76 7 65 10
2010 81 8 61 10
2011 138 13 78 13
2012 282 26 149 24
2013 233 22 118 19
2014 126 12 61 10
2015 133 12 88 14

Construction des réseaux temporels

Dans 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’opération précédente n’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’ai à nouveau échantillonné dans les données, en ne téléchargeant que 25% des 77 608 articles, soit 19 402 articles3.

Vu que l’on va vouloir observer la manière dont l’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’inter-citations par article, qui pourra faire office de coefficient de pondération si besoin. Je ne vais pas jusqu’à sous-échantillonner pour limiter le nombre d’articles par blog, mais c’est envisageable4.

Enfin, on va écrire le code de visualisation de l’Hypothesesosphère de chaque année, en mettant des couleurs sur les huit “communautés” de blogs les plus larges, que l’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’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’exige n’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’est qu’ils sont réciproques : les blogs se font mutuellement référence).

hyponet

Pour obtenir un résultat plus exhaustif, il suffit d’augmenter le seuil précité de 25%, ce qui permettra de scanner un plus grand nombre d’articles, et donc potentiellement de rendre l’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és

Les 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 document5.

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)6.

Résultats : les thèmes de l’Hypothesesosphère

Dans 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”) :

hypotopics

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”, …) :

hyponet_topics

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 :

stm-metadata

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 loin

Ce 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 , 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.

hypodyn

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.

  1. Le meilleur moyen de travailler sur l’intégralité de la base serait bien sûr de l’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’ai accédé qu’aux données publiques de la plateforme. []
  2. 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. []
  3. Il est fortement recommandé, à ce stade, de laisser une seconde entre chaque téléchargement, pour ne pas stresser la plateforme. []
  4. Cette étape serait nécessaire si l’on souhaitait contrôler (éliminer) les différences de volume de publication d’une année sur l’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. []
  5. 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. []
  6. À 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. []

Extraire un corpus médiatique sans (trop) saigner des yeux

Vous vous êtes déjà demandé quelle avait la couverture médiatique d’un projet de loi comme le projet de loi DADVSI ? ou, plus connu, le projet de loi HADOPI, qui donna lieu à un feuilleton législatif de plusieurs années ?

J’avais très rapidement mentionné le sujet en évoquant un papier co-écrit avec Pierre Gueydier, présenté à l’AFSP en 2013 et que nous avons commencé à remettre à jour. Comme d’habitude, tout est en ligne.

Le papier portant sur la politisation, une étude préliminaire de la médiatisation des projets de loi peut être un bon moyen de jeter un premier coup d’oeil aux individus, aux institutions et aux organisations mobilisées autour de leur examen.

Quelques essais et 300 lignes de code plus loin, on dispose donc d’un corpus de 6350 articles issus de sept médias français différents1, qui ressemble à ça au fil du temps :

counts

Comment faire

  • Pour chaque média, il y a un moteur de recherche utilisant une pagination des résultats. La première étape consiste donc à parcourir chaque page de résultats, en récupérant les adresses des articles.
  • Ensuite, pour chaque article, on a accès soit à une page donnant accès au texte intégral, soit aux premières lignes du texte dans le cas des articles payants du Figaro et du Monde.
  • Enfin, il faut se donner une syntaxe permettant de sauvegarder le contenu d’un lien HTTP vers un fichier texte, ce qui demande quelques essais-erreurs avec les expressions régulières.

Les techniques servant à récupérer et à nettoyer les données ayant déjà été traitées dans plein d’autres billets (exemple), je ne développe pas sur ce point, mais suis intéressé par tout scraper équivalent pour d’autres sites de médias.

Qu’en tirer

Le raisonnement du texte étant qualitatif, l’exploration du corpus est avant tout une manière de trianguler des décisions de terrain, comme le choix de se focaliser sur certains acteurs plutôt que d’autres.

Histoire de repérer les acteurs, on extrait tous les termes contenant une majuscule initiale, que l’on nettoie ensuite des termes courants. Restent les termes comme « Vivendi Universal » ou « Frédéric Mitterrand ».

On parcourt ensuite les mille termes les plus fréquents, dont on tire une liste de presque 350 entités, allant de la classe politique à Twitter en passant par les DRM et la jurisprudence SABAM.

Voici à quoi ressemble la co-occurrence de ces entités dans les articles publiés entre 2012 et aujourd’hui, représentées sous la forme d’un réseau de termes fréquemment associés à la « mission Lescure-préparant-l’acte-II-de-l’exception culturelle » :

seq3

Le réseau est naturellement très dense (il y a énormément de co-occurrences), mais les liens sont plus ou moins ténus, grâce à une technique de pondération qui tient compte du nombre d’entités identifiées dans chaque article2.

En additionnant ces liens, on obtient un indice plus synthétique, le degré pondéré de centralité. Dans le graphique ci-dessus, la taille des entités est proportionnel à cet indice, qui n’est qu’une mesure possible parmi d’autres.

Voici donc, pour terminer, les quinze premiers scores de centralité sur la totalité des neuf années couvertes. D’autres tableaux et graphiques explorant des segments temporels spécifiques de la période couverte sont disponibles dans l’annexe du papier.

Screen Shot 2014-06-26 at 3.39.09 PM

Je n’ai pas le temps de m’acharner sur les données, mais cette preuve du concept montre qu’il n’est pas difficile de récolter un corpus médiatique, hélas moins riche qu’une base de données comme Factiva ou LexisNexis, mais d’ampleur raisonnable.

Si vous avez des suggestions sur comment modéliser tout ça proprement, à coups de topic models ou autre chose, laissez un commentaire, mais c’est en général à ce stade-là que l’on commence à saigner un peu des yeux.

  1. Libération apparaît dans le corpus Écrans.fr, et les articles des Échos ne sont pas disponibles avant décembre 2011. []
  2. Cette technique permet de mettre sur un même plan les articles en texte intégral et ceux pour lesquels on ne dispose que des deux premiers paragraphes. []

Des réseaux et des mots

Histoire d’en terminer avec les réseaux de députés, voici quelques slides publicitaires pour la fonction ggnet du package GGally, qui rassemble plusieurs fonctions graphiques exploitant la syntaxe de ggplot2 :

Côté analyse, le réseau « Twitter » des députés est moins parlant que celui de leur travail législatif, même s’il lui ressemble structurellement, mais je ne reviens pas là-dessus, n’ayant pas beaucoup plus de données qu’il y a quelques mois.

Je présenterai les slides sur ggnet mercredi à R Addicts Paris, aux côtés d’autres présentations beaucoup plus avancées dans la manipulation de graphiques. Côté réseaux, il y a plein de pistes pour produire des réseaux manipulables, comme sigma.js ou d3Network. Voici un exemple de réseau textuel visualisé avec cette dernière fonction, qui utilise d3.js :

d3Network

Cliquez sur l’image pour la version dynamique. Les données sont tirées d’un petit exemple de modélisation textuelle dans un corpus faiblement structuré, conçu pour Baptiste Coulmont.

Dans cet exemple, les liens entre les termes correspondent à leur probabilité d’association dans un ensemble de termes lemmatisés, où les termes sont groupés par « thèmes possibles« . La modélisation utilise des distributions de Dirichlet et s’estime, grosso modo, de manière “fixe”, “aléatoire” ou “bayésienne” — ce qui prend des plombes dès que le corpus contient plus de quelques centaines de documents…

Dernier truc en cours, un autre exemple de temps de calcul très lent, et qui demande en plus un très long processus préalable de récupération des données. Le graphique suivant contient un peu plus d’un million d’observations, agrégées par semaine de publication et séparées visuellement par institution d’origine :

fig4_week

Le projet auquel se rattache les données est trop peu construit pour en dire vraiment plus, sinon que R et RStudio gèrent très bien les manipulations graphiques sur un million de points, à condition d’être disposé à aller se faire un café (ou même en racheter à côté) pendant que les objets ggplot2 (environ 250 MB par objet) percolent. Peut-être bigvis peut-il encore réduire ce temps de calcul, mais dans tous les cas, R fonctionne à un million de points : testé, approuvé.

Bonnes fêtes :)

Une dernière pour la route

Une dernière avalanche de courbes sur les premiers tours, avec les données :

Je m’étais également promis de faire un peu de publicité à la conférence “La fabrique de la loi”, dont j’ai parlé ici en rapport à un projet d’extraction de données sur la production législative. Depuis, j’ai eu quelques retours de doctorants intéressés : manifestez-vous dans les commentaires, et quand on sera assez nombreux, on formera un parti de masse—ou peut-être juste un séminaire de recherche. À l’étranger, j’ai trouvé des scrapers pour l’Union européenne et le Congrès américain.

Les outils de web scraping et de text mining ont d’abord été appliqués à la production législative outre-Atlantique mais il y a également un public en France pour ces initiatives, fondées sur la transparence et l’ouverture des données. On parle du même milieu qui a porté, selon les époques, les licences libres ou Creative Commons, et qui s’est opposé à la loi DADVSI puis encore plus visiblement à la loi HADOPI. Côté recherche, je n’ai aucune idée de ce qui se fait hors de projets connexes comme Comparative Agendas, mais j’ai commencé un papier récent pour voir un peu ce qui se fait en dehors des frontières.

Du côté de la lexicométrie, cet intéressant projet de journée d’étude avec des applications de l’analyse de texte à la sociologie. J’ai posé une question sur les logiciels Alceste et Lexico, parce que je ne sais pas trop ce qui se fait ni où ça en est, mais il me semble que les approches non-paramétriques ont gagné du terrain, et qu’on peut désormais faire pas mal de choses avec R en matière de text mining. R présente aussi l’avantage d’être disponible pour d’autres tâches liées : web scraping, analyse de réseau des interlocuteurs (façon DNA), bref, ce que vous voulez. Et c’est libre.

Il y a un peu de tri à faire dans tout ce fatras : par exemple, je suis assez peu convaincu des résultats du wordscoring en général, et les données Comparative Manifestos ne me convainquent pas beaucoup non plus. Cela signifie juste qu’il y a beaucoup à faire, en lien avec les recherches qui peuvent exploiter ces données et les résultats d’analyses statistiques appliquées à la production (textuelle ou pas) des parlements.

Sonal, pour analyser des entretiens

Aperçu dans la description du logiciel Sonal, que je découvre en lisant la newsletter de l’AFS jusqu’au bout :

Sonal est également sur Hypothèses depuis fin 2009. Je n’en ferai rien car le logiciel ne tourne que sur Windows et exporte dans des formats propriétaires, mais longue vie au projet et bravo pour l’esprit, car les logiciels payants sont nombreux sur le créneau de l’analyse textuelle ou lexicométrique, ce qui limite drastiquement les possibilités.

Un indicateur de saillance du travail parlementaire

Histoire d’apprendre à jouer avec la commande getURL de la librairie RCurl, j’ai écrit quelques lignes de code pour récupérer une bonne partie du travail législatif accompli à l’Assemblée nationale à partir des projets et propositions de loi. J’ai aussi extrait quelques-unes des caractéristiques pour chaque dossier, et notamment le nombre de débats organisés en séance publique. Les données couvrent deux législatures (2002-2012).

Mon script n’a pas réussi à capturer l’intégralité des travaux à cause des erreurs de codage sur le site de l’Assemblée nationale, mais j’ai réussi à recueillir 405 projets de loi et 261 propositions de loi, introduits soit à l’Assemblée nationale, soit au Sénat. La catégorie modale est le projet de loi introduit à la chambre basse. Les deux législatures sont grossièrement identiques sur l’ensemble des critères étudiés1.

Je vais me servir du nombre de séances publiques tenues sur un même texte comme d’un indicateur de saillance au sein du travail parlementaire. La distribution du nombre de séances est très asymétrique : la plupart des lois ne dépassent pas une à trois séances 2. Les valeurs extrêmes sont tenues par les lois de finances et par certains textes anormalement saillants dans l’agenda parlementaire, pour des raisons qui restent à expliquer :

 [1] "reforme_hopital"                     "reforme_collectivites_territoriales"
 [3] "nomination_audiovisuel_public"       "modernisation_economie"             
 [5] "loi_finances_2012"                   "loi_finances_2011"                  
 [7] "loi_finances_2010"                   "loi_finances_2009"                  
 [9] "loi_finances_2008"                   "internet"                           
[11] "grenelle_environnement2"             "defenseur_droits"                   
[13] "articles_34-1_3944"                  "temps_travail_entreprise"           
[15] "prevention_delinquance"              "loi_finances_2007"                  
[17] "immigration_integration"             "engagement_national_logement"       
[19] "egalite_chances"                     "eau_milieux_aquatiques"             
[21] "031206"                              "0200240203"

Dans les 3% des textes les plus programmés en séance publique, donc : le temps de travail des entreprises, la loi “ENL”, la réforme des collectivités territoriales, celle de la prévention de la délinquance, puis les nominations dans l’audiovisuel, le Grenelle de l’environnement… On y retrouve la plupart des projets emblématiques du gouvernement. On y trouve aussi, à mon grand plaisir, HADOPI, et même la loi précédente, DADVSI. Le record, avec trente séances, est tenu par la loi HPST.

En séparant les fonctions de répartition empirique par législature, chambre d’introduction et type d’initiative, on obtient les courbes suivantes (zoomables en PDF : cliquer sur l’image). Les points sur les courbes rouges et bleues correspondent respectivement aux lois DADVSI (12e législature) et HADOPI (13e législature). Chaque courbe utilise un minimum de 104 points.

On peut apercevoir des nuances entre les législatures ou entre les critères institutionnels, mais en réalité, je ne pense pas que la distinction par chambre d’introduction résiste à l’examen, dans la mesure où les règles d’introduction spécifique des textes sont noyées dans des centaines de projets alloués aux deux tiers à la chambre basse. Une fois cette simplification admise, on observe quelques différences entre les critères restants :

  • La 13e législature organise une séance et demi de plus en moyenne par texte examiné3. Cet effet concerne prioritairement les projets de loi, pour lequel le nombre moyen de séances publiques a plus que doublé après 2007, de 2.2 à 4.74.
  • L’augmentation des séances sur les propositions de loi est moins importante en volume mais identique en taux de croissance. S’il y a un effet post-2007, il s’exerce sur les projets et propositions de manière égale.
  • Une régression logistique indique que chaque organisation de séance double la probabilité d’aboutir à la promulgation d’une loi5. L’effet persiste si l’on contrôle par le type (projet/proposition), mais cesse d’être significatif quand on corrige les erreurs standard à l’intérieur de chaque législature6.

Cet indicateur de saillance est tout aussi valable qu’un autre, et ses résultats préliminaires sont fiables : le haut de la distribution est occupé par des lois à forte charge symbolique, où les députés ont soit été très sollicités ou très mobilisés par défaut ; et l’augmentation sous la 13e législature peut s’expliquer de beaucoup de manières.

Mon échantillon est perfectible, tout comme mon code, qui laisse quelques lignes en erreur dans la base. Je ne sais pas si quelqu’un au GEVIPAR ou ailleurs a déjà extrait cette information. Je ne sais pas non plus si ces indicateurs sont mesurés comparativement. La suite : étendre au Sénat, et trouver un manuel d’analyse de corpus législatif, si je parviens à extraire les débats DADVSI et HADOPI de manière satisfaisante.

  1. Je ne tiens pas compte des changements de codage qui font disparaître les rapports publics d’information et d’autres missions sur d’autres pages que je ne souhaitais pas capturer pour ce projet. []
  2. Pour rendre compte de la distribution, on va utiliser une fonction “ECDF” de répartie empirique, plus lisible qu’une estimation de densité par noyau sur une distribution asymétrique dont on souhaite conserver les unités naturelles (ici, le nombre de séances publiques). []
  3. Estimation significative sur un t-test à p < .05, intervalle de confiance [-2.3, -.64]. []
  4. L'intervalle à 95% de confiance sur le sous-ensemble à N = projets de loi est [-3.7, -1.1]. []
  5. La moitié des projets ou propositions ne donne pas lieu à la promulgation d’une loi dans mon échantillon. Je n’ai pas vérifié le codage, mais n’ai aucune raison de ne pas le croire jusque-là. []
  6. Pour être précis, l’effet est significatif à p < 0.1 en contrôlant par le type (projet/proposition), mais reperd en significativité quand on supprime les lois de finance, qui biaisent le modèle. []

Geek stuff

J’ai souri en lisant les vignettes d’une doctorante qui a fait son coming-out geek.

Dernière manipulation geek en date : une étudiante a eu une idée originale pour un cours de statistiques, où elle a décidé d’analyse un échantillon des trois millions de tweets #iranelection envoyés lors de l’élection iranienne. Son échantillon commence le 19 juin 2009, et son filtre a récupéré principalement des tweets en langue anglaise, avec quelques observations en Farsi et dans d’autres langues. Le fichier qu’elle m’a fourni contient 45 000 observations environ.

Pour lui fabriquer un échantillon plus maniable, j’ai appliqué la méthode suivante :

  • Assigner un nombre aléatoire entre 0 et 1 à chaque ligne.
  • Ordonner les observations par ce numéro.
  • Extraire les 4000 premières entrées vers un nouveau fichier.
  • Recommencer, extraire les 3000 premières.
  • Recommencer, extraire les 2000 premières.

L’opération sous Excel m’a créé un fichier d’environ 165MB qui a bien ralenti mon système, mais le fichier final est correctement échantillonné. Ensuite, il a fallu appliquer pas mal d’expressions régulières, du genre \|en\|(.*).jpg\|, pour nettoyer les données, ce qui m’a valu de perdre 144 observations mais de terminer avec un fichier CSV presque directement exploitable, après deux heures de manipulation.

Vos suggestions sur comment analyser le fichier sont les bienvenues ! Comme le cours se déroule sous Stata, j’ai pensé lui faire utiliser wordscores, mais il y a certainement une meilleure méthode pour analyser le corpus.