Skip to content

Tabel-extractie voor OER-PDFs zonder lopende-tekst kerntaken #53

@EdF2021

Description

@EdF2021

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

  • Aeres MBO en Rijn IJssel komen terug in de seed-set met >= 1 OER per instelling
  • Geen regressie op de huidige 3 werkende instellingen (Da Vinci, Talland, ROC Utrecht)
  • Test in tests/test_ingest.py op een sample tabel-PDF die nu nul kerntaken oplevert (oeren/talland_oeren/25690*Beveiliger*.pdf)
  • Verificatie: bulk_seed produceert weer ~1000 studenten over 5 instellingen
  • Documentatie-update in validatie_samenwijzer/README.md als de ingest-flow extra stappen krijgt

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.

Metadata

Metadata

Assignees

Labels

enhancementNew feature or requesttechTechnische verbeteringen

Type

No type
No fields configured for issues without a type.

Projects

Status
Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions