Comment je prépare le tableau de bord des sujets les plus traités par les sites d’actu

Cap­ture d’écran d’un script Python

C’est sans doute le pro­jet le plus ambi­tieux et le plus com­plexe que j’aie mené à bien depuis que j’ai lan­cé Dans mon labo il y a bien­tôt quatre ans. Il m’a fal­lu pas mal d’après-midi plu­vieux et de jours fériés bla­fards pour ter­mi­ner le tableau de bord qui liste les sujets les plus pré­sents dans les sites d’actualité fran­çais.

Il est deve­nu pos­sible grâce aux pro­grès que j’ai réa­li­sés en Python, un lan­gage de pro­gram­ma­tion pri­sé des data­jour­na­listes. De mon côté, j’ai dû sérieu­se­ment m’y mettre cou­rant 2017, notam­ment pour affi­cher en direct les résul­tats des élec­tions légis­la­tives au sein de la carte inter­ac­tive que j’ai pré­pa­rée pour Contexte.

Pour explo­rer les flux XML mis à dis­po­si­tion par le minis­tère de l’Intérieur le soir des scru­tins, j’ai trou­vé en Python, avec sa syn­taxe acces­sible et ses mul­ti­plies librai­ries dis­po­nibles, un par­te­naire idéal. (Mais il est aus­si pos­sible de faire ça très bien avec d’autres solu­tions, comme R.)

Et ces connais­sances m’ont ouvert de nou­veaux hori­zons, notam­ment ceux de la recon­nais­sance auto­ma­ti­sée d’entités nom­mées. Un domaine qui, m’a-t-on expli­qué, a beau­coup pro­gres­sé grâce au patient tra­vail de des­crip­tion et de clas­se­ment réa­li­sé par les contri­bu­teurs de Wiki­pe­dia.

J’ai d’abord tra­vaillé, tou­jours pour Contexte, sur les thé­ma­tiques les plus pré­sentes dans le dis­cours des dépu­tés pour enri­chir le trom­bi­no­scope de l’Assemblée natio­nale que le site pro­pose à ses abon­nés. C’est alors que m’est venue l’idée de pro­po­ser une démarche com­pa­rable, mais avec les médias en ligne.

1. Scraper les flux RSS des sites d‘actu avec Python

J’ai lis­té, dans une Google Sheet, les sites que je sou­hai­tais étu­dier, en ren­sei­gnant pour cha­cun l’adresse de son flux RSS prin­ci­pal.

Mon script de scra­ping (dis­po pou les curieux) com­mence par récu­pé­rer cette liste, et va cher­cher dans chaque flux le titre et la des­crip­tion (le cha­pô ou le début du texte) de chaque article. Il récu­père aus­si sa date de publi­ca­tion, et enre­gistre le tout dans un fichier Json dédié à chaque site (voir par exemple celui du Monde).

Tous les flux RSS n’étant pas construits de la même façon, il a fal­lu prendre en compte les dif­fé­rents cas de figure : ain­si, le résu­mé de l’article se trouve dans un élé­ment qui peut être nom­mé « des­crip­tion », « sum­ma­ry », « content»…

2. Créer un corpus de textes et le faire analyser par TextRazor

La suite de ce script va conca­té­ner ensemble les titres et résu­més de chaque article publiés dans une période don­née (depuis sept jours, cette semaine ou ce mois) pour en faire un seul et même texte.

Ce cor­pus va ensuite être envoyé à Tex­tRa­zor, via la librai­rie Python que met à dis­po­si­tion ce ser­vice d’analyse séman­tique. Ce der­nier est gra­tuit jusqu’à 500 requêtes par jour, un quo­ta lar­ge­ment suf­fi­sant pour ce pro­jet.

Par­mi les ser­vices équi­va­lents, Tex­tRa­zor a un autre avan­tage : non seule­ment son outil d’extraction des enti­tés nom­mées ren­voie la liste des thé­ma­tiques détec­tées au sein du cor­pus sou­mis, mais il four­nit aus­si pour cha­cune un score de rele­vance («per­ti­nence », que j’ai fina­le­ment tra­duit en « pré­sence » dans mon tableau de bord).

Ain­si, s’il détecte les mots « GPA », « ges­ta­tion pour autrui » ou « mère por­teuse » dans un texte, Tex­tra­zor réunit ses expres­sions dans une seule thé­ma­tique (en géné­ral le titre de la notice Wiki­pe­dia dédiée). Et donne à cette der­nière une note, de 0 à 1, selon que l’entité lui semble plus ou moins per­ti­nente dans le texte four­ni.

C’est à la fois la force et la fai­blesse de ma méthode : ce sco­ring me per­met de géné­rer les mul­tiples clas­se­ments, mais je n’ai pas « la main » sur son éla­bo­ra­tion.

