"Fag" finnes ikke i Grep - Utdanningsdirektoratet/KL06-LK20-public GitHub Wiki

Denne artikkelen er en del av artikkelserien Mer i dybden

Så rart det enn høres, så finnes det ikke noen egen type/klasse i Grep som heter fag. Vi har riktig nok flere typer som kretser rundt begrepet fag, slik som

  • Læreplan (som jo er læreplan for fag)
  • Fagkategori (som brukes til statistikk. Denne er overordnet fagområde (se neste punkt))
  • Fagområde (som brukes til statistikk)
  • Fagkode (som er en identifikator for et fag eller del av et fag, for presist å kunne angi opplæring, eksamensgjennomføring, vurdering og dokumentasjon)
  • Opplæringsfag (som er en konstruksjon vi i Grep har laget som et lim som binder læreplan- og fagkode-sfæren (inkl. utdanningsprogram og programområdr osv)

De to siste, hvis vi ser på en forekomst av hver og en av de to typene over, har et målgruppe-element i seg. De er f.eks. en fagkode for et bestemt trinn, eller en bestemt eksamensordning. Opplæringsfag er f.eks. et opplæringsfag for et bestemt trinn eller en definert målgruppe.

Fagene i "Fag- og timefordeling"

Rundskrivet Fag- og timefordeling og tilbudsstruktur for Kunnskapsløftet Udir-1-2023 angir blant annet hvilke fag som det skal undervises i grunnopplæringen, men hvis vi leser de ulike tabellene som beskriver bestemmelser for de ulike fagene, ser vi at det ikke er noe en-til-en-forhold mellom Fag- og timefordeling og de enkelte læreplanene. Se for eksempel Tabell 1 Ordinær fag- og timefordeling for elever på 1.–10. trinn skoleåret 2023–2024. Tabellen lister opp fag vi kjenner igjen i titlene til læreplanene, men noen ganger er flere fag slått sammen (eks.: "Fremmedspråk/fordypning/arbeidslivsfag" og "Valgfag"). Den lister også opp ting som ikke finnes i læreplanene, men hvor det likevel finnes bestemmelser om timefordeling ("Fleksibel time" og "Fysisk aktivitet"). Det samme ser vi i f.eks Tabell 4 Fag- og timefordeling i utdanningsprogram for studiespesialisering, programområde for realfag og språk, samfunnsfag og økonomi

Rundskrivet kan leses på nettet og lastes ned som PDF, men er ikke digitalisert på en slik måte at vi kan bruke dataene maskinelt (API). Det nærmeste vi kommer fagene i rundskrivet i Grep, er kanskje Grep-typen "fagområde". I eksperimentene nedenfor har vi tatt med fagområde i tillegg til de "fagene" vi konstruerer der.

Begrepet fag

Hvis vi ser leksikalsk på det, så viser flere kilder at definisjonen kan være ganske vid. Vi slår eksempelvis opp i Det norske akademis ordbok (NAOB), og ser at de har denne definisjonen lenke til det som vises i illustrasjonen nedenfor (og vi hopper til betydning 6)
image
image
Fagene i skolen er det første eksempelet som listes opp. På tross av ganske presise definisjoner, kan vi likevel hevde at "Fagene i skolen" kan ha flere konnotasjoner:

  • det som på timeplanen som henger på kjøleskapet står som det jeg skal ha i 4. time på tirsdag – "Matte"
  • det jeg skal ta eksamen i en vakker vårdag: "Norsk sidemål, vg3 studieforberedende utdanningsprogram, skriftlig" (fagkode: NOR1268). Men faget er norsk, og læreplanen er Norsk (NOR01-06).
  • det som læreren setter seg inn i for å forberede undervisningen - læreplanen for faget, f.eks. norsk (NOR01-06)
    • men læreren i Norsk for elever med tegnspråk, setter seg inn i NOR05-05. Men det er fortsatt faget norsk.

Eksperiment: Kan vi fingere/simulere "fag" fra Grep-data?

Kan vi fingere eller simulere en ting vi kan kalle "fag", ut fra dataene vi har fra Grep?
Ja, kanskje – og her er det muligens to tilnærminger vi kan ta utgangspunkt i:

  1. Læreplankodens tre første tegn (f.eks "NOR")
  2. Læreplankodens fem første tegn (f.eks "NOR01"). Tegnene etter bindestreken i NOR01-06 viser til at det er den 6. revisjonen av NOR01. Det er NOR01 som viser hvilket fag vi snakker om.

Fag, basert på læreplankodens tre første tegn

Denne tilnærmingen gjør blant annet at f.eks fellesfaget "Norsk" og "Norsk for elever med tegnspråk er det samme faget "Norsk". Det gjør også at alle de ti matematikk-planene (Matematikk 1-10, Matematikk P, Matematikk 2P-Y osv) er "Matematikk. Hvis man godtar det, så må vi også nevne at vi kan komme opp i litt navnetrøbbel når vi kommer til programfagene i VGO. Ta f.eks "MDD":

  • MDD01 - Musikk, dans og drama
  • MDD02 - Bevegelse
  • MDD03 - Lytting
  • MDD04 - Danseteknikker
  • MDD05 - Musikk
  • MDD06 - Teaterensemble

Det skal en del programmering til (eller trylling i en spørring) for å bestemme hva fellesbetegnelsen for disse seks skal være for å si hvilket fag det dreier seg om. I eksempelet over, vet vi at fellesnevneren for disse er "Musikk, dans og drama", men vil det alltid være slik at "XXX02" og "XXX03" alltid bærer navnet til fellesnevneren som vi setter til "XXX01"? Testen nedenfor tyder på at det kanskje er slik. Se forklaringen etter den første spørringen nedenfor.

Eksperimentet i praksis (SPARQL)

Siden dette er et eksperiment, og ikke må forstås som Udirs offisielle til liste over fag basert på kriteriene over, kan vi lage oss en spørring over dataene som lister opp alle læreplaner basert på de tre første tegnene i koden, og navngir det vi får som treff som "fagKortTittel" (du kan kalle det noe annet om du vil). Vi velger oss SPARQL som spørrespråk, siden vi har et eget SPARQL-endepunkt for Grep.

Du kan prøve ut disse spørringene selv hvis du har lyst. Les først oppskriften i SPARQL-wikien vår, og gå til Beta-miljøet vi bruker til testing og kjør spørringene der. (velg repoet "201906" øverst til høyre på siden, og klikk på "sparql" i venstremenyen)

PREFIX u: <http://psi.udir.no/ontologi/kl06/>
PREFIX d: <http://psi.udir.no/kl06/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT ?fagKort ?fagKortTittel (GROUP_CONCAT(DISTINCT ?fomr; SEPARATOR=", ") AS ?fagomr) WHERE {
    # Finn minimum tallverdi for hver fagKort
    {
        SELECT ?fagKort (MIN(xsd:integer(SUBSTR(?kode, 4, 2))) AS ?minTallverdi) WHERE {
            ?lp a u:laereplan_lk20 ;
                u:kode ?kode ;
                u:kortform ?tittel ;
                u:fastsatt-spraak ?fastsattSpr .
            BIND(SUBSTR(?kode, 1, 3) AS ?fagKort)
            BIND(xsd:integer(SUBSTR(?kode, 4, 2)) AS ?tallverdi)
            # Filter for oss som ikke kan samisk
            FILTER(
                (?fastsattSpr = d:sme && LANG(?tittel) = "nob") ||
                (?fastsattSpr != d:sme && LANG(?tittel) = "default")
            )
        }
        GROUP BY ?fagKort
    }
    # Bruk minimum tallverdi til å finne riktig tittel og rense den
    {
        SELECT ?fagKort (CONCAT(UCASE(SUBSTR(?tittelRenset, 1, 1)), SUBSTR(?tittelRenset, 2)) AS ?fagKortTittel) WHERE {
            ?lp a u:laereplan_lk20 ;
                u:kode ?kode ;
                u:kortform ?tittel ;
                u:fastsatt-spraak ?fastsattSpr .
            BIND(SUBSTR(?kode, 1, 3) AS ?fagKort)
            BIND(xsd:integer(SUBSTR(?kode, 4, 2)) AS ?tallverdi)
            BIND(REPLACE(REPLACE(REPLACE(REPLACE(?tittel, "Vg1 ", ""), "(?i)Vg2 ", ""), "Vg3 ", ""), "1–10", "") AS ?tittelRenset)
            FILTER(
                (?fastsattSpr = d:sme && LANG(?tittel) = "nob") ||
                (?fastsattSpr != d:sme && LANG(?tittel) = "default")
            )
            {
                SELECT ?fagKort (MIN(xsd:integer(SUBSTR(?kode, 4, 2))) AS ?minTallverdi) WHERE {
                    ?lp a u:laereplan_lk20 ;
                        u:kode ?kode .
                    BIND(SUBSTR(?kode, 1, 3) AS ?fagKort)
                    BIND(xsd:integer(SUBSTR(?kode, 4, 2)) AS ?tallverdi)
                }
                GROUP BY ?fagKort
            }
            FILTER(?tallverdi = ?minTallverdi)
        }
    }
    # Hent fagomraade
    OPTIONAL {
        ?lp a u:laereplan_lk20 ;
            u:kode ?kode ;
            u:kortform ?tittel ;
            u:fastsatt-spraak ?fastsattSpr .
        BIND(SUBSTR(?kode, 1, 3) AS ?fagKort)
        BIND(xsd:integer(SUBSTR(?kode, 4, 2)) AS ?tallverdi)
        OPTIONAL {
            ?lp u:kompetansemaalsett/u:etter-fag/u:fagomraade-referanser ?fomrKode .
            ?fomrKode u:tittel ?fomr .
            FILTER(LANG(?fomr) = "default")
        }
    }
}
GROUP BY ?fagKort ?fagKortTittel
ORDER BY ?fagKort

