fix: Discours BC faux positif titre-only + bouton Analyse en fin de titre

- newsfeed.ts: les catégories Discours BC / Chef d'État ne sont retenues que
  si le nom propre apparaît dans le TITRE de l'article (pas dans le body)
  → un article UK social avec 'Bailey' dans le body ne sera plus taggué BC
- NewsTab: bouton Analyse déplacé après le titre de l'article (en fin de ligne)
  Layout final : [il y a Xh] [Source] [Catégorie]  puis  Titre... [▼ Analyse]

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
caty21
2026-06-28 15:16:05 +02:00
parent fa0b5d9c45
commit afd0026f25
2 changed files with 18 additions and 15 deletions
+11 -8
View File
@@ -788,14 +788,17 @@ async function fetchZeroHedgeNews(): Promise<NewsItem[]> {
const summary = plainText.slice(0, 300);
const analysisText = plainText.slice(0, 800);
// Pré-filtre macro : ZeroHedge couvre de nombreux sujets non-financiers.
// On exige qu'un mot-clé macro explicite soit présent AVANT d'appliquer les
// règles de noms de gouverneurs (évite "Bailey" dans un article social UK).
const MACRO_CONTEXT = /\b(rate|rates|dollar|euro|pound|yen|franc|currency|currencies|forex|fx\b|economy|economic|gdp|inflation|recession|central bank|fed\b|ecb\b|boe\b|boj\b|boc\b|rba\b|rbnz\b|snb\b|fomc|treasury|bond|yield|fiscal|monetary|tariff|trade war|deficit|debt|interest rate|rate cut|rate hike|basis point)\b/i;
if (!MACRO_CONTEXT.test(`${title} ${analysisText}`)) continue;
// Filtre de pertinence forex : garder seulement si une règle matche
const { impacts, categories } = applyRules(`${title} ${analysisText}`);
// Filtre de pertinence forex : garder seulement si une règle matche.
// IMPORTANT : "Discours BC" et "Chef d'État" (déclenchées par des noms propres)
// ne sont valides que si le nom apparaît dans le TITRE — évite "Bailey" dans
// un article social UK dont le body parle aussi de la "pound" ou de l'"economy".
const bodyResult = applyRules(`${title} ${analysisText}`);
const titleResult = applyRules(title);
const PERSON_CATS = new Set(["Discours BC", "Chef d'État"]);
const categories = bodyResult.categories.filter(
c => !PERSON_CATS.has(c) || titleResult.categories.includes(c)
);
const impacts = bodyResult.impacts;
if (impacts.length === 0 && categories.length === 0) continue;
const dateStr = dateM?.[1]?.trim() ?? "";