RSS-Parser: Match-Schwelle adaptiv (Bug 1 aus Buckelwal-Diagnose)
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) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
@@ -155,8 +155,16 @@ class RSSParser:
|
|||||||
summary = entry.get("summary", "")
|
summary = entry.get("summary", "")
|
||||||
text = f"{title} {summary}".lower()
|
text = f"{title} {summary}".lower()
|
||||||
|
|
||||||
# Flexibles Keyword-Matching: mindestens die Hälfte der Suchworte muss vorkommen (aufgerundet)
|
# Adaptive Match-Schwelle:
|
||||||
min_matches = min(2, max(1, (len(search_words) + 1) // 2))
|
# - 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)
|
match_count = sum(1 for word in search_words if word in text)
|
||||||
|
|
||||||
if match_count >= min_matches:
|
if match_count >= min_matches:
|
||||||
|
|||||||
In neuem Issue referenzieren
Einen Benutzer sperren