Text Classification
Transformers
Safetensors
English
deberta-v2
digital-humanities
historical-text
ai-text-detection
deberta-v3
chronologic
Eval Results (legacy)
text-embeddings-inference
Instructions to use chronologic/chronologic-authenticity-deberta with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use chronologic/chronologic-authenticity-deberta with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-classification", model="chronologic/chronologic-authenticity-deberta")# pip install -U transformers accelerate # Load model directly from transformers import AutoTokenizer, AutoModelForSequenceClassification tokenizer = AutoTokenizer.from_pretrained("chronologic/chronologic-authenticity-deberta") model = AutoModelForSequenceClassification.from_pretrained("chronologic/chronologic-authenticity-deberta", device_map="auto") - Notebooks
- Google Colab
- Kaggle
Add model card
Browse files
README.md
CHANGED
|
@@ -1,3 +1,240 @@
|
|
| 1 |
---
|
| 2 |
license: mit
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
license: mit
|
| 3 |
+
base_model: microsoft/deberta-v3-large
|
| 4 |
+
library_name: transformers
|
| 5 |
+
language: en
|
| 6 |
+
pipeline_tag: text-classification
|
| 7 |
+
tags:
|
| 8 |
+
- digital-humanities
|
| 9 |
+
- historical-text
|
| 10 |
+
- ai-text-detection
|
| 11 |
+
- deberta-v3
|
| 12 |
+
- chronologic
|
| 13 |
+
metrics:
|
| 14 |
+
- accuracy
|
| 15 |
+
- f1
|
| 16 |
+
- roc_auc
|
| 17 |
+
widget:
|
| 18 |
+
- text: "One evening of late summer, before the nineteenth century had reached one-third of its span, a young man and woman, the latter carrying a child, were approaching the large village of Weydon-Priors, in Upper Wessex, on foot."
|
| 19 |
+
example_title: "Authentic (Hardy, 1886)"
|
| 20 |
+
- text: "The fog clung to the cobblestones like a shroud, and I could not shake the feeling that the very gaslights were watching my every step as I hurried toward the old manor."
|
| 21 |
+
example_title: "Pastiche"
|
| 22 |
+
model-index:
|
| 23 |
+
- name: chronologic-authenticity-deberta
|
| 24 |
+
results:
|
| 25 |
+
- task:
|
| 26 |
+
type: text-classification
|
| 27 |
+
name: Authentic period prose vs. LLM imitation
|
| 28 |
+
dataset:
|
| 29 |
+
type: chronologic-authenticity-test
|
| 30 |
+
name: Held-out test split (grouped by volume and author)
|
| 31 |
+
metrics:
|
| 32 |
+
- type: accuracy
|
| 33 |
+
value: 0.881
|
| 34 |
+
- type: f1
|
| 35 |
+
value: 0.875
|
| 36 |
+
- type: roc_auc
|
| 37 |
+
value: 0.941
|
| 38 |
+
- task:
|
| 39 |
+
type: text-classification
|
| 40 |
+
name: Authentic period prose vs. LLM imitation
|
| 41 |
+
dataset:
|
| 42 |
+
type: chronologic-authenticity-holdout
|
| 43 |
+
name: Cross-generator holdout (5 unseen models, length-matched)
|
| 44 |
+
metrics:
|
| 45 |
+
- type: accuracy
|
| 46 |
+
value: 0.901
|
| 47 |
+
- type: f1
|
| 48 |
+
value: 0.901
|
| 49 |
+
- type: roc_auc
|
| 50 |
+
value: 0.964
|
| 51 |
---
|
| 52 |
+
|
| 53 |
+
# chronologic-authenticity-deberta
|
| 54 |
+
|
| 55 |
+
A DeBERTa-v3-large classifier that separates authentic English prose from 1831–1930
|
| 56 |
+
from language-model imitation of it. It is one of the two style instruments in the
|
| 57 |
+
[Chronologic-EN](https://github.com/Historical-AI-Lab/Chronologic-EN) benchmark.
|
| 58 |
+
The companion model is
|
| 59 |
+
[chronologic-date-deberta](https://huggingface.co/chronologic/chronologic-date-deberta).
|
| 60 |
+
|
| 61 |
+
**What the output means.** The model has a single logit. `sigmoid(logit)` is
|
| 62 |
+
P(synthetic), the probability that the passage was written by a language model. A low
|
| 63 |
+
score means the passage reads as genuine period prose. A high score means it reads as
|
| 64 |
+
machine imitation. The inference widget shows this as the `synthetic` label.
|
| 65 |
+
|
| 66 |
+
## Intended use and out-of-scope use
|
| 67 |
+
|
| 68 |
+
This model is a **model-level benchmark instrument**. It measures how far a language
|
| 69 |
+
model's answers, taken together, sit from matched authentic prose. It is **not** a
|
| 70 |
+
passage-level AI-text detector. Don't use it to decide whether a single document, essay
|
| 71 |
+
or submission was machine-written. Single-passage scores are noisy. It flags about 9% of
|
| 72 |
+
genuine period prose as synthetic in some collections. And single-passage scoring is
|
| 73 |
+
exactly where fine-tuned models slip through (see Limitations).
|
| 74 |
+
|
| 75 |
+
**Raw outputs are not Chronologic scores.** The benchmark never reads this probability
|
| 76 |
+
as a verdict. It turns the probability into a percentile against a reference corpus of
|
| 77 |
+
authentic passages, and that step needs the code in the GitHub repository and the scored
|
| 78 |
+
reference corpus (the `CHRONOLOGIC_DATA` directory). A number you compute from this
|
| 79 |
+
model alone can't be compared with published Authenticity Fidelity scores.
|
| 80 |
+
|
| 81 |
+
## How the benchmark uses it
|
| 82 |
+
|
| 83 |
+
Each answer's detector output is converted to a percentile among authentic passages
|
| 84 |
+
from within ±10 years of the question's target date, in the same length bin, scored by
|
| 85 |
+
the same frozen model. A model writing indistinguishably from period prose would
|
| 86 |
+
produce uniform percentiles. Authenticity Fidelity (0–100) is the mean percentile,
|
| 87 |
+
rescaled against the value that resampled authentic passages themselves produce
|
| 88 |
+
(a pseudo-model baseline). So 100 means indistinguishable from genuine prose of the
|
| 89 |
+
target period.
|
| 90 |
+
|
| 91 |
+
## Training data
|
| 92 |
+
|
| 93 |
+
- **Positives:** passages of English prose published 1831–1930, drawn from the same
|
| 94 |
+
volume roster as [chronologic-date-deberta](https://huggingface.co/chronologic/chronologic-date-deberta),
|
| 95 |
+
whose card describes the sources (IDI, COHA, the Chicago Novel Corpus and others).
|
| 96 |
+
- **Negatives** are elicited *from the positives themselves*, so topic and content stay
|
| 97 |
+
roughly constant and style carries the signal. There are five elicitation modalities:
|
| 98 |
+
- 40% infill of a gap between real bookending sentences
|
| 99 |
+
- 20% continuation of a real passage
|
| 100 |
+
- 10% paraphrase
|
| 101 |
+
- 20% generation constrained by a title, a date and a one-sentence summary
|
| 102 |
+
- 10% few-shot imitation
|
| 103 |
+
- The pool holds 29,681 newly elicited generations. It also reuses earlier infill
|
| 104 |
+
generations and adds generations from Talkie, a model trained only on pre-1931 text,
|
| 105 |
+
run locally. Generators come from a deliberately diverse set of model families,
|
| 106 |
+
including base models.
|
| 107 |
+
- **Normalization.** Both classes go through the same typography folding (quotes,
|
| 108 |
+
dashes, whitespace), after side-specific cleaning: OCR repair on the historical side,
|
| 109 |
+
and Markdown/JSON stripping on the generated side. Without this the classifier learns
|
| 110 |
+
typography rather than style.
|
| 111 |
+
- **Length-matched.** A classifier given passage length alone scores 0.4875, which is
|
| 112 |
+
chance.
|
| 113 |
+
- **Size:** 58,006 passages, 29,003 per class. The splits are 46,644 train, 5,462
|
| 114 |
+
validation and 5,900 test, grouped by source volume and by author.
|
| 115 |
+
- **Cross-generator holdout.** Five models were held out of all three splits before
|
| 116 |
+
training: `gemini-3.1-pro-preview`, `gemma-4-31b-it`, `cohere/command-a`,
|
| 117 |
+
`amazon/nova-pro-v1` and `openai/gpt-5.6-sol`. Of their 1,854 frozen generations,
|
| 118 |
+
1,766 survive length-matching and are paired with 1,766 authentic passages (n = 3,532).
|
| 119 |
+
Three of the five come from families absent from training entirely. So the transfer
|
| 120 |
+
claim is "held-out models, mostly held-out families".
|
| 121 |
+
- The benchmark's reserved source volumes are excluded from training.
|
| 122 |
+
- The training text is not redistributed, because some sources are still in copyright.
|
| 123 |
+
|
| 124 |
+
## Training procedure
|
| 125 |
+
|
| 126 |
+
- `microsoft/deberta-v3-large` with `num_labels=1` and `BCEWithLogitsLoss`. It is a
|
| 127 |
+
one-logit binary classifier, not a regressor.
|
| 128 |
+
- 3 epochs, batch size 32, learning rate 2e-5, weight decay 0.01, warmup ratio 0.1,
|
| 129 |
+
max length 256 tokens.
|
| 130 |
+
- The checkpoint was kept at epoch 2 by validation accuracy (val accuracy 0.876, AUROC
|
| 131 |
+
0.936).
|
| 132 |
+
|
| 133 |
+
## Evaluation
|
| 134 |
+
|
| 135 |
+
| Evaluation | n | Accuracy | F1 | AUROC |
|
| 136 |
+
|---|---|---|---|---|
|
| 137 |
+
| Held-out test split | 5,900 | 0.881 | 0.875 | 0.941 |
|
| 138 |
+
| Cross-generator holdout, length-matched | 3,532 | 0.901 | 0.901 | 0.964 |
|
| 139 |
+
|
| 140 |
+
Accuracy on the test split's negatives, by elicitation modality:
|
| 141 |
+
|
| 142 |
+
| Modality | n | Accuracy |
|
| 143 |
+
|---|---|---|
|
| 144 |
+
| Constrained generation | 777 | 0.988 |
|
| 145 |
+
| Infill | 1,140 | 0.890 |
|
| 146 |
+
| Few-shot | 210 | 0.871 |
|
| 147 |
+
| Paraphrase | 304 | 0.694 |
|
| 148 |
+
| **Continuation** | 486 | **0.586** |
|
| 149 |
+
|
| 150 |
+
Accuracy on the test split's negatives, for selected generator families:
|
| 151 |
+
|
| 152 |
+
| Family | n | Accuracy |
|
| 153 |
+
|---|---|---|
|
| 154 |
+
| openai | 320 | 0.741 |
|
| 155 |
+
| meta-llama | 203 | 0.660 |
|
| 156 |
+
| **talkie** | 97 | **0.227** |
|
| 157 |
+
| **nousresearch** | 35 | **0.114** |
|
| 158 |
+
|
| 159 |
+
A check that the detector is not reading vocabulary coverage instead of style: the
|
| 160 |
+
within-class rank correlation between out-of-vocabulary rate and P(synthetic) is near
|
| 161 |
+
zero (ρ = −0.06 and −0.12).
|
| 162 |
+
|
| 163 |
+
## Limitations and biases
|
| 164 |
+
|
| 165 |
+
- **Continuation and paraphrase are hard.** The detector is much better at recognising
|
| 166 |
+
text written to a prompt than text that continues or rewrites a real passage. The
|
| 167 |
+
headline accuracy reflects the modality mix of the training negatives.
|
| 168 |
+
- **Models trained on period text slip through.** Talkie, which is trained only on
|
| 169 |
+
pre-1931 text, is caught 23% of the time, and NousResearch fine-tunes 11% of the time
|
| 170 |
+
(n = 35). Per-passage detection is exactly where such models evade it.
|
| 171 |
+
- **False positives on genuine prose.** About 9% of authentic passages are flagged as
|
| 172 |
+
synthetic in the two large IDI collections, and 2–6% in the smaller COHA and fiction
|
| 173 |
+
samples.
|
| 174 |
+
- **Scope.** The model is trained on English prose from 1831–1930 and passages of
|
| 175 |
+
benchmark-answer length. Outside that period, language or length range its outputs
|
| 176 |
+
have not been validated.
|
| 177 |
+
- **Typography.** The training text was normalized. Unnormalized input (curly quotes,
|
| 178 |
+
em-dashes, line breaks) is out of distribution. Normalize first (see Usage).
|
| 179 |
+
|
| 180 |
+
## A note on Goodhart's law
|
| 181 |
+
|
| 182 |
+
Publishing the judges makes them possible to train against. Any model trained, tuned,
|
| 183 |
+
RL'd or selected against these instruments, or against models derived from them, no
|
| 184 |
+
longer has valid Chronologic style scores. If you report Chronologic style scores for
|
| 185 |
+
such a model, say that it was optimized against the judges.
|
| 186 |
+
|
| 187 |
+
## Usage
|
| 188 |
+
|
| 189 |
+
**(a) Pipeline.** Quick inspection only; this skips the normalization the model was
|
| 190 |
+
trained with.
|
| 191 |
+
|
| 192 |
+
```python
|
| 193 |
+
from transformers import pipeline
|
| 194 |
+
clf = pipeline("text-classification", model="chronologic/chronologic-authenticity-deberta")
|
| 195 |
+
clf("It was a dark and stormy night; the rain fell in torrents.")
|
| 196 |
+
# [{'label': 'synthetic', 'score': ...}] score = P(synthetic)
|
| 197 |
+
```
|
| 198 |
+
|
| 199 |
+
**(b) Explicit code.** Normalize first, using `normalize_typography` from
|
| 200 |
+
`stylejudge/normalize.py` in the [GitHub repository](https://github.com/Historical-AI-Lab/Chronologic-EN)
|
| 201 |
+
(standard library only):
|
| 202 |
+
|
| 203 |
+
```python
|
| 204 |
+
import sys, torch
|
| 205 |
+
from transformers import AutoTokenizer, AutoModelForSequenceClassification
|
| 206 |
+
|
| 207 |
+
sys.path.insert(0, "Chronologic-EN/stylejudge") # path to your clone
|
| 208 |
+
from normalize import normalize_typography
|
| 209 |
+
|
| 210 |
+
repo = "chronologic/chronologic-authenticity-deberta"
|
| 211 |
+
tok = AutoTokenizer.from_pretrained(repo)
|
| 212 |
+
model = AutoModelForSequenceClassification.from_pretrained(repo).eval()
|
| 213 |
+
|
| 214 |
+
texts = [normalize_typography(t) for t in ["...your passages..."]]
|
| 215 |
+
enc = tok(texts, padding=True, truncation=True, max_length=256, return_tensors="pt")
|
| 216 |
+
with torch.no_grad():
|
| 217 |
+
p_synthetic = torch.sigmoid(model(**enc).logits.squeeze(-1))
|
| 218 |
+
```
|
| 219 |
+
|
| 220 |
+
**(c) Benchmark scoring.** For real Chronologic scores, use `stylejudge/score_style.py`
|
| 221 |
+
(or the full `modelasjudge/run_pipeline.py`) from the GitHub repository. These apply the
|
| 222 |
+
percentile layer against the reference corpus.
|
| 223 |
+
|
| 224 |
+
## Citation
|
| 225 |
+
|
| 226 |
+
Preprint forthcoming.
|
| 227 |
+
|
| 228 |
+
```bibtex
|
| 229 |
+
@misc{chronologic2026,
|
| 230 |
+
title = {Chronologic-EN: Measuring the Ability to Represent the Past},
|
| 231 |
+
author = {Underwood, Ted and Qiu, Ziliang and Griebel, Sarah and
|
| 232 |
+
Nelson, Laura K. and Roland, Teddy and Shang, Wenyi and
|
| 233 |
+
Wilkens, Matthew},
|
| 234 |
+
year = {2026}
|
| 235 |
+
}
|
| 236 |
+
```
|
| 237 |
+
|
| 238 |
+
## Contact
|
| 239 |
+
|
| 240 |
+
Ted Underwood, University of Illinois Urbana-Champaign, tunder@illinois.edu.
|