"""Testet das Keyword-Matching der RSS-Auswertung. Hintergrund: Dieselbe Lage lieferte am 01.08.2026 je nach Titel 79 oder 17 RSS-Treffer. Ursache war die Kombination aus zwei Dingen. Die Keyword-Erzeugung lieferte fuer den politisch formulierten Titel Phrasen ("migrationskrise spanien", "aufnahmeverfahren eu") statt Einzelbegriffe, und das Matching verglich diese Phrasen als starre Zeichenfolge. Die Schlagzeile "Migrationskrise in Spanien" enthaelt "migrationskrise spanien" nicht, wegen des Wortes dazwischen. Aus 53 Artikeln wurden so 16. Laeuft ohne Netzzugriff und ohne Kosten. Aufruf aus dem Projektstamm: venv/bin/python tests/test_rss_treffer.py """ import os import sys sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "src")) from feeds.rss_parser import wort_trifft, _is_specific_word # noqa: E402 from agents.researcher import FEED_SELECTION_PROMPT_TEMPLATE # noqa: E402 ok = 0 fail = 0 def pruefe(name, bedingung, extra=""): global ok, fail if bedingung: ok += 1 print(" OK " + name) else: fail += 1 print(" FEHL " + name + " " + str(extra)) SCHLAGZEILE = ( "migrationskrise in spanien: eu-innenminister beraten am dienstag über ceuta" ).lower() # --------------------------------------------------------------------------- # A. Einzelbegriffe verhalten sich wie bisher # --------------------------------------------------------------------------- print("\nA. Einzelbegriffe") pruefe("A1 enthaltenes Wort trifft", wort_trifft("ceuta", SCHLAGZEILE)) pruefe("A2 nicht enthaltenes Wort trifft nicht", not wort_trifft("marokko", SCHLAGZEILE)) pruefe("A3 Wortteil trifft weiterhin (Komposita)", wort_trifft("migration", SCHLAGZEILE)) pruefe("A4 leeres Wort trifft nie", not wort_trifft("", SCHLAGZEILE)) # --------------------------------------------------------------------------- # B. Phrasen treffen wortweise # --------------------------------------------------------------------------- print("\nB. Mehrwort-Begriffe") pruefe("B1 Phrase mit Wort dazwischen trifft jetzt", wort_trifft("migrationskrise spanien", SCHLAGZEILE)) pruefe("B2 Phrase in umgekehrter Reihenfolge trifft", wort_trifft("spanien migrationskrise", SCHLAGZEILE)) pruefe("B3 zusammenhaengende Phrase trifft weiterhin", wort_trifft("eu-innenminister beraten", SCHLAGZEILE)) pruefe("B4 fehlt ein Bestandteil, trifft die Phrase nicht", not wort_trifft("migrationskrise portugal", SCHLAGZEILE)) pruefe("B5 abstrakte Phrase ohne Bezug trifft nicht", not wort_trifft("aufnahmeverfahren eu", SCHLAGZEILE)) # Der gemeldete Fall: zehn Begriffe, davon neun Phrasen. KEYWORDS_LAGE_55 = [ "migrationskrise spanien", "eu-innenminister", "südgrenze spanien", "mittelmeer migration", "grenzschutz europa", "flüchtlinge mittelmeer", "überfahrten mittelmeer", "schengen-außengrenzen", "europol migration", "aufnahmeverfahren eu", ] treffer = sum(1 for w in KEYWORDS_LAGE_55 if wort_trifft(w, SCHLAGZEILE)) alt_treffer = sum(1 for w in KEYWORDS_LAGE_55 if w in SCHLAGZEILE) pruefe("B6 der gemeldete Keyword-Satz trifft die Schlagzeile jetzt", treffer >= 2, (treffer, alt_treffer)) pruefe("B7 vorher traf nur der eine Einzelbegriff", alt_treffer == 1, alt_treffer) # Die Schwelle bleibt unveraendert streng: ohne spezifisches Wort im Text # braucht es mehrere Treffer. FREMDE = "fussball bundesliga spieltag zusammenfassung".lower() pruefe("B8 fremde Schlagzeile bleibt ohne Treffer", sum(1 for w in KEYWORDS_LAGE_55 if wort_trifft(w, FREMDE)) == 0) pruefe("B9 Spezifik-Erkennung unveraendert", _is_specific_word("migrationskrise spanien") and not _is_specific_word("eu")) # --------------------------------------------------------------------------- # C. Der Auftrag verlangt Einzelbegriffe und Eigennamen # --------------------------------------------------------------------------- print("\nC. Auftrag an die Keyword-Erzeugung") for stichwort, name in ( ("EINZELWÖRTER", "C1 Einzelwoerter statt Phrasen gefordert"), ("Eigennamen der Lage MÜSSEN", "C2 Eigennamen sind Pflicht"), ("Schauplatz", "C3 Schauplatz wird ausdruecklich genannt"), ("KEINE abstrakten Politikbegriffe", "C4 abstrakte Begriffe ausgeschlossen"), ): pruefe(name, stichwort in FEED_SELECTION_PROMPT_TEMPLATE) pruefe("C5 Beispiel nennt den konkreten Fehlerfall", "ceuta" in FEED_SELECTION_PROMPT_TEMPLATE.lower()) print("\nErgebnis: " + str(ok) + " bestanden, " + str(fail) + " fehlgeschlagen") sys.exit(1 if fail else 0)