Beschrijving
Na PR #50 gebruikt extraheer_kerntaken() een strict regex-filter (≥12 letters + lowercase + dedup). Dat lost de garbled-fragments op, maar PDFs waar kerntaken in tabellen staan leveren nu 0 kerntaken op — de markitdown-conversie vlakt tabellen af tot losse cellen op losse regels (B1-K1- op regel 1, 1 op regel 2, Theorie op regel 3, ...).
Voorbeeld: oeren/talland_oeren/25690 Beveiliger 2 24 maanden BOL.pdf — 40 regex-hits, allemaal cel-fragmenten zoals naam='1', 'W2', 'TE', '4'. Worden nu allemaal weggefilterd → 0 echte kerntaken.
Effect
Seed-data is gehalveerd: van 1000 studenten over 5 instellingen naar 600 studenten over 3 instellingen. Aeres MBO en Rijn IJssel vallen volledig weg omdat hun OERs vrijwel allemaal tabel-zwaar zijn. Da Vinci, ROC Utrecht en Talland hebben genoeg lopende-tekst-OERs om door te komen.
In bulk_seed.py-output wordt dit netjes gerapporteerd:
Overgeslagen instellingen:
- Aeres MBO: geen geïndexeerde OERs met kerntaken
- Rijn IJssel: ...
Mogelijke oplossingen
Optie A — pdfplumber tables (preferred):
pdfplumber heeft native page.extract_tables() die wel structuur behoudt
- Pre-processing stap: detecteer of een PDF tabel-zwaar is, gebruik dan tables-mode
- Heuristic: aantal
B\d-K\d- matches op losse regels > N → tabel-modus
Optie B — LLM-based extraction:
- Claude met de volledige OER-tekst (markdown) + system prompt "extract kerntaken/werkprocessen as JSON"
- Robust voor onverwachte layouts, maar duur per ingestie en niet deterministisch
- Past in
_ai.py-isolatiepatroon
Optie C — domeinspecifieke parser:
- Aeres-OERs hebben een herkenbare "Examenplannen 25-26"-structuur
- Per instelling/template een aparte parser
- Hoge maintenance, schaalt niet
Acceptatiecriteria
Context
Ontdekt tijdens verificatie van PR #50 (mei 2026). De keuze is bewust geweest om eerst de garbled-fragments te elimineren (data-integriteit) en de tabel-extractie als opvolgactie te plannen — liever 600 schone studenten dan 1000 met 95% onzin-kerntaken.
Gerelateerd: #49 (gesloten via #50), waar dit als opvolgactie expliciet wordt genoemd.
Beschrijving
Na PR #50 gebruikt
extraheer_kerntaken()een strict regex-filter (≥12 letters + lowercase + dedup). Dat lost de garbled-fragments op, maar PDFs waar kerntaken in tabellen staan leveren nu 0 kerntaken op — demarkitdown-conversie vlakt tabellen af tot losse cellen op losse regels (B1-K1-op regel 1,1op regel 2,Theorieop regel 3, ...).Voorbeeld:
oeren/talland_oeren/25690 Beveiliger 2 24 maanden BOL.pdf— 40 regex-hits, allemaal cel-fragmenten zoalsnaam='1','W2','TE','4'. Worden nu allemaal weggefilterd → 0 echte kerntaken.Effect
Seed-data is gehalveerd: van 1000 studenten over 5 instellingen naar 600 studenten over 3 instellingen. Aeres MBO en Rijn IJssel vallen volledig weg omdat hun OERs vrijwel allemaal tabel-zwaar zijn. Da Vinci, ROC Utrecht en Talland hebben genoeg lopende-tekst-OERs om door te komen.
In
bulk_seed.py-output wordt dit netjes gerapporteerd:Mogelijke oplossingen
Optie A — pdfplumber tables (preferred):
pdfplumberheeft nativepage.extract_tables()die wel structuur behoudtB\d-K\d-matches op losse regels > N → tabel-modusOptie B — LLM-based extraction:
_ai.py-isolatiepatroonOptie C — domeinspecifieke parser:
Acceptatiecriteria
tests/test_ingest.pyop een sample tabel-PDF die nu nul kerntaken oplevert (oeren/talland_oeren/25690*Beveiliger*.pdf)bulk_seedproduceert weer ~1000 studenten over 5 instellingenvalidatie_samenwijzer/README.mdals de ingest-flow extra stappen krijgtContext
Ontdekt tijdens verificatie van PR #50 (mei 2026). De keuze is bewust geweest om eerst de garbled-fragments te elimineren (data-integriteit) en de tabel-extractie als opvolgactie te plannen — liever 600 schone studenten dan 1000 met 95% onzin-kerntaken.
Gerelateerd: #49 (gesloten via #50), waar dit als opvolgactie expliciet wordt genoemd.