From a08df3d1214c0faa9e2e1a1af43ab4b6133decdc Mon Sep 17 00:00:00 2001 From: UserIsMH Date: Fri, 1 May 2026 16:55:05 +0200 Subject: [PATCH] RSS-Parser: Match-Schwelle adaptiv (Bug 1 aus Buckelwal-Diagnose) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bisher musste eine Headline mindestens 2 der dynamisch generierten Suchworte enthalten, um den Match-Filter zu passieren. Bei thematisch engen Lagen (Bsp. "Buckelwal timmy") fielen damit echte Treffer wie "Transport mit Buckelwal erreicht dänische Gewässer..." durch, weil nur 1 Keyword (buckelwal) gematcht hat. Neue Heuristik: enthält der Text mindestens ein spezifisches Keyword (>=7 Zeichen, also keine kurzen Akteursnamen wie "iran" oder "trump"), reicht 1 Treffer. Bei nur kurzen, generischen Keywords gilt weiter die alte Schwelle (halb der Wörter, max. 2). Topic-Filter danach (Haiku) fängt False Positives. Damit kommen ZDF/tagesschau/n-tv-Headlines mit nur einem starken Begriff durch — der Hauptgrund, warum Lage 8 Buckelwal mit ZDF-Quelle am ersten Refresh 0 Artikel hatte. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/feeds/rss_parser.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/feeds/rss_parser.py b/src/feeds/rss_parser.py index e4aaefb..5e756f4 100644 --- a/src/feeds/rss_parser.py +++ b/src/feeds/rss_parser.py @@ -155,8 +155,16 @@ class RSSParser: summary = entry.get("summary", "") text = f"{title} {summary}".lower() - # Flexibles Keyword-Matching: mindestens die Hälfte der Suchworte muss vorkommen (aufgerundet) - min_matches = min(2, max(1, (len(search_words) + 1) // 2)) + # Adaptive Match-Schwelle: + # - Bei mindestens einem spezifischen Keyword (>=7 Zeichen) im Text reicht 1 Treffer. + # Verhindert, dass Headlines mit nur einem starken Keyword wie "buckelwal" + # rausfallen, wenn die Lage thematisch eng ist (Bug 1, vom User dokumentiert). + # - Sonst: alte Heuristik (mindestens halb der Wörter, max. 2). + specific_in_text = any(w in text for w in search_words if len(w) >= 7) + if specific_in_text: + min_matches = 1 + else: + min_matches = min(2, max(1, (len(search_words) + 1) // 2)) match_count = sum(1 for word in search_words if word in text) if match_count >= min_matches: