Cette application SvelteKit est conçue pour visualiser les résultats d'analyses de sentiments effectuées sur des corpus d'articles de presse. Elle permet de charger et d'explorer le corpus Collection Islam Afrique de l'Ouest (IWAC), de filtrer les articles selon divers critères (pays, journal, polarité, score de subjectivité, centralité) et d'afficher les répartitions de sentiments sous forme de graphiques interactifs.
L'objectif principal est de fournir une interface interactive pour explorer et comprendre les tendances de sentiments dans la couverture médiatique de l'islam et des musulmans dans la presse d'Afrique de l'Ouest francophone.
Analyse comparative des résultats entre trois modèles IA (ChatGPT, Gemini, Mistral) :
Support du français et de l'anglais avec traduction automatique des valeurs de sentiment et synchronisation URL.
# Vue graphiques avec filtre par pays
https://fmadore.github.io/IWAC-sentiment-analysis/?view=charts&countries=Togo
# Vue tendances en anglais avec polarité positive
https://fmadore.github.io/IWAC-sentiment-analysis/?view=trends&lang=en&polarities=Positif
# Mode comparaison avec filtres de divergence
https://fmadore.github.io/IWAC-sentiment-analysis/?view=comparison&compare=true&diffMin=2&diffMax=5
# Heatmap avec centralité spécifique
https://fmadore.github.io/IWAC-sentiment-analysis/?view=heatmap¢ralities=Central,Très%20central
# Tableau avec filtres multiples
https://fmadore.github.io/IWAC-sentiment-analysis/?view=table&countries=Mali&subjectivities=1,2
# Comparaison de modèles
https://fmadore.github.io/IWAC-sentiment-analysis/?view=comparison&compare=true&dataset=chatgpt
L'application a été optimisée pour offrir des performances exceptionnelles malgré la taille importante des données (22MB de JSON) :
loadCurrentDataset() et loadComparisonDatasets() remplacent le chargement systématiquevite-plugin-compressiondisplay=swaptransform et will-change pour les performancesSEOHead.svelte avec métadonnées adaptatives par vue// svelte.config.js - Précompression activée
precompress: true
// vite.config.ts - Plugin de compression
compression({
algorithm: 'brotliCompress',
compressionOptions: { level: 11 }
})
Le projet est structuré comme une application SvelteKit moderne avec Svelte 5 runes :
src/lib/: Contient la logique principale de l'application.components/: Composants Svelte réutilisables organisés par catégorie.common/: Composants de base réutilisables.AccordionItem.svelte: Item accordéon animé pour sections pliables.ArbiterSection.svelte: Affichage des verdicts d'arbitrage entre modèles.ArticleDetailModal.svelte: Modal pour afficher les détails d'un article.ComparisonDetailModal.svelte: Modal pour afficher les détails de comparaison.ComparisonPanel.svelte: Panneau de contrôle du mode comparaison.DropdownMenu.svelte: Menu déroulant générique réutilisable.FilterCard.svelte: Conteneur stylisé pour les groupes de filtres.FilterChip.svelte: Chip de filtre avec états visuels.FullScreenModal.svelte: Modal plein écran pour les détails.GlassCard.svelte: Carte avec effet glassmorphism.LoadingState.svelte: Indicateur de chargement animé.SearchInput.svelte: Champ de recherche avec icône.SentimentBadge.svelte: Badge coloré pour afficher les valeurs de sentiment.layout/: Composants de mise en page.AppHeader.svelte: En-tête avec branding, sélecteur de langue et bouton plein écran.FiltersPanel.svelte: Panneau latéral contenant tous les filtres.SidebarNav.svelte: Navigation latérale avec menu des vues.ViewContent.svelte: Container principal pour le contenu des vues.data-display/: Composants d'affichage de données.AnalysisInfo.svelte: Informations explicatives sur la méthodologie d'analyse.ArticleDetail.svelte: Détails complets d'un article sélectionné.ArticleTable.svelte: Tableau interactif des articles avec tri et pagination.ComparisonDetail.svelte: Vue détaillée d'une comparaison article par article.ComparisonStats.svelte: Statistiques et métriques du mode comparaison.ComparisonTable.svelte: Tableau comparatif avec visualisation des divergences.ComparisonView.svelte: Interface principale du mode comparaison.filters/: Composants de filtrage.CentralityFilter.svelte: Filtre par centralité de l'islam/musulmans.ClearFiltersButton.svelte: Bouton pour effacer tous les filtres.CountryFilter.svelte: Filtre hiérarchique par pays.DiscrepancyFilter.svelte: Filtres avancés pour les divergences.ExtremeAnalysisControls.svelte: Contrôles pour l'analyse des extrêmes.JournalFilter.svelte: Filtre par journal avec recherche et pagination.PolarityFilter.svelte: Filtre par polarité du sentiment.SentimentCriteriaFilter.svelte: Filtres combinés polarité/subjectivité.SubjectivityFilter.svelte: Filtre par score de subjectivité.viz/: Composants de visualisation.CentralityHeatmap.svelte: Heatmap de centralité par pays et année.CorrelationChart.svelte: Distribution croisée polarité/subjectivité.KeywordFrequencyChart.svelte: Graphique des mots-clés dans les extrêmes.SentimentChart.svelte: Distribution de polarité par journal.SentimentTrendsChart.svelte: Évolution des sentiments dans le temps.SubjectivityChart.svelte: Distribution de subjectivité par journal.VolumeChart.svelte: Volume d'articles par pays au fil du temps.ui/: Composants d'interface utilisateur.ChartCard.svelte: Conteneur pour les graphiques avec titre et options.CSVExportButton.svelte: Bouton d'export CSV des données filtrées.ComparisonCSVExportButton.svelte: Export CSV spécialisé pour les comparaisons.DatasetBadge.svelte: Badge indiquant le dataset ou mode actuel.DatasetPicker.svelte: Sélecteur de dataset et mode comparaison.LanguageSwitcher.svelte: Sélecteur de langue FR/EN.ModelPairPicker.svelte: Sélecteur de paire de modèles pour comparaison.SEOHead.svelte: Métadonnées SEO dynamiques avec support multilingue.PWAManager.svelte: Gestion de l'installation PWA et des mises à jour.stores/: Modules de gestion d'état avec Svelte 5 runes.arbiter.svelte.ts: État des évaluations d'arbitrage Gemini 3.0 Pro.articles.svelte.ts: État des articles du corpus.comparison.svelte.ts: État du mode comparaison entre modèles.datasets.svelte.ts: État des datasets et sélection de modèles.extreme-analysis.svelte.ts: État de l'analyse des extrêmes lexicaux.filters.svelte.ts: État des filtres (pays, journal, polarité, etc.).ui.svelte.ts: État de l'interface (sidebar, vue active, chargement).url/: Module de gestion d'état URL.state.svelte.ts: État URL réactif.parser.svelte.ts: Parsing des paramètres URL.builder.svelte.ts: Construction des URLs partageables.actions.svelte.ts: Actions de manipulation d'état.constants.ts: Constantes et valeurs valides.types.ts: Types TypeScript pour l'état URL.*.test.ts: Tests unitaires Vitest pour les stores.i18n/: Système d'internationalisation.index.ts: Configuration principale et stores de langue.fr.ts: Traductions françaises (langue par défaut).en.ts: Traductions anglaises complètes.utils.ts: Utilitaires de traduction pour les valeurs de sentiment.types.ts: Types TypeScript pour les traductions.types/: Définitions TypeScript.data.ts: Structures de données (Article, SentimentAnalysis, etc.).extremeAnalysis.ts: Types pour l'analyse des extrêmes.pwa.ts: Types pour la gestion PWA.utils/: Fonctions utilitaires.chartTheme.ts: Configuration des thèmes ECharts.extremeAnalysis.ts: Utilitaires pour l'analyse des extrêmes.pwa.ts: Utilitaires pour la gestion PWA.urlState.ts: Gestion legacy de l'état URL (pour compatibilité).utils.ts: Fonctions utilitaires générales.index.ts: Point d'entrée central pour les exports.routes/: Définit les pages de l'application.+page.svelte: Composant principal de la page de visualisation.+page.ts: Script de chargement de données.+layout.svelte: Mise en page commune à toutes les pages.+layout.ts: Configuration pour le prérendu SSG.app.html: Template HTML principal de l'application.app.d.ts: Déclarations de types globaux.app.css: Styles CSS globaux avec variables CSS et thème.static/: Contient les fichiers statiques.data/: Fichiers de données JSON du corpus IWAC.iwac_articles_chatgpt.json: Articles analysés par ChatGPT.iwac_articles_gemini.json: Articles analysés par Gemini.iwac_articles_mistral.json: Articles analysés par Mistral.iwac_arbiter_evaluations_*.json: Évaluations d'arbitrage pour chaque paire de modèles.iwac_extreme_analysis_*.json: Analyses lexicales des extrêmes par modèle.data-preprocess/: Scripts de préparation des données.data-fetch.py: Script Python pour récupérer et transformer les données depuis Hugging Face.extreme-analysis.py: Script pour générer l'analyse lexicale des extrêmes..agent/: Configuration des workflows pour l'agent IA.package.json: Définit les dépendances du projet et les scripts npm.svelte.config.js: Configuration SvelteKit.tsconfig.json: Configuration TypeScript.vite.config.ts: Configuration Vite.L'application charge automatiquement le corpus IWAC depuis les fichiers JSON situés dans static/data/ :
iwac_articles_chatgpt.json: Articles analysés par ChatGPTiwac_articles_gemini.json: Articles analysés par Geminiiwac_articles_mistral.json: Articles analysés par MistralChaque fichier contient une liste d'objets Article, où chaque article inclut des métadonnées (titre, journal, pays, date) et un objet sentiment_analysis contenant les résultats de l'analyse (polarité, subjectivité, centralité, etc.).
Le mode comparaison utilise deux datasets simultanément (sélectionnés parmi les trois paires possibles) pour identifier et analyser les divergences entre les analyses des modèles.
Pour chaque paire de modèles, des évaluations d'arbitrage par Gemini 3.0 Pro sont disponibles :
iwac_arbiter_evaluations_chatgpt-gemini.jsoniwac_arbiter_evaluations_chatgpt-mistral.jsoniwac_arbiter_evaluations_gemini-mistral.jsonCes fichiers contiennent les verdicts de l'arbitre pour chaque dimension d'analyse (polarité, subjectivité, centralité), indiquant quel modèle a produit l'analyse la plus pertinente.
Consultez src/lib/types/data.ts pour la structure détaillée des objets Article, SentimentAnalysis et ComparisonData.
Le script data-preprocess/data-fetch.py permet de récupérer les données depuis le dataset Hugging Face "fmadore/iwac-newspaper-articles" et de les transformer au format attendu par l'application.
Le script data-preprocess/extreme-analysis.py génère une analyse lexicale approfondie des cas extrêmes (subjectivité, polarité, centralité) en identifiant les mots-clés les plus fréquents pour chaque catégorie et modèle. Cette analyse produit des fichiers JSON spécialisés pour la visualisation des patterns lexicaux.
L'application propose une suite complète de visualisations interactives pour explorer les données d'analyse de sentiment :
stores/)L'application utilise des modules de gestion d'état basés sur les Svelte 5 runes pour une réactivité optimale :
filters.svelte.tscountryFilters: Pays sélectionnés pour le filtrage (filtre hiérarchique principal).journalFilters: Journaux sélectionnés pour le filtrage.polarityFilters: Polarités sélectionnées pour le filtrage.subjectivityFilters: Scores de subjectivité sélectionnés.centralityFilters: Niveaux de centralité sélectionnés.discrepancyFilters: Filtres de divergence pour le mode comparaison.articles.svelte.tsdatasetArticles: Cache des articles par dataset.currentDatasetArticles: Articles du dataset sélectionné.selectedArticle: Article actuellement sélectionné pour affichage détaillé.filteredArticles: Articles après application de tous les filtres.availableJournals: Journaux disponibles selon les pays sélectionnés.datasets.svelte.tsavailableDatasets: Liste des datasets disponibles (ChatGPT, Gemini, Mistral).selectedDataset: Dataset actuellement sélectionné.comparisonMode: Booléen indiquant si le mode comparaison est actif.comparisonPair: Paire de modèles sélectionnée pour comparaison.comparison.svelte.tsselectedComparison: Comparaison actuellement sélectionnée pour affichage détaillé.comparisonData: Données de comparaison entre modèles.filteredComparisons: Comparaisons après application des filtres.comparisonStatistics: Statistiques et métriques de comparaison.arbiter.svelte.tsarbiterEvaluations: Évaluations d'arbitrage par Gemini 3.0 Pro.currentArbiterPair: Paire de modèles pour laquelle les évaluations sont chargées.arbiterStatistics: Statistiques des verdicts d'arbitrage.getArbiterForArticle(): Récupère l'évaluation d'arbitrage pour un article.ui.svelte.tssidebarExpanded: État d'expansion de la sidebar.activeView: Vue actuellement active (charts, trends, comparison, etc.).isLoadingDataset, isLoadingComparison, isLoadingArbiter: États de chargement.url/Gestion modulaire de l'état URL avec synchronisation automatique :
getCurrentState(): Récupère l'état actuel de l'application.parseURLState(): Parse les paramètres URL.buildURLSearchParams(): Construit les paramètres URL.updateURL(): Met à jour l'URL avec l'état actuel.initializeURLState(): Initialise l'état depuis l'URL.clearAllFilters(): Efface tous les filtres.AppHeader.svelte: En-tête moderne de l'application avec :
LanguageSwitcher.svelte: Composant de sélection de langue avec :
ClearFiltersButton.svelte: Bouton pour effacer tous les filtres avec :
CSVExportButton.svelte: Bouton d'export CSV avec :
ComparisonCSVExportButton.svelte: Export CSV spécialisé pour les comparaisons avec :
DatasetPicker.svelte: Sélecteur de dataset et mode comparaison avec :
DiscrepancyFilter.svelte: Filtres avancés pour le mode comparaison avec :
Tous les composants de filtrage supportent désormais la traduction automatique des valeurs :
CountryFilter.svelte: Permet de sélectionner un ou plusieurs pays. Ce filtre est hiérarchique et influence la liste des journaux disponibles. Les noms de pays sont traduits (ex: Bénin/Benin).JournalFilter.svelte: Permet de filtrer les articles par journal, avec fonctionnalités de recherche, pagination et affichage du nombre de journaux disponibles.PolarityFilter.svelte: Permet de filtrer les articles selon leur polarité avec traduction automatique des valeurs (Très positif/Very positive, etc.).SubjectivityFilter.svelte: Permet de filtrer les articles selon leur score de subjectivité (échelle de 1 à 5) avec légende explicative traduite.CentralityFilter.svelte: Permet de filtrer les articles selon la centralité du sujet islam/musulmans avec traduction des niveaux (Très central/Very central, etc.).SentimentChart.svelte: Utilise ECharts pour afficher la distribution des polarités par journal. Propose deux modes de visualisation :SubjectivityChart.svelte: Utilise ECharts pour afficher la distribution des scores de subjectivité par journal. Propose deux modes de visualisation :SentimentTrendsChart.svelte: Utilise ECharts pour afficher un graphique linéaire montrant l'évolution des sentiments au fil du temps (par année) avec zoom interactif et navigation.CorrelationChart.svelte: Graphique en barres groupées montrant la distribution croisée entre polarité et subjectivité, avec labels descriptifs et tooltips informatifs.VolumeChart.svelte: Visualise le volume d'articles par pays au fil du temps avec deux modes :CentralityHeatmap.svelte: Heatmap interactive montrant la centralité moyenne de l'islam/musulmans par pays et année, avec échelle de couleurs intuitive.ArticleTable.svelte: Affiche un tableau des articles filtrés avec possibilité de tri, pagination avancée, et vue mobile adaptée sous forme de cartes.ArticleDetail.svelte: Affiche les détails complets d'un article sélectionné, y compris ses métadonnées et les résultats d'analyse avec justifications.AnalysisInfo.svelte: Fournit des informations explicatives détaillées sur la méthodologie d'analyse (polarité, subjectivité, centralité) sous forme d'accordéon. S'adapte automatiquement au mode comparaison pour expliquer les différences entre modèles.ComparisonView.svelte: Interface principale du mode comparaison avec :
ComparisonTable.svelte: Tableau de comparaison avancé avec :
ComparisonDetail.svelte: Vue détaillée de comparaison avec :
ComparisonStats.svelte: Statistiques de comparaison avec :
+page.svelte et +page.ts)+page.ts: Fonction de chargement simplifiée qui ne charge plus de manifest externe.+page.svelte:L'application intègre un système complet de gestion multilingue :
currentLanguage et t pour les traductionsLe mode comparaison est une fonctionnalité avancée qui permet d'analyser les différences entre les analyses de sentiment effectuées par trois modèles IA (ChatGPT, Gemini, Mistral) sur le même corpus d'articles. Cette approche comparative offre des insights précieux sur :
?compare=true&pair=chatgpt-gemini à l'URLLe mode comparaison fournit des métriques détaillées :
Prérequis : Node.js et npm installés.
Cloner le projet (si ce n'est pas déjà fait) et naviguer dans le dossier :
# cd ma-visualisation-sentiments
Installer les dépendances :
npm install
Lancer le serveur de développement :
npm run dev
L'application sera généralement accessible à l'adresse http://localhost:5173.
Pour construire l'application pour la production :
npm run build
Ceci générera les fichiers optimisés dans le dossier build (si vous utilisez adapter-static, sinon le dossier dépendra de l'adaptateur configuré).
Pour prévisualiser la version de production (après npm run build) :
npm run preview
npm run dev: Lance le serveur de développement.npm run build: Construit l'application pour la production.npm run preview: Lance un serveur local pour prévisualiser la build de production.npm run check: Exécute Svelte Check pour vérifier les types et les erreurs dans les composants Svelte.npm run lint: Exécute ESLint pour vérifier les erreurs de style de code.npm run format: Exécute Prettier pour formater le code.npm run test: Lance les tests unitaires Vitest en mode watch.npm run test:run: Exécute les tests unitaires une seule fois.Pour mettre à jour les données du corpus IWAC :
Installer les dépendances Python :
pip install -r data-preprocess/requirements.txt
Exécuter le script de récupération des données :
python data-preprocess/data-fetch.py
Ce script récupère automatiquement les données depuis le dataset Hugging Face et génère les fichiers iwac_articles_chatgpt.json, iwac_articles_gemini.json et iwac_articles_mistral.json.
Générer les évaluations d'arbitrage (Admin uniquement) :
python data-preprocess/arbiter-evaluation.py
Ce script utilise l'API Gemini pour générer les verdicts d'arbitrage entre les modèles. Nécessite une clé API Google valide.
Générer l'analyse des extrêmes lexicaux (optionnel) :
python data-preprocess/extreme-analysis.py
Ce script analyse les mots-clés associés aux cas extrêmes de sentiment et génère :
iwac_extreme_analysis_chatgpt.json : Analyse lexicale des extrêmes pour ChatGPTiwac_extreme_analysis_gemini.json : Analyse lexicale des extrêmes pour Geminiiwac_extreme_analysis_mistral.json : Analyse lexicale des extrêmes pour MistralCes fichiers permettent d'alimenter la vue "Extremes" avec des insights sur les patterns lexicaux caractéristiques de chaque catégorie de sentiment.
L'application est automatiquement déployée sur GitHub Pages à chaque push sur la branche main.
Vous pouvez accéder à la version en ligne ici : https://fmadore.github.io/IWAC-sentiment-analysis/
Le déploiement est géré par un workflow GitHub Actions défini dans .github/workflows/deploy.yml.
Ce README fournit une vue d'ensemble du projet. Pour des détails spécifiques sur l'implémentation, veuillez consulter le code source et les commentaires dans les fichiers respectifs.