CoLA

Corpus of Linguistic Acceptability

Tests whether a model can tell if a sentence is grammatically acceptable English, using examples from linguistics textbooks.

Released May 2018 Metric GLUE test MCC SOTA 73.8 · Vega v1 (2022)
01

At a glance

Task
Binary acceptability judgement
Size
8.5k train / 1k dev / 1k test; ~70% acceptable
Metric
Matthews correlation coefficient (MCC, −1 to 1)
Source
Example sentences from 23 linguistics publications, with the authors' own * (unacceptable) marks
Part of
GLUE
Neural Network Acceptability Judgments
Warstadt, Singh, Bowman · TACL 2019
Read the paper ↗ Hugging Face ↗
02

What it tests

Linguistics papers are full of example sentences, some marked with an asterisk meaning 'a native speaker would not say this'. CoLA collects those sentences and their marks: 'The book was written by John' is fine; 'Book the was written by John' is not; 'The more you would want, the less you would eat' is the kind of subtle case that makes the task interesting.

Because 70% of sentences are acceptable, accuracy is misleading; Matthews correlation (which is 0 for any constant predictor) is used instead.

GPT-1 scored 45.4 MCC, a ten-point jump over the previous best and the paper's largest relative gain on GLUE — evidence that a language model picks up grammaticality as a side effect of predicting text.

03

Examples

Items from the dataset (or representative items where the originals are not freely redistributable).

Sentence
The book was written by John.
Answeracceptable (1)
Sentence
Book the was written by John.
Answerunacceptable (0)
Sentence
They drank the pub dry.
Answeracceptable (1)
Sentence
They drank the pub.
Answerunacceptable (0)
04

Reported results

Scores reported on this benchmark, with the evaluation setting each one used.

SettingReportedContext
Fine-tuned45.4 MCCPrior best 35.0
05

State of the art

Best known · GLUE test MCC
73.8
✓ saturated · at or above human level
Model
Vega v1
2022
Human baseline
66.4

Source: arxiv.org ↗ · checked October 2026.

06

Quickstart

Load the benchmark and score a Hugging Face causal LM on it in a few lines.

1Install
shell
pip install -U datasets transformers evaluate lm-eval sacrebleu rouge-score scikit-learn
2Load the data

sentence, label (0 unacceptable · 1 acceptable)

python · load
from datasets import load_dataset

ds = load_dataset("nyu-mll/glue", "cola", split="validation")
print(ds)            # columns: sentence, label (0 unacceptable · 1 acceptable)
print(ds[0])
3Score a model

Two helpers cover every benchmark in this collection: loglik for anything multiple-choice (score each option, pick the highest) and generate for anything free-form. Swap MODEL for whatever you are evaluating.

python · helpers
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

MODEL = "gpt2"                                   # or "Qwen/Qwen2.5-1.5B", "meta-llama/Llama-3.2-1B", …
tok = AutoTokenizer.from_pretrained(MODEL); model = AutoModelForCausalLM.from_pretrained(MODEL, torch_dtype=torch.bfloat16).eval().to("cuda")

@torch.no_grad()
def loglik(context, continuation):
    """Sum of log-probs of `continuation` tokens given `context` — the standard multiple-choice scorer."""
    ids = tok(context + continuation, return_tensors="pt").input_ids.to(model.device)
    n_ctx = len(tok(context).input_ids)
    logp = model(ids).logits.log_softmax(-1)[0, :-1]
    return logp.gather(1, ids[0, 1:, None])[n_ctx - 1:].sum().item()

@torch.no_grad()
def generate(prompt, max_new_tokens=32, stop=None):
    ids = tok(prompt, return_tensors="pt").input_ids.to(model.device)
    out = model.generate(ids, max_new_tokens=max_new_tokens, do_sample=False, pad_token_id=tok.eos_token_id)
    text = tok.decode(out[0, ids.shape[1]:], skip_special_tokens=True)
    return text.split(stop)[0] if stop else text
python · evaluate
LABELS = {"sst2": ["negative", "positive"], "cola": ["unacceptable", "acceptable"]}["sst2"]  # pick the task
def prompt(ex): return f"{ex['sentence']}\nQuestion: Is this sentence {LABELS[0]} or {LABELS[1]}?\nAnswer:"
preds = [max(range(2), key=lambda i: loglik(prompt(ex), " " + LABELS[i])) for ex in ds]
from sklearn.metrics import accuracy_score, matthews_corrcoef
print("acc", accuracy_score(ds["label"], preds), "mcc", matthews_corrcoef(ds["label"], preds))
4Or use lm-evaluation-harness

Task name(s): cola. The harness reproduces the GPT-3 prompt formats and reports the standard metric.

shell
lm_eval --model hf --model_args pretrained=gpt2,dtype=bfloat16 \
        --tasks cola --num_fewshot 0 --batch_size auto --output_path results/
07

Pitfalls

  • Use MCC, not accuracy (`sklearn.metrics.matthews_corrcoef`).
  • The dev set has in-domain and out-of-domain halves (sources seen/unseen in training); the paper reports both.
  • Judgements are the linguists' own and sometimes contested — expect a noise ceiling.
08

References