Je voulais comparer les ordres du jour des chaînes d’information. Savoir quelle place BFMTV, CNews, franceinfo et LCI donnent à la politique un mardi soir, ou si un sujet revient plus souvent ailleurs.
La question paraît simple. Elle ne l’est pas. Un direct ne se laisse pas additionner : il faut le découper, le transcrire, classer des morceaux, puis décider comment les agréger.
J’ai fini par construire SIGNAL. Le site publie des parts d’antenne, des écarts, des courbes. Derrière, il y a surtout une série de choix de calcul. C’est cette mécanique que je veux décrire ici. Pas la récupération des flux : la façon dont les chiffres sont fabriqués.
Le segment comme unité
Tout part d’un segment de cinq minutes.
C’est assez long pour contenir une séquence éditoriale, un plateau, un reportage ou un débat. C’est assez court pour rester comparable d’une chaîne à l’autre. Et c’est une unité qu’on peut horodater, retrouver et vérifier.
Les horaires sont normalisés en UTC. Chaque segment porte une date, une heure et une chaîne.
Un segment à 3 h du matin pèse autant qu’un segment à 20 h. Un plateau de quarante minutes coupé en huit segments pèse huit fois plus qu’un sujet évoqué trente secondes dans un seul segment. Mais la règle est la même pour toutes les chaînes, et c’est ce qui rend la comparaison possible.
Une part d’antenne est donc une part de segments classés. Pas un chronomètre au dixième de seconde.
Deux choses sont exclues du calcul. D’abord les segments de moins de 100 caractères utiles : c’est généralement du bruit, un jingle ou une transcription vide. Ensuite les segments classés « Publicité », qui ne portent aucun signal éditorial. (CNEWS est la chaîne qui en diffuse le plus)
Le dénominateur n’est donc pas « tout ce qui a été diffusé ». C’est « les segments classés ». Cette nuance change le sens des pourcentages, et elle est écrite dans les données.
Ce que le classifieur voit
Le texte envoyé au classifieur n’est pas le flux brut. C’est une transcription diarisée.
Le modèle par défaut est whisper-large-v3-turbo. La diarisation distingue des voix à l’intérieur d’un fichier, avec des identifiants anonymes. Elle ne dit jamais qui parle dans la vie réelle. Les tours sont fusionnés et envoyés sous une forme compacte :
Intervenants : S1, S2, S3 (un tag = une voix).
[S1] Le texte du premier tour.
[S2] La réponse, sans horodatage.
Les noms de chaînes sont remplacés par [CHAINE] avant l’analyse. Ça n’empêche pas le modèle de deviner à partir du contenu, mais ça retire l’indice le plus direct. Le classifieur ne doit pas choisir un sujet parce qu’il reconnaît la chaîne.
La diarisation se trompe parfois, surtout sur les chevauchements et les jingles. C’est une limite du système. Elle n’est pas corrigée par le score.
La grille de classification
Le classifieur ne rédige pas. Il remplit un formulaire.
Le modèle Jev de TypeSafe permet de poser trois types de questions : un choix fermé, une probabilité et une note sur une échelle. Le modèle ne peut pas inventer une catégorie hors liste.
Le sujet principal est choisi parmi dix-huit catégories : Politique, Économie, Social-Emploi, Agriculture, Sécurité-Justice, Immigration, Santé, Éducation, Logement, Environnement, Tech-Science, Culture-Médias, Sports, Faits divers, Société, International, Publicité, Autre.
Un segment reçoit un seul sujet principal. Les probabilités de chaque catégorie sont conservées, mais l’agrégat utilise le choix majoritaire. Les segments mixtes perdent donc une partie de leur information. C’est le prix d’une lecture simple.
Le parti cité suit la même logique : une liste fermée, avec les dirigeants, porte-paroles et candidats associés à chaque formation. Ces informations sont lues aux sources et datées, pas tirées de la mémoire du modèle. Ça permet d’attribuer une mention implicite du type « Bardella a déclaré… » au Rassemblement National, sans laisser le modèle inventer une appartenance. La liste est mise à jour à chaque remaniement ou changement de candidature.
Les scores sont bornés :
| Score | Tension | Rigueur | Pluralisme |
|---|---|---|---|
| 0 | calme / informatif | mensonge évident | pluralisme équilibré |
| 1 | tendu / animé | mensonge probable | un point de vue domine |
| 2 | conflictuel / polémique | propos crédibles | chambre d’écho |
| 3 | — | propos sourcés | — |
La probabilité de débat va de 0 à 1.
L’échelle de rigueur est la plus fragile. Elle va de « mensonge évident » à « propos sourcés ». Ce n’est pas un fact-check. C’est une appréciation du segment, à l’échelle de cinq minutes. Elle sert à repérer des variations, pas à trancher la vérité.
Du JSON aux statistiques
Chaque analyse est écrite dans un JSON atomique, à côté du texte du segment. Un compactage transforme ensuite ces JSON en Parquet compressé, puis en base DuckDB.
Les probabilités de sujet et de parti deviennent des colonnes. Les légendes de scores deviennent des libellés lisibles. Le titre d’émission est joint depuis la grille des programmes. Le transcript diarisé remplace le texte brut dans la ligne. source_file et analyzed_at restent présents.
La base DuckDB est reconstruite à chaque compactage. L’API la lit sans charger les transcriptions, pour garder les réponses légères. Le Parquet, lui, conserve tout.
On peut donc retrouver un chiffre publié, remonter au segment, puis au fichier source. C’est cette chaîne qui rend le calcul vérifiable. Sans elle, un score n’est qu’une opinion avec une virgule.
Les calculs
La part d’un sujet sur une chaîne est le nombre de segments de ce sujet divisé par le nombre de segments classés de la chaîne, publicité exclue :
part_sujet(chaine) = segments_sujet(chaine) / segments_classés(chaine)
Les écarts de sujets sont calculés de deux façons. Les signatures comparent la part d’un sujet sur une chaîne à la moyenne des chaînes, avec un seuil minimal d’écart et un plancher de part. Le duel prend le plus grand écart entre deux chaînes pour un même sujet, à condition que la chaîne haute dépasse 10 %.
Les mentions de parti sont une moyenne de probabilités : quelle chance, dans un segment, que tel parti soit cité ? Ce n’est pas un temps de parole ni un jugement sur le ton.
Les séries horaires donnent la part des grands sujets heure par heure et la probabilité de mention des partis. Les corrélations comparent la présence d’un parti et la part d’un sujet sur des intervalles alignés, avec au moins six points communs. Une corrélation descriptive, pas une cause.
Les courbes ajoutent moyenne, pic, creux, variation début–fin et volatilité horaire. Un pic n’est signalé que si plusieurs conditions sont réunies : au moins six points, un pic au moins huit points au-dessus de la moyenne, et un écart d’au moins 1,5 écart-type.
Les tendances comparent l’édition courante à au moins trois éditions précédentes. Une tendance n’est dite « robuste » que si l’écart dépasse le seuil de la métrique et si le z-score atteint 2.
L’intensité d’un moment combine la tension et la probabilité de débat :
intensité = tension / 2 + probabilité_de_débat
Elle sert à classer les extraits à montrer. Pas à établir une hiérarchie de gravité.
Ce que ça ne dit pas
Une part d’antenne n’est pas un chronomètre. Elle compte des segments, pas des secondes de parole.
Les mentions de parti ne mesurent ni le temps de parole, ni la tonalité, ni le cadrage.
Les scores de tension, de rigueur et de pluralisme sont des jugements à l’échelle du segment, pas de l’émission.
Les segments ne sont pas indépendants : plateaux, éditions, séquences. Aucun intervalle de confiance ni test de significativité n’est calculé.
Une heure à faible volume est fragile. La grille des sujets est un choix : une autre grille produirait d’autres parts. La transcription et la diarisation peuvent se tromper. Les citations sont automatiques et doivent être vérifiées avant publication.
Et un écart de couverture ne prouve ni intention, ni consigne, ni coordination.
Conclusion
Les résultats produits par la méthode proviennent d’un classifieur automatique qui possède ses biais et imprécisions mais permet de se rapprocher d’une vision “humaine” de l’actualité. La transparence de la méthode et la possibilité de remonter aux segments originaux permettent de vérifier les chiffres et d’interpréter les résultats avec prudence. Les mentions de partis ou sujets ne prennent pas en compte si les propos sont positifs ou négatifs, ni si les sujets sont traités de manière approfondie ou superficielle. Il est donc important de compléter ces données avec une analyse qualitative pour obtenir une image complète de la couverture médiatique.
Le site est disponible ici : signal.dera.page.