Mova0.5 pre-release⌕
☰
home / docs / coref — SLM coreference: a sieve of rules with a reason for every link

coref — SLM coreference: a sieve of rules with a reason for every link

The annotator keeps context and resolves pronouns (Smart annotator — layers, context, memory, "Document memory").

A separate crate that depends on en (en = { path = "../en" }), not the other way round.

This is the in-house coreference of the small language model (SLM):

How it works

UD tree (gold or en annotate) → mentions (mention.rs) → sieves (sieve.rs) → CorefUD Entity= (corefud.rs)
                                                                          → evaluation (score.rs, eval.rs)

Mentions from the tree

Heads:

Not heads:

Span — the subtree of the head under CorefUD rules:

Coordination "John and Mary" gives two mentions with one head: the whole group and the first conjunct. The CRAC scorer tells them apart by span. The group is output only when something refers to it.

On GUM dev with gold trees:

Features — only from UD FEATS (Number, Gender, Person, PronType, Poss, Reflex) and hand-made closed lists:

What is not known stays unknown and matches anything, like "unknown" in Lee et al. 2013. Gender is not guessed from a name (Smart annotator — layers, context, memory, "Document level"). Instead there are:

Cluster features are the union of the features of its mentions.

Sieves — from the most precise

The architecture follows Raghunathan et al. 2010 (papers/r/ra/raghunathan-2010-multi-pass-sieve-coreference-resolution) and Lee et al. 2013 (papers/l/le/lee-2013-deterministic-coreference-resolution-based-entity):

Candidate order — in the spirit of Hobbs. Hobbs 1978 itself is missing from the library; it is taken from the descriptions in Raghunathan 2010 and Lee 2013:

Heads higher in the tree come first, as in Haghighi & Klein 2009 (papers/h/ha/haghighi-2009-simple-coreference-resolution-rich-syntactic).

idwhat it doesdefault
speaker"I" of one voice is one person. A voice is a speaker from # speaker, a separate quotation or the narrator. "I" in a quotation is its author, i.e. the subject of the speech verb outside the quotes. "we" and "you" of one voice go together. "you" addressed to an addressee is that addressee's earlier "I". Rules follow Lee 2013, §3.3.1 and Baldwin 1997 (papers/b/ba/baldwin-1997-cogniac-high-precision-coreference-limited)yes
exactexact text match of nominal mentionsyes
relaxedtext match up to and including the head. After the head — only relative clauses (acl); a quantified antecedent — noyes
apposappos in the treeyes
predpredicative noun: subject — cop — noun, without negationyes
relpronrelative pronoun → the noun the relative clause is attached to. Memory only: relatives are not annotated in GUM, so they do not go into the outputyes
acronym"AFP" — capital letters of a nameyes
reflexivereflexive pronoun → subject of its predicate (principle A)yes
strict_ahead is among the cluster heads + cluster words ⊆ + modifiers ⊆ + not i-within-iyes
strict_bthe same without modifiersyes
strict_cthe same without wordsno: 31% on dev
proper_headthe same proper head, without conflicting proper names and numbers in modifiersyes
relaxed_headthe proper head is among the cluster wordsno: 24% on dev
deixisan event «it» and a bare «this/that» → the clause before it, added as a mention (details below)no: 12% on dev
pronoun3rd-person pronoun, details belowyes
nearestbaseline: nearest preceding agreeing mentionbaseline only

What «it» is (src/it.rs, before the sieves; PRAG_OFF=it-class turns it off, it-pleonastic and it-event each half). Tests on the predicate, after Loáiciga et al. 2017 (papers/en/…loaiciga-2017-what-is-it…) and Eckert and Strube's context test in Kolhatkar et al. 2018:

Measured on dev (2026-10-18; CoNLL F1 with / without singletons): gold trees 75.18 / 64.30 → 75.21 / 64.32, SLM trees 69.70 / 57.57 → 69.82 / 57.66. The precision of «it» rose from 51.9% to 53.5% (gold trees) and from 42.5% to 45.3% (SLM trees), with 19 and 23 fewer «it» linked. Each test alone moves CoNLL by at most 0.03; «it» as the object of a verb of knowing (know, believe, say…) as an event was tried and dropped (−0.02). The same test in the SLM's frame reader (an event or pleonastic «it» left unresolved) lost on the courses (7 672 → 7 633 tests, 2 199 → 2 202 exams; pleonastic only 7 650 / 2 203), so the reader does not use it.

The deixis sieve (off): an event «it» or a bare «this/that» (not before a noun) is linked to the clause before it — the clause to the left in the same sentence, else the main clause of the previous sentence (Yu et al. 2022's baseline, Kolhatkar et al. 2018's search order). The clause is added as a mention with the predicate as its head. On dev only 12% of these links are right (17 of 141), and the sieve costs 0.8 CoNLL with singletons, so it is not in the default.

The pronoun sieve:

