Repository: EuroEval/EuroEval
Pull request #869: Add support for Finnish
Author: login: oliverkinch
Created: 2025-03-31T10:10:09Z | Merged: 2025-04-24T10:57:14Z

Adding support for Finnish.

| Dataset | Type | Included in PR |
|---------|------|---------------|
| TyDiQA-fi | Question Answering | x |
| ScandiSent-fi | Sentiment Analysis | ☐ |
| Finnish sentiment | Sentiment Analysis | x |
| OpenSubtitlesSent-nl | Sentiment Analysis | ☐ |
| ScaLA with Turku Dependency Treebank | Linguistic Acceptability | x |
| FiNER | Named Entity Recognition | ☐ |
| TurkuNER | Named Entity Recognition | x |
| XLSUM-fi | Summarization | x |
| FINBench General Knowledge | Knowledge | ☐ |
| FINBench Paraphrase | Knowledge | ☐ |
| HellaSwag-fi-google-translate | Commonsense Reasoning | x |
| HellaSwag-fi (GPT-4o) | Reasoning | ☐ |




Fix https://github.com/EuroEval/EuroEval/issues/158


Diff:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 371e62b4f..b654a2b00 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -137,6 +137,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
   that it is the German version of the dataset, and to avoid confusion with the Spanish
   'mlsum-es' dataset.
 
