From f5dec5416556412bfc13b6fcb123a84063e59779 Mon Sep 17 00:00:00 2001 From: Eddy de Vink Date: Sat, 12 Sep 2026 09:11:45 +0200 Subject: [PATCH] v1.10.0: whitelist alleen titel-anker; medium+zwak uitsluitend in samenvatting geweerd --- buzzrss/bot.py | 53 ++++++++++++++++++++++++++++++++++++---------- maubot.yaml | 2 +- validate_filter.py | 14 ++++++++++++ 3 files changed, 57 insertions(+), 12 deletions(-) diff --git a/buzzrss/bot.py b/buzzrss/bot.py index 8dae00b..d431a2a 100644 --- a/buzzrss/bot.py +++ b/buzzrss/bot.py @@ -89,13 +89,17 @@ rss_change_level = EventType.find("xyz.maubot.rss", t_class=EventType.Class.STAT # een niet-OV-bericht te veel doorgelaten (gebruikersbesluit, 2026-09-10). # # Drie lagen, elk met een eigen regel: -# 1. WHITELIST -> ALTIJD door. Alleen termen die in élke context OV -# betekenen (merken: NS/ProRail/Arriva; onmiskenbaar jargon: spoorstoring, -# perron, bushalte, conducteur, ovpay; multi-woord termen). +# 1. WHITELIST -> ALTIJD door BIJ EEN HIT IN DE TITEL. Alleen termen die +# in élke context OV betekenen (merken: NS/ProRail/Arriva; onmiskenbaar jargon: +# spoorstoring, perron, bushalte, conducteur, ovpay; multi-woord termen). # REGEL: twijfel je of de term ook buiten het OV kan voorkomen -> NIET hier. # 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). +# Een whitelist-term ALLEEN in de SAMENVATTING laat NIET onvoorwaardelijk +# door: een bijzin als 'de zakelijke bezoeker is ook nodig voor het openbaar +# vervoer' in een economiebericht is geen OV-nieuws (besluit 2026-09-12). +# Zo'n hit scoort via de gewogen families (dezelfde termen staan daar ook in). # 2. GEWOGEN FAMILIES -> score = som van unieke OV-families over het hele artikel # (titel + samenvatting; per familie 1× per artikel — herhaling of beide velden # tellen niet dubbel, besluit 2026-09-11) >= drempel (3). @@ -107,6 +111,12 @@ rss_change_level = EventType.find("xyz.maubot.rss", t_class=EventType.Class.STAT # 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). +# EXTRA (besluit 2026-09-12): een medium + zwak-combinatie +# UITSLUITEND in de samenvatting (geen enkele hit in de +# titel) is geen OV-bewijs — 'openbaar vervoer' + 'zakelijke +# reizigers' in een economiebericht telt dan toch op tot de +# drempel. Sterke (3) families blijven in de samenvatting +# gewoon tellen. # - zwak (1): DUBBELZINNIGHEID. Woorden die (ook) buiten het OV # voorkomen. REGEL: elk dubbelzinnig woord krijgt een EIGEN # familie (niet samengevoegd), zodat twee verschillende @@ -199,10 +209,15 @@ MATCH_FILTER_BLACKLIST: frozenset[str] = frozenset({ }) # MATCH_FILTER_WHITELIST: termen die een bericht per definitie OV maken. Eén enkele -# hit in titel óf samenvatting laat ALTIJD door (geen familiescore nodig) — dit is het -# expliciete "onmiskenbaar OV"-signaal, zodat we voor deze termen niet op de gewogen +# hit in de TITEL laat ALTIJD door (geen familiescore nodig) — dit is het expliciete +# "onmiskenbaar OV"-signaal, zodat we voor deze termen niet op de gewogen # heuristiek hoeven te leunen. Vergelijking is case-insensitive, dus ook 'nederlandse # spoorwegen', 'prorail' en 'NS' in all-caps titels tellen mee. +# Een whitelist-hit ALLEEN in de samenvatting is géén onvoorwaardelijk signaal +# (besluit 2026-09-12: 'openbaar vervoer' als bijzin in een economiebericht is geen +# OV-nieuws); die term scoort dan via de gewogen families — voor whitelist-termen +# die geen eigen familie hebben (bv. 'treinstel': alleen zwak via \w*trein\w*) is +# een samenvatting-alleen hit dus zwak. # Termen MOETEN in elke context OV betekenen. Niet hierop (algemeen/dubbelzinnig): # los 'trein', 'bus', 'metro', 'tram', 'station', 'lijn', 'ov', 'reiziger', # 'vervoerder', 'sprinter', @@ -407,7 +422,12 @@ class RSSBot(Plugin): 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 - zwakke familie in titel én samenvatting is géén combinatie. Weert oa + zwakke familie in titel én samenvatting is géén combinatie. Whitelist-termen + (NS, perron, bushalte, openbaar vervoer, ...) laten alleen onvoorwaardelijk + door BIJ EEN HIT IN DE TITEL; in de samenvatting wegen ze mee als gewogen + familie. Een medium + zwak-combinatie UITSLUITEND in de samenvatting (geen + enkele hit in de titel) is geen OV-bewijs ('openbaar vervoer' + 'zakelijke + reizigers' in een economiebericht, besluit 2026-09-12). Weert oa 'VW-bus' (bus matcht niet ná een koppelteken), 'schoolbus', 'bussen rijden om' in een woningbrand-lead, het werkwoord 'brengen', het idioom 'goed met elkaar overweg kunnen', 'een wijk opwaarderen', brandweerjargon @@ -415,8 +435,12 @@ class RSSBot(Plugin): waarin de samenvatting 'station' + 'pendelbus' + 'bus' noemt. Bewust doorgelaten: krant 'De Metro'/café 'De Tram' (medium) en atleet- 'sprinter' in combinatie met ander OV-woord.""" - # Whitelist: één onmiskenbare OV-term (titel óf samenvatting) laat altijd door. - if RSSBot._whitelist_hit(title) or RSSBot._whitelist_hit(summary): + # Whitelist: een onmiskenbare OV-term in de TITEL laat altijd door (het + # artikel kondigt het onderwerp aan: 'NS verlengt noodregeling'). Een + # whitelist-term ALLEEN in de samenvatting is geen OV-bewijs ('openbaar + # vervoer' als bijzin in een economiebericht, besluit 2026-09-12) en + # scoort via de gewogen families hieronder. + if RSSBot._whitelist_hit(title): return True t_hits = RSSBot._fam_hits(title) s_hits = RSSBot._fam_hits(summary) @@ -433,6 +457,11 @@ class RSSBot(Plugin): # 'bus' in een golfverslag telt anders op tot de drempel). if not t_hits or len(combined) < 2: return False + elif not t_hits and 1 in combined.values(): + # Medium + zwak uitsluitend in de samenvatting, niets in de titel: geen + # OV-bewijs. 'openbaar vervoer' + 'zakelijke reizigers' in een + # economiebericht telt anders op tot de drempel (besluit 2026-09-12). + return False return True @staticmethod @@ -444,13 +473,15 @@ 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 — één medium-hit volstaat niet, moet combineren met een andere OV-familie\n" + "trein-/bus-/metrostation — één medium-hit volstaat niet, moet combineren met een andere OV-familie; " + "medium + zwak uitsluitend in de samenvatting (geen hit in de titel) telt niet\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" - "**Whitelist (altijd door):** één onmiskenbare OV-term in titel óf samenvatting is genoeg " + "**Whitelist (altijd door bij een hit in de TITEL):** een onmisbare OV-term in de titel is genoeg " "(NS, ProRail, Nederlandse Spoorwegen, spoorstoring, perron, bushalte, conducteur, " - "ov-chipkaart, ovpay, openbaar vervoer, ...)\n\n" + "ov-chipkaart, ovpay, openbaar vervoer, ...); in de samenvatting alleen weegt zo'n term mee " + "als gewogen familie (medium/sterk)\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: som van unieke OV-families ≥ 3 — één familie telt 1× per artikel " diff --git a/maubot.yaml b/maubot.yaml index c8802e0..e6a42e7 100644 --- a/maubot.yaml +++ b/maubot.yaml @@ -1,5 +1,5 @@ id: nl.eddydevink.rss -version: 1.9.9 +version: 1.10.0 modules: - buzzrss main_class: RSSBot diff --git a/validate_filter.py b/validate_filter.py index 450e62d..85a7cfb 100755 --- a/validate_filter.py +++ b/validate_filter.py @@ -150,6 +150,20 @@ GOLDEN = [ ("Restaurant naast busstation wil uitbreiden", "De eigenaar wil uitbreiden naar het naastgelegen pand.", False), # zelfde regel, letterlijk gebruikersvoorbeeld ("Busstation wordt verbouwd", "De verbouwing duurt tot het voorjaar.", False), # herhaling/één woord = 1 signaal: 2 < 3 ('busstation' 60× weegt ook 1×) ("Metro rijdt niet", "De halte is tijdelijk gesloten.", True), # medium-combinatie over twee families: metro(2)+halte(2)=4 + # fix 2026-09-12: whitelist-term alleen in de SAMENVATTING is geen OV-bewijs + # (valt terug op gewogen families); medium+zwak uitsluitend in de samenvatting + # (geen hit in de titel) wordt geweerd. Echte cases 11-09-2026: + # AT5-economiebericht ('openbaar vervoer' + 'zakelijke reizigers' als bijzin) + # en Telegraaf-overstroming Japan ('openbaar vervoer ontregeld' in de tekst). + ("Economische groei van de stad niet meer vanzelfsprekend: ondernemersclubs waarschuwen", + "Volgens Evers is de zakelijke bezoeker ook nodig voor het openbaar vervoer, de culturele sector en musea. " + "Het aantal zakelijke reizigers in de stad daalt.", False), + ("Straat in Japan verandert in rivier door hevige regen", + "Het verkeer ligt plat en ook het openbaar vervoer is ontregeld in de getroffen regio.", False), + # recall-bewaakt: 'openbaar vervoer' in de TITEL blijft onvoorwaardelijk door + # (whitelist-titel-anker; Havenloods 11-09-2026, 'einde aan gratis ov'). + ("Er komt echt een einde aan gratis openbaar vervoer voor ouderen", + "De gemeente stopt vanaf januari met de gratis reizen voor 65-plussers.", True), # 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),