Noen forklaringer:

  • I denne spørringen tar vi utgangspunkt i læreplankoden ?kode, som da er hele koden (som i "NOR01-06"). I linje 13 og 30 (for vi måtte lage flere lag med sub-spørringer for å få alt til å gå opp), binder vi de tre første tengene av koden til det vi har kalt ?fagKort ("NOR01-06" blir da "NOR")
  • I linje 5 (i SELECT-delen) har vi for sikkerhets skyld gruppekonkatenert (samlet i én celle i resultattabellen) fagområdene, siden egenskapen heter u:fagomraade-referanser og altså indikerer plural. Vi får disse bundet i ?fagomr, kommaseparert. Fagområder har egentlig ikke noe å si for "prosjektet" men kan være en fin tilleggsopplysning (hvis flere læreplankoder blir samlet til én, vil alle fagområdene bli listet opp (se "NOR" i resultatet).
  • Så har vi fjernet "Vg1 ", "Vg2 " og "Vg3 " og "1–10" i tittelen (vi måtte bruke flagget (?i) for "Vg2 " fordi det var ett tilfelle av liten forbokstav). Se BIND(REPLACE i linje 32.
  • I linje 33 har vi en betinget filtrering, slik at vi i stedet for samiske titler, får titlene på bokmål
    • "DDU", har "Duodji" også på bokmål. Duodji er en fellesbetegnelse på samenes tradisjonelle kunsthåndverk og husflid.
  • Merk at titlene tar utgangspunkt i kortformen av læreplantitlene (se linje 11 og 28), og at vi har tvunget alle titlene til å ha stor forbokstav (linje 25)
  • I avsnittet som begynner i 6 og 26 har vi sørget for at der vi får flere like ?fagKort, så er det den koden med lavest verdi som bærer tittelen. Altså at "NOR01" kommer før "NOR05", og dermed får tittelen "Norsk". Det samme for matematikk ("MAT"), men der har vi som nevnt i tillegg tatt bort "1-10" i tittelen.

Utsnitt av resultatet:
image
Her ser vi at Matematikk heter "Matematikk" og ikke "Matematikk 1–10", og at faget Musikk, dans og drama er fellesnevneren for alle MDD-planene og i tillegg er knyttet til flere fagområder.

Noen problemstillinger med denne modellen

"Samleplaner" som "POS" blir ikke riktig:

  • POS02: Sosialkunnskap
  • POS03: Samfunnsgeografi
  • POS04: Sosiologi og sosialantropologi
  • POS05: Politikk og menneskerettigheter

Det kan diskuteres at "POS" da blir "Sosialkunnskap", slik det blir etter reglene vi har satt opp i spørringen. De som har laget koden, har kanskje hatt "Politikk og samfunn" i tankene. Les mer mot slutten av artikkelen om det å legge for mye semantikk i utformingen av koden.

Det samme gjelder "ASK" ("Antikkens kultur" og "Latin eller gresk" som samlet blir "Antikkens kultur".

Andre veien, kunne vi sagt at "DAO02", "Design og arkitektur" kunne vært det overordnede faget for "DOR01", "Design og redesign".

Leser vi resultatene nøye, finner vi helt sikkert flere slike eksempler.

Derfor kan kanskje den neste tilnærmingen være en bedre løsning. Men da får vi langt flere fag. I skivende stund får tilnærmingen vi har beskrevet 304 treff, mens den neste får 428 treff.

⚠️NB⚠️
Vær obs på at denne listen over "fag" ikke er en offisiell liste fra Utdanningsdirektoratet.



Fag, basert på læreplankodens fem første tegn

En annen løsning, er å ta utgangspunkt i læreplanens fem første tegn. La oss gå rett til selve spørringen:

PREFIX u: <http://psi.udir.no/ontologi/kl06/>
PREFIX d: <http://psi.udir.no/kl06/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT ?fagKort ?fagKortTittel (GROUP_CONCAT(DISTINCT ?fomr; SEPARATOR=", ") AS ?fagomr) WHERE {
    # Finn fagKort basert på de første 5 tegnene av ?kode
    {
        SELECT ?fagKort (CONCAT(UCASE(SUBSTR(?tittel, 1, 1)), SUBSTR(?tittel, 2)) AS ?fagKortTittel) WHERE {
            ?lp a u:laereplan_lk20 ;
                u:kode ?kode ;
                u:kortform ?tittel ;
                u:fastsatt-spraak ?fastsattSpr .
            BIND(SUBSTR(?kode, 1, 5) AS ?fagKort)
            FILTER(
                (?fastsattSpr = d:sme && LANG(?tittel) = "nob") ||
                (?fastsattSpr != d:sme && LANG(?tittel) = "default")
            )
        }
        GROUP BY ?fagKort ?tittel
    }
    # Hent fagomraade
    OPTIONAL {
        ?lp a u:laereplan_lk20 ;
            u:kode ?kode ;
            u:kortform ?tittel ;
            u:fastsatt-spraak ?fastsattSpr .
        BIND(SUBSTR(?kode, 1, 5) AS ?fagKort)
        OPTIONAL {
            ?lp u:kompetansemaalsett/u:etter-fag/u:fagomraade-referanser ?fomrKode .
            ?fomrKode u:tittel ?fomr .
            FILTER(LANG(?fomr) = "default")
        }
    }
}
GROUP BY ?fagKort ?fagKortTittel
ORDER BY ?fagKort

Utsnintt av resulatet:
image
Her ser vi at alle matte-fagene og alle "MDD" (Musikk, dans og drama) er listet opp som egne fag. I denne spørringen har vi også valgt å beholde eventuelle henvisninger til VGO-trinn i tittelen, som i Vg2 maritime fag".

Denne spørringen er litt enklere enn den forrige fordi vi ikke tar hensyn til tallverdier for de to første tallene etter de tre bokstavene for så å bestemme at tittelen skal komme fra den med lavest tall.

Fordelen med denne metoden, er at vi får med oss alle læreplanene. Det eneste vi ikke bryr oss om er bindestreken, etterfulgt av de to siste tallene, altså det som angir hvilken revisjon vi er på i rekken av revisjoner for den spesifikke læreplanen.

Ulempen er kanskje at vi får flere "fag" enn tilsiktet, men det er øyet som ser. Fag (for grunnopplæringen) er kanskje noe imellom det du finner (mellom linjene) i tabellene i Fag- og timefordeling, og det du finner i en av disse spørringene.

Hva med å ta utgangpunkt i opplæringsfag?

Vi kunne også tenke at opplæringsfag kunne vært et bedre utgangspunkt enn læreplan for dette "prosjektet". Da ville man også fått med oss programfagene som ligger i kompetansemålsettene i læreplanen.
image
Utfordringen med et slikt utgangspunkt er at hvis vi ser igjennom listen over alle 904 opplæringsfag, så har vi noen ganger lyst til å ta med de fire første tegnene (etter samme prinsipp som de fem første i læreplanen), men andre ganger hele koden (alle seks tegnene). Dette kan eksemplifiseres med "AKT2 i bildet over. Her kan vi tenke oss å ta med alle seks tegnene i opplæringsfag-koden for å få med alle AKT2-titlene. Andre ganger, kan vi tenke oss å bruke kun de første fem, som i "NAT1" i bildet under for å samle alle til "Naturfag". Men den fremgangsmåten krever en ganske halsbrekkende regex-øvelse (som i BIND(REPLACE i spørringen over) for å strippe her og der i tittelen for det som til slutt skal bli den endelige tittelen. Det er bare ta en rask titt på titlene for "NAT1" i bildet under. For noen kunne det også gitt mening og bare ta med de tre første tegnene, men da mister du de ulike fagene vi nevnte i bildet over.

image
Men rent prinsipielt kunne kanskje opplæringsfag være det sikreste utgangspunktet, men vi ville fått en større rydde- og filtreringsjobb.

OK - vi gjør et forsøk, men tar denne gangen ikke med kode:

PREFIX u: <http://psi.udir.no/ontologi/kl06/>
PREFIX st: <https://data.udir.no/kl06/v201906/status/status_>

SELECT DISTINCT ?tittel (GROUP_CONCAT(DISTINCT ?ofKode; SEPARATOR=", ") AS ?opplFag)WHERE {

  ?s a u:opplaeringsfag ;
     u:tittel ?orgTittel ;
     u:status st:publisert ; # Vi fjerner utgåtte fag
     u:for-aarstrinn ?tr ;
     u:kode ?ofKode ;
     u:kortform ?ttl .

  FILTER(
    (LANG(?ttl)="default") &&
    (LANG(?orgTittel)="default") &&
    NOT EXISTS { ?s u:erstattes-av [] }
  )
  # Så fjerner vi alt om årstrinn
  BIND(
    REPLACE(
      ?ttl,
            # Neste linje er veldig lang... Rull sidelengs for å se
      "(, 1\\. årstrinn|, 10\\. årstrinn|, 2\\. årstrinn|, 3\\. årstrinn|, 4\\. årstrinn|, 5\\. årstrinn|, 6\\. årstrinn|, 7\\. årstrinn|, 8\\. årstrinn|, 9\\. årstrinn| 1\\. årstrinn| 2\\. årstrinn| 3\\. årstrinn| 4\\. årstrinn| 5\\. årstrinn| 6\\. årstrinn| 7\\. årstrinn| 8\\. årstrinn| 9\\. årstrinn| 10\\. årstrinn| 1\\.| 2\\.| 3\\.| 4\\.| 5\\.| 6\\.| 7\\.| 8\\.| 9\\.| 10\\.|, 1\\.|, 2\\.|, 2|, 3\\.|, 4\\.|, 5\\.|, 6\\.|, 7\\.|, 8\\.|, 9\\.|, 10\\.|, 1\\. år|, 2\\. år| 1\\. år| 2\\. år| vg1| vg2| vg3| år| 1 trinn| trinn)", 
      ""
    ) AS ?tittelRenset
  )
  # og henter originaltittelen der det er forkortelser i kortformen som vi bruker som tittel
  BIND(
    STR(
      IF(STR(?tittelRenset) = "Adm. og bærekr. drift", ?orgTittel,
        IF(STR(?tittelRenset) = "No. og samf., språk. min., VOV", ?orgTittel,
          IF(STR(?tittelRenset) = "Prod. av varer og tjenester", ?orgTittel,
            IF(STR(?tittelRenset) = "Kompl., prod. og brønnvedl.h.", ?orgTittel, ?tittelRenset)
          )
        )
      )
    # Den endelige tittelen
    ) AS ?tittel
  )    
}
GROUP BY ?tittel
ORDER BY ?tittel

Som i skrivende stund gir 556 titler som vi kanskje kunne kalle fag. Her er et lite utsnitt:
image Vi hopper til linje 360:
image
Her tar vi også med listen over opplæringsfag som ligger bak tittelen.

For ordens skyld – vi tar med disclameren en gang til:

⚠️NB⚠️
Vær obs på at denne listen over "fag" ikke er en offisiell liste fra Utdanningsdirektoratet.

En av grunnene til at vi ikke vil si at dette er Udirs liste over fag, er at vi ikke ønsker å opprette en bruk av disse tre- og fem-tegns-kodene som autorative koder. Læreplankoder skrives etter hvert som læreplanene opprettes, men syntaksen bestemmes ikke nødvendigvis ut fra de kriteriene som vi har lekt oss med i denne artikkelen. Det kan fort bli feil. Betrakt de de tre første tegnene som arbitrære koder, selv om det som som oftest ikke ser slik ut. De som skiver kodene, legger ofte inn en kombinasjon som gjør at de blir lette å huske. Det samme gjelder de som bruker læreplanene. Hele eller deler av læreplankoden brukes også aktivt på lærerværelset i noen tilfeller. Men for ordens skyld – det sikreste er kanskje å ta bort ?fagKort fra SELECT-delen av spørringene, slik at du kun sitter igjen med titlene.

Men tilbake til det mer overordnede begrepet fag. Det kan hende, basert på resultatene fra spørringene, at konklusjonen blir at det aller sikreste er en håndskrevet liste, utarbeidet etter en grundig gjennomgang av fag- og timefordelingen og lista over læreplaner og tilhørende opplæringsfag. Det beror litt på hva du legger i termen "fag".



Ta gjerne kontakt om du har forslag til endringer i denne artikkelen.

⚠️ **GitHub.com Fallback** ⚠️