Instructions to use nishparadox/atomizer-gliner-small with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- GLiNER
How to use nishparadox/atomizer-gliner-small with GLiNER:
from gliner import GLiNER model = GLiNER.from_pretrained("nishparadox/atomizer-gliner-small") text = "Cristiano Ronaldo dos Santos Aveiro was born on 5 February 1985 in Funchal, Madeira, Portugal." labels = ["person", "date", "location"] entities = model.predict_entities(text, labels) for entity in entities: print(entity["text"], "=>", entity["label"]) - Notebooks
- Google Colab
- Kaggle
atomizer-gliner-small
atomizer on GLiNER small v2.5 (gliner-community/gliner_small-v2.5):
a single-pass span atomizer with a critic. It splits a text into short, self-contained claims ("atoms") and scores
each one:
verifiable: is this a factual claim that can be checked?checkworthy: is it worth fact-checking?
Atomization is the step any claim-level fact-checking tool depends on: search, evidence judgment and the verdict
all work on the claims it produces, so a claim that is missed, merged or wrongly resolved here cannot be checked
correctly later. The figure shows fact-assessor, our own opinionated
fact-assessment tool: atomizer is the "trained atomizer" option of its Atomization step, and its verifiable /
checkworthy scores drive Claim filtering. The integration is in progress (see Intended use).
It runs in one forward pass: 163M parameters (GLiNER small v2.5 plus four heads), a few ms per text on a GPU, ~40 ms on a laptop CPU.
One repo per architecture. The atomizer models live in one Hugging Face repo per backbone and head design, so every tag of a repo loads the same way and has the same size and speed. This repo is the small model, where the releases are:
| Repo | Backbone | Heads |
|---|---|---|
atomizer-gliner-small (this repo) |
GLiNER small v2.5 (163M) | standard; the releases (main) |
atomizer-gliner-large |
GLiNER large v2.5 (456M) | standard |
atomizer-gliner2.5-base |
Fastino GLiNER2.5 base (202M) | standard, no BiLSTM |
atomizer-gliner2.5-base-native |
Fastino GLiNER2.5 base (192M) | GLiNER2.5's own pretrained heads |
atomizer-gliner2.5-base-xhead |
Fastino GLiNER2.5 base (217M) | head-interaction block |
The model does not generate text. It selects words from the input, replaces references ("She" → "Marie Curie", "The company" → "Tesla") with earlier spans, and adds closed-class glue words ("is", "the", "'s"). When no earlier span is the referent, it keeps the reference as written ("The company was founded in 2003 …") rather than guess a name. An atom cannot contain a name or number that isn't in the input, and values are copied byte for byte ("8846m").
Status: research prototype.
mainis v0.6 (2026-10-15): the v0.5 recipe with WiCE, FActScore and synthetic v0.4 added to the data. Against v0.5 it has 6 significant wins and no loss (FActScore soft F1 +0.097, WiCE exact +0.095, Factcheck-Bench +0.027, synthetic exact +0.021, PropSegmEnt +0.017) at the same size and speed. It also resolves a writer who names themselves ("I am Paradox. … My lab is in Quorna." → "Paradox's lab is in Quorna."), where v0.5 keeps "I" and "My". It handles chat and agent text: first person, greetings, hedges ("I think …", which are unwrapped) and opinions (emitted as atoms with lowverifiable), and it can leave a reference as written when its referent is not in the text, instead of forcing a wrong one. The models on Fastino's GLiNER2.5 base (its pretrained relation scorer for references, or a head-interaction block) are in their own repos (table above): on the same data they are within noise of v0.6 and ~1.5× slower on a CPU.
Intended use
atomizer turns free text into checkable claims: short, self-contained statements, each scored for whether it is
a factual claim (verifiable) and worth checking (checkworthy). It is meant as the first stage of:
- fact-checking and claim verification: split an LLM answer, article or post into claims, keep the checkable ones, and verify each against evidence;
- hallucination detection and factual-precision scores for LLM output (the share of claims that are supported);
- check-worthiness triage: rank claims for human fact-checkers;
- retrieval units: propositions as the indexed unit for retrieval.
It does not decide whether a claim is true: verifiable means "can be checked", not "correct".
Our own pipeline: fact-assessor, an opinionated fact-assessment tool (figure at the top) that checks any text against evidence and returns a verdict per claim, a fact score and a knowledge graph. atomizer works with any claim-level verifier; fact-assessor is where we use it.
There, atomizer is the "trained atomizer" option of the Atomization step: one local forward pass gives
the claims and their verifiable / checkworthy scores, and Claim filtering keeps the claims whose scores pass a
cut-off, so neither step needs an LLM or API call. That means no API cost, milliseconds instead of seconds, and no
name or number in a claim that is not in the input. A wrong claim can still come from a wrong reference (see
Limitations). The fact-assessor integration is not done yet; it and an end-to-end comparison with the LLM
atomizer are in progress.
Usage
The loading code is the atomizer package at NISH1001/atomizer. That repo is
private for now, so access is on request. The weights are a plain PyTorch state dict (model.pt) plus atomizer.json
(backbone, settings, glue and insertion vocabularies).
uv add "atomizer @ git+ssh://git@github.com/NISH1001/atomizer@v0.3.0" # needs access to the repo; v0.6 is meant for ≥ v0.3.0
from atomizer import Atomizer
atomizer = Atomizer.load("nishparadox/atomizer-gliner-small") # latest release (main = v0.6)
# atomizer = Atomizer.load("nishparadox/atomizer-gliner-small", revision="v0.5") # a pinned release
for atom in atomizer.atomize("I am good. My name is Nish. I think the height of mount everest is 8846m."):
print(atom.text, round(atom.verifiable, 2), round(atom.checkworthy, 2))
# I am good. 0.0 0.0
# My name is Nish. 0.0 0.0
# The height of mount everest is 8846m. 1.0 0.98
atomizer.atomize(text, min_verifiable=0.5) # only checkable facts
print(atomizer.explain(text).show()) # every head's predictions
atomizer.critic_scores(["We should invest more in education."]) # score claims you already have
atomize returns every atom by default, opinions and greetings included, each with its scores. Filter with
min_verifiable / min_checkworthy.
Model
The encoder of GLiNER small v2.5 (DeBERTa-v3-small, 6 layers; Apache-2.0) with its pretrained BiLSTM and span layer, then four heads:
| Head | Predicts |
|---|---|
| anchor | per word: does an atom start here |
| pair | per (atom, word): KEEP / SUB / DROP, and glue after the word |
| antecedent | per reference: which earlier span it means, or none (keep the reference as written) |
| critic | per atom: verifiable, checkworthy |
Every tag of this repo is this network. The same heads on Fastino's GLiNER2.5 base encoder, with GLiNER2.5's own
pretrained relation scorer as the antecedent head ("native") or with a head-interaction block ("xhead"), are the
models of the atomizer-gliner2.5-base-* repos.
Assembly from these predictions is deterministic. Texts longer than 1,024 tokens are atomized in sentence windows with read-only context. Details: ARCHITECTURE.md.
Training
v0.5 and v0.6 are each one run from the base model on all the training data (see the recipes below). v0.1–v0.4 were trained in
stages, each continuing from an earlier checkpoint (see Stages). No API calls were made to create training data. Every
run is logged in W&B nasa-impact/atomizer (team project). The full log, with commands, curves and timings, is in
EXPERIMENTS.md.
Datasets
| Dataset | Role | Labels |
|---|---|---|
chentong00/propositionizer-wiki-data |
atoms: 42,857 Wikipedia passages, ~7.7 propositions each | GPT-4, by the dataset authors (Chen et al., Dense X Retrieval) |
Nithiwat/claimbuster |
critic: 23,533 US-debate sentences (check-worthy fact / unimportant fact / non-factual) | human |
iai-group/clef2024_checkthat_task1_en |
critic: CLEF CheckThat! 2024 task 1, check-worthiness yes/no (train 22,501, dev 1,032, test 318) | human |
nishparadox/atomizer-chat-synthetic |
atoms + per-atom critic labels on chat, agent, science and news text. v0.1 (12 types, train 995, test 204) for stage 3; v0.2 (18 types, train 1,453, test 306) for stage 4; v0.3 (19 types, train 1,496, test 323; adds 60 distractor-reference texts) for stage 5 and v0.5; v0.4 (26 types, train 2,037, test 442; adds introductions, kept references, possessives, long documents, scientific papers, meaning words, promotional claims) for v0.6 | AI-written (Claude); see its disclaimer |
| Factcheck-Bench (Apache-2.0) | atoms + per-claim labels on 94 real ChatGPT answers; 62 train (stage 4), 30 seeded held-out test | human |
nfliu/decontextualization (Choi et al. 2021) |
a Wikipedia sentence rewritten to stand alone, its paragraph as read-only context; only rewrites a span model can build (1,224 train). Trains only the antecedent head and the critic | human |
| WiCE (Kamoi et al. 2023; annotations ODC-BY 1.0) | atoms: Wikipedia claims split into sub-claims, official splits (train 1,260 / dev 349 / test 358 claims); v0.6 only | GPT-3 few-shot, by the dataset authors |
| FActScore (Min et al. 2023; data terms not stated, so not redistributed) | atoms: biographies written by InstructGPT, ChatGPT and PerplexityAI with human-revised atomic facts, split by person with a fixed seed (349 train / 46 valid / 101 test biographies); v0.6 only | human |
chat templates (scripts/make_chat.py) |
hedged facts, opinions, insults, personal and social statements, questions; with noise | rule-based, generated locally |
sihaochen/propsegment (PropSegmEnt) |
test only (its atoms are fragments) | human |
ClaimBuster and CheckThat! come from the same debate transcripts. Every training sentence that also appears in a validation or test split was removed (3,279 sentences), so the critic is not scored on sentences it trained on.
v0.6 recipe
The v0.5 recipe below with synthetic v0.4 (×3), WiCE (×3) and FActScore (×1) added, 103,357 texts per epoch; 3 epochs /
9,690 steps, released: the last step; 1× A100 80GB, 144 min; W&B run small-v07 (the runs of this round were named
before the version number was settled). The same data on the Fastino architectures (their own repos): EXPERIMENTS.md,
run 12.
v0.5 recipe
One run from gliner-community/gliner_small-v2.5, every training example in every epoch:
| v0.5 | |
|---|---|
| data per epoch | Propositionizer 42,856 + critic 40,402 (ClaimBuster + CheckThat! 2024) + templates 5,999, once each; synthetic v0.3 1,496, Decontextualization 1,212 and Factcheck-Bench 62, three times each (×3 upsampling of the small human / synthetic sets) = 97,567 |
| epochs / steps | 3 / 9,147 (released: step 5,000, best heldout exact F1) |
| batch | 32 |
| learning rates (encoder / GLiNER layers / heads) | 3e-5 / 1e-4 / 5e-4 |
| hardware, time | 1× A100 80GB, 83 min |
| W&B run | small-full |
Training texts that also appear (after normalising) in the same dataset's validation or test split are dropped (14 texts). The stage runs before it used a fixed random subset of the large sources in every epoch, so about 10,000 critic sentences and 600 template texts were never trained on; v0.5 uses all of them. Other settings as in "Shared by all stages" below, with the "none" antecedent of stage 5.
Stages (v0.1–v0.4)
| Stage 1: atomizer | Stage 2: critic → v0.1 | Stage 3: chat → v0.2 | Stage 4: human data → v0.3 | Stage 5: "none" antecedent → v0.4 | |
|---|---|---|---|---|---|
| starts from | gliner-community/gliner_small-v2.5 |
stage 1, final | v0.1 | v0.2 | v0.2 |
| data per epoch | Propositionizer, 42,857 | Propositionizer 15,000 + ClaimBuster + CheckThat! 2024 (58,681) | Propositionizer 27,076 (30%) + critic 27,076 (30%) + templates 5,415 (6%) + synthetic 995 (all) = 60,562 | Propositionizer 23,000 (25%) + critic 23,000 (25%) + templates 4,600 (5%) + synthetic v0.2 1,453 + Decontextualization 1,224 + Factcheck-Bench 62 (all) = 53,339 | as stage 4, with synthetic v0.3 1,496 (≈53,300) |
| epochs / steps | 3 / 8,037 | 1 / 3,668 (released: step 1,000) | 2 / 3,780 (released: step 3,500, the last eval) | 2 / 3,334 (released: step 3,000, the last eval) | 2 / 3,330 (released: step 2,500, best heldout) |
| batch | 16 | 16 | 32 | 32 | 32 |
| learning rates (encoder / GLiNER layers / heads) | 3e-5 / 1e-4 / 5e-4 | 2e-5 / 5e-5 / 5e-4 | 2e-5 / 5e-5 / 5e-4 | 2e-5 / 5e-5 / 5e-4 | 2e-5 / 5e-5 / 5e-4 |
| hardware, time | Apple M3 Max (MPS), 2 h 10 min | Apple M3 Max, ~40 min | 1× A100 80GB, 16 min | Apple M3 Max, ~1 h 40 min | 1× A100 80GB, 20 min |
| W&B run | gliner-small-v2.5-propwiki-3ep |
gliner-small-v2.5-propwiki-critic |
m1-mix-syn |
m4b-mac-decontext-ante-nocritneg |
small-from-v0.2-noneante |
Stage 4 also changed decoding and labels: atoms copy words only within one sentence (pySBD), and other sentences enter an atom only as a resolved reference. Long texts get a header of earlier introductions per window.
A failed first attempt at stage 4 (m4-rc1, kept as tag v0.3-rc1) also trained the anchor and pair heads on
Decontextualization and added broken copies of gold atoms as critic negatives. One whole rewritten sentence per
example taught it not to split (PropSegmEnt 0.741 → 0.695), and the negatives pushed short factual claims to
verifiable ≈ 0.01. v0.3 drops both.
Stage 5 gives the antecedent head a "none" option: a fixed score of 0 next to every candidate span (Lee et
al. 2017's dummy antecedent; no new parameters). When "none" wins, the reference stays as written. It is trained on
references the gold atoms keep as written (up to 2 per text) and on 60 new synthetic texts in pairs, the referent
named (resolve it) or absent (keep the reference). v0.4 re-runs v0.3's recipe from v0.2 with this change.
Continuing v0.3 for 2 more epochs instead (tag v0.4-rc3) split sentences better but reduced wrong references
less, and lost more comparisons overall.
Shared by all stages and v0.5:
- AdamW (fused), weight decay 0.01, gradient clip 1.0
- cosine schedule, 5% warmup, bf16 autocast, dropout 0.1
- insertion vocabulary of 300 words, 2,000 glue phrases
- anchor threshold 0.35, tuned on Propositionizer validation
Stage 3 also uses bucketed shuffling: each epoch, batches are rebuilt from shuffled chunks sorted by length, so they mix datasets (70% of batches) at 5% padding.
How labels are made
An aligner turns each gold atom into per-word targets:
- an anchor: the atom's first word no other atom uses
- KEEP / SUB / DROP for each word
- glue for each gap
- an antecedent span for each reference, and none for a reference the gold atom keeps as written
Gold atoms that cannot be built this way are skipped, and the anchor loss is masked on their words. That covers reordering, verb changes and words not in the text: ~26–30% of GPT-4 propositions, and ~0% of the templates and synthetic data. The critic learns from gold atoms (per-atom labels, or "verifiable" for propositions) and from whole labelled sentences, with the atomization losses switched off for those.
Stage 3 ablations
Same data and settings, one difference each; test sets below:
| Run | Difference | synthetic soft F1 | critic AUC (synthetic atoms) | chat held-out | Propositionizer | PropSegmEnt | CheckThat! F1 |
|---|---|---|---|---|---|---|---|
| M1 = v0.2 | — | 0.897 | 0.994 | 0.988 | 0.733 | 0.741 | 0.866 |
| M2 | + glue penalty 0.5 | 0.897 | 0.994 | 0.989 | 0.733 | 0.742 | 0.866 |
| M3 | no synthetic data | 0.872 | 0.947 | 0.989 | 0.728 | 0.730 | 0.872 |
| M1 at step 500 | 0.26 epochs instead of 2 | 0.891 | 0.980 | 0.975 | 0.744 | 0.760 | 0.851 |
- The synthetic data mainly improves the critic on realistic text (+0.047 AUC).
- The glue penalty has no effect.
- Longer training improves chat and the critic but costs a little on Wikipedia-style text. The release favours chat and agent inputs.
Evaluation
Test splits only, none used for training or checkpoint selection. Atom sets are scored with soft F1 (best-match token F1 between predicted and reference atoms).
v0.5 vs v0.6 (A100 run of the suite), same texts for both. ✔ marks a difference whose paired-bootstrap 95% CI (2,000 resamples over texts) excludes 0; the rest are not significant. The synthetic test here has 442 texts (the 119 texts of the v0.4 categories included), so v0.5 reads 0.894 on it, not 0.905 as in the older tables below.
| Test set | v0.5 | v0.6 | v0.6 − v0.5 |
|---|---|---|---|
| synthetic chat/agent (442), soft F1 | 0.894 | 0.894 | tie; exact F1 +0.021 ✔ |
| Factcheck-Bench (30 real ChatGPT answers, human), soft F1 | 0.754 | 0.781 | +0.027 ✔ |
| Decontextualization (195, human), soft F1 | 0.552 | 0.560 | +0.008 |
| …references resolved | 0.703 | 0.734 | +0.031 |
| …wrong references (lower is better) | 0.073 | 0.088 | +0.015 |
| Propositionizer test (500), soft F1 | 0.742 | 0.739 | −0.003 |
| PropSegmEnt test (500, human-labelled), soft F1 | 0.756 | 0.774 | +0.017 ✔ |
| WiCE test (358 Wikipedia claims → sub-claims), soft / exact F1 | 0.790 / 0.218 | 0.811 / 0.313 | +0.021 ✔ / +0.095 ✔ |
| FActScore test (101 LLM biographies, human atomic facts), soft / exact F1 | 0.613 / 0.022 | 0.710 / 0.092 | +0.097 ✔ |
CLEF CheckThat! 2024 official test (318), checkworthy F1 / AUC |
0.865 / 0.978 | 0.862 / 0.975 | ties |
| words not in the input (invented) | 0 | 0 |
v0.6 is better on real LLM answers, on human-segmented text and on the two claim-decomposition sets it was trained on, and tied on everything else: 6 significant wins, no loss. Its wrong-reference rate is higher (0.088 vs 0.073, not significant). Run details: EXPERIMENTS.md, run 12.
v0.4 vs v0.5 (at the v0.5 release), same texts for both. "Paired 95% CI" is a bootstrap over texts (2,000 resamples; 1,000 for the critic sets) of the v0.5 − v0.4 difference; ✔ marks a CI that excludes 0.
| Test set | v0.4 | v0.5 | paired 95% CI |
|---|---|---|---|
| synthetic chat/agent (323), soft / exact F1 | 0.899 / 0.553 | 0.905 / 0.555 | +0.002..+0.012 ✔ / −0.020..+0.023 |
| Factcheck-Bench (30 real ChatGPT answers, human), soft F1 | 0.760 | 0.753 | −0.026..+0.010 |
| …exact F1 | 0.183 | 0.146 | −0.070..−0.005 ✔ (lower) |
| Decontextualization (195, human), soft F1 | 0.543 | 0.551 | −0.005..+0.021 |
| …references resolved | 0.582 | 0.703 | +0.061..+0.181 ✔ |
| …wrong references (lower is better) | 0.044 | 0.073 | −0.012..+0.071 |
| Propositionizer test (500), soft F1 | 0.731 | 0.742 | +0.007..+0.016 ✔ |
| PropSegmEnt test (500, human-labelled), soft F1 | 0.738 | 0.757 | +0.008..+0.030 ✔ |
CLEF CheckThat! 2024 official test (318), checkworthy F1 / AUC |
0.876 / 0.978 | 0.865 / 0.978 | −0.049..+0.022 / −0.008..+0.009 |
CheckThat! dev (1,032), checkworthy F1 / AUC |
0.952 / 0.995 | 0.949 / 0.997 | ties |
ClaimBuster valid (2,353), checkworthy F1 / AUC |
0.785 / 0.945 | 0.767 / 0.938 | −0.041..+0.004 / −0.012..−0.001 ✔ (lower) |
| chat templates held out, soft F1 | 0.985 | 0.989 |
v0.5 resolves many more references (+12 points on human rewrites) and splits Wikipedia and human-segmented text better. Its atoms match the Factcheck-Bench wording exactly less often (30 texts), it ranks ClaimBuster sentences slightly worse (−0.006 AUC), and wrong references rise from 4.4% to 7.3% (not significant: 241 correct and 19 wrong substitutions vs 216 and 10). Run details: EXPERIMENTS.md, run 6.
v0.3 vs v0.4 (at the v0.4 release), same texts for both. "Paired 95% CI" is a bootstrap over texts (2,000 resamples) of the v0.4 − v0.3 difference; ✔ marks a CI that excludes 0.
| Test set | v0.3 | v0.4 | paired 95% CI |
|---|---|---|---|
| synthetic chat/agent (323), soft / exact F1 | 0.896 / 0.544 | 0.899 / 0.553 | −0.001..+0.006 / −0.006..+0.024 |
| Factcheck-Bench (30 real ChatGPT answers, human), soft F1 | 0.748 | 0.760 | +0.002..+0.022 ✔ |
| …exact F1 | 0.200 | 0.183 | −0.038..−0.001 ✔ (lower) |
| Decontextualization (195, human), soft F1 | 0.525 | 0.543 | +0.010..+0.028 ✔ |
| …references resolved | 0.563 | 0.582 | −0.025..+0.064 |
| …wrong references (lower is better) | 0.077 | 0.044 | −0.073..+0.008 |
| Propositionizer test (500), soft F1 | 0.726 | 0.731 | +0.002..+0.008 ✔ |
| PropSegmEnt test (500, human-labelled), soft F1 | 0.741 | 0.738 | −0.011..+0.004 |
CLEF CheckThat! 2024 official test (318), checkworthy F1 / AUC |
0.867 / 0.979 | 0.876 / 0.978 | −0.019..+0.036 / −0.006..+0.003 |
CheckThat! dev (1,032) / ClaimBuster valid (2,353), checkworthy AUC |
0.996 / 0.945 | 0.995 / 0.945 | ties |
| chat templates held out / known v0.1 failure cases (8), soft F1 | 0.984 / 1.00 | 0.985 / 1.00 | |
fact-assessor claim cases (19), verifiable F1 |
1.00 | 1.00 |
v0.4 is better on real LLM answers (soft F1), Decontextualization and Wikipedia propositions, tied elsewhere, and puts a wrong name in place of a reference less often (0.077 → 0.044; 0.091 → 0.045 on the A100 run of the suite). Its atoms on Factcheck-Bench match the human wording exactly less often (−0.017, 30 texts). Atoms that end in a dangling function word ("… founded in 2003 by.") fall from 3.6% to 3.3%. One seed per run; the differences are small. Run details: EXPERIMENTS.md, run 5.
v0.2 vs v0.3 (at the v0.3 release), sentence-scoped decoder:
| Test set | v0.2 | v0.3 | paired 95% CI |
|---|---|---|---|
| synthetic chat/agent, v0.2's test (204), soft / exact F1 | 0.893 / 0.552 | 0.911 / 0.616 | |
| synthetic chat/agent, all of v0.2 test (306), soft / exact F1 | 0.876 / 0.464 | 0.894 / 0.533 | +0.012..+0.022 / +0.053..+0.086 |
…critic verifiable on their gold atoms, AUC |
0.960 | 0.983 | |
| Factcheck-Bench (30 real ChatGPT answers, human), soft / exact F1 | 0.744 / 0.166 | 0.748 / 0.200 | −0.014..+0.021 / +0.009..+0.058 |
…critic verifiable on their gold atoms, AUC (only 4 non-claims) |
0.825 | 0.896 | |
| Decontextualization (195, human): references resolved | 0.450 | 0.556 | |
| …pronouns (56) / noun phrases (97) | 0.62 / 0.36 | 0.75 / 0.45 | |
| chat templates with held-out patterns, facts and names, soft F1 | 0.984 | 0.984 | |
| known v0.1 failure cases (8), soft F1 | 1.000 | 1.000 | |
| Propositionizer test (500), soft F1 | 0.728 | 0.726 | −0.007..+0.001 |
| PropSegmEnt test (500, human-labelled), soft F1 | 0.741 | 0.741 | −0.007..+0.007 |
CLEF CheckThat! 2024 task 1 EN official test (315), checkworthy F1 / AUC |
0.866 / 0.981 | 0.867 / 0.979 | |
fact-assessor claim cases (19), verifiable F1 |
1.00 | 1.00 | |
| words not in the input (invented) | 0 | 0 |
v0.3 is better on chat, agent and real LLM text, on references and on the critic, and tied on Wikipedia text. Validation splits agree; the one dip is CheckThat! dev F1 (0.972 → 0.960).
"References resolved" is the share of human rewrites whose added words (the referent, "She" → "Marie Curie") appear together in one predicted atom of that sentence.
Earlier releases, with the decoder of their time:
| Test set | v0.1 | v0.2 |
|---|---|---|
| synthetic chat/agent texts (204), soft F1 | 0.774 | 0.897 |
| chat templates with held-out patterns, soft F1 | 0.525 | 0.988 |
| known v0.1 failure cases (8), soft F1 | 0.565 | 1.000 |
| PropSegmEnt test (500), soft F1 | 0.666 | 0.741 |
CheckThat! 2024 test, checkworthy F1 / AUC |
0.827 / 0.974 | 0.866 / 0.981 |
The share of reference atoms a span model can express at all is about 70% on GPT-4 propositions, so word-exact match on that set is low.
Limitations
References are the main weakness. v0.6 resolves 73% (v0.5: 70%) of the references in human rewrites, and 8.8% of its substitutions put a wrong earlier name in place of the reference (v0.5: 7.3%; v0.4: 4%). The words are all copied from the input, yet the atom can be false. Check atoms whose
partscontain an antecedent if this matters; usev0.4if a wrong name costs more than an unresolved reference.A resolved atom can come with its unresolved twin: "The study found that the drug reduced mortality by 20%." and "The drug reduced mortality by 20%.".
Long, list-like Wikipedia sentences sometimes give broken fragments ("Was Bill Todman Productions.").
The chat gains are measured on generated data. The templates and the AI-written synthetic set are cleaner than real user text. The 8 failure cases are real but few.
Over-generates on long scientific passages: about 15 atoms per passage where an LLM atomizer writes about 8. This was measured on v0.1 and not re-measured.
One reference resolves to one span. "The study" cannot become a description assembled from several places, and event references ("That loss raised sea level…") stay unresolved.
No reordering and no verb changes. "carrying" cannot become "carried". An opinion word placed before the fact ("the ridiculously expensive X costs…") cannot be separated.
The anchor threshold (0.35) controls how many atoms come out. Lower it for more atoms.
A speaker who names themselves is resolved from v0.6 on ("I am Paradox. … My lab is in Quorna." → "Paradox's lab is in Quorna."); v0.5 keeps "I" and "My". Neither resolves a third person introduced the same way ("He is Paradox. He won …" keeps "He"), and a verb is never changed ("Lira Vos have two patents").
About 1–5% of sentences get no atom (no word reaches the anchor threshold).
Long documents cost ~0.04 soft F1 (sentence windows).
Opinions phrased as product facts ("… display data in a visually appealing way") can get a high
verifiable.v0.6 is meant for the
atomizercode ≥ v0.3.0, whose decoder keeps capitals that do not start a sentence ("in May 2017") and never inserts a meaning-changing word (not, may, if, …); older code loads it but decodes differently.
Versions
Every version is a tag: pick it in the branch/tag menu above the files, or load it with
Atomizer.load("nishparadox/atomizer-gliner-small", revision="<tag>"). Releases are on main; a version with several
candidates keeps them as -rcN tags (none for v0.6: one run, released as is). Every tag is the small architecture;
models on other backbones or heads have their own repos (table at the top), each with its own version numbers. Until
2026-10-15 those models were candidates on this repo's dev branch (v0.6-rc1–rc4, v0.7-rc2, v0.7-rc3) and v0.6
itself was v0.7-rc1; the mapping is in the atomizer repo's EXPERIMENTS.md ("HF repos: one per architecture").
| Tag | Status | Training | Factcheck-Bench soft F1 | References resolved / wrong (Decontextualization) | PropSegmEnt | CheckThat! checkworthy F1 / AUC |
|---|---|---|---|---|---|---|
v0.6 |
release (main) |
one run from the base model on v0.5's data + WiCE, FActScore and synthetic v0.4; last step of 9,690 | 0.781 | 0.734 / 0.088 | 0.774 | 0.862 / 0.975 |
v0.5 |
release | one run from the base model, all data every epoch, small sets ×3; step 5,000 of 9,147 (= v0.5-rc2) |
0.753 | 0.703 / 0.073 | 0.757 | 0.865 / 0.978 |
v0.5-rc1 |
candidate | same data from v0.2, learning rates 2e-5 / 5e-5 / 5e-4; step 5,000 of 9,147 | 0.767 | 0.614 / 0.071 | 0.738 | 0.862 / 0.979 |
v0.4 |
release | stage 5: v0.2 → stage 4 data + 60 distractor texts, antecedent may pick "none"; step 2,500 of 3,330 (= v0.4-rc2) |
0.759 | 0.582 / 0.045 | 0.737 | 0.871 / 0.978 |
v0.4-rc1 |
candidate | same run, last step | 0.762 | 0.608 / 0.048 | 0.742 | 0.851 / 0.976 |
v0.4-rc3 |
candidate | same change, continuing v0.3 for 2 epochs; step 2,500 | 0.756 | 0.582 / 0.056 | 0.751 | 0.863 / 0.975 |
v0.3 |
release | stage 4: v0.2 → human data (Factcheck-Bench, Decontextualization) + synthetic v0.2 | 0.748 | 0.556 / 0.091 | 0.741 | 0.867 / 0.979 |
v0.3-rc1 |
not released | first try at stage 4 (M4): stopped splitting sentences, critic regressed | 0.733 | – | 0.696 | 0.867 / 0.981 |
v0.2 |
release | stage 3: chat, hedges, opinions; synthetic v0.1 | 0.744 | 0.450 / – | 0.741 | 0.866 / 0.981 |
v0.1 |
release | stages 1–2: Wikipedia atomizer + critic | – | – | 0.666 | 0.827 / 0.974 |
"Wrong" is the share of spans put in place of a reference that no human atom contains. Numbers in this table come from the A100 run of
the test suite, so they differ slightly from the laptop numbers above. Among the v0.4 candidates (all from the same
change), v0.4-rc2 had the best record across all test sets: 8 significant wins and 3 losses in pairwise
comparisons, against 6 / 3 for rc1 and 8 / 6 for rc3. Between the v0.5 candidates, v0.5-rc2 won 5 comparisons
and lost 2 against rc1, and won 4 / lost 2 against v0.4 (rc1: 3 / 0).
License
The weights are released under CC-BY-4.0. The atomizer code is MIT. Every tag is fine-tuned from
gliner-community/gliner_small-v2.5 (Apache-2.0).
The training data has its own terms, which you should check for your use:
- Propositionizer labels were generated with GPT-4 by the dataset's authors (OpenAI terms).
- ClaimBuster is CC-BY-SA 4.0.
- CLEF CheckThat! 2024 is under the CLEF lab's terms.
atomizer-chat-syntheticwas written by an AI model (Claude, by Anthropic).- Factcheck-Bench is Apache-2.0.
- Decontextualization (Choi et al. 2021) is Wikipedia text with human rewrites; see the dataset's own terms.
- WiCE annotations are ODC-BY 1.0 (text from Wikipedia and Common Crawl); FActScore's data terms are not stated, and it is not redistributed (v0.6 only).
Model tree for nishparadox/atomizer-gliner-small
Base model
gliner-community/gliner_small-v2.5