The speaker constraint (Lee 2013) lives in compatible: clusters with "I" of different voices do not merge.

Transparency

coref explain — the chains of a document: each mention with its sentence and bounds, the sieve id and evidence. Example from GUM dev (gold trees):

## chain 2 (53 mentions): Number=Sing Gender=Masc Animacy=Anim Person=3
  - GUM_bio_emperor-2:1-17 «Joshua Abraham Norton (c. 1818 – January 8, 1880), known as Emperor Norton» — first mention
  - GUM_bio_emperor-2:20-42 «a citizen of San Francisco, California, who … "Norton I, Emperor of the United States"» ← [pred] «Joshua Abraham Norton …» (GUM_bio_emperor-2:1) —cop «was»— «a citizen …» (GUM_bio_emperor-2:21)
  - GUM_bio_emperor-2:28-28 «who» [memory only] ← [relpron] relative «who» in the relative clause of «a citizen …» (GUM_bio_emperor-2:21)
  - GUM_bio_emperor-2:32-32 «himself» ← [reflexive] «himself» → subject «who» (GUM_bio_emperor-2:28) of predicate «proclaimed»
  - GUM_bio_emperor-3:1-1 «He» ← [pronoun] «he» → «a citizen …» (GUM_bio_emperor-2:21): candidate #1 in Hobbs order, 1 sent. back; cluster Number=Sing Gender=Masc Animacy=Anim; animacy preference
  - GUM_bio_emperor-5:10-10 «his» ← [pronoun] «his» → «his» (GUM_bio_emperor-5:5): candidate #4 in Hobbs order, 0 sent. back; …; rejected: «his mother» (GUM_bio_emperor-5:6): Gender Masc≠Fem
  - GUM_bio_emperor-6:1-1 «Norton» ← [strict_a] head «norton» is in the cluster; words ⊆ ["born", "england", "norton"]; modifiers [] ⊆ []; …

Full output — explain-dev-GUM_bio_emperor.txt.

coref resolve — CoNLL-U with Entity= in MISC (CorefUD, papers/n/ne/nedoluzhko-2022-corefud-1-0-coreference-meets):

The resolver does not see the gold standard: test resolver_ignores_gold_entities; in addition, every eval compares the output from MISC with and without Entity (fail-fast).

Scorer

Metrics (src/score.rs):

Formulas for predicted mentions without manipulations — Pradhan et al. 2014 (papers/p/pr/pradhan-2014-scoring-coreference-partitions-predicted-mentions).

Mention matching — by head, as in the main CRAC 2023–2026 metric (papers/n/no/novak-2025-findings-fourth-shared-task-multilingual, papers/n/no/novak-2026-findings-fifth-shared-task-multilingual):

Singletons: with and without them. Without them, singleton entities are removed on both sides before matching. The total over documents is the sum of numerators and denominators.

Checks that can show red:

Data and licenses

GUM (UD 2.18, UD_English-GUM) — CC BY-NC-SA:

SLM trees — en annotate $MOVA_DATA/en/models/en.bin on gold tokens (EWT + ESLSpok, CC BY-SA 4.0). Trees are supplied with --trees:

Hand-made lists in src/ are our own work, row coref-hand-lists in en/data/train-licenses.tsv:

No third-party lexicons. What is missing is listed under "What next".

Results — GUM test (UD 2.18: 30 documents, 7,955 mentions, 4,330 entities, of which 1,104 non-singleton)

Matching by head. The row "sieve (12)" is the default system. Reports:

CoNLL F1 (MUC / B³ / CEAF-e — F1)

systemgold trees, with singletonsgold, without singletonsSLM trees, with singletonsSLM, without singletons
everything separate40.17 (0 / 63.65 / 56.85)0.0038.810.00
exact string match only53.07 (29.98 / 67.32 / 61.90)27.88 (29.98 / 23.23 / 30.42)49.8924.42
pronoun → nearest agreeing57.73 (40.39 / 68.32 / 64.46)32.67 (40.39 / 31.87 / 25.74)55.8032.08
sieve (all 14)72.2259.1067.5453.83
sieve (12)73.04 (69.18 / 75.26 / 74.68)60.31 (69.24 / 58.79 / 52.89)67.90 (63.36 / 70.68 / 69.65)54.03 (63.42 / 52.87 / 45.81)
sieve (12), exact span68.8258.3357.8149.73

Mention detection (F1, by head):

Dev, for comparison (tuned on it):

3rd-person pronouns by form (test, sieve (12))

Precision is the share of linked pronouns whose antecedent is in the same gold chain.

formlinkedprecision % (gold trees)precision % (SLM trees)baseline "nearest", % (gold)
it19441.230.129.9
he12581.680.837.8
they9350.547.952.1
his8991.089.942.7
them5567.364.351.8
their5168.671.262.7
she3754.159.033.3
its3647.233.330.6
her2365.275.033.3
him2462.573.925.0
himself / themselves / itself6 / 6 / 4100 / 100 / 75100 / 67 / 2550 / 100 / 50
total74362.457.740.4

