Gebruikersbesluit 2026-09-11: 'busstation' 60x in een artikel is één signaal, niet
60x de score. _filter_passes combineert titel- en samenvattingshits nu per familie
(dict over beide teksten). Gevolg (regressie-pinned): 'Pand naast busstation'
(titel+samenvatting) en 'Busstation wordt verbouwd' (zonder andere OV-term) zijn
nu geweerd; combinaties over 2 families (metro+halte, metrostation+metro) blijven
door.
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.
Gebruikersbesluit 2026-09-11 n.a.v. Omroep West-artikel 'Restaurant weg, pand
staat te verloederen': één 'busstation'-hit in de samenvatting ('pand naast
busstation') is geen OV-nieuws en mocht niet doorgelaten worden.
- Familie station-samenstellingen (trein/bus/metro-station): gewicht 3 -> 2
(medium). In de samenvatting moet nu een tweede OV-woord bijkomen; in de
titel volstaat het anker nog (2x2=4).
- 'busstation'/'metrostation' van de whitelist af (whitelist = altijd door).
- 'station' uit de voertuig-samenstelling-familie verwijderd: 'busstation'
telde dubbel mee (via 'bus' én 'station', 2x3=6).
- validate_filter.py: 6 nieuwe regressie-cases + invariant 2-aanpassing.
2026-09-11 09:07:43 +02:00
5 changed files with 118 additions and 36 deletions
# OV-matchfilter: VAST in code (gewogen families + blacklist), niet via config te wijzigen.
# 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 som van unieke OV-families >= 3; één familie telt 1× per artikel (titel + samenvatting; herhaling of beide velden = 1 signaal). Zie de families en de
# blacklist in buzzrss/bot.py (MATCH_FILTER_FAMILIES / MATCH_FILTER_BLACKLIST).
# blacklist in buzzrss/bot.py (MATCH_FILTER_FAMILIES / MATCH_FILTER_BLACKLIST).
# `!rss set-filter` en `!rss filter` tonen alleen de huidige (vaste) filter.
# `!rss set-filter` en `!rss filter` tonen alleen de huidige (vaste) filter.
(r"\b(?:ns|arriva|qbuzz|connexxion|cxx|transdev|keolis|ret|gvb|ebs|htm|syntus|u-ov|allgo|flixbus|blauwnet|r-net|valleilijn|waterbus|eurostar|thalys|randstadrail|gvu|prorail|hermes|rrreis|qliner|ov)\b",3),# vervoerders ('Breng' staat in de zwakke groep: botst met het werkwoord "brengen")
(r"\b(?:ns|arriva|qbuzz|connexxion|cxx|transdev|keolis|ret|gvb|ebs|htm|syntus|u-ov|allgo|flixbus|blauwnet|r-net|valleilijn|waterbus|eurostar|thalys|randstadrail|gvu|prorail|hermes|rrreis|qliner|ov)\b",3),# vervoerders ('Breng' staat in de zwakke groep: botst met het werkwoord "brengen")
(r"\b(?:spoorweg|spoorba(?:an|nen)|spoorlijn|spoorverkeer|spoorwegovergang|spoorbrug|spoorstoring|perron|seinstoring|wisselstoring|spoorstaking)\w*\b",3),# spoorinfra; let op de klinkerwisseling: 'ontsporing' (open lettergreep, één o) vs 'ontspoord'/'ontspoorde' (dicht, dubbel o) — vandaar beide stammen
(r"\b(?:spoorweg|spoorba(?:an|nen)|spoorlijn|spoorverkeer|spoorwegovergang|spoorbrug|spoorstoring|perron|seinstoring|wisselstoring|spoorstaking)\w*\b",3),# spoorinfra; let op de klinkerwisseling: 'ontsporing' (open lettergreep, één o) vs 'ontspoord'/'ontspoorde' (dicht, dubbel o) — vandaar beide stammen
(r"\b(?:treinstation|treinstations|metrostation|metrostations|busstation|busstations)\b",2),# station-samenstellingen: onmiskenbaar OV, maar MEDIUM — één station-woord náást een ander onderwerp ('pand naast busstation', besluit 2026-09-11) is geen OV-bericht; in de samenvatting moet een tweede OV-woord bijkomen
(r"(?<![\w-])\bstations?\b",1),# los 'station(s)' is ZWAK: ook tv-/radio-/regionale omroepstations ('de lokale stations'), moet combineren met een andere OV-familie
(r"(?<![\w-])\bstations?\b",1),# los 'station(s)' is ZWAK: ook tv-/radio-/regionale omroepstations ('de lokale stations'), moet combineren met een andere OV-familie
(r"\b(?:bus|tram|metro)-?(?:halte|haltes|lijn|lijnen|verkeer|net|staking|ba(?:an|nen)|hok(?:je|jes)|chauffeur)\w*\b",3),# voertuig-samenstelling (bushalte/buslijn/bushokje/busbanen/…); géén 'station': *station-samenstellingen zitten in de station-familie, anders telde 'busstation' dubbel mee (via 'bus' én 'station') — fix 2026-09-11
(r"\b(?:treinstoring|treinverkeer|treinstaking|treinongeval|treinbotsing|treinongeluk)\w*\b",3),# trein-jargon-samenstellingen: onmiskenbaar OV
(r"\b(?:treinstoring|treinverkeer|treinstaking|treinongeval|treinbotsing|treinongeluk)\w*\b",3),# trein-jargon-samenstellingen: onmiskenbaar OV
(r"\b\w*trein\w*\b",1),# losse 'trein' en algemene samenstellingen (stoptrein, goederentrein, treinverkeer al in bovenstaande familie) — ZWAK: 'de trein naar mijn nieuwe huis' is geen OV-jargon, moet combineren met een andere familie
(r"\b\w*trein\w*\b",1),# losse 'trein' en algemene samenstellingen (stoptrein, goederentrein, treinverkeer al in bovenstaande familie) — ZWAK: 'de trein naar mijn nieuwe huis' is geen OV-jargon, moet combineren met een andere familie
(r"\b(?:intercity|streekvervoer|stadsvervoer|veerdienst|veerboot|veerboten|veerpont|voetveer|veerverbinding|buurtbus|belbus)\w*\b",3),# treintypes, vervoerssectoren en veren ('sprinter' staat in de zwakke groep: atleet-botsing)
(r"\b(?:intercity|streekvervoer|stadsvervoer|veerdienst|veerboot|veerboten|veerpont|voetveer|veerverbinding|buurtbus|belbus)\w*\b",3),# treintypes, vervoerssectoren en veren ('sprinter' staat in de zwakke groep: atleet-botsing)
("Bushalte aan de Markt wordt verplaatst","De halte gaat 200 meter opschuiven.",True),
("Bushalte aan de Markt wordt verplaatst","De halte gaat 200 meter opschuiven.",True),
("Conducteur bekogeld in stoptrein bij Den Haag","De conducteur is nagekeken.",True),
("Conducteur bekogeld in stoptrein bij Den Haag","De conducteur is nagekeken.",True),
("Nieuwe app voor ovpay","De ovpay-app wordt dit najaar vernieuwd.",True),
("Nieuwe app voor ovpay","De ovpay-app wordt dit najaar vernieuwd.",True),
# fix 2026-09-11: station-samenstellingen zijn medium (niet meer whitelist/
# sterk) — een enkel 'busstation' in de samenvatting naast een ander onderwerp
# ('pand naast busstation') moet GEWEERD worden, en 'busstation' telt maar 1×.
("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.",False),# één familie in titel ÉN samenvatting = één signaal: 2 < 3 (besluit 2026-09-11)
("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","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)