From 341036cd1634d4f543ba85d6ce8b2709223b0eb4 Mon Sep 17 00:00:00 2001 From: Eddy de Vink Date: Fri, 11 Sep 2026 09:17:08 +0200 Subject: [PATCH] =?UTF-8?q?v1.9.8:=20titel=20weegt=20niet=20meer=202x=20?= =?UTF-8?q?=E2=80=94=20score=20=3D=20titel=20+=20samenvatting=20>=3D=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Gebruikersbesluit 2026-09-11: een medium-hit in de TITEL haalt het filter te makkelijk ('restaurant naast busstation' = 2x2=4 was door). Formule gelijkgemaakt: score = titelscore + samenvattingscore >= 3. Gevolg (regressie-pinned): - enkel-woord-medium in titel is nu onvoldoende (fietsenstalling/restaurant-case geweerd); zware/sterke woorden en combinaties over 2 families blijven door. - zwak-alleen-regel (titel-anker + >=2 families) ongewijzigd. --- base-config.yaml | 2 +- buzzrss/bot.py | 35 +++++++++++++++++++---------------- maubot.yaml | 2 +- validate_filter.py | 8 +++++--- 4 files changed, 26 insertions(+), 21 deletions(-) diff --git a/base-config.yaml b/base-config.yaml index fc7fa59..c45ac42 100644 --- a/base-config.yaml +++ b/base-config.yaml @@ -28,7 +28,7 @@ exclude_paywalled: true # 0 = uit. title_dedup_days: 30 # OV-matchfilter: VAST in code (gewogen families + blacklist), niet via config te wijzigen. -# Doorlaten als 2×(titelscore) + 1×(samenvattingscore) >= 3. Zie de families en de +# Doorlaten als titelscore + samenvattingscore >= 3 (titel weegt niet extra). Zie de families en de # blacklist in buzzrss/bot.py (MATCH_FILTER_FAMILIES / MATCH_FILTER_BLACKLIST). # `!rss set-filter` en `!rss filter` tonen alleen de huidige (vaste) filter. # Users who can bypass room permission checks diff --git a/buzzrss/bot.py b/buzzrss/bot.py index 2247971..651b6eb 100644 --- a/buzzrss/bot.py +++ b/buzzrss/bot.py @@ -51,10 +51,12 @@ rss_change_level = EventType.find("xyz.maubot.rss", t_class=EventType.Class.STAT # Gewogen OV-trefwoord-families voor het match-filter. Elke tuple = (regex, gewicht). # Per familie wordt 1× geteld per tekst (niet per cluster/herhaling). Drempel (3): -# doorlaten als 2×(titelscore) + 1×(samenvattingscore) >= MATCH_FILTER_THRESHOLD +# doorlaten als titelscore + samenvattingscore >= MATCH_FILTER_THRESHOLD +# (titel weegt NIET extra — besluit 2026-09-11: 'restaurant naast busstation' +# als enige medium-hit in de titel is geen OV-bericht). # Gewicht 3 (sterk, onmiskenbaar OV): één woord in titel óf samenvatting volstaat. -# Gewicht 2 (medium): één woord in de titel volstaat; in de samenvatting moet er -# een tweede OV-woord bijkomen. +# Gewicht 2 (medium): moet combineren met een andere OV-familie; één medium-hit, +# in titel óf samenvatting, haalt de drempel niet. # Gewicht 1 (zwak/dubbelzinnig: los "bus", "breng", "overweg", "overwegen", "sein", # "kaartje", "opwaarderen", "rails", "pendelbus"): moet met een ander OV-woord # combineren (een tweede, andere familie — dezelfde zwakke familie in titel én @@ -94,16 +96,15 @@ rss_change_level = EventType.find("xyz.maubot.rss", t_class=EventType.Class.STAT # NIET: station-samenstellingen (busstation/metrostation) — een bericht over # een pand 'naast het busstation' is geen OV-nieuws (besluit 2026-09-11); # die wegen mee via de gewogen families (medium). -# 2. GEWOGEN FAMILIES -> score = 2x titel + 1x samenvatting >= drempel (3). +# 2. GEWOGEN FAMILIES -> score = titel + samenvatting >= drempel (3). # - sterk (3): onmiskenbaar OV-jargon/merken/samenvoegingen (spoorlijn, # bushalte, busverkeer, intercity, lijn 12, ...). # - medium (2): onmiskenbaar OV maar iets algemener (tram, metro, halte, -# pont, ovpay, openbaar vervoer, trein-/bus-/metrostation); -# mag niet volledig ontbreken, maar telt alleen mee ter -# ondersteuning. Station-samenstellingen zijn medium: één -# station-woord náást een ander onderwerp ('pand naast -# busstation') maakt een bericht nog geen OV-bericht -# (besluit 2026-09-11). +# pont, ovpay, openbaar vervoer, trein-/bus-/metrostation). +# Moet COMBINEREN met een andere OV-familie: één medium-hit, +# in titel óf samenvatting, is onvoldoende — de titel weegt +# niet extra ('restaurant naast busstation' in de titel is +# geen OV-bericht, besluit 2026-09-11). # - zwak (1): DUBBELZINNIGHEID. Woorden die (ook) buiten het OV # voorkomen. REGEL: elk dubbelzinnig woord krijgt een EIGEN # familie (niet samengevoegd), zodat twee verschillende @@ -394,11 +395,12 @@ class RSSBot(Plugin): @staticmethod def _filter_passes(title: str, summary: str) -> bool: - """Gewogen familiescore: doorlaten bij 2×(titelscore) + 1×(samenvattingscore) >= drempel. + """Gewogen familiescore: doorlaten bij titelscore + samenvattingscore >= drempel + (titel weegt NIET extra — één medium-hit in de titel, 'restaurant naast + busstation', is geen OV-bewijs; besluit 2026-09-11). Sterke families (gewicht 3) halen de drempel al met één woord in titel óf - samenvatting. Medium (2) in de titel ook; in de samenvatting moet er een - tweede OV-woord bijkomen. + samenvatting. Medium (2) moet combineren met een andere OV-familie. Zwakke woorden (losse 'bus', 'breng', 'overweg', 'overwegen', 'sein', 'opwaarderen', 'kaartje', 'rails', 'pendelbus') moeten combineren met een ander OV-woord én minstens één zwak woord moet in de titel staan; dezelfde @@ -415,7 +417,7 @@ class RSSBot(Plugin): return True t_hits = RSSBot._fam_hits(title) s_hits = RSSBot._fam_hits(summary) - score = 2 * sum(w for _, w in t_hits) + sum(w for _, w in s_hits) + score = sum(w for _, w in t_hits) + sum(w for _, w in s_hits) if score < MATCH_FILTER_THRESHOLD: return False if max(w for _, w in t_hits + s_hits) == 1: @@ -436,7 +438,7 @@ class RSSBot(Plugin): "samenstellingen als bushalte/buslijn/bushokje/busbaan/busverkeer, treinstoring/treinverkeer/treinstaking, " "intercity/streekvervoer/veerdienst/buurtbus/belbus, 'lijn 12'\n" "- Medium (2): tram, metro, openbaar vervoer, lightrail, halte, pont, ov-chipkaart/ovpay, ov-staking, conducteur, " - "trein-/bus-/metrostation (die vereisen in de samenvatting een tweede OV-woord: een 'pand naast busstation' is geen OV-bericht)\n" + "trein-/bus-/metrostation — één medium-hit volstaat niet, moet combineren met een andere OV-familie\n" "- Zwak (1): losse 'bus' (niet ná een koppelteken), 'pendelbus'/'shuttlebus', 'trein', 'station(s)', 'breng', 'overweg', 'overwegen', " "'sein', 'kaartje', 'opwaarderen', 'rails', 'inchecken'/'uitchecken', 'dienstregeling', 'chipkaart', 'reisproduct', 'vervoersbewijs', " "'ontsporen', 'reiziger', 'vervoerder', 'sprinter' — moet combineren met een ander OV-woord, met minstens één zwak woord in de titel\n\n" @@ -445,7 +447,8 @@ class RSSBot(Plugin): "ov-chipkaart, ovpay, openbaar vervoer, ...)\n\n" "Uitgesloten (blacklist): woorden die wél matchen maar geen OV-waarde hebben, " "o.a. straatnamen rond stations ('stationsstraat', 'stationsweg', ...) en niet-OV-vormen als 'stationcar' en 'stationair'\n\n" - "Doorlaten: `2×(titel-score) + 1×(samenvatting-score) ≥ 3`; bij uitsluitend zwakke woorden tellen alleen " + "Doorlaten: `titel-score + samenvatting-score ≥ 3` (titel weegt niet extra); " + "bij uitsluitend zwakke woorden tellen alleen " "≥2 verschillende families én een zwak woord in de titel" ) diff --git a/maubot.yaml b/maubot.yaml index 175d0f6..eecf6e1 100644 --- a/maubot.yaml +++ b/maubot.yaml @@ -1,5 +1,5 @@ id: nl.eddydevink.rss -version: 1.9.7 +version: 1.9.8 modules: - buzzrss main_class: RSSBot diff --git a/validate_filter.py b/validate_filter.py index 1196f9e..d4aef85 100755 --- a/validate_filter.py +++ b/validate_filter.py @@ -145,9 +145,11 @@ GOLDEN = [ ("Restaurant weg, pand staat te verloederen: 'Doorn in het oog'", "De gemeente Midden-Delfland wil het leegstaande horecapand naast busstation Maasland " "Viaduct kopen. Het gebouw staat al jaren leeg en maakt een vervallen indruk.", False), - ("Pand naast busstation wordt gesloopt", "Het leegstaande pand naast het busstation gaat plat.", True), # titel-anker: 2×2=4 (medium-in-titel volstaat, zelfde regel als 'Metrostation Centraal gesloten') - ("Nieuwe fietsenstalling bij busstation", "", True), # titel-anker: 2×2=4 - ("Busstation wordt verbouwd", "Het busstation krijgt andere perrons.", True), # titel-anker: 2×2=4 + ("Pand naast busstation wordt gesloopt", "Het leegstaande pand naast het busstation gaat plat.", True), # busstation in titel ÉN samenvatting: 2+2=4 — twee velden tellen mee + ("Nieuwe fietsenstalling bij busstation", "", False), # besluit 2026-09-11: één medium-hit in de titel is onvoldoende (titel weegt 1×, was 2×) + ("Restaurant naast busstation wil uitbreiden", "De eigenaar wil uitbreiden naar het naastgelegen pand.", False), # zelfde regel, letterlijk gebruikersvoorbeeld + ("Busstation wordt verbouwd", "Het busstation krijgt andere perrons.", True), # busstation in titel én samenvatting: 4 + ("Metro rijdt niet", "De halte is tijdelijk gesloten.", True), # medium-combinatie over twee families: metro(2)+halte(2)=4 # busstation mag niet dubbel meetellen via 'bus' én 'station' (was 2×3=6→nu 1×2) ("Metrostation Centraal tijdelijk gesloten", "De metro's rijden niet.", True), ("NS verlengt noodregeling op traject Zwolle", "Reizigers moeten rekening houden met minder treinen.", True),