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

Un peu d'inspiration !

Depuis 2014, j'accompagne des médias dans leurs projets et je mène mes propres expériences. Retrouvez les réalisations dont je suis le plus fier dans un portfolio qui vous donnera envie d'innover !

Partager cet article

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

Partager cet article

On en discute ?