v1.9.8: titel weegt niet meer 2x — score = titel + samenvatting >= 3

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.
This commit is contained in:
Eddy de Vink 2026-09-11 09:17:08 +02:00
commit 341036cd16
4 changed files with 26 additions and 21 deletions

View file

@ -28,7 +28,7 @@ exclude_paywalled: true
# 0 = uit. # 0 = uit.
title_dedup_days: 30 title_dedup_days: 30
# 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 titelscore + samenvattingscore >= 3 (titel weegt niet extra). 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.
# Users who can bypass room permission checks # Users who can bypass room permission checks

View file

@ -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). # 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): # 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 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 # Gewicht 2 (medium): moet combineren met een andere OV-familie; één medium-hit,
# een tweede OV-woord bijkomen. # in titel óf samenvatting, haalt de drempel niet.
# Gewicht 1 (zwak/dubbelzinnig: los "bus", "breng", "overweg", "overwegen", "sein", # Gewicht 1 (zwak/dubbelzinnig: los "bus", "breng", "overweg", "overwegen", "sein",
# "kaartje", "opwaarderen", "rails", "pendelbus"): moet met een ander OV-woord # "kaartje", "opwaarderen", "rails", "pendelbus"): moet met een ander OV-woord
# combineren (een tweede, andere familie — dezelfde zwakke familie in titel én # 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 # NIET: station-samenstellingen (busstation/metrostation) — een bericht over
# een pand 'naast het busstation' is geen OV-nieuws (besluit 2026-09-11); # een pand 'naast het busstation' is geen OV-nieuws (besluit 2026-09-11);
# die wegen mee via de gewogen families (medium). # 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, # - sterk (3): onmiskenbaar OV-jargon/merken/samenvoegingen (spoorlijn,
# bushalte, busverkeer, intercity, lijn 12, ...). # bushalte, busverkeer, intercity, lijn 12, ...).
# - medium (2): onmiskenbaar OV maar iets algemener (tram, metro, halte, # - medium (2): onmiskenbaar OV maar iets algemener (tram, metro, halte,
# pont, ovpay, openbaar vervoer, trein-/bus-/metrostation); # pont, ovpay, openbaar vervoer, trein-/bus-/metrostation).
# mag niet volledig ontbreken, maar telt alleen mee ter # Moet COMBINEREN met een andere OV-familie: één medium-hit,
# ondersteuning. Station-samenstellingen zijn medium: één # in titel óf samenvatting, is onvoldoende — de titel weegt
# station-woord náást een ander onderwerp ('pand naast # niet extra ('restaurant naast busstation' in de titel is
# busstation') maakt een bericht nog geen OV-bericht # geen OV-bericht, besluit 2026-09-11).
# (besluit 2026-09-11).
# - zwak (1): DUBBELZINNIGHEID. Woorden die (ook) buiten het OV # - zwak (1): DUBBELZINNIGHEID. Woorden die (ook) buiten het OV
# voorkomen. REGEL: elk dubbelzinnig woord krijgt een EIGEN # voorkomen. REGEL: elk dubbelzinnig woord krijgt een EIGEN
# familie (niet samengevoegd), zodat twee verschillende # familie (niet samengevoegd), zodat twee verschillende
@ -394,11 +395,12 @@ class RSSBot(Plugin):
@staticmethod @staticmethod
def _filter_passes(title: str, summary: str) -> bool: 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 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 samenvatting. Medium (2) moet combineren met een andere OV-familie.
tweede OV-woord bijkomen.
Zwakke woorden (losse 'bus', 'breng', 'overweg', 'overwegen', 'sein', Zwakke woorden (losse 'bus', 'breng', 'overweg', 'overwegen', 'sein',
'opwaarderen', 'kaartje', 'rails', 'pendelbus') moeten combineren met een 'opwaarderen', 'kaartje', 'rails', 'pendelbus') moeten combineren met een
ander OV-woord én minstens één zwak woord moet in de titel staan; dezelfde ander OV-woord én minstens één zwak woord moet in de titel staan; dezelfde
@ -415,7 +417,7 @@ class RSSBot(Plugin):
return True return True
t_hits = RSSBot._fam_hits(title) t_hits = RSSBot._fam_hits(title)
s_hits = RSSBot._fam_hits(summary) 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: if score < MATCH_FILTER_THRESHOLD:
return False return False
if max(w for _, w in t_hits + s_hits) == 1: 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, " "samenstellingen als bushalte/buslijn/bushokje/busbaan/busverkeer, treinstoring/treinverkeer/treinstaking, "
"intercity/streekvervoer/veerdienst/buurtbus/belbus, 'lijn 12'\n" "intercity/streekvervoer/veerdienst/buurtbus/belbus, 'lijn 12'\n"
"- Medium (2): tram, metro, openbaar vervoer, lightrail, halte, pont, ov-chipkaart/ovpay, ov-staking, conducteur, " "- 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', " "- 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', " "'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" "'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" "ov-chipkaart, ovpay, openbaar vervoer, ...)\n\n"
"Uitgesloten (blacklist): woorden die wél matchen maar geen OV-waarde hebben, " "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" "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" "≥2 verschillende families én een zwak woord in de titel"
) )

View file

@ -1,5 +1,5 @@
id: nl.eddydevink.rss id: nl.eddydevink.rss
version: 1.9.7 version: 1.9.8
modules: modules:
- buzzrss - buzzrss
main_class: RSSBot main_class: RSSBot

View file

@ -145,9 +145,11 @@ GOLDEN = [
("Restaurant weg, pand staat te verloederen: 'Doorn in het oog'", ("Restaurant weg, pand staat te verloederen: 'Doorn in het oog'",
"De gemeente Midden-Delfland wil het leegstaande horecapand naast busstation Maasland " "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), "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') ("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", "", True), # titel-anker: 2×2=4 ("Nieuwe fietsenstalling bij busstation", "", False), # besluit 2026-09-11: één medium-hit in de titel is onvoldoende (titel weegt 1×, was 2×)
("Busstation wordt verbouwd", "Het busstation krijgt andere perrons.", True), # titel-anker: 2×2=4 ("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) # 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), ("Metrostation Centraal tijdelijk gesloten", "De metro's rijden niet.", True),
("NS verlengt noodregeling op traject Zwolle", "Reizigers moeten rekening houden met minder treinen.", True), ("NS verlengt noodregeling op traject Zwolle", "Reizigers moeten rekening houden met minder treinen.", True),