Precision and contribution of each sieve (test, gold trees; contribution is cumulative, CoNLL F1 without singletons)

sievelinksprecision %Δ CoNLL without singletons (gold / SLM)
speaker77190.7+21.88 / +21.99
exact96469.6+20.94 / +18.07
relaxed2454.2+0.26 / +0.28
appos8975.3 (SLM: 16.7)+2.33 / +0.18
pred15758.0+2.33 / +2.03
relpron150n/a (not annotated in GUM)+0.14 / −0.00
acronym2100+0.03 / +0.01
reflexive1573.3+0.15 / +0.07
strict_a39154.7+5.18 / +4.55
strict_b1100+0.05 / +0.11
strict_c (disabled)10521.9−0.50 / +0.31
proper_head4161.0+0.54 / +0.30
relaxed_head (disabled)543.7−0.62 / −0.43
pronoun75859.5+6.38 / +6.36

Sieve precision is the share of links where both mentions are in the gold standard (by head) and in the same chain. It is computed on the full sieve (all 14), so that the disabled ones are visible too.

What dev decided (gold trees, CoNLL F1 with / without singletons)

Hobbs order versus pure recency:

Animacy preference for he/she: +0.8 / +1.0. Pronoun window of 1–4 sentences — the same (±0.1); kept 3 (Lee 2013).

Mentions:

Sieves:

CRAC on GUM — for reference

CRAC 2025, table 8 in text.md — en_gum, CoNLL F1, by head, without singletons:

systemCoNLL F1
CorPipeEnsemble76.1
CorPipeSingle75.2
LLM-UWB73.6
LLM-NUST-FewShot69.8
Stanza69.0
BASELINE (mBERT end-to-end)61.7

CRAC 2026 (novak-2026-findings-fifth-shared-task-multilingual, table 7): the row with CorPipeEnsemble 76.1, Stanza 73.0 and baselines 62.4 is most likely en_gum. The row label is lost in the extracted text, so the attribution is not certain.

The settings differ — compare only roughly:

Our 60.3 on gold trees and 54.0 on SLM trees are below the CRAC baseline (61.7). But the system is transparent, runs the whole test in 13 s on one core and was not trained on GUM.

Three main error types (test)

  1. "it" / "its" → wrong noun (precision 41%, on SLM trees 30%). Among the causes:

    • "it" often refers to an event or a statement, and we do not build event mentions (VERB head);
    • a semantic class of nouns is missing.

    Examples:

    • GUM_academic_eegimaa-2: «its» → «This section»;
    • GUM_bio_dvorak-11: «it» → «1874»;
    • GUM_conversation_lambada-21: «it» → «this person» — without a lexicon "person" is not known to be animate.
  2. Same text or head, different entities (exact 69.6%, strict_a 54.7%). These are generic and repeated groups, different persons with one head, part versus whole:

    • «some politicians» ~ «some politicians», «those days» ~ «those days»;
    • «[George W.] Bush» ~ «[George H. W.] Bush»;
    • «Senegal» ~ «Southern Senegal»;
    • «the first shuttle mission» ~ «the first space shuttle mission».
  3. Wrong relations in SLM trees. The parser attaches reference numbers "[1–3]" as appos to nouns: GUM_academic_discrimination-4, «1 - 3» ~ «much social science research». Because of this:

    • appos drops from 75% to 17%;
    • pronoun — from 59.5% to 54.6%;
    • CoNLL without singletons loses 6.3.

    This also covers name gender without a lexicon: «she» → «that» (GUM_conversation_lambada-57) — a demonstrative pronoun without gender wins in Hobbs order.

How to run

cd coref && cargo build --release -j 2
G=$MOVA_DATA/en/ud/ud-treebanks-v2.18/UD_English-GUM
.../target/release/en annotate $MOVA_DATA/en/models/en.bin $G/en_gum-ud-test.conllu > test.slm-trees.conllu
../target/release/coref eval $G/en_gum-ud-test.conllu --out <dir>                               # gold trees
../target/release/coref eval $G/en_gum-ud-test.conllu --trees test.slm-trees.conllu --out <dir>  # SLM trees
../target/release/coref resolve <in.conllu> [--trees f] > out.conllu    # CorefUD
../target/release/coref explain <in.conllu> [doc-id] [--trees f]        # chains with reasons
../target/release/coref score <gold.conllu> <output.conllu> [--exact]   # scorer
../target/release/coref mentions <gold.conllu> [--trees f]              # mention detection against gold

Dev experiment switches — environment variables; the defaults are what dev selected:

Speed: the whole test (30 documents, 28k words) — all systems and tables in 13 s on one core.

What next (needed)

This page in Markdown → https://md.mova.elamur.ai/free/en/docs/coref/