+### Added
+- Added support for Finnish 🇫🇮! This includes the Finnish part of the reading comprehension dataset
+  [TydiQA-fi](https://huggingface.co/datasets/google-research-datasets/tydiqa/viewer/secondary_task?views%5B%5D=secondary_task_train),
+  the Finnish part of the binary sentiment classification dataset [ScandiSent](https://github.com/timpal0l/ScandiSent), the linguistic acceptability dataset ScaLA with the [Finnish Universal
+  Dependencies](https://github.com/UniversalDependencies/UD_Finnish-TDT), the NER dataset [Turku NER](https://aclanthology.org/2020.lrec-1.567/), the summarisation dataset [XL-Sum-fi](https://huggingface.co/datasets/TurkuNLP/xlsum-fi), and the common-sense reasoning dataset [HellaSwag-fi](https://huggingface.co/datasets/Finnish-NLP/hellaswag-fi-google-translate).
+
 ### Fixed
 - Now uses `fp16` instead of `bf16` when evaluating decoder models on GPUs with CUDA
   compatibility < 8.0. This was contributed by
diff --git a/docs/datasets/finnish.md b/docs/datasets/finnish.md
new file mode 100644
index 000000000..5b3618b6e
--- /dev/null
+++ b/docs/datasets/finnish.md
@@ -0,0 +1,388 @@
+# 🇫🇮 Finnish
+
+This is an overview of all the datasets used in the Finnish part of EuroEval. The
+datasets are grouped by their task - see the [task overview](/tasks) for more
+information about what these constitute.
+
+## Sentiment Classification
+
+### ScandiSent-fi
+
+This dataset consists of reviews from Trustpilot and was published [here](https://aclanthology.org/2021.nodalida-main.42/). It is a binary sentiment classification dataset, with labels "positive" and "negative".
+
+For the Finnish part of the dataset, there are 10,000 training samples. From these samples, we have created a 1,024 / 256 / 2,048 split for the train, validation and test splits, respectively.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Kaikki meni niinkuin piti. Nopea toimitus.",
+  "label": "positive"
+}
+```
+```json
+{
+  "text": "En pidä tästä, kun ei löydy linkkiä mistä pääsis heti maksamaan. En todellakaan pidä siitä, että joka tieto pitää kopioida erikseen. Haluaisin päästä suoraan oston jälkeen maksamaa mobiilipankkiin. Pari laskua on jäänyt tän takia kokonaan huomioimatta. Ja ihan turhaa.... ärsyttää sitten se kotiin tuleva muistutuslasku.",
+  "label": "negative"
+}
+```
+```json
+{
+  "text": "Todella hidas toimitus, ja virheellistä tietoa tuotteiden saatavuudesta, paketti ja tuotteet perillä vasta kuukauden päästä tilauksesta....",
+  "label": "negative"
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 12
+- Prefix prompt:
+  ```
+  Seuraavassa on arvosteluja ja niiden tunnesävy, joka voi olla 'positiivinen' tai 'negatiivinen'.
+  ```
+- Base prompt template:
+  ```
+  Teksti: {text}
+  Tunnesävy: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Teksti: {text}
+
+  Luokittele arvostelun tunnesävy. Vastaa vain 'positiivinen' tai 'negatiivinen', ei muuta.
+  ```
+- Label mapping:
+    - `positive` ➡️ `positiivinen`
+    - `negative` ➡️ `negatiivinen`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset scandisent-fi
+```
+
+
+## Named Entity Recognition
+
+### Turku-NER-fi
+
+This dataset was published in [this paper](https://aclanthology.org/2020.lrec-1.567/). The dataset is a manually annotated corpus built on the Universal Dependencies Finnish corpus. The corpus was created by the Turku NLP group.
+
+The original dataset contains 12,217 / 1,364 / 1,555 samples for the training, validation and test splits, respectively. We use 1,024 / 256 / 2,048 samples for our training, validation and test splits, respectively. All the new splits are subsets of the original splits.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "tokens": ["Suomalaiset", "vaihtoivat", "Tukholman", "Tallinnaan"],
+  "labels": ["O", "O", "B-LOC", "B-LOC"]
+}
+```
+```json
+{
+  "tokens": array(['Liuhto', 'nosti', 'Kreikan', 'tapauksen', 'yhteydessä', 'esille', 'kysymyksen', 'siitä', ',', 'miten', 'Euroopan', 'unionissa', 'yleisesti', 'sanktioidaan', 'pelisääntöjen', 'rikkomisesta', '.'], dtype=object),
+  "labels": array(['B-PER', 'O', 'B-LOC', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-ORG', 'I-ORG', 'O', 'O', 'O', 'O', 'O'], dtype=object)
+}
+```
+```json
+{
+  "tokens": array(['Mithridates', 'oli', 'Pontoksen', 'merkittävin', 'kuningas', 'ja', 'Rooman', 'valtakunnan', 'vaarallisin', 'vihollinen', 'ensimmäisellä', 'vuosisadalla', 'eaa.', '.'], dtype=object),
+  "labels": array(['B-PER', 'O', 'B-LOC', 'O', 'O', 'O', 'B-LOC', 'I-LOC', 'O', 'O', 'O', 'O', 'O', 'O'], dtype=object)
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 8
+- Prefix prompt:
+  ```
+  Seuraavassa on lauseita ja JSON-sanakirjoja, jotka sisältävät annetussa lauseessa esiintyvät nimetyt entiteetit.
+  ```
+- Base prompt template:
+  ```
+  Lause: {text}
+  Nimetyt entiteetit: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Lause: {text}
+
+  Tunnista lauseessa esiintyvät nimetyt entiteetit. Tulosta ne JSON-sanakirjana, jonka avaimet ovat 'henkilö', 'paikka', 'organisaatio' ja 'muut'. Arvojen tulee olla listoja kyseisen tyypin nimetyistä entiteeteistä täsmälleen siinä muodossa kuin ne esiintyvät lauseessa.
+  ```
+- Label mapping:
+    - `B-PER` ➡️ `person`
+    - `I-PER` ➡️ `person`
+    - `B-LOC` ➡️ `sted`
+    - `I-LOC` ➡️ `sted`
+    - `B-ORG` ➡️ `organisation`
+    - `I-ORG` ➡️ `organisation`
+    - `B-MISC` ➡️ `diverse`
+    - `I-MISC` ➡️ `diverse`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset turku-ner-fi
+```
+
+
+## Linguistic Acceptability
+
+### ScaLA-fi
+
+This dataset was published in [this paper](https://aclanthology.org/2023.nodalida-1.20/)
+and was automatically created from the [Finnish Universal Dependencies
+treebank](https://github.com/UniversalDependencies/UD_Finnish-TDT/tree/master) by
+assuming that the documents in the treebank are correct, and corrupting the samples to
+create grammatically incorrect samples. The corruptions were done by either removing a
+word from a sentence, or by swapping two neighbouring words in a sentence. To ensure
+that this does indeed break the grammaticality of the sentence, a set of rules were used
+on the part-of-speech tags of the words in the sentence.
+
+The original dataset consists of 15,136 samples, from which we use 1,024 / 256 / 2,048 samples for training,
+validation and testing, respectively (so 3,328 samples used in total). These splits are
+used as-is in the framework.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Vuotta aiempaan verrattuna uusia ajoneuvoja rekisteröitiin 17,6 prosenttia enemmän.",
+  "label": "correct"
+}
+```
+```json
+{
+  "text": "20-vuotias sai aiemmin marraskuussa 2006 Helsingin käräjäoikeudelta 30 päiväsakkoa Ta... varastettujen vaatteiden hallussapidosta.",
+  "label": "correct"
+}
+```
+```json
+{
+  "text": "Kun käyttäjä kirjoittaa viestin, se näkyy käyttäjän käyttäjälistassa.",
+  "label": "incorrect"
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 12
+- Prefix prompt:
+  ```
+  Seuraavat ovat lauseita ja ovatko ne kieliopillisesti oikein.
+  ```
+- Base prompt template:
+  ```
+  Lause: {text}
+  Kieliopillisesti oikein: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Lause: {text}
+
+  Määritä onko lause kieliopillisesti oikein vai ei. Vastaa 'kyllä', jos lause on oikein, ja 'ei', jos se ei ole.
+  ```
+- Label mapping:
+    - `correct` ➡️ `kyllä`
+    - `incorrect` ➡️ `ei`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset scala-fi
+```
+
+
+## Reading Comprehension
+
+### TydiQA-fi
+This question-answering dataset was published in [this paper](https://aclanthology.org/2020.tacl-1.30/). TydiQA is a multilingual dataset covering 11 typologically diverse languages with 204K question-answer pairs collected from native speakers genuinely seeking information. It was designed to evaluate models across languages with varied linguistic features and contains questions written directly in each language without translation.
+
+The original Finnish TydiQA dataset contains 6,855 training and 782 validation samples (we use the [secondary task subset](https://huggingface.co/datasets/google-research-datasets/tydiqa/viewer/secondary_task?views%5B%5D=secondary_task_train)).  We created a 1,024 / 256 / 2,024 split, where the samples from the train and validation split are sampled from the original train and validation splits, respectively. The test set consists of the remaining samples from the original validation split + additional samples from the original train split.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "question": "Kuka näytteli Dumbledorea Harry Potter elokuvissa?",
+  "context": "Dumbledorea esittää kirjasarjasta tehdyssä elokuvasarjassa Richard Harris kahdessa ensimmäisessä elokuvassa. Harrisin kuoltua Michael Gambon esitti hahmoa sarjan lopuissa elokuvissa.",
+  "answers": {
+    "text": ["Richard Harris kahdessa ensimmäisessä elokuvassa. Harrisin kuoltua Michael Gambon"],
+    "answer_start": [59]
+  }
+}
+
+```json
+{
+  "question": "Milloin Cristiano Ronaldo liittyi Juventukseen?",
+  "context": "Ronaldo siirtyi heinäkuussa 2018 Juventukseen 105 miljoonalla eurolla. Sopimus on nelivuotinen, ja sen aikana hän tienaa verojen jälkeen noin 120 miljoonaa euroa.[133]",
+  "answers": {
+    "text": ["heinäkuussa 2018"],
+    "answer_start": [16]
+  }
+}
+```
+```json
+{
+  "question": "Kuka hallitsi Mithridates VI jälkeen?",
+  "context": "Mithridates laajensi valtakuntaansa ympäri Mustanmeren rantoja, ja hän ajautui kolmesti sotaan Rooman valtakuntaa vastaan. Ensimmäisessä sodassa (89 eaa.–85 eaa.) hän valtasi suuren osan Vähää-Aasiaa ja Rooman valtakunnalle kuuluneet osat, jolloin hänen sanotaan teloittaneen 80000 roomalaista. Mithridates valtasi myös Kreikan, mutta konsuli Sulla kukisti hänen joukkonsa vuonna 85 eaa., ja Mithridateen oli luovuttava valloituksistaan. Toinen sota (83 eaa.–81 eaa.) oli suppeampi laajuudeltaan. Kolmannessa sodassa (73 eaa.–63 eaa.) roomalaiset sotapäälliköt Lucullus ja Pompeius kukistivat Mithridateen perusteellisesti. Mithridates surmasi tai surmautti itsensä jouduttuaan poikansa Farnakes II:n syrjäyttämäksi.",
+  "answers": {
+    "text": ["Farnakes II"],
+    "answer_start": [687]
+  }
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 4
+- Prefix prompt:
+  ```
+  Seuraavassa on tekstejä ja niihin liittyviä kysymyksiä ja vastauksia.
+  ```
+- Base prompt template:
+  ```
+  Teksti: {text}
+  Kysymys: {question}
+  Vastaa enintään 3 sanalla: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Teksti: {text}
+
+  Vastaa seuraavaan kysymykseen yllä olevasta tekstistä enintään 3 sanalla.
+
+  Kysymys: {question}
+  ```
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset tydiqa-fi
+```
+
+
+## Common-sense Reasoning
+
+### HellaSwag-fi
+
+This dataset is a machine translated version of the English [HellaSwag
+dataset](https://aclanthology.org/P19-1472/). The [dataset](https://huggingface.co/datasets/Finnish-NLP/hellaswag-fi-google-translate) was created by Finnish-NLP using Google Translate. The dataset is designed to
+be used in EuroEval and it therefore already has a 1,024 / 256 / 2,048 split for the train, validation and test splits, respectively.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "[Otsikko ] Tiikkihuonekalujen tahraus [vaihe] Pyyhi lika, pöly ja roskat pois. [vaihe] Voit harjata lian pois kuivalla paperipyyhkeellä tai liinalla. Jos puhdistettavia kohtia on sitkeämpiä, voit hieroa ne puhtaaksi kostealla rievulla.\nVastausvaihtoehdot:\na. [vaihe] Poista tahrat tiikistä pyyhkimällä ne kuivalla talouspaperilla. [vaihe] Noudata samoja puhdistustoimenpiteitä, joita käytit tahran kanssa.\nb. Aja niiden yli puhdistusaineella, kunnes tahra on poissa. [vaihe] Kokeile puupetsin ja öljyn yhdistelmää.\nc. [välivaiheet] Älä käytä puhdistusaineita. Saatat vahingoittaa puuta, mutta vaikeutat varmasti värjäysprosessia.\nd. Poista mahdollisimman paljon likaa levittämällä tahra kevyelle, pörröiselle liinalle tai kädelle ja pyyhkimällä se pois. [vaihe] Käytä hankaamiseen valkaisuainetta ja vettä.",
+  "label": "c",
+}
+```
+```json
+{
+  "text": "Pieni ryhmä ihmisiä nähdään uimassa altaan ympärillä ja johtaa useisiin laukauksiin, joissa uimari heittää pallon verkkoon. Maalivahti torjuu muutaman laukauksen ja vaihtaa sitten toisen joukkuetoverinsa kanssa yleisön hurraten. ihmisiä\nVastausvaihtoehdot:\na. cheer vielä kerran ja palaa uimaan uima-altaan ympärille.\nb. vaihda jatkuvasti pois ja johtaa siihen, että yksi joukkue voittaa ja juhlii kaikki yhdessä vedessä.\nc. Curra ja hyppää vuorotellen ylös ja eteenpäin pelaamalla biljardia.\nd. ensimmäinen video, jossa muut joukkuetoverit sukeltavat altaaseen ja hyppäävät ylös ja alas ponnahduslaudalla.",
+  "label": "b",
+}
+```
+```json
+{
+  "text": "Kahden ihmisen nähdään kävelevän pöytäjalkapallopöydän ympärillä pelaamassa. ihmisiä\nVastausvaihtoehdot:\na. pitäkää kupit ylös ja alakaa pelata peliä ja lyödä toisianne.\nb. Tartu sauvoista ja lyö palloa pöydän ympärillä.\nc. Jatka kävelemistä ja yksi henkilö lyö pallon verkon yli.\nd. siirrä ympäri pöytää heittäen palloa ympäriinsä, kun ihmiset katselevat sivuilla.",
+  "label": "b",
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 5
+- Prefix prompt:
+  ```
+  Seuraavat ovat monivalintakysymyksiä (vastauksineen).
+  ```
+- Base prompt template:
+  ```
+  Kysymys: {text}
+  Vastausvaihtoehdot:
+  a. {option_a}
+  b. {option_b}
+  c. {option_c}
+  d. {option_c}
+  Vastaus: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Kysymys: {text}
+  Vastausvaihtoehdot:
+  a. {option_a}
+  b. {option_b}
+  c. {option_c}
+  d. {option_d}
+
+  Vastaa yllä olevaan kysymykseen käyttämällä 'a', 'b', 'c' tai 'd', äläkä mitään muuta.
+  ```
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset hellaswag-fi
+```
+
+
+## Summarization
+
+### XLSum-fi
+
+This dataset is a machine translation of the XL-Sum dataset, which was published in [this paper](https://aclanthology.org/2021.findings-acl.413/). [TurkuNLP](https://huggingface.co/datasets/TurkuNLP) has translated the dataset to Finnish using DeepL.
+
+The original Finnish XL-Sum dataset contains 54,966 / 1,803 / 1,791 training, validation and test samples, respectively. We use 1,024 / 256 / 2,048 samples for our training, validation and test splits, respectively. The new training and validation splits are subsets of the original splits. The test split is the same as the original test split + additional samples from the original validation split.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Poliisi kutsuttiin Century Wharfiin keskiviikkona noin kello 14:15 GMT. 66-vuotias mies on pidätetty murhasta epäiltynä, ja häntä pidetään vangittuna. Etelä-Walesin poliisi ilmoitti, että se siirtää asian vapaaehtoisesti riippumattoman poliisin valituslautakunnan käsiteltäväksi.",
+  "target_text": "Murhatutkinta on aloitettu sen jälkeen, kun 65-vuotiaan naisen ruumis löytyi Cardiff Bayn asunnosta."
+}
+```
+```json
+{
+  "text": "Yritys on nimittänyt KPMG:n tarkastelemaan uudelleenjärjestelyvaihtoehtoja sen jälkeen, kun paikallisviranomaisten menojen leikkaukset heikensivät sen liiketoimintanäkymiä. Southern tarjoaa hoitoa yli 31 000 ihmiselle, ja suurin osa rahoituksesta tulee NHS:ltä ja kunnilta. Yrityksen mukaan budjettileikkaukset merkitsivät sitä, että sen vuokrataakka oli 'kestämätön'. Southern kertoi keskustelevansa vuokranantajien kanssa uudelleenjärjestelystä ja varoitti myös, että se oli vaarassa jättää velkansa maksamatta. 'Yhtiön lainanantajat ovat tietoisia uhkaavasta pankkikovenanttirikkomuksesta, mutta ne tukevat edelleen täysin toimia, joihin yhtiö ryhtyy ongelmiensa ratkaisemiseksi', Southern sanoi lausunnossaan. Yhtiö vahvisti myös, ettei se enää keskustele mahdollisten ostajien kanssa. 'Hallitus katsoo, että yksikään näistä ehdotuksista ei todennäköisesti johda siihen, että lähitulevaisuudessa tehtäisiin mielekäs tarjous, ja se on päättänyt olla jatkamatta niiden käsittelyä', Southern totesi. Southernin osakkeet, joiden arvo oli 606 penceä vuonna 2007, olivat keskipäivällä 6,3 penniä.",
+  "target_text": "Yhdistyneen kuningaskunnan suurimman hoivakotien ylläpitäjän Southern Cross Healthcaren osakkeet ovat romahtaneet 60 prosenttia, kun on uutisoitu, että taloudelliset ongelmat ovat lisääntymässä."
+}
+```
+```json
+{
+  "text": "Pohjois-Walesin palo- ja pelastusviranomainen vahvisti maanantaina talousarvionsa vuosiksi 2015-16. Viranomainen on suostunut leikkaamaan neljä johtotehtävää, leikkaamaan joitakin palveluja ja käyttämään vararahastoa, jotta se voi hyväksyä 32,1 miljoonan punnan talousarvionsa. On pelätty, että sadat palomiehet voivat lähteä seuraavien viiden vuoden aikana tehtävien budjettileikkausten seurauksena.",
+  "target_text": "Pohjois-Walesin palomiehet lopettavat suurten eläinten pelastamisen ja vähentävät väärien hälytysten määrää, jotta talous saataisiin tasapainoon."
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 1
+- Prefix prompt:
+  ```
+  Seuraavassa on artikkeleita ja niihin liittyviä tiivistelmiä.
+  ```
+- Base prompt template:
+  ```
+  Uutisartikkeli: {text}
+  Tiivistelmä: {target_text}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Uutisartikkeli: {text}
+
+  Kirjoita tiivistelmä yllä olevasta artikkelista.
+  ```
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset xlsum-fi
+```
diff --git a/src/euroeval/dataset_configs/finnish.py b/src/euroeval/dataset_configs/finnish.py
new file mode 100644
index 000000000..01997abfb
--- /dev/null
+++ b/src/euroeval/dataset_configs/finnish.py
@@ -0,0 +1,60 @@
+"""All Finnish dataset configurations used in EuroEval."""
+
+from ..data_models import DatasetConfig
+from ..languages import FI
+from ..tasks import COMMON_SENSE, LA, NER, RC, SENT, SUMM
+
+### Official datasets ###
+
+SCANDISENT_FI_CONFIG = DatasetConfig(
+    name="scandisent-fi",
+    pretty_name="the truncated version of the Finnish part of the binary sentiment "
+    "classification dataset ScandiSent",
+    huggingface_id="EuroEval/scandisent-fi-mini",
+    task=SENT,
+    languages=[FI],
+    _labels=["negative", "positive"],
+)
+
+TURKU_NER_FI_CONFIG = DatasetConfig(
+    name="turku-ner-fi",
+    pretty_name="the Finnish part of the named entity recognition dataset Turku NER",
+    huggingface_id="EuroEval/turku-ner-fi-mini",
+    task=NER,
+    languages=[FI],
+)
+
+TYDIQA_FI_CONFIG = DatasetConfig(
+    name="tydiqa-fi",
+    pretty_name="the Finnish part of the TydiQA reading comprehension dataset",
+    huggingface_id="EuroEval/tydiqa-fi-mini",
+    task=RC,
+    languages=[FI],
+)
+
+XLSUM_FI_CONFIG = DatasetConfig(
+    name="xlsum-fi",
+    pretty_name="the Finnish summarisation dataset XL-Sum",
+    huggingface_id="EuroEval/xlsum-fi-mini",
+    task=SUMM,
+    languages=[FI],
+)
+
+HELLASWAG_FI_CONFIG = DatasetConfig(
+    name="hellaswag-fi",
+    pretty_name="the truncated version of the Finnish common-sense reasoning dataset "
+    "HellaSwag-fi, translated from the English HellaSwag dataset",
+    huggingface_id="EuroEval/hellaswag-fi-mini",
+    task=COMMON_SENSE,
+    languages=[FI],
+)
+
+SCALA_FI_CONFIG = DatasetConfig(
+    name="scala-fi",
+    pretty_name="the Finnish part of the linguistic acceptability dataset ScaLA",
+    huggingface_id="EuroEval/scala-fi",
+    task=LA,
+    languages=[FI],
+)
+
+### Unofficial datasets ###
diff --git a/src/euroeval/prompt_templates/linguistic_acceptability.py b/src/euroeval/prompt_templates/linguistic_acceptability.py
index 0d255fe9c..58d9c68e9 100644
--- a/src/euroeval/prompt_templates/linguistic_acceptability.py
+++ b/src/euroeval/prompt_templates/linguistic_acceptability.py
@@ -1,7 +1,7 @@
 """Templates for the Linguistic Acceptability task."""
 
 from ..data_models import PromptConfig
-from ..languages import DA, DE, EN, ES, FO, FR, IS, IT, NB, NL, NN, NO, SV
+from ..languages import DA, DE, EN, ES, FI, FO, FR, IS, IT, NB, NL, NN, NO, SV
 
 LA_TEMPLATES = {
     DA: PromptConfig(
@@ -36,6 +36,14 @@
         default_instruction_prompt="Texto: {text}\n\nDetermina si el texto es "
         "gramaticalmente correcto o no. Responde con {labels_str}, y nada más.",
     ),
+    FI: PromptConfig(
+        default_prompt_label_mapping=dict(correct="kyllä", incorrect="ei"),
+        default_prompt_prefix="Seuraavat ovat lauseita ja ovatko ne "
+        "kieliopillisesti oikein.",
+        default_prompt_template="Lause: {text}\nKieliopillisesti oikein: {label}",
+        default_instruction_prompt="Lause: {text}\n\nMääritä onko lause "
+        "oikein vai ei. Vastaa {labels_str}, ja ei mitään muuta.",
+    ),
     FO: PromptConfig(
         default_prompt_label_mapping=dict(correct="ja", incorrect="nei"),
         default_prompt_prefix="Hetta eru nakrir setningar og um teir eru mállæruliga "
diff --git a/src/euroeval/prompt_templates/multiple_choice.py b/src/euroeval/prompt_templates/multiple_choice.py
index 1d118f22a..8acd71702 100644
--- a/src/euroeval/prompt_templates/multiple_choice.py
+++ b/src/euroeval/prompt_templates/multiple_choice.py
@@ -1,7 +1,7 @@
 """Templates for all multiple choice tasks."""
 
 from ..data_models import PromptConfig
-from ..languages import DA, DE, EN, ES, FR, IS, IT, NB, NL, NN, NO, SV
+from ..languages import DA, DE, EN, ES, FI, FR, IS, IT, NB, NL, NN, NO, SV
 
 # TODO: Missing Faroese
 MULTIPLE_CHOICE_TEMPLATES = {
@@ -36,6 +36,13 @@
         "usando solo {labels_str}, y nada más.",
         default_prompt_label_mapping="auto",
     ),
+    FI: PromptConfig(
+        default_prompt_prefix="Seuraavat ovat monivalintakysymyksiä (vastauksineen).",
+        default_prompt_template="Kysymys: {text}\nVastaus: {label}",
+        default_instruction_prompt="Kysymys: {text}\n\nVastaa yllä olevaan kysymykseen "
+        "käyttämällä {labels_str}, äläkä mitään muuta.",
+        default_prompt_label_mapping="auto",
+    ),
     FR: PromptConfig(
         default_prompt_prefix="Les questions suivantes sont des questions à choix "
         "multiples (avec réponses).",
diff --git a/src/euroeval/prompt_templates/named_entity_recognition.py b/src/euroeval/prompt_templates/named_entity_recognition.py
index 7630ddc84..937f057bb 100644
--- a/src/euroeval/prompt_templates/named_entity_recognition.py
+++ b/src/euroeval/prompt_templates/named_entity_recognition.py
@@ -1,7 +1,7 @@
 """Templates for the Named Entity Recognition task."""
 
 from ..data_models import PromptConfig
-from ..languages import DA, DE, EN, ES, FO, FR, IS, IT, NB, NL, NN, NO, SV
+from ..languages import DA, DE, EN, ES, FI, FO, FR, IS, IT, NB, NL, NN, NO, SV
 
 NER_TEMPLATES = {
     DA: PromptConfig(
@@ -80,6 +80,25 @@
         "claves {labels_str}. Los valores deben ser listas de las "
         "entidades nombradas de ese tipo, exactamente como aparecen en la oración.",
     ),
+    FI: PromptConfig(
+        default_prompt_label_mapping={
+            "b-per": "henkilö",
+            "i-per": "henkilö",
+            "b-loc": "paikka",
+            "i-loc": "paikka",
+            "b-org": "organisaatio",
+            "i-org": "organisaatio",
+            "b-misc": "muut",
+            "i-misc": "muut",
+        },
+        default_prompt_prefix="Seuraavassa on lauseita ja JSON-sanakirjoja, jotka "
+        "sisältävät annetussa lauseessa esiintyvät nimetyt entiteetit.",
+        default_prompt_template="Lause: {text}\nNimetyt entiteetit: {label}",
+        default_instruction_prompt="Lause: {text}\n\nTunnista lauseessa olevat "
+        "entiteetit. Tulosta ne JSON-sanakirjana, jonka avaimet ovat {labels_str}. "
+        "Arvojen tulee olla listoja kyseisen tyypin nimetyistä entiteeteistä "
+        "täsmälleen siinä muodossa kuin ne esiintyvät lauseessa.",
+    ),
     FO: PromptConfig(
         default_prompt_label_mapping={
             "b-per": "persónur",
diff --git a/src/euroeval/prompt_templates/reading_comprehension.py b/src/euroeval/prompt_templates/reading_comprehension.py
index 78c76e264..d21eabcf7 100644
--- a/src/euroeval/prompt_templates/reading_comprehension.py
+++ b/src/euroeval/prompt_templates/reading_comprehension.py
@@ -1,7 +1,7 @@
 """Templates for the Reading Comprehension task."""
 
 from ..data_models import PromptConfig
-from ..languages import DA, DE, EN, ES, FO, FR, IS, IT, NB, NL, NN, NO, SV
+from ..languages import DA, DE, EN, ES, FI, FO, FR, IS, IT, NB, NL, NN, NO, SV
 
 RC_TEMPLATES = {
     DA: PromptConfig(
@@ -39,6 +39,16 @@
         "sobre el texto anterior en máximo 3 palabras.\n\nPregunta: {question}",
         default_prompt_label_mapping=dict(),
     ),
+    FI: PromptConfig(
+        default_prompt_prefix="Seuraavassa on tekstejä ja niihin liittyviä kysymyksiä "
+        "ja vastauksia.",
+        default_prompt_template="Teksti: {text}\nKysymys: {question} "
+        "\nVastaa enintään 3 sanalla: {label}",
+        default_instruction_prompt="Teksti: {text}\n\nVastaa seuraavaan "
+        "kysymykseen yllä olevasta tekstistä enintään 3 sanalla.\n\n"
+        "Kysymys: {question}",
+        default_prompt_label_mapping=dict(),
+    ),
     FO: PromptConfig(
         default_prompt_prefix="Hetta eru tekstir saman við spurningum og svar.",
         default_prompt_template="Tekstur: {text}\nSpurningur: {question}\nSvara við í "
diff --git a/src/euroeval/prompt_templates/sentiment_classification.py b/src/euroeval/prompt_templates/sentiment_classification.py
index feb99b301..0371862bf 100644
--- a/src/euroeval/prompt_templates/sentiment_classification.py
+++ b/src/euroeval/prompt_templates/sentiment_classification.py
@@ -1,7 +1,7 @@
 """Templates for the Sentiment Analysis task."""
 
 from ..data_models import PromptConfig
-from ..languages import DA, DE, EN, ES, FO, FR, IS, IT, NB, NL, NN, NO, SV
+from ..languages import DA, DE, EN, ES, FI, FO, FR, IS, IT, NB, NL, NN, NO, SV
 
 SENT_TEMPLATES = {
     DA: PromptConfig(
@@ -44,6 +44,16 @@
         default_instruction_prompt="Documento: {text}\n\nClasifica el sentimiento del "
         "documento. Responde con {labels_str}, y nada más.",
     ),
+    FI: PromptConfig(
+        default_prompt_label_mapping=dict(
+            positive="positiivinen", neutral="neutrali", negative="negatiivinen"
+        ),
+        default_prompt_prefix="Seuraavassa on arvosteluja ja niiden tunnesävy, joka "
+        "voi olla {labels_str}.",
+        default_prompt_template="Teksti: {text}\nTunnesävy: {label}",
+        default_instruction_prompt="Teksti: {text}\n\nLuokittele arvostelun tunnesävy. "
+        "Vastaa vain {labels_str}, ei muuta.",
+    ),
     FO: PromptConfig(
         default_prompt_label_mapping=dict(
             positive="positivt", neutral="neutralt", negative="negativt"
diff --git a/src/euroeval/prompt_templates/summarization.py b/src/euroeval/prompt_templates/summarization.py
index aab3b7aee..07f8152db 100644
--- a/src/euroeval/prompt_templates/summarization.py
+++ b/src/euroeval/prompt_templates/summarization.py
@@ -1,7 +1,7 @@
 """Templates for the Summarization task."""
 
 from ..data_models import PromptConfig
-from ..languages import DA, DE, EN, ES, FR, IS, IT, NB, NL, NN, NO, SV
+from ..languages import DA, DE, EN, ES, FI, FR, IS, IT, NB, NL, NN, NO, SV
 
 # TODO: Missing Faroese
 SUMM_TEMPLATES = {
@@ -36,6 +36,14 @@
         "documento anterior.",
         default_prompt_label_mapping=dict(),
     ),
+    FI: PromptConfig(
+        default_prompt_prefix="Seuraavassa on artikkeleita ja niihin liittyviä "
+        "tiivistelmiä.",
+        default_prompt_template="Uutisartikkeli: {text}\nTiivistelmä: {target_text}",
+        default_instruction_prompt="Uutisartikkeli: {text}\n\nKirjoita tiivistelmä "
+        "yllä olevasta artikkelista.",
+        default_prompt_label_mapping=dict(),
+    ),
     FR: PromptConfig(
         default_prompt_prefix="Les documents suivants sont accompagnés d'un résumé.",
         default_prompt_template="Document: {text}\nRésumé: {target_text}",
diff --git a/src/scripts/create_hellaswag_fi.py b/src/scripts/create_hellaswag_fi.py
new file mode 100644
index 000000000..903021b40
--- /dev/null
+++ b/src/scripts/create_hellaswag_fi.py
@@ -0,0 +1,274 @@
+"""Create the Finnish HellaSwag-mini dataset and upload it to the HF Hub."""
+
+from collections import Counter
+from logging import getLogger
+
+import pandas as pd
+from constants import (
+    MAX_NUM_CHARS_IN_INSTRUCTION,
+    MAX_NUM_CHARS_IN_OPTION,
+    MAX_REPETITIONS,
+    MIN_NUM_CHARS_IN_INSTRUCTION,
+    MIN_NUM_CHARS_IN_OPTION,
+)
+from datasets import Dataset, DatasetDict, Split, load_dataset
+from huggingface_hub import HfApi
+from requests import HTTPError
+
+logger = getLogger(__name__)
+
+
+def main() -> None:
+    """Create the Finnish HellaSwag-mini dataset and upload it to the HF Hub.
+
+    HellaSwag-fi is designed to EuroEval so it already has a
+    1,024 / 256 / 2,048 train/val/test split. This script
+    therefore does not perform the same filtering as seen in
+    `src/scripts/create_hellaswag.py`.
+    """
+    # Define the base download URL
+    repo_id = "Finnish-NLP/hellaswag-fi-google-translate"
+
+    dataset = load_dataset(path=repo_id, token=True)
+    dfs = {}
+    for split in ["train", "validation", "test"]:
+        df = dataset[split].to_pandas()
+
+        df["endings"] = df["endings"].apply(process_endings)
+
+        df = process_split(df=df, split=split)
+        dfs[split] = df
+
+    # Create validation split
+    val_df = dfs["validation"]
+    assert len(val_df) == 256
+
+    # Create test split
+    test_df = dfs["test"]
+    assert len(test_df) == 2_048
+
+    # Create train split
+    train_df = dfs["train"]
+    assert len(train_df) == 1_024
+
+    # Collect datasets in a dataset dictionary
+    dataset = DatasetDict(
+        train=Dataset.from_pandas(train_df, split=Split.TRAIN),
+        val=Dataset.from_pandas(val_df, split=Split.VALIDATION),
+        test=Dataset.from_pandas(test_df, split=Split.TEST),
+    )
+
+    dataset_id = "EuroEval/hellaswag-fi-mini"
+
+    # Remove the dataset from Hugging Face Hub if it already exists
+    try:
+        api = HfApi()
+        api.delete_repo(dataset_id, repo_type="dataset")
+    except HTTPError:
+        pass
+
+    # Push the dataset to the Hugging Face Hub
+    dataset.push_to_hub(dataset_id, private=True)
+
+
+def process_endings(raw_endings: str) -> list[str]:
+    """Process the endings of the HellaSwag-fi dataset.
+
+    Args:
+        raw_endings: The endings of the HellaSwag-fi dataset.
+
+    Returns:
+        The processed endings.
+    """
+    # Remove starting/ending square brackets and quotes
+    raw_endings = raw_endings[2:-2]
+
+    # Most endings are separated by newline characters
+    endings = raw_endings.split("\n")
+    if len(endings) != 4:
+        # If not, try a more hacky approach
+        endings = _extract_endings(raw_endings=raw_endings)
+        assert len(endings) == 4
+    else:
+        # Fix quotes
+        endings = [_fix_quotes(ending) for ending in endings]
+    return endings
+
+
+def _fix_quotes(ending: str) -> str:
+    r"""Remove starting and ending quotes.
+
+    Some entries have mixed quotes, e.g.
+        '\'Aloha"'
+    which should be turned into the following:
+        'Aloha'
+
+    Args:
+        ending: The ending to process.
+
+    Returns:
+        The processed ending.
+    """
+    ending = ending.strip()
+    # Remove start and end quotes
+    if ending[0] in ['"', "'"]:
+        ending = ending[1:]
+    if ending[-1] in ['"', "'"]:
+        ending = ending[:-1]
+
+    return ending
+
+
+def _extract_endings(raw_endings: str) -> list[str]:
+    """Extract endings from the HellaSwag-fi dataset.
+
+    This strategy is used for samples where the endings are
+    not simply separated by newline characters.
+
+    Args:
+        raw_endings: The endings of the HellaSwag-fi dataset.
+
+    Returns:
+        The processed endings.
+    """
+    endings: list[str] = []
+    i: int = 0
+    start: int = 0
+    while i < len(raw_endings) - 2:
+        if raw_endings[i].isalpha() or raw_endings[i] == "[":
+            start = i
+
+            while i < len(raw_endings) - 2:
+                # An ending seems to end with one of the following
+                # char combinations.
+                ends = ['."', ".'", "'.", '".', ".\n"]
+                if raw_endings[i : i + 2] in ends:
+                    ending = raw_endings[start : i + 1].strip()
+                    endings.append(ending)
+                    i += 1
+                    break
+                i += 1
+        else:
+            i += 1
+
+    # Last ending
+    ending = raw_endings[start:].strip()
+    endings.append(ending)
+    return endings
+
+
+def process_split(df: pd.DataFrame, split: str) -> pd.DataFrame:
+    """Process the split of the HellaSwag-fi dataset.
+
+    Args:
+        df: The dataframe to process.
+        split: The split of the dataframe.
+
+    Returns:
+        The processed dataframe.
+    """
+    _print_filtering_stats(df=df, split=split)
+
+    # Make a `text` column with all the options in it
+    df["text"] = [
+        row.ctx.replace("\n", " ").strip() + "\n"
+        "Vastausvaihtoehdot:\n"
+        "a. " + row.endings[0].replace("\n", " ").strip() + "\n"
+        "b. " + row.endings[1].replace("\n", " ").strip() + "\n"
+        "c. " + row.endings[2].replace("\n", " ").strip() + "\n"
+        "d. " + row.endings[3].replace("\n", " ").strip()
+        for _, row in df.iterrows()
+    ]
+
+    # Fix the label column
+    label_mapping = {0: "a", 1: "b", 2: "c", 3: "d"}
+    df.label = df.label.map(label_mapping)
+
+    # Only keep the columns `text`, `label` and `activity_label`
+    df = df[["text", "label", "activity_label"]]
+
+    return df
+
+
+def _print_filtering_stats(df: pd.DataFrame, split: str) -> None:
+    """Print filtering statistics.
+
+    For the Finnish HellaSwag-mini dataset, we don't want to filter
+    any samples. These prints give an overview about how many samples
+    in the dataset that would be filtered out by the different filters
+    that are applied in `src/scripts/create_hellaswag.py`.
+
+    Args:
+        df: The dataframe to print statistics for.
+        split: The split of the dataframe
+    """
+    short_ctx_count = sum(df.ctx.str.len() < MIN_NUM_CHARS_IN_INSTRUCTION)
+    long_ctx_count = sum(df.ctx.str.len() > MAX_NUM_CHARS_IN_INSTRUCTION)
+
+    short_endings_count = sum(
+        df.endings.map(
+            lambda endings: min(len(ending) for ending in endings)
+            < MIN_NUM_CHARS_IN_OPTION
+        )
+    )
+    long_endings_count = sum(
+        df.endings.map(
+            lambda endings: max(len(ending) for ending in endings)
+            > MAX_NUM_CHARS_IN_OPTION
+        )
+    )
+    logger.info(f"\nSplit: {split}")
+    logger.info(
+        "Samples with too short context: "
+        f"{short_ctx_count} ({short_ctx_count / len(df):.2%})"
+    )
+    logger.info(
+        "Samples with too long context: "
+        f"{long_ctx_count} ({long_ctx_count / len(df):.2%})"
+    )
+    logger.info(
+        "Samples with too short options: "
+        f"{short_endings_count} ({short_endings_count / len(df):.2%})"
+    )
+    logger.info(
+        "Samples with too long options: "
+        f"{long_endings_count} ({long_endings_count / len(df):.2%})"
+    )
+
+    def is_repetitive(text: str) -> bool:
+        """Return True if the text is repetitive."""
+        if text == "":
+            return False
+        max_repetitions = max(Counter(text.split()).values())
+        return max_repetitions > MAX_REPETITIONS
+
+    repetitive_ctx_count = sum(df.ctx.apply(is_repetitive))
+    repetitive_endings_count = sum(
+        df.endings.map(lambda endings: any(is_repetitive(ending) for ending in endings))
+    )
+
+    logger.info(
+        "Samples with repetitive context: "
+        f"{repetitive_ctx_count} ({repetitive_ctx_count / len(df):.2%})"
+    )
+    logger.info(
+        "Samples with repetitive options: "
+        f"{repetitive_endings_count} ({repetitive_endings_count / len(df):.2%})"
+    )
+
+    activity_label_counts = df["activity_label"].value_counts()
+    infrequent_labels = activity_label_counts[activity_label_counts < 3].index.tolist()
+    infrequent_label_count = sum(df["activity_label"].isin(infrequent_labels))
+
+    logger.info(
+        "Activity labels with fewer than 3 samples: "
+        f"{len(infrequent_labels)} out of {len(activity_label_counts)}"
+    )
+    logger.info(
+        "Samples with infrequent activity labels: "
+        f"{infrequent_label_count} ({infrequent_label_count / len(df):.2%})"
+    )
+
+
+if __name__ == "__main__":
+    main()
diff --git a/src/scripts/create_scala.py b/src/scripts/create_scala.py
index 24488678c..c40d47234 100644
--- a/src/scripts/create_scala.py
+++ b/src/scripts/create_scala.py
@@ -27,6 +27,7 @@
     load_dedt_pos,
     load_endt_pos,
     load_esdt_pos,
+    load_fidt_pos,
     load_fodt_pos,
     load_frdt_pos,
     load_isdt_pos,
@@ -62,6 +63,7 @@ def main() -> None:
         "fr": load_frdt_pos,
         "it": load_itdt_pos,
         "es": load_esdt_pos,
+        "fi": load_fidt_pos,
     }
 
     # Set up the progress bar and iterate over the languages
diff --git a/src/scripts/create_scandisent_fi.py b/src/scripts/create_scandisent_fi.py
new file mode 100644
index 000000000..901c7d196
--- /dev/null
+++ b/src/scripts/create_scandisent_fi.py
@@ -0,0 +1,93 @@
+"""Create the Finnish part of the ScandiSent dataset and upload it to the HF Hub."""
+
+import pandas as pd
+from constants import MAX_NUM_CHARS_IN_DOCUMENT, MIN_NUM_CHARS_IN_DOCUMENT  # noqa
+from datasets import Dataset, DatasetDict, Split, load_dataset
+from huggingface_hub import HfApi
+from requests import HTTPError
+
+
+def main() -> None:
+    """Create the Finnish part of the ScandiSent dataset and upload it to the HF Hub."""
+    # Define the base download URL
+    repo_id = "timpal0l/scandisent"
+
+    # Download the dataset
+    dataset = load_dataset(path=repo_id, token=True, split="train")
+    assert isinstance(dataset, DatasetDict)
+
+    # Convert the dataset to a dataframe
+    df = dataset.to_pandas()
+    assert isinstance(df, pd.DataFrame)
+
+    # Keep only Finnish samples
+    df = df[df["language"] == "fi"]
+
+    # Drop all columns except for `text` and `label_text`
+    columns_to_drop = [col for col in df.columns if col not in ["text", "label"]]
+    df.drop(columns=columns_to_drop, inplace=True)
+
+    # Change labels from integer to string
+    df["label"] = df["label"].map({0: "negative", 1: "positive"})
+
+    # Create validation split
+    val_size = 256
+    val_df = df.sample(n=val_size, random_state=4242)
+    df = df.drop(val_df.index)
+
+    # Create test split
+    test_size = 2048
+    test_df = df.sample(n=test_size, random_state=4242)
+    df = df.drop(test_df.index)
+
+    # Create train split
+    train_size = 1024
+    train_df = df.sample(n=train_size, random_state=4242)
+
+    # Reset the index
+    train_df = train_df.reset_index(drop=True)
+    val_df = val_df.reset_index(drop=True)
+    test_df = test_df.reset_index(drop=True)
+
+    # Only work with samples where the document is not very large or small
+    # We do it after we have made the splits to ensure that the dataset is minimally
+    # affected.
+    new_train_df = train_df.copy()
+    new_train_df["text_len"] = new_train_df.text.str.len()
+    new_train_df = new_train_df.query("text_len >= @MIN_NUM_CHARS_IN_DOCUMENT").query(
+        "text_len <= @MAX_NUM_CHARS_IN_DOCUMENT"
+    )
+    new_val_df = val_df.copy()
+    new_val_df["text_len"] = new_val_df.text.str.len()
+    new_val_df = new_val_df.query("text_len >= @MIN_NUM_CHARS_IN_DOCUMENT").query(
+        "text_len <= @MAX_NUM_CHARS_IN_DOCUMENT"
+    )
+    new_test_df = test_df.copy()
+    new_test_df["text_len"] = new_test_df.text.str.len()
+    new_test_df = new_test_df.query("text_len >= @MIN_NUM_CHARS_IN_DOCUMENT").query(
+        "text_len <= @MAX_NUM_CHARS_IN_DOCUMENT"
+    )
+
+    # Collect datasets in a dataset dictionary
+    dataset = DatasetDict(
+        train=Dataset.from_pandas(train_df, split=Split.TRAIN),
+        val=Dataset.from_pandas(val_df, split=Split.VALIDATION),
+        test=Dataset.from_pandas(test_df, split=Split.TEST),
+    )
+
+    # Create dataset ID
+    dataset_id = "EuroEval/scandisent-fi-mini"
+
+    # Remove the dataset from Hugging Face Hub if it already exists
+    try:
+        api = HfApi()
+        api.delete_repo(dataset_id, repo_type="dataset")
+    except HTTPError:
+        pass
+
+    # Push the dataset to the Hugging Face Hub
+    dataset.push_to_hub(dataset_id, private=True)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/src/scripts/create_turku_ner_fi.py b/src/scripts/create_turku_ner_fi.py
new file mode 100644
index 000000000..8ff1540ca
--- /dev/null
+++ b/src/scripts/create_turku_ner_fi.py
@@ -0,0 +1,117 @@
+"""Create the Finnish Turku NER dataset and upload it to the HF Hub."""
+
+import pandas as pd
+import requests
+from datasets import Dataset, DatasetDict, Split
+from huggingface_hub import HfApi
+from requests import HTTPError
+
+LABEL_MAPS = {
+    "B-PRO": "B-MISC",
+    "I-PRO": "I-MISC",
+    "B-DATE": "B-MISC",
+    "I-DATE": "I-MISC",
+    "I-EVENT": "I-MISC",
+    "B-EVENT": "B-MISC",
+}
+
+
+def main() -> None:
+    """Create the Finnish Turku NER dataset and uploads it to the HF Hub."""
+    # Read the CoNLL TSV files
+    dfs = read_dataset()
+    train_df = dfs["train"]
+    val_df = dfs["val"]
+    test_df = dfs["test"]
+
+    # Add a `text` column
+    train_df["text"] = train_df["tokens"].map(lambda tokens: " ".join(tokens))
+    val_df["text"] = val_df["tokens"].map(lambda tokens: " ".join(tokens))
+    test_df["text"] = test_df["tokens"].map(lambda tokens: " ".join(tokens))
+
+    # Create validation split
+    val_size = 256
+    val_df = val_df.sample(n=min(val_size, len(val_df)), random_state=4242)
+
+    # Create test split
+    test_size = 2048
+    test_df = test_df.sample(n=min(test_size, len(test_df)), random_state=4242)
+
+    # Create train split
+    train_size = 1024
+    train_df = train_df.sample(n=min(train_size, len(train_df)), random_state=4242)
+
+    # Reset the index
+    train_df = train_df.reset_index(drop=True)
+    val_df = val_df.reset_index(drop=True)
+    test_df = test_df.reset_index(drop=True)
+
+    # Collect datasets in a dataset dictionary
+    dataset = DatasetDict(
+        train=Dataset.from_pandas(train_df, split=Split.TRAIN),
+        val=Dataset.from_pandas(val_df, split=Split.VALIDATION),
+        test=Dataset.from_pandas(test_df, split=Split.TEST),
+    )
+
+    mini_dataset_id = "EuroEval/turku-ner-fi-mini"
+    # Remove the dataset from Hugging Face Hub if it already exists
+    try:
+        api = HfApi()
+        api.delete_repo(mini_dataset_id, repo_type="dataset")
+    except HTTPError:
+        pass
+
+    # Push the dataset to the Hugging Face Hub
+    dataset.push_to_hub(mini_dataset_id, private=True)
+
+
+def read_dataset() -> dict:
+    """Read the CoNLL-formatted TSV files and convert them to the required format."""
+    base_url = "https://raw.githubusercontent.com/TurkuNLP/turku-ner-corpus/refs/heads/master/data/conll/{}.tsv"
+    train_url = base_url.format("train")
+    val_url = base_url.format("dev")
+    test_url = base_url.format("test")
+
+    data = dict(
+        train=requests.get(train_url).text.split("\n\n"),
+        val=requests.get(val_url).text.split("\n\n"),
+        test=requests.get(test_url).text.split("\n\n"),
+    )
+
+    dfs = {}
+
+    for split_name, split_raw_data in data.items():
+        split_samples: list[dict[str, list[str]]] = []
+
+        for raw_sample in split_raw_data:
+            if "DOCSTART" in raw_sample or not raw_sample:
+                continue
+
+            tokens = []
+            labels = []
+            for line in raw_sample.split("\n"):
+                token, label = line.split("\t")
+
+                # Turku has additional labels that
+                # we will not use.
+                if label in LABEL_MAPS:
+                    label = LABEL_MAPS[label]
+
+                tokens.append(token)
+                labels.append(label)
+
+            split_samples.append({"tokens": tokens, "labels": labels})
+
+        dfs[split_name] = pd.DataFrame.from_records(split_samples)
+
+    # According to the paper, there should be 12,217 / 1,364 / 1,555
+    # samples in the train/val/test splits, respectively.
+    assert len(dfs["train"]) == 12_217
+    assert len(dfs["val"]) == 1_364
+    assert len(dfs["test"]) == 1_555
+
+    return dfs
+
+
+if __name__ == "__main__":
+    main()
diff --git a/src/scripts/create_tydiqa_fi.py b/src/scripts/create_tydiqa_fi.py
new file mode 100644
index 000000000..66c0e3741
--- /dev/null
+++ b/src/scripts/create_tydiqa_fi.py
@@ -0,0 +1,118 @@
+"""Create the TydiQA-mini Finnish dataset and upload it to the HF Hub."""
+
+import pandas as pd
+from constants import (
+    MAX_NUM_CHARS_IN_CONTEXT,
+    MAX_NUM_CHARS_IN_QUESTION,
+    MIN_NUM_CHARS_IN_CONTEXT,
+    MIN_NUM_CHARS_IN_QUESTION,
+)
+from datasets.arrow_dataset import Dataset
+from datasets.dataset_dict import DatasetDict
+from datasets.load import load_dataset
+from datasets.splits import Split
+from huggingface_hub.hf_api import HfApi
+from requests.exceptions import HTTPError
+
+
+def main() -> None:
+    """Create the TydiQA-mini Finnish dataset and upload it to the HF Hub."""
+    dataset_id = "google-research-datasets/tydiqa"
+
+    # Load the datasets from the `alexandrainst` organisation
+    train = load_dataset(dataset_id, "secondary_task", split="train", token=True)
+    val = load_dataset(dataset_id, "secondary_task", split="validation", token=True)
+
+    # Ensure that the datasets are indeed datasets
+    assert isinstance(train, Dataset)
+    assert isinstance(val, Dataset)
+
+    # Make train_df and val_df
+    train_df = train.to_pandas()
+    val_df = val.to_pandas()
+
+    # Extract all Finnish samples
+    train_df, val_df = [df[df.id.str.contains("finnish")] for df in (train_df, val_df)]
+
+    train_df, val_df = [process_df(df=df) for df in (train_df, val_df)]
+
+    # Make splits
+    train_size = 1024
+    val_size = 256
+    test_size = 2048
+
+    # Take val_size samples from val_df for validation
+    final_val_df = val_df.sample(n=val_size, random_state=4242)
+
+    # Take train_size samples from train_df for training
+    final_train_df = train_df.sample(n=train_size, random_state=4242)
+
+    # Remaining samples
+    remaining_val_df = val_df.loc[~val_df.index.isin(final_val_df.index)]
+    remaining_train_df = train_df.loc[~train_df.index.isin(final_train_df.index)]
+
+    # Use the remaining samples from val_df + additional samples from
+    # train_df for testing
+    test_samples = remaining_train_df.sample(
+        n=test_size - len(remaining_val_df), random_state=4242
+    )
+    final_test_df = pd.concat([remaining_val_df, test_samples])
+
+    assert len(final_test_df) == test_size
+    assert len(final_train_df) == train_size
+    assert len(final_val_df) == val_size
+
+    final_val_df = final_val_df.reset_index(drop=True)
+    final_test_df = final_test_df.reset_index(drop=True)
+    final_train_df = final_train_df.reset_index(drop=True)
+
+    # Collect datasets in a dataset dictionary
+    dataset = DatasetDict(
+        train=Dataset.from_pandas(final_train_df, split=Split.TRAIN),
+        val=Dataset.from_pandas(final_val_df, split=Split.VALIDATION),
+        test=Dataset.from_pandas(final_test_df, split=Split.TEST),
+    )
+
+    # Create dataset ID
+    mini_dataset_id = "EuroEval/tydiqa-fi-mini"
+
+    # Remove the dataset from Hugging Face Hub if it already exists
+    try:
+        api: HfApi = HfApi()
+        api.delete_repo(mini_dataset_id, repo_type="dataset")
+    except HTTPError:
+        pass
+
+    # Push the dataset to the Hugging Face Hub
+    dataset.push_to_hub(mini_dataset_id, private=True)
+
+
+def process_df(df: pd.DataFrame) -> pd.DataFrame:
+    """Remove outliers and ensure that the context is not too large or small.
+
+    Args:
+        df: The dataframe to process.
+
+    Returns:
+        The processed dataframe.
+    """
+    # Only work with samples where the context is not very large or small
+    lengths = df.context.str.len()
+    df = df[lengths.between(MIN_NUM_CHARS_IN_CONTEXT, MAX_NUM_CHARS_IN_CONTEXT)]
+
+    # Only work with samples where the context is not very large or small
+    lengths = df.question.str.len()
+    df_with_no_outliers = df[
+        lengths.between(MIN_NUM_CHARS_IN_QUESTION, MAX_NUM_CHARS_IN_QUESTION)
+    ]
+
+    # Only work with the questions having answers in the context
+    has_answer: pd.Series = df_with_no_outliers.answers.map(
+        lambda dct: dct["text"][0] != ""
+    )
+    df_with_answer: pd.DataFrame = df_with_no_outliers.loc[has_answer]
+    return df_with_answer
+
+
+if __name__ == "__main__":
+    main()
diff --git a/src/scripts/create_xlsum_fi.py b/src/scripts/create_xlsum_fi.py
new file mode 100644
index 000000000..2b0f7574a
--- /dev/null
+++ b/src/scripts/create_xlsum_fi.py
@@ -0,0 +1,78 @@
+"""Create the Finnish version of the XLSum summarisation dataset."""
+
+import pandas as pd
+from constants import MAX_NUM_CHARS_IN_ARTICLE, MIN_NUM_CHARS_IN_ARTICLE
+from datasets import Dataset, DatasetDict, Split, load_dataset
+from huggingface_hub import HfApi
+from requests import HTTPError
+
+
+def main() -> None:
+    """Create the Finnish XL-Sum dataset and upload to HF Hub."""
+    dataset_id = "TurkuNLP/xlsum-fi"
+
+    dataset = load_dataset(dataset_id)
+    assert isinstance(dataset, DatasetDict)
+
+    dataset = dataset.rename_columns(column_mapping=dict(summary="target_text"))
+
+    train_df = dataset["train"].to_pandas()
+    val_df = dataset["validation"].to_pandas()
+    test_df = dataset["test"].to_pandas()
+    assert isinstance(train_df, pd.DataFrame)
+    assert isinstance(val_df, pd.DataFrame)
+    assert isinstance(test_df, pd.DataFrame)
+
+    # Only work with samples where the text is not very large or small
+    train_lengths = train_df.text.str.len()
+    val_lengths = val_df.text.str.len()
+    test_lengths = test_df.text.str.len()
+    lower_bound = MIN_NUM_CHARS_IN_ARTICLE
+    upper_bound = MAX_NUM_CHARS_IN_ARTICLE
+    train_df = train_df[train_lengths.between(lower_bound, upper_bound)]
+    val_df = val_df[val_lengths.between(lower_bound, upper_bound)]
+    test_df = test_df[test_lengths.between(lower_bound, upper_bound)]
+
+    # Create test split
+    test_size = 2048
+    val_samples_to_test = val_df.sample(n=test_size - len(test_df), random_state=4242)
+    # Remove the samples from the validation set
+    val_df = val_df[~val_df.index.isin(val_samples_to_test.index)]
+    # Concatenate the test set with the sampled validation set
+    test_df = pd.concat([test_df, val_samples_to_test])
+
+    # Create validation split
+    val_size = 256
+    val_df = val_df.sample(n=val_size, random_state=4242)
+
+    # Create train split
+    train_size = 1024
+    train_df = train_df.sample(n=train_size, random_state=4242)
+
+    val_df = val_df.reset_index(drop=True)
+    test_df = test_df.reset_index(drop=True)
+    train_df = train_df.reset_index(drop=True)
+
+    # Collect datasets in a dataset dictionary
+    dataset = DatasetDict(
+        train=Dataset.from_pandas(train_df, split=Split.TRAIN),
+        val=Dataset.from_pandas(val_df, split=Split.VALIDATION),
+        test=Dataset.from_pandas(test_df, split=Split.TEST),
+    )
+
+    # Create dataset ID
+    mini_dataset_id = "EuroEval/xlsum-fi-mini"
+
+    # Remove the dataset from Hugging Face Hub if it already exists
+    try:
+        api: HfApi = HfApi()
+        api.delete_repo(mini_dataset_id, repo_type="dataset")
+    except HTTPError:
+        pass
+
+    # Push the dataset to the Hugging Face Hub
+    dataset.push_to_hub(mini_dataset_id, private=True)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/src/scripts/load_ud_pos.py b/src/scripts/load_ud_pos.py
index 734d1f727..fdf3dd3cb 100644
--- a/src/scripts/load_ud_pos.py
+++ b/src/scripts/load_ud_pos.py
@@ -261,6 +261,24 @@ def load_esdt_pos() -> Dict[str, pd.DataFrame]:
     return load_ud_pos(train_url=train_url, val_url=val_url, test_url=test_url)
 
 
+def load_fidt_pos() -> Dict[str, pd.DataFrame]:
+    """Load the part-of-speech part of the Finnish Dependency Treebank.
+
+    Returns:
+        The dataframes, stored in the keys `train`, `val` and `test`.
+    """
+    # Define download URLs
+    base_url = (
+        "https://raw.githubusercontent.com/UniversalDependencies/UD_Finnish-TDT/"
+        "master/fi_tdt-ud-{}.conllu"
+    )
+    train_url = base_url.format("train")
+    val_url = base_url.format("dev")
+    test_url = base_url.format("test")
+
+    return load_ud_pos(train_url=train_url, val_url=val_url, test_url=test_url)
+
+
 def load_ud_pos(
     train_url: str,
     val_url: str,


Reviews:
user: login: copilot-pull-request-reviewer[bot]
body: ## Pull Request Overview

This PR adds comprehensive support for Finnish by introducing new dataset scripts, updating prompt templates, and adding corresponding configuration and documentation.  
- Implements Finnish loaders/utilities for UD POS, XLSum, TydiQA, Turku NER, ScandiSent, HellaSwag, and ScaLA.  
- Updates EuroEval prompt templates, dataset configurations, documentation, and changelog to include Finnish resources.

### Reviewed Changes

Copilot reviewed 16 out of 16 changed files in this pull request and generated 1 comment.

<details>
<summary>Show a summary per file</summary>

| File | Description |
| ---- | ----------- |
| src/scripts/load_ud_pos.py | Added a new function load_fidt_pos for loading the Finnish Dependency Treebank data. |
| src/scripts/create_xlsum_fi.py | Implements the Finnish version of the XLSum summarisation dataset. |
| src/scripts/create_tydiqa_fi.py | Creates and uploads the Finnish TydiQA-mini dataset after filtering Finnish samples. |
| src/scripts/create_turku_ner_fi.py | Implements Finnish Turku NER dataset processing including token joining and sample splitting. |
| src/scripts/create_scandisent_fi.py | Adds support to process and upload the Finnish part of the ScandiSent sentiment classification dataset. |
| src/scripts/create_scala.py | Updated to include Finnish UD POS support in the language mapping. |
| src/scripts/create_hellaswag_fi.py | Introduces a new script to process and upload the Finnish HellaSwag-mini dataset. |
| src/euroeval/prompt_templates/*.py | Includes Finnish prompt configurations in summarization, sentiment classification, reading comprehension, named entity recognition, multiple choice, and linguistic acceptability templates. |
| src/euroeval/dataset_configs/finnish.py | Contains dataset configurations for several Finnish datasets. |
| docs/datasets/finnish.md | Adds documentation and examples for Finnish datasets in EuroEval. |
| CHANGELOG.md | Updates changelog to detail the addition of Finnish support. |
</details>



<details>
<summary>Comments suppressed due to low confidence (1)</summary>

**src/scripts/create_hellaswag_fi.py:118**
* Accessing ending[0] without checking if the string is empty may lead to an IndexError. Consider adding a condition to ensure 'ending' is non-empty before indexing.
```
if ending[0] in ['", "'"]:
```
</details>


state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-23T13:18:04Z
user: login: saattrupdan
state: CHANGES_REQUESTED
author_association: MEMBER
submitted_at: 2025-04-24T09:33:52Z
user: login: saattrupdan
body: LGTM, nice work!
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-24T10:12:38Z

Review comments:
diff_hunk: @@ -0,0 +1,277 @@
+"""Create the Finnish HellaSwag-mini dataset and upload it to the HF Hub."""
+
+from collections import Counter
+from logging import getLogger
+
+import pandas as pd
+from constants import (
+    MAX_NUM_CHARS_IN_INSTRUCTION,
+    MAX_NUM_CHARS_IN_OPTION,
+    MAX_REPETITIONS,
+    MIN_NUM_CHARS_IN_INSTRUCTION,
+    MIN_NUM_CHARS_IN_OPTION,
+)
+from datasets import Dataset, DatasetDict, Split, load_dataset
+from huggingface_hub import HfApi
+from requests import HTTPError
+
+logger = getLogger(__name__)
+
+
+def main() -> None:
+    """Create the Finnish HellaSwag-mini dataset and upload it to the HF Hub.
+
+    HellaSwag-fi is designed to EuroEval so it already has a
+    1,024 / 256 / 2,048 train/val/test split. This script
+    therefore does not perform the same filtering as seen in
+    `src/scripts/create_hellaswag.py`.
+    """
+    # Define the base download URL
+    repo_id = "Finnish-NLP/hellaswag-fi-google-translate"
+
+    dataset = load_dataset(path=repo_id, token=True)
+    dfs = {}
+    for split in ["train", "validation", "test"]:
+        df = dataset[split].to_pandas()
+
+        df["endings"] = df["endings"].apply(process_endings)
+
+        df = process_split(df=df, split=split)
+        dfs[split] = df
+
+    # Create validation split
+    val_df = dfs["validation"]
+    assert len(val_df) == 256
+
+    # Create test split
+    test_df = dfs["test"]
+    assert len(test_df) == 2_048
+
+    # Create train split
+    train_df = dfs["train"]
+    assert len(train_df) == 1_024
+
+    # Collect datasets in a dataset dictionary
+    dataset = DatasetDict(
+        train=Dataset.from_pandas(train_df, split=Split.TRAIN),
+        val=Dataset.from_pandas(val_df, split=Split.VALIDATION),
+        test=Dataset.from_pandas(test_df, split=Split.TEST),
+    )
+
+    dataset_id = "EuroEval/hellaswag-fi-mini"
+
+    # Remove the dataset from Hugging Face Hub if it already exists
+    try:
+        api = HfApi()
+        api.delete_repo(dataset_id, repo_type="dataset")
+    except HTTPError:
+        pass
+
+    # Push the dataset to the Hugging Face Hub
+    dataset.push_to_hub(dataset_id, private=True)
+
+
+def process_endings(raw_endings: str) -> list[str]:
+    """Process the endings of the HellaSwag-fi dataset.
+
+    I wanted to use `ast.literal_eval` to parse the endings, but it failed
+    because of mixed quotes.
+
+    Args:
+        raw_endings: The endings of the HellaSwag-fi dataset.
+
+    Returns:
+        The processed endings.
+    """
+    # Remove starting/ending square brackets and quotes
+    raw_endings = raw_endings[2:-2]
+
+    # Most endings are separated by newline characters
+    endings = raw_endings.split("\n")
+    if len(endings) != 4:
+        # If not, try a more hacky approach
+        endings = _extract_endings(raw_endings=raw_endings)
+        assert len(endings) == 4
+    else:
+        # Fix quotes
+        endings = [_fix_quotes(ending) for ending in endings]
+    return endings
+
+
+def _fix_quotes(ending: str) -> str:
+    r"""Remove starting and ending quotes.
+
+    Some entries have mixed quotes, e.g.
+        '\'Aloha"'
+    which should be turned into the following:
+        'Aloha'
+
+
+    Args:
+        ending: The ending to process.
+
+    Returns:
+        The processed ending.
+    """
+    ending = ending.strip()
+    # Remove start and end quotes
+    if ending[0] in ['"', "'"]:
+        ending = ending[1:]
+    if ending[-1] in ['"', "'"]:
+        ending = ending[:-1]
+
+    return ending
+
+
+def _extract_endings(raw_endings: str) -> list[str]:
+    """Extract endings from the HellaSwag-fi dataset.
+
+    This strategy is used for samples where the endings are
+    not simply separated by newline characters.
+
+    Args:
+        raw_endings: The endings of the HellaSwag-fi dataset.
+
+    Returns:
+        The processed endings.
+    """
+    endings = []
+    i = 0
+    while i < len(raw_endings) - 2:
+        if raw_endings[i].isalpha() or raw_endings[i] == "[":
+            start = i
+
+            while i < len(raw_endings) - 2:
+                # An ending seems to end with one of the following
+                # char combinations.
+                ends = ['."', ".'", "'.", '".', ".\n"]
+                if raw_endings[i : i + 2] in ends:
+                    ending = raw_endings[start : i + 1].strip()
+                    endings.append(ending)
+                    i += 1
+                    break
+                i += 1
+        else:
+            i += 1
+
+    # Last ending
+    ending = raw_endings[start:].strip()
path: src/scripts/create_hellaswag_fi.py
user: login: Copilot
body: The variable 'start' may be uninitialized if the condition in the while loop is never met. Ensure 'start' is defined (or initialize it) before its use to avoid potential runtime errors.
created_at: 2025-04-23T13:18:04Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,387 @@
+# 🇫🇮 Finnish
+
+This is an overview of all the datasets used in the Finnish part of EuroEval. The
+datasets are grouped by their task - see the [task overview](/tasks) for more
+information about what these constitute.
+
+## Sentiment Classification
+
+### ScandiSent-fi
+
+This dataset consists of reviews from Trustpilot and was published [here](https://github.com/timpal0l/ScandiSent). It is a binary sentiment classification dataset, with labels "positive" and "negative".
+
+For the Finnish part of the dataset, there are 10,000 training samples. From these samples, we have created a 1,024 / 256 / 2,048 split for the train, validation and test splits, respectively.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Kaikki meni niinkuin piti. Nopea toimitus.",
+  "label": "positive"
+}
+```
+```json
+{
+  "text": "En pidä tästä, kun ei löydy linkkiä mistä pääsis heti maksamaan. En todellakaan pidä siitä, että joka tieto pitää kopioida erikseen. Haluaisin päästä suoraan oston jälkeen maksamaa mobiilipankkiin. Pari laskua on jäänyt tän takia kokonaan huomioimatta. Ja ihan turhaa.... ärsyttää sitten se kotiin tuleva muistutuslasku.",
+  "label": "negative"
+}
+```
+```json
+{
+  "text": "Todella hidas toimitus, ja virheellistä tietoa tuotteiden saatavuudesta, paketti ja tuotteet perillä vasta kuukauden päästä tilauksesta....",
+  "label": "negative"
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 12
+- Prefix prompt:
+  ```
+  Seuraavassa on arvosteluja ja niiden tunnesävy, joka voi olla 'positiivinen' tai 'negatiivinen'.
+  ```
+- Base prompt template:
+  ```
+  Teksti: {text}
+  Tunnesävy: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Teksti: {text}
+
+  Luokittele arvostelun tunnesävy. Vastaa vain 'positiivinen' tai 'negatiivinen', ei muuta.
+  ```
+- Label mapping:
+    - `positive` ➡️ `positiivinen`
+    - `negative` ➡️ `negatiivinen`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset scandisent-fi
+```
+
path: docs/datasets/finnish.md
user: login: saattrupdan
body: ```suggestion


```
created_at: 2025-04-24T09:14:58Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,387 @@
+# 🇫🇮 Finnish
+
+This is an overview of all the datasets used in the Finnish part of EuroEval. The
+datasets are grouped by their task - see the [task overview](/tasks) for more
+information about what these constitute.
+
+## Sentiment Classification
+
+### ScandiSent-fi
+
+This dataset consists of reviews from Trustpilot and was published [here](https://github.com/timpal0l/ScandiSent). It is a binary sentiment classification dataset, with labels "positive" and "negative".
path: docs/datasets/finnish.md
user: login: saattrupdan
body: ```suggestion
This dataset consists of reviews from Trustpilot and was published [here](https://aclanthology.org/2021.nodalida-main.42/). It is a binary sentiment classification dataset, with labels "positive" and "negative".
```
created_at: 2025-04-24T09:15:56Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,387 @@
+# 🇫🇮 Finnish
+
+This is an overview of all the datasets used in the Finnish part of EuroEval. The
+datasets are grouped by their task - see the [task overview](/tasks) for more
+information about what these constitute.
+
+## Sentiment Classification
+
+### ScandiSent-fi
+
+This dataset consists of reviews from Trustpilot and was published [here](https://github.com/timpal0l/ScandiSent). It is a binary sentiment classification dataset, with labels "positive" and "negative".
+
+For the Finnish part of the dataset, there are 10,000 training samples. From these samples, we have created a 1,024 / 256 / 2,048 split for the train, validation and test splits, respectively.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Kaikki meni niinkuin piti. Nopea toimitus.",
+  "label": "positive"
+}
+```
+```json
+{
+  "text": "En pidä tästä, kun ei löydy linkkiä mistä pääsis heti maksamaan. En todellakaan pidä siitä, että joka tieto pitää kopioida erikseen. Haluaisin päästä suoraan oston jälkeen maksamaa mobiilipankkiin. Pari laskua on jäänyt tän takia kokonaan huomioimatta. Ja ihan turhaa.... ärsyttää sitten se kotiin tuleva muistutuslasku.",
+  "label": "negative"
+}
+```
+```json
+{
+  "text": "Todella hidas toimitus, ja virheellistä tietoa tuotteiden saatavuudesta, paketti ja tuotteet perillä vasta kuukauden päästä tilauksesta....",
+  "label": "negative"
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 12
+- Prefix prompt:
+  ```
+  Seuraavassa on arvosteluja ja niiden tunnesävy, joka voi olla 'positiivinen' tai 'negatiivinen'.
+  ```
+- Base prompt template:
+  ```
+  Teksti: {text}
+  Tunnesävy: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Teksti: {text}
+
+  Luokittele arvostelun tunnesävy. Vastaa vain 'positiivinen' tai 'negatiivinen', ei muuta.
+  ```
+- Label mapping:
+    - `positive` ➡️ `positiivinen`
+    - `negative` ➡️ `negatiivinen`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset scandisent-fi
+```
+
+## Named Entity Recognition
+
+### Turku-NER-fi
+
+This dataset was published in [this paper](https://aclanthology.org/2020.lrec-1.567/).
+
+The original dataset contains 12,217 / 1,364 / 1,555 samples for the training, validation and test splits, respectively. We use 1,024 / 256 / 2,048 samples for our training, validation and test splits, respectively. All the new splits are subsets of the original splits.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "tokens": ["Suomalaiset", "vaihtoivat", "Tukholman", "Tallinnaan"],
+  "labels": ["O", "O", "B-LOC", "B-LOC"]
+}
+```
+```json
+{
+  "tokens": ["Liuhto", "nosti", "Kreikan", "tapauksen", "yhteydessä", "esille", "kysymyksen", "siitä", ",", "miten", "Euroopan", "unionissa", "yleisesti", "sanktioidaan", "pelisääntöjen", "rikkomisesta", "."],
+  "labels": ["B-PER", "O", "B-LOC", "O", "O", "O", "O", "O", "O", "O", "B-ORG", "I-ORG", "O", "O", "O", "O", "O"],
+}
+```
+```json
+{
+  "tokens": ["Mithridates", "oli", "Pontoksen", "merkittävin", "kuningas", "ja", "Rooman", "valtakunnan", "vaarallisin", "vihollinen", "ensimmäisellä", "vuosisadalla", "eaa.", "."],
+  "labels": ["B-PER", "O", "B-LOC", "O", "O", "O", "B-LOC", "I-LOC", "O", "O", "O", "O", "O", "O"],
+}
+```
path: docs/datasets/finnish.md
user: login: saattrupdan
body: Should be arrays, to maintain consistency with the other docs.
created_at: 2025-04-24T09:16:51Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,387 @@
+# 🇫🇮 Finnish
+
+This is an overview of all the datasets used in the Finnish part of EuroEval. The
+datasets are grouped by their task - see the [task overview](/tasks) for more
+information about what these constitute.
+
+## Sentiment Classification
+
+### ScandiSent-fi
+
+This dataset consists of reviews from Trustpilot and was published [here](https://github.com/timpal0l/ScandiSent). It is a binary sentiment classification dataset, with labels "positive" and "negative".
+
+For the Finnish part of the dataset, there are 10,000 training samples. From these samples, we have created a 1,024 / 256 / 2,048 split for the train, validation and test splits, respectively.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Kaikki meni niinkuin piti. Nopea toimitus.",
+  "label": "positive"
+}
+```
+```json
+{
+  "text": "En pidä tästä, kun ei löydy linkkiä mistä pääsis heti maksamaan. En todellakaan pidä siitä, että joka tieto pitää kopioida erikseen. Haluaisin päästä suoraan oston jälkeen maksamaa mobiilipankkiin. Pari laskua on jäänyt tän takia kokonaan huomioimatta. Ja ihan turhaa.... ärsyttää sitten se kotiin tuleva muistutuslasku.",
+  "label": "negative"
+}
+```
+```json
+{
+  "text": "Todella hidas toimitus, ja virheellistä tietoa tuotteiden saatavuudesta, paketti ja tuotteet perillä vasta kuukauden päästä tilauksesta....",
+  "label": "negative"
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 12
+- Prefix prompt:
+  ```
+  Seuraavassa on arvosteluja ja niiden tunnesävy, joka voi olla 'positiivinen' tai 'negatiivinen'.
+  ```
+- Base prompt template:
+  ```
+  Teksti: {text}
+  Tunnesävy: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Teksti: {text}
+
+  Luokittele arvostelun tunnesävy. Vastaa vain 'positiivinen' tai 'negatiivinen', ei muuta.
+  ```
+- Label mapping:
+    - `positive` ➡️ `positiivinen`
+    - `negative` ➡️ `negatiivinen`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset scandisent-fi
+```
+
+## Named Entity Recognition
+
+### Turku-NER-fi
+
+This dataset was published in [this paper](https://aclanthology.org/2020.lrec-1.567/).
+
+The original dataset contains 12,217 / 1,364 / 1,555 samples for the training, validation and test splits, respectively. We use 1,024 / 256 / 2,048 samples for our training, validation and test splits, respectively. All the new splits are subsets of the original splits.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "tokens": ["Suomalaiset", "vaihtoivat", "Tukholman", "Tallinnaan"],
+  "labels": ["O", "O", "B-LOC", "B-LOC"]
+}
+```
+```json
+{
+  "tokens": ["Liuhto", "nosti", "Kreikan", "tapauksen", "yhteydessä", "esille", "kysymyksen", "siitä", ",", "miten", "Euroopan", "unionissa", "yleisesti", "sanktioidaan", "pelisääntöjen", "rikkomisesta", "."],
+  "labels": ["B-PER", "O", "B-LOC", "O", "O", "O", "O", "O", "O", "O", "B-ORG", "I-ORG", "O", "O", "O", "O", "O"],
+}
+```
+```json
+{
+  "tokens": ["Mithridates", "oli", "Pontoksen", "merkittävin", "kuningas", "ja", "Rooman", "valtakunnan", "vaarallisin", "vihollinen", "ensimmäisellä", "vuosisadalla", "eaa.", "."],
+  "labels": ["B-PER", "O", "B-LOC", "O", "O", "O", "B-LOC", "I-LOC", "O", "O", "O", "O", "O", "O"],
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 8
+- Prefix prompt:
+  ```
+  Seuraavassa on lauseita ja JSON-sanakirjoja, jotka sisältävät annetussa lauseessa esiintyvät nimetyt entiteetit.
+  ```
+- Base prompt template:
+  ```
+  Lause: {text}
+  Nimetyt entiteetit: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Lause: {text}
+
+  Tunnista lauseessa esiintyvät nimetyt entiteetit. Tulosta ne JSON-sanakirjana, jonka avaimet ovat 'henkilö', 'paikka', 'organisaatio' ja 'muut'. Arvojen tulee olla listoja kyseisen tyypin nimetyistä entiteeteistä täsmälleen siinä muodossa kuin ne esiintyvät lauseessa.
+  ```
+- Label mapping:
+    - `B-PER` ➡️ `person`
+    - `I-PER` ➡️ `person`
+    - `B-LOC` ➡️ `sted`
+    - `I-LOC` ➡️ `sted`
+    - `B-ORG` ➡️ `organisation`
+    - `I-ORG` ➡️ `organisation`
+    - `B-MISC` ➡️ `diverse`
+    - `I-MISC` ➡️ `diverse`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset turku-ner-fi
+```
+
path: docs/datasets/finnish.md
user: login: saattrupdan
body: ```suggestion
```
created_at: 2025-04-24T09:17:08Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,387 @@
+# 🇫🇮 Finnish
+
+This is an overview of all the datasets used in the Finnish part of EuroEval. The
+datasets are grouped by their task - see the [task overview](/tasks) for more
+information about what these constitute.
+
+## Sentiment Classification
+
+### ScandiSent-fi
+
+This dataset consists of reviews from Trustpilot and was published [here](https://github.com/timpal0l/ScandiSent). It is a binary sentiment classification dataset, with labels "positive" and "negative".
+
+For the Finnish part of the dataset, there are 10,000 training samples. From these samples, we have created a 1,024 / 256 / 2,048 split for the train, validation and test splits, respectively.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Kaikki meni niinkuin piti. Nopea toimitus.",
+  "label": "positive"
+}
+```
+```json
+{
+  "text": "En pidä tästä, kun ei löydy linkkiä mistä pääsis heti maksamaan. En todellakaan pidä siitä, että joka tieto pitää kopioida erikseen. Haluaisin päästä suoraan oston jälkeen maksamaa mobiilipankkiin. Pari laskua on jäänyt tän takia kokonaan huomioimatta. Ja ihan turhaa.... ärsyttää sitten se kotiin tuleva muistutuslasku.",
+  "label": "negative"
+}
+```
+```json
+{
+  "text": "Todella hidas toimitus, ja virheellistä tietoa tuotteiden saatavuudesta, paketti ja tuotteet perillä vasta kuukauden päästä tilauksesta....",
+  "label": "negative"
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 12
+- Prefix prompt:
+  ```
+  Seuraavassa on arvosteluja ja niiden tunnesävy, joka voi olla 'positiivinen' tai 'negatiivinen'.
+  ```
+- Base prompt template:
+  ```
+  Teksti: {text}
+  Tunnesävy: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Teksti: {text}
+
+  Luokittele arvostelun tunnesävy. Vastaa vain 'positiivinen' tai 'negatiivinen', ei muuta.
+  ```
+- Label mapping:
+    - `positive` ➡️ `positiivinen`
+    - `negative` ➡️ `negatiivinen`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset scandisent-fi
+```
+
+## Named Entity Recognition
+
+### Turku-NER-fi
+
+This dataset was published in [this paper](https://aclanthology.org/2020.lrec-1.567/).
+
+The original dataset contains 12,217 / 1,364 / 1,555 samples for the training, validation and test splits, respectively. We use 1,024 / 256 / 2,048 samples for our training, validation and test splits, respectively. All the new splits are subsets of the original splits.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "tokens": ["Suomalaiset", "vaihtoivat", "Tukholman", "Tallinnaan"],
+  "labels": ["O", "O", "B-LOC", "B-LOC"]
+}
+```
+```json
+{
+  "tokens": ["Liuhto", "nosti", "Kreikan", "tapauksen", "yhteydessä", "esille", "kysymyksen", "siitä", ",", "miten", "Euroopan", "unionissa", "yleisesti", "sanktioidaan", "pelisääntöjen", "rikkomisesta", "."],
+  "labels": ["B-PER", "O", "B-LOC", "O", "O", "O", "O", "O", "O", "O", "B-ORG", "I-ORG", "O", "O", "O", "O", "O"],
+}
+```
+```json
+{
+  "tokens": ["Mithridates", "oli", "Pontoksen", "merkittävin", "kuningas", "ja", "Rooman", "valtakunnan", "vaarallisin", "vihollinen", "ensimmäisellä", "vuosisadalla", "eaa.", "."],
+  "labels": ["B-PER", "O", "B-LOC", "O", "O", "O", "B-LOC", "I-LOC", "O", "O", "O", "O", "O", "O"],
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 8
+- Prefix prompt:
+  ```
+  Seuraavassa on lauseita ja JSON-sanakirjoja, jotka sisältävät annetussa lauseessa esiintyvät nimetyt entiteetit.
+  ```
+- Base prompt template:
+  ```
+  Lause: {text}
+  Nimetyt entiteetit: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Lause: {text}
+
+  Tunnista lauseessa esiintyvät nimetyt entiteetit. Tulosta ne JSON-sanakirjana, jonka avaimet ovat 'henkilö', 'paikka', 'organisaatio' ja 'muut'. Arvojen tulee olla listoja kyseisen tyypin nimetyistä entiteeteistä täsmälleen siinä muodossa kuin ne esiintyvät lauseessa.
+  ```
+- Label mapping:
+    - `B-PER` ➡️ `person`
+    - `I-PER` ➡️ `person`
+    - `B-LOC` ➡️ `sted`
+    - `I-LOC` ➡️ `sted`
+    - `B-ORG` ➡️ `organisation`
+    - `I-ORG` ➡️ `organisation`
+    - `B-MISC` ➡️ `diverse`
+    - `I-MISC` ➡️ `diverse`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset turku-ner-fi
+```
+
+
+
+## Linguistic Acceptability
+
+### ScaLA-fi
+
+This dataset was published in [this paper](https://aclanthology.org/2023.nodalida-1.20/)
+and was automatically created from the [Finnish Universal Dependencies
+treebank](https://github.com/UniversalDependencies/UD_Finnish-TDT/tree/master) by
+assuming that the documents in the treebank are correct, and corrupting the samples to
+create grammatically incorrect samples. The corruptions were done by either removing a
+word from a sentence, or by swapping two neighbouring words in a sentence. To ensure
+that this does indeed break the grammaticality of the sentence, a set of rules were used
+on the part-of-speech tags of the words in the sentence.
+
+The original dataset consists of 15,136 samples, from which we use 1,024 / 256 / 2,048 samples for training,
+validation and testing, respectively (so 3,328 samples used in total). These splits are
+used as-is in the framework.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Vuotta aiempaan verrattuna uusia ajoneuvoja rekisteröitiin 17,6 prosenttia enemmän.",
+  "label": "correct"
+}
+```
+```json
+{
+  "text": "20-vuotias sai aiemmin marraskuussa 2006 Helsingin käräjäoikeudelta 30 päiväsakkoa Ta... varastettujen vaatteiden hallussapidosta.",
+  "label": "correct"
+}
+```
+```json
+{
+  "text": "Kun käyttäjä kirjoittaa viestin, se näkyy käyttäjän käyttäjälistassa.",
+  "label": "incorrect"
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 12
+- Prefix prompt:
+  ```
+  Seuraavat ovat lauseita ja ovatko ne kieliopillisesti oikein.
+  ```
+- Base prompt template:
+  ```
+  Lause: {text}
+  Kieliopillisesti oikein: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Lause: {text}
+
+  Määritä onko lause kieliopillisesti oikein vai ei. Vastaa 'kyllä', jos lause on oikein, ja 'ei', jos se ei ole.
+  ```
+- Label mapping:
+    - `correct` ➡️ `kyllä`
+    - `incorrect` ➡️ `ei`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset scala-fi
+```
+
path: docs/datasets/finnish.md
user: login: saattrupdan
body: ```suggestion


```
created_at: 2025-04-24T09:17:37Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,387 @@
+# 🇫🇮 Finnish
+
+This is an overview of all the datasets used in the Finnish part of EuroEval. The
+datasets are grouped by their task - see the [task overview](/tasks) for more
+information about what these constitute.
+
+## Sentiment Classification
+
+### ScandiSent-fi
+
+This dataset consists of reviews from Trustpilot and was published [here](https://github.com/timpal0l/ScandiSent). It is a binary sentiment classification dataset, with labels "positive" and "negative".
+
+For the Finnish part of the dataset, there are 10,000 training samples. From these samples, we have created a 1,024 / 256 / 2,048 split for the train, validation and test splits, respectively.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Kaikki meni niinkuin piti. Nopea toimitus.",
+  "label": "positive"
+}
+```
+```json
+{
+  "text": "En pidä tästä, kun ei löydy linkkiä mistä pääsis heti maksamaan. En todellakaan pidä siitä, että joka tieto pitää kopioida erikseen. Haluaisin päästä suoraan oston jälkeen maksamaa mobiilipankkiin. Pari laskua on jäänyt tän takia kokonaan huomioimatta. Ja ihan turhaa.... ärsyttää sitten se kotiin tuleva muistutuslasku.",
+  "label": "negative"
+}
+```
+```json
+{
+  "text": "Todella hidas toimitus, ja virheellistä tietoa tuotteiden saatavuudesta, paketti ja tuotteet perillä vasta kuukauden päästä tilauksesta....",
+  "label": "negative"
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 12
+- Prefix prompt:
+  ```
+  Seuraavassa on arvosteluja ja niiden tunnesävy, joka voi olla 'positiivinen' tai 'negatiivinen'.
+  ```
+- Base prompt template:
+  ```
+  Teksti: {text}
+  Tunnesävy: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Teksti: {text}
+
+  Luokittele arvostelun tunnesävy. Vastaa vain 'positiivinen' tai 'negatiivinen', ei muuta.
+  ```
+- Label mapping:
+    - `positive` ➡️ `positiivinen`
+    - `negative` ➡️ `negatiivinen`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset scandisent-fi
+```
+
+## Named Entity Recognition
+
+### Turku-NER-fi
+
+This dataset was published in [this paper](https://aclanthology.org/2020.lrec-1.567/).
path: docs/datasets/finnish.md
user: login: saattrupdan
body: Missing information on where the data comes from.
created_at: 2025-04-24T09:18:01Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,387 @@
+# 🇫🇮 Finnish
+
+This is an overview of all the datasets used in the Finnish part of EuroEval. The
+datasets are grouped by their task - see the [task overview](/tasks) for more
+information about what these constitute.
+
+## Sentiment Classification
+
+### ScandiSent-fi
+
+This dataset consists of reviews from Trustpilot and was published [here](https://github.com/timpal0l/ScandiSent). It is a binary sentiment classification dataset, with labels "positive" and "negative".
+
+For the Finnish part of the dataset, there are 10,000 training samples. From these samples, we have created a 1,024 / 256 / 2,048 split for the train, validation and test splits, respectively.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Kaikki meni niinkuin piti. Nopea toimitus.",
+  "label": "positive"
+}
+```
+```json
+{
+  "text": "En pidä tästä, kun ei löydy linkkiä mistä pääsis heti maksamaan. En todellakaan pidä siitä, että joka tieto pitää kopioida erikseen. Haluaisin päästä suoraan oston jälkeen maksamaa mobiilipankkiin. Pari laskua on jäänyt tän takia kokonaan huomioimatta. Ja ihan turhaa.... ärsyttää sitten se kotiin tuleva muistutuslasku.",
+  "label": "negative"
+}
+```
+```json
+{
+  "text": "Todella hidas toimitus, ja virheellistä tietoa tuotteiden saatavuudesta, paketti ja tuotteet perillä vasta kuukauden päästä tilauksesta....",
+  "label": "negative"
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 12
+- Prefix prompt:
+  ```
+  Seuraavassa on arvosteluja ja niiden tunnesävy, joka voi olla 'positiivinen' tai 'negatiivinen'.
+  ```
+- Base prompt template:
+  ```
+  Teksti: {text}
+  Tunnesävy: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Teksti: {text}
+
+  Luokittele arvostelun tunnesävy. Vastaa vain 'positiivinen' tai 'negatiivinen', ei muuta.
+  ```
+- Label mapping:
+    - `positive` ➡️ `positiivinen`
+    - `negative` ➡️ `negatiivinen`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset scandisent-fi
+```
+
+## Named Entity Recognition
+
+### Turku-NER-fi
+
+This dataset was published in [this paper](https://aclanthology.org/2020.lrec-1.567/).
+
+The original dataset contains 12,217 / 1,364 / 1,555 samples for the training, validation and test splits, respectively. We use 1,024 / 256 / 2,048 samples for our training, validation and test splits, respectively. All the new splits are subsets of the original splits.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "tokens": ["Suomalaiset", "vaihtoivat", "Tukholman", "Tallinnaan"],
+  "labels": ["O", "O", "B-LOC", "B-LOC"]
+}
+```
+```json
+{
+  "tokens": ["Liuhto", "nosti", "Kreikan", "tapauksen", "yhteydessä", "esille", "kysymyksen", "siitä", ",", "miten", "Euroopan", "unionissa", "yleisesti", "sanktioidaan", "pelisääntöjen", "rikkomisesta", "."],
+  "labels": ["B-PER", "O", "B-LOC", "O", "O", "O", "O", "O", "O", "O", "B-ORG", "I-ORG", "O", "O", "O", "O", "O"],
+}
+```
+```json
+{
+  "tokens": ["Mithridates", "oli", "Pontoksen", "merkittävin", "kuningas", "ja", "Rooman", "valtakunnan", "vaarallisin", "vihollinen", "ensimmäisellä", "vuosisadalla", "eaa.", "."],
+  "labels": ["B-PER", "O", "B-LOC", "O", "O", "O", "B-LOC", "I-LOC", "O", "O", "O", "O", "O", "O"],
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 8
+- Prefix prompt:
+  ```
+  Seuraavassa on lauseita ja JSON-sanakirjoja, jotka sisältävät annetussa lauseessa esiintyvät nimetyt entiteetit.
+  ```
+- Base prompt template:
+  ```
+  Lause: {text}
+  Nimetyt entiteetit: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Lause: {text}
+
+  Tunnista lauseessa esiintyvät nimetyt entiteetit. Tulosta ne JSON-sanakirjana, jonka avaimet ovat 'henkilö', 'paikka', 'organisaatio' ja 'muut'. Arvojen tulee olla listoja kyseisen tyypin nimetyistä entiteeteistä täsmälleen siinä muodossa kuin ne esiintyvät lauseessa.
+  ```
+- Label mapping:
+    - `B-PER` ➡️ `person`
+    - `I-PER` ➡️ `person`
+    - `B-LOC` ➡️ `sted`
+    - `I-LOC` ➡️ `sted`
+    - `B-ORG` ➡️ `organisation`
+    - `I-ORG` ➡️ `organisation`
+    - `B-MISC` ➡️ `diverse`
+    - `I-MISC` ➡️ `diverse`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset turku-ner-fi
+```
+
+
+
+## Linguistic Acceptability
+
+### ScaLA-fi
+
+This dataset was published in [this paper](https://aclanthology.org/2023.nodalida-1.20/)
+and was automatically created from the [Finnish Universal Dependencies
+treebank](https://github.com/UniversalDependencies/UD_Finnish-TDT/tree/master) by
+assuming that the documents in the treebank are correct, and corrupting the samples to
+create grammatically incorrect samples. The corruptions were done by either removing a
+word from a sentence, or by swapping two neighbouring words in a sentence. To ensure
+that this does indeed break the grammaticality of the sentence, a set of rules were used
+on the part-of-speech tags of the words in the sentence.
+
+The original dataset consists of 15,136 samples, from which we use 1,024 / 256 / 2,048 samples for training,
+validation and testing, respectively (so 3,328 samples used in total). These splits are
+used as-is in the framework.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Vuotta aiempaan verrattuna uusia ajoneuvoja rekisteröitiin 17,6 prosenttia enemmän.",
+  "label": "correct"
+}
+```
+```json
+{
+  "text": "20-vuotias sai aiemmin marraskuussa 2006 Helsingin käräjäoikeudelta 30 päiväsakkoa Ta... varastettujen vaatteiden hallussapidosta.",
+  "label": "correct"
+}
+```
+```json
+{
+  "text": "Kun käyttäjä kirjoittaa viestin, se näkyy käyttäjän käyttäjälistassa.",
+  "label": "incorrect"
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 12
+- Prefix prompt:
+  ```
+  Seuraavat ovat lauseita ja ovatko ne kieliopillisesti oikein.
+  ```
+- Base prompt template:
+  ```
+  Lause: {text}
+  Kieliopillisesti oikein: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Lause: {text}
+
+  Määritä onko lause kieliopillisesti oikein vai ei. Vastaa 'kyllä', jos lause on oikein, ja 'ei', jos se ei ole.
+  ```
+- Label mapping:
+    - `correct` ➡️ `kyllä`
+    - `incorrect` ➡️ `ei`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset scala-fi
+```
+
+## Reading Comprehension
+
+### TydiQA-fi
+
+This question-answering dataset was published in [this paper](https://arxiv.org/abs/2003.05002).
path: docs/datasets/finnish.md
user: login: saattrupdan
body: Missing information on where the data comes from.
created_at: 2025-04-24T09:18:16Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,387 @@
+# 🇫🇮 Finnish
+
+This is an overview of all the datasets used in the Finnish part of EuroEval. The
+datasets are grouped by their task - see the [task overview](/tasks) for more
+information about what these constitute.
+
+## Sentiment Classification
+
+### ScandiSent-fi
+
+This dataset consists of reviews from Trustpilot and was published [here](https://github.com/timpal0l/ScandiSent). It is a binary sentiment classification dataset, with labels "positive" and "negative".
+
+For the Finnish part of the dataset, there are 10,000 training samples. From these samples, we have created a 1,024 / 256 / 2,048 split for the train, validation and test splits, respectively.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Kaikki meni niinkuin piti. Nopea toimitus.",
+  "label": "positive"
+}
+```
+```json
+{
+  "text": "En pidä tästä, kun ei löydy linkkiä mistä pääsis heti maksamaan. En todellakaan pidä siitä, että joka tieto pitää kopioida erikseen. Haluaisin päästä suoraan oston jälkeen maksamaa mobiilipankkiin. Pari laskua on jäänyt tän takia kokonaan huomioimatta. Ja ihan turhaa.... ärsyttää sitten se kotiin tuleva muistutuslasku.",
+  "label": "negative"
+}
+```
+```json
+{
+  "text": "Todella hidas toimitus, ja virheellistä tietoa tuotteiden saatavuudesta, paketti ja tuotteet perillä vasta kuukauden päästä tilauksesta....",
+  "label": "negative"
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 12
+- Prefix prompt:
+  ```
+  Seuraavassa on arvosteluja ja niiden tunnesävy, joka voi olla 'positiivinen' tai 'negatiivinen'.
+  ```
+- Base prompt template:
+  ```
+  Teksti: {text}
+  Tunnesävy: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Teksti: {text}
+
+  Luokittele arvostelun tunnesävy. Vastaa vain 'positiivinen' tai 'negatiivinen', ei muuta.
+  ```
+- Label mapping:
+    - `positive` ➡️ `positiivinen`
+    - `negative` ➡️ `negatiivinen`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset scandisent-fi
+```
+
+## Named Entity Recognition
+
+### Turku-NER-fi
+
+This dataset was published in [this paper](https://aclanthology.org/2020.lrec-1.567/).
+
+The original dataset contains 12,217 / 1,364 / 1,555 samples for the training, validation and test splits, respectively. We use 1,024 / 256 / 2,048 samples for our training, validation and test splits, respectively. All the new splits are subsets of the original splits.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "tokens": ["Suomalaiset", "vaihtoivat", "Tukholman", "Tallinnaan"],
+  "labels": ["O", "O", "B-LOC", "B-LOC"]
+}
+```
+```json
+{
+  "tokens": ["Liuhto", "nosti", "Kreikan", "tapauksen", "yhteydessä", "esille", "kysymyksen", "siitä", ",", "miten", "Euroopan", "unionissa", "yleisesti", "sanktioidaan", "pelisääntöjen", "rikkomisesta", "."],
+  "labels": ["B-PER", "O", "B-LOC", "O", "O", "O", "O", "O", "O", "O", "B-ORG", "I-ORG", "O", "O", "O", "O", "O"],
+}
+```
+```json
+{
+  "tokens": ["Mithridates", "oli", "Pontoksen", "merkittävin", "kuningas", "ja", "Rooman", "valtakunnan", "vaarallisin", "vihollinen", "ensimmäisellä", "vuosisadalla", "eaa.", "."],
+  "labels": ["B-PER", "O", "B-LOC", "O", "O", "O", "B-LOC", "I-LOC", "O", "O", "O", "O", "O", "O"],
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 8
+- Prefix prompt:
+  ```
+  Seuraavassa on lauseita ja JSON-sanakirjoja, jotka sisältävät annetussa lauseessa esiintyvät nimetyt entiteetit.
+  ```
+- Base prompt template:
+  ```
+  Lause: {text}
+  Nimetyt entiteetit: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Lause: {text}
+
+  Tunnista lauseessa esiintyvät nimetyt entiteetit. Tulosta ne JSON-sanakirjana, jonka avaimet ovat 'henkilö', 'paikka', 'organisaatio' ja 'muut'. Arvojen tulee olla listoja kyseisen tyypin nimetyistä entiteeteistä täsmälleen siinä muodossa kuin ne esiintyvät lauseessa.
+  ```
+- Label mapping:
+    - `B-PER` ➡️ `person`
+    - `I-PER` ➡️ `person`
+    - `B-LOC` ➡️ `sted`
+    - `I-LOC` ➡️ `sted`
+    - `B-ORG` ➡️ `organisation`
+    - `I-ORG` ➡️ `organisation`
+    - `B-MISC` ➡️ `diverse`
+    - `I-MISC` ➡️ `diverse`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset turku-ner-fi
+```
+
+
+
+## Linguistic Acceptability
+
+### ScaLA-fi
+
+This dataset was published in [this paper](https://aclanthology.org/2023.nodalida-1.20/)
+and was automatically created from the [Finnish Universal Dependencies
+treebank](https://github.com/UniversalDependencies/UD_Finnish-TDT/tree/master) by
+assuming that the documents in the treebank are correct, and corrupting the samples to
+create grammatically incorrect samples. The corruptions were done by either removing a
+word from a sentence, or by swapping two neighbouring words in a sentence. To ensure
+that this does indeed break the grammaticality of the sentence, a set of rules were used
+on the part-of-speech tags of the words in the sentence.
+
+The original dataset consists of 15,136 samples, from which we use 1,024 / 256 / 2,048 samples for training,
+validation and testing, respectively (so 3,328 samples used in total). These splits are
+used as-is in the framework.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Vuotta aiempaan verrattuna uusia ajoneuvoja rekisteröitiin 17,6 prosenttia enemmän.",
+  "label": "correct"
+}
+```
+```json
+{
+  "text": "20-vuotias sai aiemmin marraskuussa 2006 Helsingin käräjäoikeudelta 30 päiväsakkoa Ta... varastettujen vaatteiden hallussapidosta.",
+  "label": "correct"
+}
+```
+```json
+{
+  "text": "Kun käyttäjä kirjoittaa viestin, se näkyy käyttäjän käyttäjälistassa.",
+  "label": "incorrect"
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 12
+- Prefix prompt:
+  ```
+  Seuraavat ovat lauseita ja ovatko ne kieliopillisesti oikein.
+  ```
+- Base prompt template:
+  ```
+  Lause: {text}
+  Kieliopillisesti oikein: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Lause: {text}
+
+  Määritä onko lause kieliopillisesti oikein vai ei. Vastaa 'kyllä', jos lause on oikein, ja 'ei', jos se ei ole.
+  ```
+- Label mapping:
+    - `correct` ➡️ `kyllä`
+    - `incorrect` ➡️ `ei`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset scala-fi
+```
+
+## Reading Comprehension
+
+### TydiQA-fi
+
+This question-answering dataset was published in [this paper](https://arxiv.org/abs/2003.05002).
path: docs/datasets/finnish.md
user: login: saattrupdan
body: We always prefer published articles over preprints. These can be found in Google Scholar under "more versions":

```suggestion
This question-answering dataset was published in [this paper](https://aclanthology.org/2020.tacl-1.30/).
```
created_at: 2025-04-24T09:19:17Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,387 @@
+# 🇫🇮 Finnish
+
+This is an overview of all the datasets used in the Finnish part of EuroEval. The
+datasets are grouped by their task - see the [task overview](/tasks) for more
+information about what these constitute.
+
+## Sentiment Classification
+
+### ScandiSent-fi
+
+This dataset consists of reviews from Trustpilot and was published [here](https://github.com/timpal0l/ScandiSent). It is a binary sentiment classification dataset, with labels "positive" and "negative".
+
+For the Finnish part of the dataset, there are 10,000 training samples. From these samples, we have created a 1,024 / 256 / 2,048 split for the train, validation and test splits, respectively.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Kaikki meni niinkuin piti. Nopea toimitus.",
+  "label": "positive"
+}
+```
+```json
+{
+  "text": "En pidä tästä, kun ei löydy linkkiä mistä pääsis heti maksamaan. En todellakaan pidä siitä, että joka tieto pitää kopioida erikseen. Haluaisin päästä suoraan oston jälkeen maksamaa mobiilipankkiin. Pari laskua on jäänyt tän takia kokonaan huomioimatta. Ja ihan turhaa.... ärsyttää sitten se kotiin tuleva muistutuslasku.",
+  "label": "negative"
+}
+```
+```json
+{
+  "text": "Todella hidas toimitus, ja virheellistä tietoa tuotteiden saatavuudesta, paketti ja tuotteet perillä vasta kuukauden päästä tilauksesta....",
+  "label": "negative"
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 12
+- Prefix prompt:
+  ```
+  Seuraavassa on arvosteluja ja niiden tunnesävy, joka voi olla 'positiivinen' tai 'negatiivinen'.
+  ```
+- Base prompt template:
+  ```
+  Teksti: {text}
+  Tunnesävy: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Teksti: {text}
+
+  Luokittele arvostelun tunnesävy. Vastaa vain 'positiivinen' tai 'negatiivinen', ei muuta.
+  ```
+- Label mapping:
+    - `positive` ➡️ `positiivinen`
+    - `negative` ➡️ `negatiivinen`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset scandisent-fi
+```
+
+## Named Entity Recognition
+
+### Turku-NER-fi
+
+This dataset was published in [this paper](https://aclanthology.org/2020.lrec-1.567/).
+
+The original dataset contains 12,217 / 1,364 / 1,555 samples for the training, validation and test splits, respectively. We use 1,024 / 256 / 2,048 samples for our training, validation and test splits, respectively. All the new splits are subsets of the original splits.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "tokens": ["Suomalaiset", "vaihtoivat", "Tukholman", "Tallinnaan"],
+  "labels": ["O", "O", "B-LOC", "B-LOC"]
+}
+```
+```json
+{
+  "tokens": ["Liuhto", "nosti", "Kreikan", "tapauksen", "yhteydessä", "esille", "kysymyksen", "siitä", ",", "miten", "Euroopan", "unionissa", "yleisesti", "sanktioidaan", "pelisääntöjen", "rikkomisesta", "."],
+  "labels": ["B-PER", "O", "B-LOC", "O", "O", "O", "O", "O", "O", "O", "B-ORG", "I-ORG", "O", "O", "O", "O", "O"],
+}
+```
+```json
+{
+  "tokens": ["Mithridates", "oli", "Pontoksen", "merkittävin", "kuningas", "ja", "Rooman", "valtakunnan", "vaarallisin", "vihollinen", "ensimmäisellä", "vuosisadalla", "eaa.", "."],
+  "labels": ["B-PER", "O", "B-LOC", "O", "O", "O", "B-LOC", "I-LOC", "O", "O", "O", "O", "O", "O"],
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 8
+- Prefix prompt:
+  ```
+  Seuraavassa on lauseita ja JSON-sanakirjoja, jotka sisältävät annetussa lauseessa esiintyvät nimetyt entiteetit.
+  ```
+- Base prompt template:
+  ```
+  Lause: {text}
+  Nimetyt entiteetit: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Lause: {text}
+
+  Tunnista lauseessa esiintyvät nimetyt entiteetit. Tulosta ne JSON-sanakirjana, jonka avaimet ovat 'henkilö', 'paikka', 'organisaatio' ja 'muut'. Arvojen tulee olla listoja kyseisen tyypin nimetyistä entiteeteistä täsmälleen siinä muodossa kuin ne esiintyvät lauseessa.
+  ```
+- Label mapping:
+    - `B-PER` ➡️ `person`
+    - `I-PER` ➡️ `person`
+    - `B-LOC` ➡️ `sted`
+    - `I-LOC` ➡️ `sted`
+    - `B-ORG` ➡️ `organisation`
+    - `I-ORG` ➡️ `organisation`
+    - `B-MISC` ➡️ `diverse`
+    - `I-MISC` ➡️ `diverse`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset turku-ner-fi
+```
+
+
+
+## Linguistic Acceptability
+
+### ScaLA-fi
+
+This dataset was published in [this paper](https://aclanthology.org/2023.nodalida-1.20/)
+and was automatically created from the [Finnish Universal Dependencies
+treebank](https://github.com/UniversalDependencies/UD_Finnish-TDT/tree/master) by
+assuming that the documents in the treebank are correct, and corrupting the samples to
+create grammatically incorrect samples. The corruptions were done by either removing a
+word from a sentence, or by swapping two neighbouring words in a sentence. To ensure
+that this does indeed break the grammaticality of the sentence, a set of rules were used
+on the part-of-speech tags of the words in the sentence.
+
+The original dataset consists of 15,136 samples, from which we use 1,024 / 256 / 2,048 samples for training,
+validation and testing, respectively (so 3,328 samples used in total). These splits are
+used as-is in the framework.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Vuotta aiempaan verrattuna uusia ajoneuvoja rekisteröitiin 17,6 prosenttia enemmän.",
+  "label": "correct"
+}
+```
+```json
+{
+  "text": "20-vuotias sai aiemmin marraskuussa 2006 Helsingin käräjäoikeudelta 30 päiväsakkoa Ta... varastettujen vaatteiden hallussapidosta.",
+  "label": "correct"
+}
+```
+```json
+{
+  "text": "Kun käyttäjä kirjoittaa viestin, se näkyy käyttäjän käyttäjälistassa.",
+  "label": "incorrect"
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 12
+- Prefix prompt:
+  ```
+  Seuraavat ovat lauseita ja ovatko ne kieliopillisesti oikein.
+  ```
+- Base prompt template:
+  ```
+  Lause: {text}
+  Kieliopillisesti oikein: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Lause: {text}
+
+  Määritä onko lause kieliopillisesti oikein vai ei. Vastaa 'kyllä', jos lause on oikein, ja 'ei', jos se ei ole.
+  ```
+- Label mapping:
+    - `correct` ➡️ `kyllä`
+    - `incorrect` ➡️ `ei`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset scala-fi
+```
+
+## Reading Comprehension
+
+### TydiQA-fi
+
+This question-answering dataset was published in [this paper](https://arxiv.org/abs/2003.05002).
+
+The original Finnish TydiQA dataset contains 6,855 training and 782 validation samples (we use the [secondary task subset](https://huggingface.co/datasets/google-research-datasets/tydiqa/viewer/secondary_task?views%5B%5D=secondary_task_train)).  We created a 1,024 / 256 / 2,024 split, where the samples from the train and validation split are sampled from the original train and validation splits, respectively. The test set consists of the remaining samples from the original validation split + additional samples from the original train split.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "question": "Kuka näytteli Dumbledorea Harry Potter elokuvissa?",
+  "context": "Dumbledorea esittää kirjasarjasta tehdyssä elokuvasarjassa Richard Harris kahdessa ensimmäisessä elokuvassa. Harrisin kuoltua Michael Gambon esitti hahmoa sarjan lopuissa elokuvissa.",
+  "answers": {
+    "text": ["Richard Harris kahdessa ensimmäisessä elokuvassa. Harrisin kuoltua Michael Gambon"],
+    "answer_start": [59]
+  }
+}
+
+```json
+{
+  "question": "Milloin Cristiano Ronaldo liittyi Juventukseen?",
+  "context": "Ronaldo siirtyi heinäkuussa 2018 Juventukseen 105 miljoonalla eurolla. Sopimus on nelivuotinen, ja sen aikana hän tienaa verojen jälkeen noin 120 miljoonaa euroa.[133]",
+  "answers": {
+    "text": ["heinäkuussa 2018"],
+    "answer_start": [16]
+  }
+}
path: docs/datasets/finnish.md
user: login: saattrupdan
body: Missing end ```.
created_at: 2025-04-24T09:24:34Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,387 @@
+# 🇫🇮 Finnish
+
+This is an overview of all the datasets used in the Finnish part of EuroEval. The
+datasets are grouped by their task - see the [task overview](/tasks) for more
+information about what these constitute.
+
+## Sentiment Classification
+
+### ScandiSent-fi
+
+This dataset consists of reviews from Trustpilot and was published [here](https://github.com/timpal0l/ScandiSent). It is a binary sentiment classification dataset, with labels "positive" and "negative".
+
+For the Finnish part of the dataset, there are 10,000 training samples. From these samples, we have created a 1,024 / 256 / 2,048 split for the train, validation and test splits, respectively.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Kaikki meni niinkuin piti. Nopea toimitus.",
+  "label": "positive"
+}
+```
+```json
+{
+  "text": "En pidä tästä, kun ei löydy linkkiä mistä pääsis heti maksamaan. En todellakaan pidä siitä, että joka tieto pitää kopioida erikseen. Haluaisin päästä suoraan oston jälkeen maksamaa mobiilipankkiin. Pari laskua on jäänyt tän takia kokonaan huomioimatta. Ja ihan turhaa.... ärsyttää sitten se kotiin tuleva muistutuslasku.",
+  "label": "negative"
+}
+```
+```json
+{
+  "text": "Todella hidas toimitus, ja virheellistä tietoa tuotteiden saatavuudesta, paketti ja tuotteet perillä vasta kuukauden päästä tilauksesta....",
+  "label": "negative"
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 12
+- Prefix prompt:
+  ```
+  Seuraavassa on arvosteluja ja niiden tunnesävy, joka voi olla 'positiivinen' tai 'negatiivinen'.
+  ```
+- Base prompt template:
+  ```
+  Teksti: {text}
+  Tunnesävy: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Teksti: {text}
+
+  Luokittele arvostelun tunnesävy. Vastaa vain 'positiivinen' tai 'negatiivinen', ei muuta.
+  ```
+- Label mapping:
+    - `positive` ➡️ `positiivinen`
+    - `negative` ➡️ `negatiivinen`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset scandisent-fi
+```
+
+## Named Entity Recognition
+
+### Turku-NER-fi
+
+This dataset was published in [this paper](https://aclanthology.org/2020.lrec-1.567/).
+
+The original dataset contains 12,217 / 1,364 / 1,555 samples for the training, validation and test splits, respectively. We use 1,024 / 256 / 2,048 samples for our training, validation and test splits, respectively. All the new splits are subsets of the original splits.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "tokens": ["Suomalaiset", "vaihtoivat", "Tukholman", "Tallinnaan"],
+  "labels": ["O", "O", "B-LOC", "B-LOC"]
+}
+```
+```json
+{
+  "tokens": ["Liuhto", "nosti", "Kreikan", "tapauksen", "yhteydessä", "esille", "kysymyksen", "siitä", ",", "miten", "Euroopan", "unionissa", "yleisesti", "sanktioidaan", "pelisääntöjen", "rikkomisesta", "."],
+  "labels": ["B-PER", "O", "B-LOC", "O", "O", "O", "O", "O", "O", "O", "B-ORG", "I-ORG", "O", "O", "O", "O", "O"],
+}
+```
+```json
+{
+  "tokens": ["Mithridates", "oli", "Pontoksen", "merkittävin", "kuningas", "ja", "Rooman", "valtakunnan", "vaarallisin", "vihollinen", "ensimmäisellä", "vuosisadalla", "eaa.", "."],
+  "labels": ["B-PER", "O", "B-LOC", "O", "O", "O", "B-LOC", "I-LOC", "O", "O", "O", "O", "O", "O"],
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 8
+- Prefix prompt:
+  ```
+  Seuraavassa on lauseita ja JSON-sanakirjoja, jotka sisältävät annetussa lauseessa esiintyvät nimetyt entiteetit.
+  ```
+- Base prompt template:
+  ```
+  Lause: {text}
+  Nimetyt entiteetit: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Lause: {text}
+
+  Tunnista lauseessa esiintyvät nimetyt entiteetit. Tulosta ne JSON-sanakirjana, jonka avaimet ovat 'henkilö', 'paikka', 'organisaatio' ja 'muut'. Arvojen tulee olla listoja kyseisen tyypin nimetyistä entiteeteistä täsmälleen siinä muodossa kuin ne esiintyvät lauseessa.
+  ```
+- Label mapping:
+    - `B-PER` ➡️ `person`
+    - `I-PER` ➡️ `person`
+    - `B-LOC` ➡️ `sted`
+    - `I-LOC` ➡️ `sted`
+    - `B-ORG` ➡️ `organisation`
+    - `I-ORG` ➡️ `organisation`
+    - `B-MISC` ➡️ `diverse`
+    - `I-MISC` ➡️ `diverse`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset turku-ner-fi
+```
+
+
+
+## Linguistic Acceptability
+
+### ScaLA-fi
+
+This dataset was published in [this paper](https://aclanthology.org/2023.nodalida-1.20/)
+and was automatically created from the [Finnish Universal Dependencies
+treebank](https://github.com/UniversalDependencies/UD_Finnish-TDT/tree/master) by
+assuming that the documents in the treebank are correct, and corrupting the samples to
+create grammatically incorrect samples. The corruptions were done by either removing a
+word from a sentence, or by swapping two neighbouring words in a sentence. To ensure
+that this does indeed break the grammaticality of the sentence, a set of rules were used
+on the part-of-speech tags of the words in the sentence.
+
+The original dataset consists of 15,136 samples, from which we use 1,024 / 256 / 2,048 samples for training,
+validation and testing, respectively (so 3,328 samples used in total). These splits are
+used as-is in the framework.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Vuotta aiempaan verrattuna uusia ajoneuvoja rekisteröitiin 17,6 prosenttia enemmän.",
+  "label": "correct"
+}
+```
+```json
+{
+  "text": "20-vuotias sai aiemmin marraskuussa 2006 Helsingin käräjäoikeudelta 30 päiväsakkoa Ta... varastettujen vaatteiden hallussapidosta.",
+  "label": "correct"
+}
+```
+```json
+{
+  "text": "Kun käyttäjä kirjoittaa viestin, se näkyy käyttäjän käyttäjälistassa.",
+  "label": "incorrect"
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 12
+- Prefix prompt:
+  ```
+  Seuraavat ovat lauseita ja ovatko ne kieliopillisesti oikein.
+  ```
+- Base prompt template:
+  ```
+  Lause: {text}
+  Kieliopillisesti oikein: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Lause: {text}
+
+  Määritä onko lause kieliopillisesti oikein vai ei. Vastaa 'kyllä', jos lause on oikein, ja 'ei', jos se ei ole.
+  ```
+- Label mapping:
+    - `correct` ➡️ `kyllä`
+    - `incorrect` ➡️ `ei`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset scala-fi
+```
+
+## Reading Comprehension
+
+### TydiQA-fi
+
+This question-answering dataset was published in [this paper](https://arxiv.org/abs/2003.05002).
+
+The original Finnish TydiQA dataset contains 6,855 training and 782 validation samples (we use the [secondary task subset](https://huggingface.co/datasets/google-research-datasets/tydiqa/viewer/secondary_task?views%5B%5D=secondary_task_train)).  We created a 1,024 / 256 / 2,024 split, where the samples from the train and validation split are sampled from the original train and validation splits, respectively. The test set consists of the remaining samples from the original validation split + additional samples from the original train split.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "question": "Kuka näytteli Dumbledorea Harry Potter elokuvissa?",
+  "context": "Dumbledorea esittää kirjasarjasta tehdyssä elokuvasarjassa Richard Harris kahdessa ensimmäisessä elokuvassa. Harrisin kuoltua Michael Gambon esitti hahmoa sarjan lopuissa elokuvissa.",
+  "answers": {
+    "text": ["Richard Harris kahdessa ensimmäisessä elokuvassa. Harrisin kuoltua Michael Gambon"],
+    "answer_start": [59]
+  }
+}
+
+```json
+{
+  "question": "Milloin Cristiano Ronaldo liittyi Juventukseen?",
+  "context": "Ronaldo siirtyi heinäkuussa 2018 Juventukseen 105 miljoonalla eurolla. Sopimus on nelivuotinen, ja sen aikana hän tienaa verojen jälkeen noin 120 miljoonaa euroa.[133]",
+  "answers": {
+    "text": ["heinäkuussa 2018"],
+    "answer_start": [16]
+  }
+}
+```json
+{
+  "question": "Kuka hallitsi Mithridates VI jälkeen?",
+  "context": "Mithridates laajensi valtakuntaansa ympäri Mustanmeren rantoja, ja hän ajautui kolmesti sotaan Rooman valtakuntaa vastaan. Ensimmäisessä sodassa (89 eaa.–85 eaa.) hän valtasi suuren osan Vähää-Aasiaa ja Rooman valtakunnalle kuuluneet osat, jolloin hänen sanotaan teloittaneen 80000 roomalaista. Mithridates valtasi myös Kreikan, mutta konsuli Sulla kukisti hänen joukkonsa vuonna 85 eaa., ja Mithridateen oli luovuttava valloituksistaan. Toinen sota (83 eaa.–81 eaa.) oli suppeampi laajuudeltaan. Kolmannessa sodassa (73 eaa.–63 eaa.) roomalaiset sotapäälliköt Lucullus ja Pompeius kukistivat Mithridateen perusteellisesti. Mithridates surmasi tai surmautti itsensä jouduttuaan poikansa Farnakes II:n syrjäyttämäksi.",
+  "answers": {
+    "text": ["Farnakes II"],
+    "answer_start": [687]
+  }
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 4
+- Prefix prompt:
+  ```
+  Seuraavassa on tekstejä ja niihin liittyviä kysymyksiä ja vastauksia.
+  ```
+- Base prompt template:
+  ```
+  Teksti: {text}
+  Kysymys: {question}
+  Vastaa enintään 3 sanalla: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Teksti: {text}
+
+  Vastaa seuraavaan kysymykseen yllä olevasta tekstistä enintään 3 sanalla.
+
+  Kysymys: {question}
+  ```
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset tydiqa-fi
+```
+
path: docs/datasets/finnish.md
user: login: saattrupdan
body: ```suggestion


```
created_at: 2025-04-24T09:24:56Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,387 @@
+# 🇫🇮 Finnish
+
+This is an overview of all the datasets used in the Finnish part of EuroEval. The
+datasets are grouped by their task - see the [task overview](/tasks) for more
+information about what these constitute.
+
+## Sentiment Classification
+
+### ScandiSent-fi
+
+This dataset consists of reviews from Trustpilot and was published [here](https://github.com/timpal0l/ScandiSent). It is a binary sentiment classification dataset, with labels "positive" and "negative".
+
+For the Finnish part of the dataset, there are 10,000 training samples. From these samples, we have created a 1,024 / 256 / 2,048 split for the train, validation and test splits, respectively.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Kaikki meni niinkuin piti. Nopea toimitus.",
+  "label": "positive"
+}
+```
+```json
+{
+  "text": "En pidä tästä, kun ei löydy linkkiä mistä pääsis heti maksamaan. En todellakaan pidä siitä, että joka tieto pitää kopioida erikseen. Haluaisin päästä suoraan oston jälkeen maksamaa mobiilipankkiin. Pari laskua on jäänyt tän takia kokonaan huomioimatta. Ja ihan turhaa.... ärsyttää sitten se kotiin tuleva muistutuslasku.",
+  "label": "negative"
+}
+```
+```json
+{
+  "text": "Todella hidas toimitus, ja virheellistä tietoa tuotteiden saatavuudesta, paketti ja tuotteet perillä vasta kuukauden päästä tilauksesta....",
+  "label": "negative"
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 12
+- Prefix prompt:
+  ```
+  Seuraavassa on arvosteluja ja niiden tunnesävy, joka voi olla 'positiivinen' tai 'negatiivinen'.
+  ```
+- Base prompt template:
+  ```
+  Teksti: {text}
+  Tunnesävy: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Teksti: {text}
+
+  Luokittele arvostelun tunnesävy. Vastaa vain 'positiivinen' tai 'negatiivinen', ei muuta.
+  ```
+- Label mapping:
+    - `positive` ➡️ `positiivinen`
+    - `negative` ➡️ `negatiivinen`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset scandisent-fi
+```
+
+## Named Entity Recognition
+
+### Turku-NER-fi
+
+This dataset was published in [this paper](https://aclanthology.org/2020.lrec-1.567/).
+
+The original dataset contains 12,217 / 1,364 / 1,555 samples for the training, validation and test splits, respectively. We use 1,024 / 256 / 2,048 samples for our training, validation and test splits, respectively. All the new splits are subsets of the original splits.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "tokens": ["Suomalaiset", "vaihtoivat", "Tukholman", "Tallinnaan"],
+  "labels": ["O", "O", "B-LOC", "B-LOC"]
+}
+```
+```json
+{
+  "tokens": ["Liuhto", "nosti", "Kreikan", "tapauksen", "yhteydessä", "esille", "kysymyksen", "siitä", ",", "miten", "Euroopan", "unionissa", "yleisesti", "sanktioidaan", "pelisääntöjen", "rikkomisesta", "."],
+  "labels": ["B-PER", "O", "B-LOC", "O", "O", "O", "O", "O", "O", "O", "B-ORG", "I-ORG", "O", "O", "O", "O", "O"],
+}
+```
+```json
+{
+  "tokens": ["Mithridates", "oli", "Pontoksen", "merkittävin", "kuningas", "ja", "Rooman", "valtakunnan", "vaarallisin", "vihollinen", "ensimmäisellä", "vuosisadalla", "eaa.", "."],
+  "labels": ["B-PER", "O", "B-LOC", "O", "O", "O", "B-LOC", "I-LOC", "O", "O", "O", "O", "O", "O"],
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 8
+- Prefix prompt:
+  ```
+  Seuraavassa on lauseita ja JSON-sanakirjoja, jotka sisältävät annetussa lauseessa esiintyvät nimetyt entiteetit.
+  ```
+- Base prompt template:
+  ```
+  Lause: {text}
+  Nimetyt entiteetit: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Lause: {text}
+
+  Tunnista lauseessa esiintyvät nimetyt entiteetit. Tulosta ne JSON-sanakirjana, jonka avaimet ovat 'henkilö', 'paikka', 'organisaatio' ja 'muut'. Arvojen tulee olla listoja kyseisen tyypin nimetyistä entiteeteistä täsmälleen siinä muodossa kuin ne esiintyvät lauseessa.
+  ```
+- Label mapping:
+    - `B-PER` ➡️ `person`
+    - `I-PER` ➡️ `person`
+    - `B-LOC` ➡️ `sted`
+    - `I-LOC` ➡️ `sted`
+    - `B-ORG` ➡️ `organisation`
+    - `I-ORG` ➡️ `organisation`
+    - `B-MISC` ➡️ `diverse`
+    - `I-MISC` ➡️ `diverse`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset turku-ner-fi
+```
+
+
+
+## Linguistic Acceptability
+
+### ScaLA-fi
+
+This dataset was published in [this paper](https://aclanthology.org/2023.nodalida-1.20/)
+and was automatically created from the [Finnish Universal Dependencies
+treebank](https://github.com/UniversalDependencies/UD_Finnish-TDT/tree/master) by
+assuming that the documents in the treebank are correct, and corrupting the samples to
+create grammatically incorrect samples. The corruptions were done by either removing a
+word from a sentence, or by swapping two neighbouring words in a sentence. To ensure
+that this does indeed break the grammaticality of the sentence, a set of rules were used
+on the part-of-speech tags of the words in the sentence.
+
+The original dataset consists of 15,136 samples, from which we use 1,024 / 256 / 2,048 samples for training,
+validation and testing, respectively (so 3,328 samples used in total). These splits are
+used as-is in the framework.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Vuotta aiempaan verrattuna uusia ajoneuvoja rekisteröitiin 17,6 prosenttia enemmän.",
+  "label": "correct"
+}
+```
+```json
+{
+  "text": "20-vuotias sai aiemmin marraskuussa 2006 Helsingin käräjäoikeudelta 30 päiväsakkoa Ta... varastettujen vaatteiden hallussapidosta.",
+  "label": "correct"
+}
+```
+```json
+{
+  "text": "Kun käyttäjä kirjoittaa viestin, se näkyy käyttäjän käyttäjälistassa.",
+  "label": "incorrect"
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 12
+- Prefix prompt:
+  ```
+  Seuraavat ovat lauseita ja ovatko ne kieliopillisesti oikein.
+  ```
+- Base prompt template:
+  ```
+  Lause: {text}
+  Kieliopillisesti oikein: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Lause: {text}
+
+  Määritä onko lause kieliopillisesti oikein vai ei. Vastaa 'kyllä', jos lause on oikein, ja 'ei', jos se ei ole.
+  ```
+- Label mapping:
+    - `correct` ➡️ `kyllä`
+    - `incorrect` ➡️ `ei`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset scala-fi
+```
+
+## Reading Comprehension
+
+### TydiQA-fi
+
+This question-answering dataset was published in [this paper](https://arxiv.org/abs/2003.05002).
+
+The original Finnish TydiQA dataset contains 6,855 training and 782 validation samples (we use the [secondary task subset](https://huggingface.co/datasets/google-research-datasets/tydiqa/viewer/secondary_task?views%5B%5D=secondary_task_train)).  We created a 1,024 / 256 / 2,024 split, where the samples from the train and validation split are sampled from the original train and validation splits, respectively. The test set consists of the remaining samples from the original validation split + additional samples from the original train split.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "question": "Kuka näytteli Dumbledorea Harry Potter elokuvissa?",
+  "context": "Dumbledorea esittää kirjasarjasta tehdyssä elokuvasarjassa Richard Harris kahdessa ensimmäisessä elokuvassa. Harrisin kuoltua Michael Gambon esitti hahmoa sarjan lopuissa elokuvissa.",
+  "answers": {
+    "text": ["Richard Harris kahdessa ensimmäisessä elokuvassa. Harrisin kuoltua Michael Gambon"],
+    "answer_start": [59]
+  }
+}
+
+```json
+{
+  "question": "Milloin Cristiano Ronaldo liittyi Juventukseen?",
+  "context": "Ronaldo siirtyi heinäkuussa 2018 Juventukseen 105 miljoonalla eurolla. Sopimus on nelivuotinen, ja sen aikana hän tienaa verojen jälkeen noin 120 miljoonaa euroa.[133]",
+  "answers": {
+    "text": ["heinäkuussa 2018"],
+    "answer_start": [16]
+  }
+}
+```json
+{
+  "question": "Kuka hallitsi Mithridates VI jälkeen?",
+  "context": "Mithridates laajensi valtakuntaansa ympäri Mustanmeren rantoja, ja hän ajautui kolmesti sotaan Rooman valtakuntaa vastaan. Ensimmäisessä sodassa (89 eaa.–85 eaa.) hän valtasi suuren osan Vähää-Aasiaa ja Rooman valtakunnalle kuuluneet osat, jolloin hänen sanotaan teloittaneen 80000 roomalaista. Mithridates valtasi myös Kreikan, mutta konsuli Sulla kukisti hänen joukkonsa vuonna 85 eaa., ja Mithridateen oli luovuttava valloituksistaan. Toinen sota (83 eaa.–81 eaa.) oli suppeampi laajuudeltaan. Kolmannessa sodassa (73 eaa.–63 eaa.) roomalaiset sotapäälliköt Lucullus ja Pompeius kukistivat Mithridateen perusteellisesti. Mithridates surmasi tai surmautti itsensä jouduttuaan poikansa Farnakes II:n syrjäyttämäksi.",
+  "answers": {
+    "text": ["Farnakes II"],
+    "answer_start": [687]
+  }
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 4
+- Prefix prompt:
+  ```
+  Seuraavassa on tekstejä ja niihin liittyviä kysymyksiä ja vastauksia.
+  ```
+- Base prompt template:
+  ```
+  Teksti: {text}
+  Kysymys: {question}
+  Vastaa enintään 3 sanalla: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Teksti: {text}
+
+  Vastaa seuraavaan kysymykseen yllä olevasta tekstistä enintään 3 sanalla.
+
+  Kysymys: {question}
+  ```
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset tydiqa-fi
+```
+
+## Knowledge
+
path: docs/datasets/finnish.md
user: login: saattrupdan
body: Should leave this out if we're not including any here.
created_at: 2025-04-24T09:25:10Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,387 @@
+# 🇫🇮 Finnish
+
+This is an overview of all the datasets used in the Finnish part of EuroEval. The
+datasets are grouped by their task - see the [task overview](/tasks) for more
+information about what these constitute.
+
+## Sentiment Classification
+
+### ScandiSent-fi
+
+This dataset consists of reviews from Trustpilot and was published [here](https://github.com/timpal0l/ScandiSent). It is a binary sentiment classification dataset, with labels "positive" and "negative".
+
+For the Finnish part of the dataset, there are 10,000 training samples. From these samples, we have created a 1,024 / 256 / 2,048 split for the train, validation and test splits, respectively.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Kaikki meni niinkuin piti. Nopea toimitus.",
+  "label": "positive"
+}
+```
+```json
+{
+  "text": "En pidä tästä, kun ei löydy linkkiä mistä pääsis heti maksamaan. En todellakaan pidä siitä, että joka tieto pitää kopioida erikseen. Haluaisin päästä suoraan oston jälkeen maksamaa mobiilipankkiin. Pari laskua on jäänyt tän takia kokonaan huomioimatta. Ja ihan turhaa.... ärsyttää sitten se kotiin tuleva muistutuslasku.",
+  "label": "negative"
+}
+```
+```json
+{
+  "text": "Todella hidas toimitus, ja virheellistä tietoa tuotteiden saatavuudesta, paketti ja tuotteet perillä vasta kuukauden päästä tilauksesta....",
+  "label": "negative"
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 12
+- Prefix prompt:
+  ```
+  Seuraavassa on arvosteluja ja niiden tunnesävy, joka voi olla 'positiivinen' tai 'negatiivinen'.
+  ```
+- Base prompt template:
+  ```
+  Teksti: {text}
+  Tunnesävy: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Teksti: {text}
+
+  Luokittele arvostelun tunnesävy. Vastaa vain 'positiivinen' tai 'negatiivinen', ei muuta.
+  ```
+- Label mapping:
+    - `positive` ➡️ `positiivinen`
+    - `negative` ➡️ `negatiivinen`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset scandisent-fi
+```
+
+## Named Entity Recognition
+
+### Turku-NER-fi
+
+This dataset was published in [this paper](https://aclanthology.org/2020.lrec-1.567/).
+
+The original dataset contains 12,217 / 1,364 / 1,555 samples for the training, validation and test splits, respectively. We use 1,024 / 256 / 2,048 samples for our training, validation and test splits, respectively. All the new splits are subsets of the original splits.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "tokens": ["Suomalaiset", "vaihtoivat", "Tukholman", "Tallinnaan"],
+  "labels": ["O", "O", "B-LOC", "B-LOC"]
+}
+```
+```json
+{
+  "tokens": ["Liuhto", "nosti", "Kreikan", "tapauksen", "yhteydessä", "esille", "kysymyksen", "siitä", ",", "miten", "Euroopan", "unionissa", "yleisesti", "sanktioidaan", "pelisääntöjen", "rikkomisesta", "."],
+  "labels": ["B-PER", "O", "B-LOC", "O", "O", "O", "O", "O", "O", "O", "B-ORG", "I-ORG", "O", "O", "O", "O", "O"],
+}
+```
+```json
+{
+  "tokens": ["Mithridates", "oli", "Pontoksen", "merkittävin", "kuningas", "ja", "Rooman", "valtakunnan", "vaarallisin", "vihollinen", "ensimmäisellä", "vuosisadalla", "eaa.", "."],
+  "labels": ["B-PER", "O", "B-LOC", "O", "O", "O", "B-LOC", "I-LOC", "O", "O", "O", "O", "O", "O"],
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 8
+- Prefix prompt:
+  ```
+  Seuraavassa on lauseita ja JSON-sanakirjoja, jotka sisältävät annetussa lauseessa esiintyvät nimetyt entiteetit.
+  ```
+- Base prompt template:
+  ```
+  Lause: {text}
+  Nimetyt entiteetit: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Lause: {text}
+
+  Tunnista lauseessa esiintyvät nimetyt entiteetit. Tulosta ne JSON-sanakirjana, jonka avaimet ovat 'henkilö', 'paikka', 'organisaatio' ja 'muut'. Arvojen tulee olla listoja kyseisen tyypin nimetyistä entiteeteistä täsmälleen siinä muodossa kuin ne esiintyvät lauseessa.
+  ```
+- Label mapping:
+    - `B-PER` ➡️ `person`
+    - `I-PER` ➡️ `person`
+    - `B-LOC` ➡️ `sted`
+    - `I-LOC` ➡️ `sted`
+    - `B-ORG` ➡️ `organisation`
+    - `I-ORG` ➡️ `organisation`
+    - `B-MISC` ➡️ `diverse`
+    - `I-MISC` ➡️ `diverse`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset turku-ner-fi
+```
+
+
+
+## Linguistic Acceptability
+
+### ScaLA-fi
+
+This dataset was published in [this paper](https://aclanthology.org/2023.nodalida-1.20/)
+and was automatically created from the [Finnish Universal Dependencies
+treebank](https://github.com/UniversalDependencies/UD_Finnish-TDT/tree/master) by
+assuming that the documents in the treebank are correct, and corrupting the samples to
+create grammatically incorrect samples. The corruptions were done by either removing a
+word from a sentence, or by swapping two neighbouring words in a sentence. To ensure
+that this does indeed break the grammaticality of the sentence, a set of rules were used
+on the part-of-speech tags of the words in the sentence.
+
+The original dataset consists of 15,136 samples, from which we use 1,024 / 256 / 2,048 samples for training,
+validation and testing, respectively (so 3,328 samples used in total). These splits are
+used as-is in the framework.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "Vuotta aiempaan verrattuna uusia ajoneuvoja rekisteröitiin 17,6 prosenttia enemmän.",
+  "label": "correct"
+}
+```
+```json
+{
+  "text": "20-vuotias sai aiemmin marraskuussa 2006 Helsingin käräjäoikeudelta 30 päiväsakkoa Ta... varastettujen vaatteiden hallussapidosta.",
+  "label": "correct"
+}
+```
+```json
+{
+  "text": "Kun käyttäjä kirjoittaa viestin, se näkyy käyttäjän käyttäjälistassa.",
+  "label": "incorrect"
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 12
+- Prefix prompt:
+  ```
+  Seuraavat ovat lauseita ja ovatko ne kieliopillisesti oikein.
+  ```
+- Base prompt template:
+  ```
+  Lause: {text}
+  Kieliopillisesti oikein: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Lause: {text}
+
+  Määritä onko lause kieliopillisesti oikein vai ei. Vastaa 'kyllä', jos lause on oikein, ja 'ei', jos se ei ole.
+  ```
+- Label mapping:
+    - `correct` ➡️ `kyllä`
+    - `incorrect` ➡️ `ei`
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset scala-fi
+```
+
+## Reading Comprehension
+
+### TydiQA-fi
+
+This question-answering dataset was published in [this paper](https://arxiv.org/abs/2003.05002).
+
+The original Finnish TydiQA dataset contains 6,855 training and 782 validation samples (we use the [secondary task subset](https://huggingface.co/datasets/google-research-datasets/tydiqa/viewer/secondary_task?views%5B%5D=secondary_task_train)).  We created a 1,024 / 256 / 2,024 split, where the samples from the train and validation split are sampled from the original train and validation splits, respectively. The test set consists of the remaining samples from the original validation split + additional samples from the original train split.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "question": "Kuka näytteli Dumbledorea Harry Potter elokuvissa?",
+  "context": "Dumbledorea esittää kirjasarjasta tehdyssä elokuvasarjassa Richard Harris kahdessa ensimmäisessä elokuvassa. Harrisin kuoltua Michael Gambon esitti hahmoa sarjan lopuissa elokuvissa.",
+  "answers": {
+    "text": ["Richard Harris kahdessa ensimmäisessä elokuvassa. Harrisin kuoltua Michael Gambon"],
+    "answer_start": [59]
+  }
+}
+
+```json
+{
+  "question": "Milloin Cristiano Ronaldo liittyi Juventukseen?",
+  "context": "Ronaldo siirtyi heinäkuussa 2018 Juventukseen 105 miljoonalla eurolla. Sopimus on nelivuotinen, ja sen aikana hän tienaa verojen jälkeen noin 120 miljoonaa euroa.[133]",
+  "answers": {
+    "text": ["heinäkuussa 2018"],
+    "answer_start": [16]
+  }
+}
+```json
+{
+  "question": "Kuka hallitsi Mithridates VI jälkeen?",
+  "context": "Mithridates laajensi valtakuntaansa ympäri Mustanmeren rantoja, ja hän ajautui kolmesti sotaan Rooman valtakuntaa vastaan. Ensimmäisessä sodassa (89 eaa.–85 eaa.) hän valtasi suuren osan Vähää-Aasiaa ja Rooman valtakunnalle kuuluneet osat, jolloin hänen sanotaan teloittaneen 80000 roomalaista. Mithridates valtasi myös Kreikan, mutta konsuli Sulla kukisti hänen joukkonsa vuonna 85 eaa., ja Mithridateen oli luovuttava valloituksistaan. Toinen sota (83 eaa.–81 eaa.) oli suppeampi laajuudeltaan. Kolmannessa sodassa (73 eaa.–63 eaa.) roomalaiset sotapäälliköt Lucullus ja Pompeius kukistivat Mithridateen perusteellisesti. Mithridates surmasi tai surmautti itsensä jouduttuaan poikansa Farnakes II:n syrjäyttämäksi.",
+  "answers": {
+    "text": ["Farnakes II"],
+    "answer_start": [687]
+  }
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 4
+- Prefix prompt:
+  ```
+  Seuraavassa on tekstejä ja niihin liittyviä kysymyksiä ja vastauksia.
+  ```
+- Base prompt template:
+  ```
+  Teksti: {text}
+  Kysymys: {question}
+  Vastaa enintään 3 sanalla: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Teksti: {text}
+
+  Vastaa seuraavaan kysymykseen yllä olevasta tekstistä enintään 3 sanalla.
+
+  Kysymys: {question}
+  ```
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset tydiqa-fi
+```
+
+## Knowledge
+
+## Common-sense Reasoning
+
+### HellaSwag-fi
+
+This dataset is a machine translated version of the English [HellaSwag
+dataset](https://aclanthology.org/P19-1472/). The [dataset](https://huggingface.co/datasets/Finnish-NLP/hellaswag-fi-google-translate) was created by Finnish-NLP using Google Translate. The dataset is designed to
+be used in EuroEval and it therefore already has a 1,024 / 256 / 2,048 split for the train, validation and test splits, respectively.
+
+Here are a few examples from the training split:
+
+```json
+{
+  "text": "[Otsikko ] Tiikkihuonekalujen tahraus [vaihe] Pyyhi lika, pöly ja roskat pois. [vaihe] Voit harjata lian pois kuivalla paperipyyhkeellä tai liinalla. Jos puhdistettavia kohtia on sitkeämpiä, voit hieroa ne puhtaaksi kostealla rievulla.\nVastausvaihtoehdot:\na. [vaihe] Poista tahrat tiikistä pyyhkimällä ne kuivalla talouspaperilla. [vaihe] Noudata samoja puhdistustoimenpiteitä, joita käytit tahran kanssa.\nb. Aja niiden yli puhdistusaineella, kunnes tahra on poissa. [vaihe] Kokeile puupetsin ja öljyn yhdistelmää.\nc. [välivaiheet] Älä käytä puhdistusaineita. Saatat vahingoittaa puuta, mutta vaikeutat varmasti värjäysprosessia.\nd. Poista mahdollisimman paljon likaa levittämällä tahra kevyelle, pörröiselle liinalle tai kädelle ja pyyhkimällä se pois. [vaihe] Käytä hankaamiseen valkaisuainetta ja vettä.",
+  "label": "c",
+}
+```
+```json
+{
+  "text": "Pieni ryhmä ihmisiä nähdään uimassa altaan ympärillä ja johtaa useisiin laukauksiin, joissa uimari heittää pallon verkkoon. Maalivahti torjuu muutaman laukauksen ja vaihtaa sitten toisen joukkuetoverinsa kanssa yleisön hurraten. ihmisiä\nVastausvaihtoehdot:\na. cheer vielä kerran ja palaa uimaan uima-altaan ympärille.\nb. vaihda jatkuvasti pois ja johtaa siihen, että yksi joukkue voittaa ja juhlii kaikki yhdessä vedessä.\nc. Curra ja hyppää vuorotellen ylös ja eteenpäin pelaamalla biljardia.\nd. ensimmäinen video, jossa muut joukkuetoverit sukeltavat altaaseen ja hyppäävät ylös ja alas ponnahduslaudalla.",
+  "label": "b",
+}
+```
+```json
+{
+  "text": "Kahden ihmisen nähdään kävelevän pöytäjalkapallopöydän ympärillä pelaamassa. ihmisiä\nVastausvaihtoehdot:\na. pitäkää kupit ylös ja alakaa pelata peliä ja lyödä toisianne.\nb. Tartu sauvoista ja lyö palloa pöydän ympärillä.\nc. Jatka kävelemistä ja yksi henkilö lyö pallon verkon yli.\nd. siirrä ympäri pöytää heittäen palloa ympäriinsä, kun ihmiset katselevat sivuilla.",
+  "label": "b",
+}
+```
+
+When evaluating generative models, we use the following setup (see the
+[methodology](/methodology) for more information on how these are used):
+
+- Number of few-shot examples: 5
+- Prefix prompt:
+  ```
+  Seuraavat ovat monivalintakysymyksiä (vastauksineen).
+  ```
+- Base prompt template:
+  ```
+  Kysymys: {text}
+  Vastausvaihtoehdot:
+  a. {option_a}
+  b. {option_b}
+  c. {option_c}
+  d. {option_c}
+  Vastaus: {label}
+  ```
+- Instruction-tuned prompt template:
+  ```
+  Kysymys: {text}
+  Vastausvaihtoehdot:
+  a. {option_a}
+  b. {option_b}
+  c. {option_c}
+  d. {option_d}
+
+  Vastaa yllä olevaan kysymykseen käyttämällä 'a', 'b', 'c' tai 'd', äläkä mitään muuta.
+  ```
+
+You can evaluate this dataset directly as follows:
+
+```bash
+$ euroeval --model <model-id> --dataset hellaswag-fi
+```
+
path: docs/datasets/finnish.md
user: login: saattrupdan
body: ```suggestion


```
created_at: 2025-04-24T09:25:22Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,59 @@
+"""All Finnish dataset configurations used in EuroEval."""
+
+from ..data_models import DatasetConfig
+from ..languages import FI
+from ..tasks import COMMON_SENSE, LA, NER, RC, SENT, SUMM
+
+### Official datasets ###
+
+SCANDISENT_FI_CONFIG = DatasetConfig(
+    name="scandisent-fi",
+    pretty_name="the truncated version of the Finnish part of the binary sentiment "
+    "classification dataset ScandiSent",
+    huggingface_id="EuroEval/scandisent-fi-mini",
+    task=SENT,
+    languages=[FI],
path: src/euroeval/dataset_configs/finnish.py
user: login: saattrupdan
body: This dataset only has the 'positive' and 'negative' labels, so we need to overwrite the default labels here:

```suggestion
    languages=[FI],
    _labels=["negative", "positive"],
```
created_at: 2025-04-24T09:29:50Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,278 @@
+"""Create the Finnish HellaSwag-mini dataset and upload it to the HF Hub."""
+
+from collections import Counter
+from logging import getLogger
+
+import pandas as pd
+from constants import (
+    MAX_NUM_CHARS_IN_INSTRUCTION,
+    MAX_NUM_CHARS_IN_OPTION,
+    MAX_REPETITIONS,
+    MIN_NUM_CHARS_IN_INSTRUCTION,
+    MIN_NUM_CHARS_IN_OPTION,
+)
+from datasets import Dataset, DatasetDict, Split, load_dataset
+from huggingface_hub import HfApi
+from requests import HTTPError
+
+logger = getLogger(__name__)
+
+
+def main() -> None:
+    """Create the Finnish HellaSwag-mini dataset and upload it to the HF Hub.
+
+    HellaSwag-fi is designed to EuroEval so it already has a
+    1,024 / 256 / 2,048 train/val/test split. This script
+    therefore does not perform the same filtering as seen in
+    `src/scripts/create_hellaswag.py`.
+    """
+    # Define the base download URL
+    repo_id = "Finnish-NLP/hellaswag-fi-google-translate"
+
+    dataset = load_dataset(path=repo_id, token=True)
+    dfs = {}
+    for split in ["train", "validation", "test"]:
+        df = dataset[split].to_pandas()
+
+        df["endings"] = df["endings"].apply(process_endings)
+
+        df = process_split(df=df, split=split)
+        dfs[split] = df
+
+    # Create validation split
+    val_df = dfs["validation"]
+    assert len(val_df) == 256
+
+    # Create test split
+    test_df = dfs["test"]
+    assert len(test_df) == 2_048
+
+    # Create train split
+    train_df = dfs["train"]
+    assert len(train_df) == 1_024
+
+    # Collect datasets in a dataset dictionary
+    dataset = DatasetDict(
+        train=Dataset.from_pandas(train_df, split=Split.TRAIN),
+        val=Dataset.from_pandas(val_df, split=Split.VALIDATION),
+        test=Dataset.from_pandas(test_df, split=Split.TEST),
+    )
+
+    dataset_id = "EuroEval/hellaswag-fi-mini"
+
+    # Remove the dataset from Hugging Face Hub if it already exists
+    try:
+        api = HfApi()
+        api.delete_repo(dataset_id, repo_type="dataset")
+    except HTTPError:
+        pass
+
+    # Push the dataset to the Hugging Face Hub
+    dataset.push_to_hub(dataset_id, private=True)
+
+
+def process_endings(raw_endings: str) -> list[str]:
+    """Process the endings of the HellaSwag-fi dataset.
+
+    I wanted to use `ast.literal_eval` to parse the endings, but it failed
+    because of mixed quotes.
+
path: src/scripts/create_hellaswag_fi.py
user: login: saattrupdan
body: ```suggestion
```
created_at: 2025-04-24T09:30:54Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,278 @@
+"""Create the Finnish HellaSwag-mini dataset and upload it to the HF Hub."""
+
+from collections import Counter
+from logging import getLogger
+
+import pandas as pd
+from constants import (
+    MAX_NUM_CHARS_IN_INSTRUCTION,
+    MAX_NUM_CHARS_IN_OPTION,
+    MAX_REPETITIONS,
+    MIN_NUM_CHARS_IN_INSTRUCTION,
+    MIN_NUM_CHARS_IN_OPTION,
+)
+from datasets import Dataset, DatasetDict, Split, load_dataset
+from huggingface_hub import HfApi
+from requests import HTTPError
+
+logger = getLogger(__name__)
+
+
+def main() -> None:
+    """Create the Finnish HellaSwag-mini dataset and upload it to the HF Hub.
+
+    HellaSwag-fi is designed to EuroEval so it already has a
+    1,024 / 256 / 2,048 train/val/test split. This script
+    therefore does not perform the same filtering as seen in
+    `src/scripts/create_hellaswag.py`.
+    """
+    # Define the base download URL
+    repo_id = "Finnish-NLP/hellaswag-fi-google-translate"
+
+    dataset = load_dataset(path=repo_id, token=True)
+    dfs = {}
+    for split in ["train", "validation", "test"]:
+        df = dataset[split].to_pandas()
+
+        df["endings"] = df["endings"].apply(process_endings)
+
+        df = process_split(df=df, split=split)
+        dfs[split] = df
+
+    # Create validation split
+    val_df = dfs["validation"]
+    assert len(val_df) == 256
+
+    # Create test split
+    test_df = dfs["test"]
+    assert len(test_df) == 2_048
+
+    # Create train split
+    train_df = dfs["train"]
+    assert len(train_df) == 1_024
+
+    # Collect datasets in a dataset dictionary
+    dataset = DatasetDict(
+        train=Dataset.from_pandas(train_df, split=Split.TRAIN),
+        val=Dataset.from_pandas(val_df, split=Split.VALIDATION),
+        test=Dataset.from_pandas(test_df, split=Split.TEST),
+    )
+
+    dataset_id = "EuroEval/hellaswag-fi-mini"
+
+    # Remove the dataset from Hugging Face Hub if it already exists
+    try:
+        api = HfApi()
+        api.delete_repo(dataset_id, repo_type="dataset")
+    except HTTPError:
+        pass
+
+    # Push the dataset to the Hugging Face Hub
+    dataset.push_to_hub(dataset_id, private=True)
+
+
+def process_endings(raw_endings: str) -> list[str]:
+    """Process the endings of the HellaSwag-fi dataset.
+
+    I wanted to use `ast.literal_eval` to parse the endings, but it failed
+    because of mixed quotes.
+
+    Args:
+        raw_endings: The endings of the HellaSwag-fi dataset.
+
+    Returns:
+        The processed endings.
+    """
+    # Remove starting/ending square brackets and quotes
+    raw_endings = raw_endings[2:-2]
+
+    # Most endings are separated by newline characters
+    endings = raw_endings.split("\n")
+    if len(endings) != 4:
+        # If not, try a more hacky approach
+        endings = _extract_endings(raw_endings=raw_endings)
+        assert len(endings) == 4
+    else:
+        # Fix quotes
+        endings = [_fix_quotes(ending) for ending in endings]
+    return endings
+
+
+def _fix_quotes(ending: str) -> str:
+    r"""Remove starting and ending quotes.
+
+    Some entries have mixed quotes, e.g.
+        '\'Aloha"'
+    which should be turned into the following:
+        'Aloha'
+
path: src/scripts/create_hellaswag_fi.py
user: login: saattrupdan
body: ```suggestion
```
created_at: 2025-04-24T09:31:05Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,78 @@
+"""Create the Finnish version of the XLSum summarisation dataset."""
+
+import pandas as pd
+from constants import MAX_NUM_CHARS_IN_ARTICLE, MIN_NUM_CHARS_IN_ARTICLE
+from datasets import Dataset, DatasetDict, Split, load_dataset
+from huggingface_hub import HfApi
+from requests import HTTPError
+
+
+def main() -> None:
+    """Create the Finnish XL-Sum dataset and upload to HF Hub."""
+    dataset_id = "TurkuNLP/xlsum-fi"
+
+    dataset = load_dataset(dataset_id)
+    assert isinstance(dataset, DatasetDict)
+
+    dataset = dataset.rename_columns(column_mapping=dict(summary="target_text"))
+
+    train_df = dataset["train"].to_pandas()
+    val_df = dataset["validation"].to_pandas()
+    test_df = dataset["test"].to_pandas()
+    assert isinstance(train_df, pd.DataFrame)
+    assert isinstance(val_df, pd.DataFrame)
+    assert isinstance(test_df, pd.DataFrame)
+
+    # Only work with samples where the text is not very large or small
+    train_lengths = train_df.text.str.len()
+    val_lengths = val_df.text.str.len()
+    test_lengths = test_df.text.str.len()
+    lower_bound = MIN_NUM_CHARS_IN_ARTICLE
+    upper_bound = MAX_NUM_CHARS_IN_ARTICLE
+    train_df = train_df[train_lengths.between(lower_bound, upper_bound)]
+    val_df = val_df[val_lengths.between(lower_bound, upper_bound)]
+    test_df = test_df[test_lengths.between(lower_bound, upper_bound)]
+
+    # Create test split
+    test_size = 2048
+    val_samples_to_test = val_df.sample(n=test_size - len(test_df), random_state=4242)
+    # Remove the samples from the validation set
+    val_df = val_df[~val_df.index.isin(val_samples_to_test.index)]
+    # Concatenate the test set with the sampled validation set
+    test_df = pd.concat([test_df, val_samples_to_test])
+
+    # Create validation split
+    val_size = 256
+    val_df = val_df.sample(n=val_size, random_state=4242)
+
+    # Create train split
+    train_size = 1024
+    train_df = train_df.sample(n=train_size, random_state=4242)
+
+    val_df = val_df.reset_index(drop=True)
+    test_df = test_df.reset_index(drop=True)
+    train_df = train_df.reset_index(drop=True)
+
+    # Collect datasets in a dataset dictionary
+    dataset = DatasetDict(
+        train=Dataset.from_pandas(train_df, split=Split.TRAIN),
+        val=Dataset.from_pandas(val_df, split=Split.VALIDATION),
+        test=Dataset.from_pandas(test_df, split=Split.TEST),
+    )
+
+    # Create dataset ID
+    mini_dataset_id = "ScandEval/xlsum-fi-mini"
path: src/scripts/create_xlsum_fi.py
user: login: saattrupdan
body: ```suggestion
    mini_dataset_id = "EuroEval/xlsum-fi-mini"
```
created_at: 2025-04-24T09:33:27Z
author_association: MEMBER

PR comments:
user: login: oliverkinch
created_at: 2025-03-31T10:41:09Z
body: For the QA datasets, see https://github.com/EuroEval/EuroEval/issues/158#issuecomment-2765693324
author_association: COLLABORATOR
user: login: oliverkinch
created_at: 2025-04-04T11:57:35Z
body: For knowledge dataset, see https://github.com/EuroEval/EuroEval/issues/158#issuecomment-2778443317
author_association: COLLABORATOR
user: login: oliverkinch
created_at: 2025-04-15T09:35:08Z
body: We now have 1 dataset in each task, except for the knowledge task (see https://github.com/EuroEval/EuroEval/issues/158#issuecomment-2797449938). Should I try to make a knowledge dataset, as you describe in the comment, or is this fine for now, and we should try and close this PR? @saattrupdan 

author_association: COLLABORATOR
user: login: oliverkinch
created_at: 2025-04-15T09:41:41Z
body: @viggo-gascou I have tried to make changes according to your clean up. Can you check if I am doing it correctly? :)
author_association: COLLABORATOR
user: login: viggo-gascou
created_at: 2025-04-15T15:03:14Z
body: > @viggo-gascou I have tried to make changes according to your clean up. Can you check if I am doing it correctly? :)

Yeah, it looks good to me as long as all of the new datasets all follow the defaults 😄
author_association: CONTRIBUTOR
user: login: saattrupdan
created_at: 2025-04-24T09:34:31Z
body: @oliverkinch  Also needs to be merged with `main` - there are apparently some conflicts, that need to be dealt with.
author_association: MEMBER
user: login: oliverkinch
created_at: 2025-04-24T10:06:11Z
body: > @oliverkinch Also needs to be merged with `main` - there are apparently some conflicts, that need to be dealt with.

I have now pushed commits according to your suggested changes. I have merged the branch with main, and I don't see any conflicts.
author_association: COLLABORATOR