This SvelteKit application visualizes sentiment analysis results performed on press article corpora. It loads and explores the Islam West Africa Collection (IWAC), filtering articles by various criteria (country, newspaper, polarity, subjectivity score, centrality) and displaying sentiment distributions as interactive charts.
Live site: https://fmadore.github.io/IWAC-sentiment-analysis/
Provide an interactive interface to explore and understand sentiment trends in media coverage of Islam and Muslims in francophone West African press.
Comparative analysis of results across three AI models (ChatGPT, Gemini, Mistral):
French and English support with automatic sentiment value translation and URL synchronization.
# Charts view with country filter
https://fmadore.github.io/IWAC-sentiment-analysis/?view=charts&countries=Togo
# Trends view in English with positive polarity
https://fmadore.github.io/IWAC-sentiment-analysis/?view=trends&lang=en&polarities=Positif
# Comparison mode with discrepancy filters
https://fmadore.github.io/IWAC-sentiment-analysis/?view=comparison&compare=true&diffMin=2&diffMax=5
# Heatmap with specific centrality
https://fmadore.github.io/IWAC-sentiment-analysis/?view=heatmap¢ralities=Central,Très%20central
# Table with multiple filters
https://fmadore.github.io/IWAC-sentiment-analysis/?view=table&countries=Mali&subjectivities=1,2
# Model comparison
https://fmadore.github.io/IWAC-sentiment-analysis/?view=comparison&compare=true&dataset=chatgpt
The application has been optimized for high performance despite large data volumes (22MB of JSON):
vite-plugin-compressiontransform and will-changeSEOHead.svelte component with adaptive metadata per view// svelte.config.js - Precompression enabled
precompress: true
// vite.config.ts - Compression plugin
compression({
algorithm: 'brotliCompress',
compressionOptions: { level: 11 }
})
The project is structured as a modern SvelteKit application with Svelte 5 runes:
src/lib/: Main application logic.components/: Reusable Svelte components organized by category.common/: Base reusable components (AccordionItem, ArbiterSection, FilterCard, FilterChip, GlassCard, SentimentBadge, modals, etc.).layout/: Page structure (AppHeader, FiltersPanel, SidebarNav, ViewContent).data-display/: Data display components (AnalysisInfo, ArticleDetail, ArticleTable, ComparisonDetail, ComparisonStats, ComparisonTable, ComparisonView).filters/: Filter components (CentralityFilter, CountryFilter, DiscrepancyFilter, JournalFilter, PolarityFilter, SubjectivityFilter, etc.).viz/: Visualization components (CentralityHeatmap, CorrelationChart, KeywordFrequencyChart, SentimentChart, SentimentTrendsChart, SubjectivityChart, VolumeChart).ui/: UI controls (ArbiterCSVExportButton, CSVExportButton, ComparisonCSVExportButton, DatasetPicker, LanguageSwitcher, ModelPairPicker, etc.).SEOHead.svelte: Dynamic SEO metadata with multilingual support.PWAManager.svelte: PWA installation and update management.stores/: State management modules with Svelte 5 runes.arbiter.svelte.ts: Gemini 2.5 Pro arbiter evaluation state.articles.svelte.ts: Corpus article state.comparison.svelte.ts: Model comparison mode state.datasets.svelte.ts: Dataset and model selection state.extreme-analysis.svelte.ts: Lexical extreme analysis state.filters.svelte.ts: Filter state (country, newspaper, polarity, etc.).ui.svelte.ts: UI state (sidebar, active view, loading).url/: URL state management module (state, parser, builder, actions, constants, types).*.test.ts: Vitest unit tests for stores.i18n/: Internationalization system (index, fr, en, utils, types).types/: TypeScript definitions.data.ts: Data structures (Article, SentimentAnalysis, etc.) with named types (PolarityValue, SubjectivityScore, CentralityValue).extremeAnalysis.ts: Extreme analysis types.pwa.ts: PWA types.utils/: Shared utility functions.format.ts: Shared formatting (formatDate, getArticleUrl, getModelDisplayName).csv.ts: CSV export (escapeCSVField, formatDateForCSV, downloadCSVFile).discrepancy.ts: Discrepancy display styling (getDiffClass, getDiffBadgeClass).chartTheme.ts: ECharts theme configuration.extremeAnalysis.ts: Extreme analysis utilities.pwa.ts: PWA utilities.urlState.ts: Legacy URL state management (for compatibility).utils.ts: General utility functions.index.ts: Central entry point for exports.routes/: Application pages.+page.svelte: Main visualization page component.+layout.svelte: Common layout for all pages.+layout.ts: SSG prerender configuration.app.html: Main HTML template.app.d.ts: Global type declarations.app.css: Global CSS styles with CSS variables and theme.static/: Static files.data/: IWAC corpus JSON data files.iwac_articles_chatgpt.json: Articles analyzed by ChatGPT.iwac_articles_gemini.json: Articles analyzed by Gemini.iwac_articles_mistral.json: Articles analyzed by Mistral.iwac_arbiter_evaluations_*.json: Arbiter evaluations for each model pair.iwac_extreme_analysis_*.json: Lexical extreme analyses per model.data-preprocess/: Data preparation scripts.shared.py: Shared module (data loading, conversions, score mappings, export utilities).data-fetch.py: Fetches and transforms data from Hugging Face.extreme-analysis.py: Generates lexical extreme analysis.significant-differences-export.py: Exports significant differences between models.arbiter-evaluation.py: Arbiter evaluation via Gemini API.package.json: Project dependencies and npm scripts.svelte.config.js: SvelteKit configuration.tsconfig.json: TypeScript configuration.vite.config.ts: Vite configuration.The application automatically loads the IWAC corpus from JSON files in static/data/:
iwac_articles_chatgpt.json: Articles analyzed by ChatGPTiwac_articles_gemini.json: Articles analyzed by Geminiiwac_articles_mistral.json: Articles analyzed by MistralEach file contains a list of Article objects, where each article includes metadata (title, newspaper, country, date) and a sentiment_analysis object with analysis results (polarity, subjectivity, centrality, etc.).
Comparison mode uses two datasets simultaneously (selected from the three possible pairs) to identify and analyze discrepancies between model analyses.
For each model pair, arbiter evaluations by Gemini 2.5 Pro are available:
iwac_arbiter_evaluations_chatgpt-gemini.jsoniwac_arbiter_evaluations_chatgpt-mistral.jsoniwac_arbiter_evaluations_gemini-mistral.jsonThese files contain arbiter verdicts for each analysis dimension (polarity, subjectivity, centrality), indicating which model produced the most relevant analysis.
See src/lib/types/data.ts for the detailed structure of Article, SentimentAnalysis, and ComparisonData objects.
The Python scripts share a common module data-preprocess/shared.py that centralizes data loading from Hugging Face, score conversions, model name mappings, and JSON export utilities.
data-preprocess/data-fetch.py fetches data from the Hugging Face dataset "fmadore/iwac-newspaper-articles" and transforms it into the format expected by the application.
data-preprocess/extreme-analysis.py generates in-depth lexical analysis of extreme cases (subjectivity, polarity, centrality) by identifying the most frequent keywords for each category and model.
data-preprocess/significant-differences-export.py exports significant discrepancies between different model analyses for the comparison mode.
data-preprocess/arbiter-evaluation.py runs arbiter evaluations using the Gemini API to generate verdicts between model pairs.
The application offers a comprehensive suite of interactive visualizations for exploring sentiment analysis data:
stores/)The application uses state management modules based on Svelte 5 runes for optimal reactivity:
filters.svelte.tscountryFilters: Selected countries (main hierarchical filter)journalFilters: Selected newspaperspolarityFilters: Selected polaritiessubjectivityFilters: Selected subjectivity scorescentralityFilters: Selected centrality levelsdiscrepancyFilters: Discrepancy filters for comparison modearticles.svelte.tsdatasetArticles: Articles cache by datasetcurrentDatasetArticles: Articles from the selected datasetselectedArticle: Currently selected article for detailed displayfilteredArticles: Articles after applying all filtersavailableJournals: Journals available based on selected countriesdatasets.svelte.tsavailableDatasets: Available datasets list (ChatGPT, Gemini, Mistral)selectedDataset: Currently selected datasetcomparisonMode: Boolean indicating if comparison mode is activecomparisonPair: Selected model pair for comparisoncomparison.svelte.tsselectedComparison: Currently selected comparison for detailed displaycomparisonData: Comparison data between modelsfilteredComparisons: Comparisons after applying filterscomparisonStatistics: Comparison statistics and metricsarbiter.svelte.tsarbiterEvaluations: Arbiter evaluations by Gemini 2.5 ProcurrentArbiterPair: Model pair for which evaluations are loadedarbiterStatistics: Arbiter verdict statisticsgetArbiterForArticle(): Retrieves arbiter evaluation for an articleui.svelte.tssidebarExpanded: Sidebar expansion stateactiveView: Currently active view (charts, trends, comparison, etc.)isLoadingDataset, isLoadingComparison, isLoadingArbiter: Loading statesurl/Modular URL state management with automatic synchronization:
getCurrentState(): Gets current application stateparseURLState(): Parses URL parametersbuildURLSearchParams(): Builds URL parametersupdateURL(): Updates URL with current stateinitializeURLState(): Initializes state from URLclearAllFilters(): Clears all filtersComparison mode is an advanced feature that analyzes differences between sentiment analyses performed by three AI models (ChatGPT, Gemini, Mistral) on the same article corpus. This comparative approach provides valuable insights into:
?compare=true&pair=chatgpt-gemini to the URLPrerequisites: Node.js and npm installed.
Clone the project and navigate to the folder:
cd ma-visualisation-sentiments
Install dependencies:
npm install
Start the development server:
npm run dev
The application will be available at http://localhost:5173.
Build for production:
npm run build
Preview the production build:
npm run preview
npm run dev: Start the development server.npm run build: Build the application for production.npm run preview: Preview the production build locally.npm run check: Run Svelte Check for type and error verification.npm run lint: Run ESLint for code style checking.npm run format: Run Prettier for code formatting.npm run test: Run Vitest unit tests in watch mode.npm run test:run: Run unit tests once (used in CI).To update the IWAC corpus data:
Install Python dependencies:
pip install -r data-preprocess/requirements.txt
Run the data fetch script:
python data-preprocess/data-fetch.py
This script automatically fetches data from the Hugging Face dataset and generates iwac_articles_chatgpt.json, iwac_articles_gemini.json, and iwac_articles_mistral.json.
Generate arbiter evaluations (Admin only):
python data-preprocess/arbiter-evaluation.py
This script uses the Gemini API to generate arbiter verdicts between models. Requires a valid Google API key.
Generate lexical extreme analysis (optional):
python data-preprocess/extreme-analysis.py
This script analyzes keywords associated with extreme sentiment cases and generates:
iwac_extreme_analysis_chatgpt.json: Lexical extreme analysis for ChatGPTiwac_extreme_analysis_gemini.json: Lexical extreme analysis for Geminiiwac_extreme_analysis_mistral.json: Lexical extreme analysis for MistralExport significant differences (optional):
python data-preprocess/significant-differences-export.py
Exports significant discrepancies between model analyses for the comparison mode.
adapter-staticThe application is automatically deployed to GitHub Pages on every push to the main branch.
Access the live version here: https://fmadore.github.io/IWAC-sentiment-analysis/
Deployment is managed by a GitHub Actions workflow defined in .github/workflows/deploy.yml.
This README provides an overview of the project. For specific implementation details, please refer to the source code.