PROT. 2026/27:2·METOD OCH VALIDERING
Varför siffran sjönk från 0,78 till 0,62.
Den högre siffran kom från en vanlig valideringsfälla. Den lägre är talar-oberoende: ingen politiker i testet har en enda mening i träningsdatan. Här är skillnaden, och vad den kostar i siffror.
Att gissa parti från text är lätt att överskatta. Om samma politiker förekommer i både tränings- och testdata lär sig modellen delvis att känna igen enskilda personers formuleringar, inte partiets retorik. En vanlig radbaserad train/test-split (90/10 på anföranden) gör exakt det: samma talare hamnar på båda sidor.
Resultatet är en siffra som ser imponerande ut men mäter fel sak. Den säger egentligen: “känner modellen igen Magdalena Andersson när hon talar?”, inte “känner modellen igen Socialdemokraternas sätt att argumentera?”
Nuvarande validering är talar-oberoende: alla unika talare listas, blandas med ett fast frö, och 15 % läggs åt sidan i sin helhet innan träningen ens börjar. Ingen mening som en testad politiker någonsin sagt förekommer i träningsdatan.
- Undanhållna talare
- 146
- Andel av talarna
- 15 %
- Träningsperiod
- 2015-2026
- Anföranden i korpus
- 75 148
| Modell | Träffsäkerhet | Macro-F1 |
|---|---|---|
| Nuvarande · talar-oberoende split | 0.628 | 0.619 |
| Radbaserad split (läckt) | 0.776 | 0.775 |
Slumpbaslinje för 8-vägsklassificering: 0.125. Random Forest på samma korpus utan läckage landar i samma härad; 0.619 är alltså en verklig, försvarbar signal, inte brus.
En tidigare version korrigerade partiobalansen två gånger, både genom att översampla ovanliga partier och genom att vikta förlustfunktionen. Aggregerat syntes det knappt (macro-F1 0.595). Det syntes på korta meningar, där modellen föll tillbaka på de minsta partierna oavsett innehåll: »Stoppa invandringen!« lästes som V. Med en mekanism i stället för två läses samma mening som SD, med 95,9 %.
Riksdagens protokoll är tvåspaltiga PDF:er. En naiv textextraktion läser rakt över kolumnerna och blandar ihop dem, och sidhuvuden (protokollnummer, datum) hamnar mitt i meningar. Parsern läser nu kolumnvis, känner igen och rensar bort återkommande sidhuvuden, och hanterar repliker (Anf. N X (Y) replik:) och talare utan partibeteckning korrekt, istället för att låta nästa anförande sluka det föregående.
Hela korpusen byggs om från källan med den fixade koden: 75 148 anföranden ur 2 970 protokoll, 2002-2026. Varje protokoll Riksdagen publicerat finns sparat lokalt, så korpusen är inte ett arv från tidigare körningar utan något som går att återskapa: ett kommando, utan nätverk, med samma resultat varje gång.
Det är inte en akademisk poäng. Radens id var länge protokoll_N där N var en räknare över det parsern råkade hitta, inte något som stod i dokumentet. När parsern lagades ändrades vilka anföranden som hittades, alla följande index sköts ett steg, och samma id kom att peka på två olika tal. Id:t är nu protokoll_talare_parti: det står i dokumentet och kan inte glida.