D Ф m i И i q ц e L Ф y e r commited on
Commit
287ff6e
·
1 Parent(s): 72d257e

fix: add explainer functions for EEAT, TREC, and Bias dashboards

Browse files
Files changed (1) hide show
  1. syscred/static/index.html +160 -1
syscred/static/index.html CHANGED
@@ -1147,7 +1147,7 @@
1147
  const biasColor = biasScore > 0.5 ? '#ef4444' : biasScore > 0.3 ? '#eab308' : '#22c55e';
1148
  detailsHTML += `
1149
  <div class="detail-card">
1150
- <div class="detail-label">⚖️ Analyse de Biais <span class="help-icon" title="Mesure si le texte contient un langage biaisé ou partisan">?</span></div>
1151
  <div class="detail-value" style="color: ${biasColor}">${biasLabel} (${(biasScore * 100).toFixed(0)}%)</div>
1152
  </div>
1153
  `;
@@ -1895,6 +1895,165 @@
1895
  document.getElementById('explainerModal').classList.remove('visible');
1896
  }
1897
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1898
  // Close modal with Escape key
1899
  document.addEventListener('keydown', function(e) {
1900
  if (e.key === 'Escape') closeExplainer();
 
1147
  const biasColor = biasScore > 0.5 ? '#ef4444' : biasScore > 0.3 ? '#eab308' : '#22c55e';
1148
  detailsHTML += `
1149
  <div class="detail-card">
1150
+ <div class="detail-label">⚖️ Analyse de Biais <span class="help-icon" onclick="event.stopPropagation(); showBiasExplainer()" title="Mesure si le texte contient un langage biaisé ou partisan">?</span></div>
1151
  <div class="detail-value" style="color: ${biasColor}">${biasLabel} (${(biasScore * 100).toFixed(0)}%)</div>
1152
  </div>
1153
  `;
 
1895
  document.getElementById('explainerModal').classList.remove('visible');
1896
  }
1897
 
1898
+ function showEEATExplainer() {
1899
+ if (!lastAnalysisData) {
1900
+ alert('Analysez d\'abord une URL pour voir les explications.');
1901
+ return;
1902
+ }
1903
+
1904
+ const modal = document.getElementById('explainerModal');
1905
+ const body = document.getElementById('explainerBody');
1906
+
1907
+ const eeatScores = lastAnalysisData.eeat_scores || {};
1908
+
1909
+ let html = `
1910
+ <div class="metric-explain" style="border-left-color: #3b82f6; background: rgba(59, 130, 246, 0.1);">
1911
+ <div class="metric-explain-header">
1912
+ <span class="metric-explain-icon">📊</span>
1913
+ <span class="metric-explain-name">E-E-A-T Score</span>
1914
+ <span class="metric-explain-value" style="color: #3b82f6; font-size: 1.5rem;">${((eeatScores.overall || 0) * 100).toFixed(0)}%</span>
1915
+ </div>
1916
+ <div class="metric-explain-simple">
1917
+ <strong>Experience, Expertise, Authoritativeness, Trustworthiness</strong><br><br>
1918
+ Ce sont les critères utilisés par Google pour évaluer la qualité du contenu.
1919
+ </div>
1920
+ </div>
1921
+ `;
1922
+
1923
+ const eeatComponents = [
1924
+ { key: 'experience', label: 'Experience', desc: 'L\'auteur a-t-il une expérience directe du sujet ?' },
1925
+ { key: 'expertise', label: 'Expertise', desc: 'L\'auteur a-t-il des connaissances reconnues ?' },
1926
+ { key: 'authority', label: 'Authoritativeness', desc: 'La source est-elle reconnue dans son domaine ?' },
1927
+ { key: 'trust', label: 'Trustworthiness', desc: 'Le contenu est-il honnête et précis ?' }
1928
+ ];
1929
+
1930
+ eeatComponents.forEach(comp => {
1931
+ const score = eeatScores[comp.key] || 0;
1932
+ const color = score >= 0.7 ? '#22c55e' : score >= 0.4 ? '#eab308' : '#ef4444';
1933
+ html += `
1934
+ <div class="metric-explain">
1935
+ <div class="metric-explain-header">
1936
+ <span class="metric-explain-icon">${score >= 0.7 ? '✅' : score >= 0.4 ? '⚠️' : '❌'}</span>
1937
+ <span class="metric-explain-name">${comp.label}</span>
1938
+ <span class="metric-explain-value" style="color: ${color}">${(score * 100).toFixed(0)}%</span>
1939
+ </div>
1940
+ <div class="metric-explain-simple">
1941
+ ${comp.desc}
1942
+ </div>
1943
+ </div>
1944
+ `;
1945
+ });
1946
+
1947
+ body.innerHTML = html;
1948
+ modal.classList.add('visible');
1949
+ }
1950
+
1951
+ function showTRECExplainer() {
1952
+ if (!lastAnalysisData) {
1953
+ alert('Analysez d\'abord une URL pour voir les explications.');
1954
+ return;
1955
+ }
1956
+
1957
+ const modal = document.getElementById('explainerModal');
1958
+ const body = document.getElementById('explainerBody');
1959
+
1960
+ const trecMetrics = lastAnalysisData.trec_metrics || {};
1961
+
1962
+ let html = `
1963
+ <div class="metric-explain" style="border-left-color: #8b5cf6; background: rgba(139, 92, 246, 0.1);">
1964
+ <div class="metric-explain-header">
1965
+ <span class="metric-explain-icon">🔍</span>
1966
+ <span class="metric-explain-name">Métriques TREC</span>
1967
+ <span class="metric-explain-value" style="color: #8b5cf6; font-size: 1.5rem;">IR</span>
1968
+ </div>
1969
+ <div class="metric-explain-simple">
1970
+ <strong>Information Retrieval Metrics</strong><br><br>
1971
+ Ces métriques mesurent la qualité de la récupération d'informations.
1972
+ </div>
1973
+ </div>
1974
+ `;
1975
+
1976
+ const metrics = [
1977
+ { key: 'precision', label: 'Precision', desc: 'Proportion de documents pertinents parmi ceux retrievés' },
1978
+ { key: 'recall', label: 'Recall', desc: 'Proportion de documents pertinents récupérés sur le total' },
1979
+ { key: 'map', label: 'MAP', desc: 'Mean Average Precision - qualité globale du ranking' },
1980
+ { key: 'ndcg', label: 'NDCG', desc: 'Normalized DCG - pertinence normalisée' },
1981
+ { key: 'mrr', label: 'MRR', desc: 'Mean Reciprocal Rank - rang de la première réponse pertinente' }
1982
+ ];
1983
+
1984
+ metrics.forEach(m => {
1985
+ const val = trecMetrics[m.key];
1986
+ const displayVal = typeof val === 'number' ? (m.key === 'precision' || m.key === 'recall' ? (val * 100).toFixed(1) + '%' : val.toFixed(3)) : '--';
1987
+ html += `
1988
+ <div class="metric-explain">
1989
+ <div class="metric-explain-header">
1990
+ <span class="metric-explain-icon">📈</span>
1991
+ <span class="metric-explain-name">${m.label}</span>
1992
+ <span class="metric-explain-value" style="color: #8b5cf6">${displayVal}</span>
1993
+ </div>
1994
+ <div class="metric-explain-simple">
1995
+ ${m.desc}
1996
+ </div>
1997
+ </div>
1998
+ `;
1999
+ });
2000
+
2001
+ body.innerHTML = html;
2002
+ modal.classList.add('visible');
2003
+ }
2004
+
2005
+ function showBiasExplainer() {
2006
+ if (!lastAnalysisData) {
2007
+ alert('Analysez d\'abord une URL pour voir les explications.');
2008
+ return;
2009
+ }
2010
+
2011
+ const modal = document.getElementById('explainerModal');
2012
+ const body = document.getElementById('explainerBody');
2013
+
2014
+ const biasAnalysis = (lastAnalysisData.analyseNLP || {}).bias_analysis || {};
2015
+ const biasScore = biasAnalysis.score || 0;
2016
+
2017
+ let html = `
2018
+ <div class="metric-explain" style="border-left-color: #f59e0b; background: rgba(245, 158, 11, 0.1);">
2019
+ <div class="metric-explain-header">
2020
+ <span class="metric-explain-icon">⚖️</span>
2021
+ <span class="metric-explain-name">Analyse de Biais</span>
2022
+ <span class="metric-explain-value" style="color: #f59e0b; font-size: 1.5rem;">${(biasScore * 100).toFixed(0)}%</span>
2023
+ </div>
2024
+ <div class="metric-explain-simple">
2025
+ <strong>Détection de parti pris</strong><br><br>
2026
+ Nous analysons si le texte contient un langage émotionnel, subjectif ou partisan.
2027
+ </div>
2028
+ </div>
2029
+ `;
2030
+
2031
+ const indicators = [
2032
+ { key: 'label', label: 'Label', desc: 'Classification du niveau de biais détecté' },
2033
+ { key: 'score', label: 'Score', desc: 'Valeur entre 0 (pas de biais) et 1 (biais fort)' }
2034
+ ];
2035
+
2036
+ indicators.forEach(ind => {
2037
+ let val = biasAnalysis[ind.key];
2038
+ if (ind.key === 'score') val = (val * 100).toFixed(0) + '%';
2039
+ html += `
2040
+ <div class="metric-explain">
2041
+ <div class="metric-explain-header">
2042
+ <span class="metric-explain-icon">📋</span>
2043
+ <span class="metric-explain-name">${ind.label}</span>
2044
+ <span class="metric-explain-value" style="color: #f59e0b">${val || '--'}</span>
2045
+ </div>
2046
+ <div class="metric-explain-simple">
2047
+ ${ind.desc}
2048
+ </div>
2049
+ </div>
2050
+ `;
2051
+ });
2052
+
2053
+ body.innerHTML = html;
2054
+ modal.classList.add('visible');
2055
+ }
2056
+
2057
  // Close modal with Escape key
2058
  document.addEventListener('keydown', function(e) {
2059
  if (e.key === 'Escape') closeExplainer();