Mal­gré quelques mau­vaises sur­prises, l’observation des résul­tats obte­nus m’a toute fois ras­su­ré : Le Pari­sien est en géné­ral le média où le thème « Paris » est le plus pré­sent ; on retrouve sou­vent « Jean-Luc Mélen­chon » bien clas­sé dans les résul­tats de Poli­tis ; Sput­nik et RT France sont bien pla­cés au clas­se­ment pour le thème « Vla­di­mir Pou­tine ».

4. Héberger les scripts sur un serveur chez PythonAnywhere

Cette par­tie-là du chan­tier serait une pro­me­nade de san­té pour un déve­lop­peur back-end même débu­tant. A un jour­na­liste bidouilleur comme moi, elle a pris pas mal de temps et d’énergie.

Une fois le script Python décrit ci-des­sus mis au point, je ne pou­vais pas l’exécuter moi-même plu­sieurs fois par jour sur mon ordi­na­teur afin de dis­po­ser de don­nées tou­jours fraîches pour ali­men­ter un éven­tuel tableau de bord.

Sur les conseils d’amis déve­lop­peurs, j’ai regar­dé plu­sieurs offres d’hébergement comme Ama­zon Web Ser­vices ou Google Cloud Plat­form, mais la lon­gueur des pro­cé­dures d’installation et des tuto­riels pro­po­sés m’a vite refroi­di. Je me suis rabat­tus sur Python Anyw­here. un ser­vice peu oné­reux et qui s’est révé­lé mieux adap­té à un noob comme moi.

Même avec cette solu­tion, je suis pas­sé par mal, de guides d’utilisation, de pages d’aide et de ques­tions Stack Over­flow avant d’arriver mes fins : faire tour­ner mon script de scra­ping plu­sieurs fois par jour.

4. Créer le tableau de bord en front à partir d’un fichier Json optimisé

Une fois toutes ces listes de thé­ma­tiques récu­pé­rées et enre­gis­trées dans le fichier Json de chaque média, un autre script Python, lui aus­si héber­gé sur Pytho­nA­nyw­here, va pré­pa­rer un fichier Json com­mun et de taille réduite.

Ce der­nier sera récu­pé­ré, au moment où le tableau de bord publié Dans mon labo se charge, par votre navi­ga­teur.  Au final, c’est donc Chrome, Fire­fox ou Edge qui va construire l’infographie à l’intérieur de la page.

Je ne détaille­rais pas sur ce tra­vail de déve­lop­pe­ment front-end, clas­sique com­bi­nai­son de HTML, de CSS et de Javas­cript, mais si vous avez des ques­tions sur cette par­tie, je serai ravi d’y répondre !

A ce stade, la prin­ci­pale dif­fi­cul­té pour moi a été de s’assurer que le char­ge­ment des don­nées puis la construc­tion de l’infographie se fasse dans un délai rai­son­nable : lors des pre­mières étapes, le tout pre­nait par­fois une bonne dizaine de secondes, ce qui es rédhi­bi­toire.

Pour chaque média, j’ai choi­si de ne pas inté­grer une thé­ma­tique si son score était infé­rieur à un cer­tain seuil (en ce moment, 0,4/1), et de n’afficher une thé­ma­tique dans la liste prin­ci­pale que si elle était pré­sente dans au moins quatre médias.

Il m’a fal­lu pas mal d’allers-retours entre scripts Python sur le ser­veur et code Javas­cript dans le navi­ga­teur pour réduire ce délai et obte­nir une expé­rience suf­fi­sam­ment fluide, mais il  reste sans doute pas mal d’optimisation pos­sible.

5. Préparer la suite avec des analyses hebdomadaires et mensuelles

Comme beau­coup l’ont fait remar­quer dès la publi­ca­tion du tableau de bord, les résul­tats seront inté­res­sants à obser­ver dans le temps, au-delà de la pho­to­gra­phie actuelle (les sept der­niers jours). Mon script réa­lise déjà des ana­lyses heb­do­ma­daires et men­suelles, qui ne sont pas affi­chées mais que j’espère uti­li­ser quand j’aurais davan­tage de recul.

Voi­là ! Je suis en tout cas curieux de savoir vos remarques, cri­tiques ou pro­po­si­tions d’amélioration dans les com­men­taires de ce post ou bien, pour les timides, dans un mes­sage pri­vé.

Mis à jour le 2/2 à 10h15. Pré­ci­sion sur les seuils (point 4) et point 5 ajou­té.

Puisque vous passez par là…

J’ai besoin de votre aide : je m’intéresse à la mesure d’audience des médias en ligne (dans Google Analytics, sur Facebook, sur Twitter…) et à ce que les journalistes en font. En participant à ma petite enquête sur le sujet, vous m’aiderez à concevoir de nouveaux services intéressants.

Partager cet article

Lien copié !
C'est nul, je veux de gros boutons colorés !

Partager cet article

On en discute ?