Publish Premove ITN v0.2.0 model
Browse files- README.md +43 -153
- model.safetensors +1 -1
- provenance.json +38 -11
README.md
CHANGED
|
@@ -1,178 +1,68 @@
|
|
| 1 |
---
|
| 2 |
library_name: premove-itn
|
| 3 |
-
language:
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
- microsoft/deberta-v3-large
|
| 7 |
-
tags:
|
| 8 |
-
- inverse-text-normalization
|
| 9 |
-
- text-normalization
|
| 10 |
-
- speech-processing
|
| 11 |
-
- voice-agents
|
| 12 |
-
- structured-prediction
|
| 13 |
-
- candidate-ranking
|
| 14 |
-
- safetensors
|
| 15 |
-
- custom-code
|
| 16 |
license: mit
|
| 17 |
---
|
| 18 |
|
| 19 |
-
# Premove ITN v0.
|
| 20 |
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
`premove-itn` Python package. It turns spoken-form ASR text into structured
|
| 24 |
-
written text:
|
| 25 |
|
| 26 |
-
|
| 27 |
-
call me at four thirty → call me at 04:30
|
| 28 |
-
the total is twenty dollars → the total is $20
|
| 29 |
-
```
|
| 30 |
-
|
| 31 |
-
Deterministic Rust realizers propose valid written forms. A
|
| 32 |
-
DeBERTa-v3-large contextual scorer uses the complete sentence to score those
|
| 33 |
-
candidates, and an exact decoder selects compatible, non-overlapping edits.
|
| 34 |
-
|
| 35 |
-
This repository contains the frozen, inference-only v0.1.0 model artifact. It
|
| 36 |
-
does not contain optimizer state, scheduler state, training counters, training
|
| 37 |
-
data, or evaluation rows. Source code and retained evaluation evidence are in
|
| 38 |
-
[`premove-ai/premove-itn`](https://github.com/premove-ai/premove-itn).
|
| 39 |
-
|
| 40 |
-
## Loading the model
|
| 41 |
-
|
| 42 |
-
This is a custom candidate-scoring architecture. Do not load it with
|
| 43 |
-
`AutoModel.from_pretrained()`.
|
| 44 |
|
| 45 |
```python
|
| 46 |
from premove_itn import PremoveITN
|
| 47 |
|
| 48 |
-
itn = PremoveITN.from_pretrained()
|
| 49 |
-
print(itn.normalize("
|
| 50 |
-
#
|
| 51 |
```
|
| 52 |
|
| 53 |
-
|
| 54 |
-
release with `pip install premove-itn==0.1.0`. Create one
|
| 55 |
-
`PremoveITN` instance and reuse it; model initialization is expensive compared
|
| 56 |
-
with warm normalization.
|
| 57 |
-
|
| 58 |
-
`device="auto"` selects CUDA when available, then Apple MPS, then CPU. The
|
| 59 |
-
Release wheels are validated on macOS 14+ arm64 and `manylinux_2_28` x86_64
|
| 60 |
-
for Python 3.11–3.13. Real frozen-model inference is validated on Apple
|
| 61 |
-
Silicon MPS and Linux CPU. Other environments require release validation. The source repository retains the current
|
| 62 |
-
[platform support matrix](https://github.com/premove-ai/premove-itn/blob/main/docs/platform-support.md).
|
| 63 |
-
|
| 64 |
-
## Architecture
|
| 65 |
-
|
| 66 |
-
```text
|
| 67 |
-
Spoken ASR text
|
| 68 |
-
↓
|
| 69 |
-
deterministic Rust candidates
|
| 70 |
-
↓
|
| 71 |
-
DeBERTa-v3-large contextual scores
|
| 72 |
-
↓
|
| 73 |
-
exact maximum-score decoder
|
| 74 |
-
↓
|
| 75 |
-
written transcript
|
| 76 |
-
```
|
| 77 |
-
|
| 78 |
-
The scorer has 435,594,145 parameters. The artifact contains the complete
|
| 79 |
-
trained state in `model.safetensors`, the pinned DeBERTa configuration, and the
|
| 80 |
-
tokenizer files required by the release.
|
| 81 |
-
|
| 82 |
-
Supported candidate kinds are `DIGIT_SEQUENCE`, `CARDINAL`, `TIME`, `DATE`,
|
| 83 |
-
`MONEY`, `DECIMAL`, `PHONE`, `ELECTRONIC`, `MEASUREMENT`, `ORDINAL`,
|
| 84 |
-
`PUNCTUATION`, `WHITELIST`, and `WORD`.
|
| 85 |
-
|
| 86 |
-
## First Evaluation
|
| 87 |
|
| 88 |
-
The
|
| 89 |
-
|
| 90 |
-
|
|
|
|
| 91 |
|
| 92 |
-
##
|
| 93 |
|
| 94 |
-
|
|
| 95 |
-
| --- | ---: | ---: |
|
| 96 |
-
|
|
| 97 |
-
|
|
| 98 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 99 |
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
| **Premove ITN** | **89.70%** | **40.53%** | 56.49 ms |
|
| 105 |
-
| Thutmose | 59.39% | 22.13% | 15.98 ms |
|
| 106 |
-
| text-processing-rs | 55.79% | 16.53% | 0.14 ms |
|
| 107 |
-
|
| 108 |
-
Premove ITN led measured semantic accuracy overall and on the 400 dedicated
|
| 109 |
-
voice-agent rows. It did not lead latency.
|
| 110 |
-
|
| 111 |
-
Latency used sequential batch-one requests on an Apple M4 MacBook Air with
|
| 112 |
-
MPS, an optimized Rust extension, and eight Rayon workers. Models were loaded
|
| 113 |
-
and warmed before request latency was measured. Download and initialization
|
| 114 |
-
are excluded. The Premove ITN timing used the release Rust extension. The backend
|
| 115 |
-
evaluation was blind: each backend received only transcript text.
|
| 116 |
-
Independent human gold adjudication is a separate task and remains pending.
|
| 117 |
-
|
| 118 |
-
See the
|
| 119 |
-
[`First Evaluation report`](https://github.com/premove-ai/premove-itn/blob/main/eval/voice_agent_itn/results/first-evaluation/REPORT.md)
|
| 120 |
-
and
|
| 121 |
-
[`detailed tables`](https://github.com/premove-ai/premove-itn/blob/main/eval/voice_agent_itn/results/first-evaluation/DETAILS.md).
|
| 122 |
-
|
| 123 |
-
## Intended use
|
| 124 |
-
|
| 125 |
-
Use Premove ITN for English voice-agent transcripts in which numbers, dates,
|
| 126 |
-
times, money, phone values, identifiers, URLs, and related structured values
|
| 127 |
-
need sentence-level disambiguation. The runtime receives only transcript text.
|
| 128 |
-
Candidate metadata is generated internally.
|
| 129 |
-
|
| 130 |
-
## Model lifecycle
|
| 131 |
-
|
| 132 |
-
- The first use downloads about 1.6 GB; duration depends on the network.
|
| 133 |
-
- Cached initialization takes several seconds on the tested system.
|
| 134 |
-
- Warm normalization averaged 56.49 ms with the retained release Rust build in
|
| 135 |
-
the MPS benchmark.
|
| 136 |
-
- Services and transcript streams should keep one normalizer resident.
|
| 137 |
|
| 138 |
## Limitations
|
| 139 |
|
| 140 |
-
-
|
| 141 |
-
|
| 142 |
-
-
|
| 143 |
-
|
| 144 |
-
- The
|
| 145 |
-
-
|
| 146 |
-
REFERENCE_ID, and VERSION.
|
| 147 |
-
- Independent human gold adjudication and broader contamination checks are
|
| 148 |
-
outside the v0.1.0 release gate. The backend evaluation itself was blind.
|
| 149 |
-
- CUDA, Windows, macOS Intel, Linux ARM64, and other accelerators are not
|
| 150 |
-
validated v0.1.0 support claims.
|
| 151 |
|
| 152 |
-
## Release identity
|
| 153 |
|
| 154 |
-
- Artifact version: `v0.
|
| 155 |
-
-
|
| 156 |
-
- Required package version: `0.1.0`
|
| 157 |
- Hub repository: `premove-ai/premove-itn`
|
| 158 |
-
- Immutable model commit: `80bda5e2e1fe9542aa628597090242df57c1a157`
|
| 159 |
- Base model: `microsoft/deberta-v3-large`
|
| 160 |
-
- Base
|
| 161 |
-
-
|
| 162 |
-
|
| 163 |
-
The package pins the immutable model commit and verifies its release metadata,
|
| 164 |
-
base-model identity, and model digest before inference. Full training
|
| 165 |
-
composition and checkpoint selection evidence are in the
|
| 166 |
-
[`production model record`](https://github.com/premove-ai/premove-itn/blob/main/docs/model-provenance.md).
|
| 167 |
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
Premove ITN source code and model weights are MIT licensed. The scorer uses
|
| 171 |
-
[`microsoft/deberta-v3-large`](https://huggingface.co/microsoft/deberta-v3-large)
|
| 172 |
-
at the revision above. Its architecture derives from the
|
| 173 |
-
[`DeBERTaV3` paper](https://arxiv.org/abs/2111.09543).
|
| 174 |
-
|
| 175 |
-
The Rust realization layer uses
|
| 176 |
-
[`text-processing-rs`](https://github.com/FluidInference/text-processing-rs),
|
| 177 |
-
which is Apache-2.0 licensed. Required notices are retained in the source
|
| 178 |
-
repository.
|
|
|
|
| 1 |
---
|
| 2 |
library_name: premove-itn
|
| 3 |
+
language: [en]
|
| 4 |
+
base_model: [microsoft/deberta-v3-large]
|
| 5 |
+
tags: [inverse-text-normalization, speech-processing, voice-agents]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6 |
license: mit
|
| 7 |
---
|
| 8 |
|
| 9 |
+
# Premove ITN v0.2.0
|
| 10 |
|
| 11 |
+
This release updates the contextual candidate scorer used by `premove-itn`.
|
| 12 |
+
The deterministic Rust candidate generators and exact decoder are unchanged.
|
|
|
|
|
|
|
| 13 |
|
| 14 |
+
Load it through the matching Python package:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 15 |
|
| 16 |
```python
|
| 17 |
from premove_itn import PremoveITN
|
| 18 |
|
| 19 |
+
itn = PremoveITN.from_pretrained(revision="v0.2.0")
|
| 20 |
+
print(itn.normalize("meet me at two thirty"))
|
| 21 |
+
# meet me at 02:30
|
| 22 |
```
|
| 23 |
|
| 24 |
+
## Training
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
|
| 26 |
+
The v0.1.0 scorer was adapted for three epochs on 7,440 controlled,
|
| 27 |
+
single-collision TIME-versus-identifier records. No replay or dual-collision
|
| 28 |
+
examples were used. Epoch 3 was selected using a separate 200-row development
|
| 29 |
+
set before any frozen test was inspected.
|
| 30 |
|
| 31 |
+
## Results
|
| 32 |
|
| 33 |
+
| Metric | v0.1.0 | v0.2.0 |
|
| 34 |
+
| --- | ---: | ---: |
|
| 35 |
+
| Context record | 51.2% | **86.2%** |
|
| 36 |
+
| Counterfactual pair | 6.4% | **72.4%** |
|
| 37 |
+
| Identifier | 29.6% | **98.0%** |
|
| 38 |
+
| Time | 72.8% | **74.4%** |
|
| 39 |
+
| Dual span | 45.0% | **96.0%** |
|
| 40 |
+
| Dual sentence exact | 16.0% | **92.0%** |
|
| 41 |
+
| Broad strict exact | 40.5% | **43.7%** |
|
| 42 |
|
| 43 |
+
The contextual and dual benchmarks are synthetic controlled evaluations. They
|
| 44 |
+
do not estimate production voice-agent accuracy. The broad benchmark gained 86
|
| 45 |
+
new exact rows and lost 38 previously exact rows. Localized losses were most
|
| 46 |
+
visible in ORDINAL, MONEY, URL, and DIGIT_SEQUENCE.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 47 |
|
| 48 |
## Limitations
|
| 49 |
|
| 50 |
+
- TIME recall on the controlled single-collision test is 74.4%, substantially
|
| 51 |
+
below the 98.0% identifier result.
|
| 52 |
+
- The model is English-only and requires the `premove-itn` candidate graph and
|
| 53 |
+
decoder. It is not a generic Transformers model.
|
| 54 |
+
- The approximately 435.6M-parameter scorer has a large download and
|
| 55 |
+
multi-second initialization cost.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 56 |
|
| 57 |
+
## Release identity
|
| 58 |
|
| 59 |
+
- Artifact version: `v0.2.0`
|
| 60 |
+
- Required package version: `0.2.0`
|
|
|
|
| 61 |
- Hub repository: `premove-ai/premove-itn`
|
|
|
|
| 62 |
- Base model: `microsoft/deberta-v3-large`
|
| 63 |
+
- Base revision: `64a8c8eab3e352a784c658aef62be1662607476f`
|
| 64 |
+
- Source checkpoint SHA-256: `10a338d57b6d619f52259a58aca210ecb78f47de44baf0c25477a8f5b06b5d39`
|
| 65 |
+
- Model SHA-256: `0b6f36aa32311d0c495e1c5307d5e34463e52b4dc283ab9030bc2f54e1bf1152`
|
|
|
|
|
|
|
|
|
|
|
|
|
| 66 |
|
| 67 |
+
Source and evaluation evidence are available from
|
| 68 |
+
[`premove-ai/premove-itn`](https://github.com/premove-ai/premove-itn).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
model.safetensors
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
size 1742425916
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:0b6f36aa32311d0c495e1c5307d5e34463e52b4dc283ab9030bc2f54e1bf1152
|
| 3 |
size 1742425916
|
provenance.json
CHANGED
|
@@ -1,23 +1,36 @@
|
|
| 1 |
{
|
| 2 |
"architecture": "premove-candidate-scorer-v1",
|
| 3 |
-
"artifact_sha256": "
|
| 4 |
"artifact_sha256_definition": "SHA-256 of model.safetensors",
|
| 5 |
-
"artifact_version": "v0.
|
| 6 |
"base_model": "microsoft/deberta-v3-large",
|
| 7 |
"base_model_revision": "64a8c8eab3e352a784c658aef62be1662607476f",
|
| 8 |
-
"benchmark_checkpoint_sha256": "
|
| 9 |
-
"
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
"redistribution": {
|
| 14 |
"base_model_license": "MIT (as listed by microsoft/deberta-v3-large)",
|
| 15 |
"base_model_weights_included": false,
|
| 16 |
"project_license": "MIT",
|
| 17 |
"tokenizer_files_included": true
|
| 18 |
},
|
| 19 |
-
"
|
| 20 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
"supported_span_kinds": [
|
| 22 |
"DIGIT_SEQUENCE",
|
| 23 |
"CARDINAL",
|
|
@@ -34,8 +47,22 @@
|
|
| 34 |
"WORD"
|
| 35 |
],
|
| 36 |
"tokenizer_revision": "64a8c8eab3e352a784c658aef62be1662607476f",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
"training_lineage": {
|
| 38 |
-
"
|
| 39 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
| 40 |
}
|
| 41 |
}
|
|
|
|
| 1 |
{
|
| 2 |
"architecture": "premove-candidate-scorer-v1",
|
| 3 |
+
"artifact_sha256": "0b6f36aa32311d0c495e1c5307d5e34463e52b4dc283ab9030bc2f54e1bf1152",
|
| 4 |
"artifact_sha256_definition": "SHA-256 of model.safetensors",
|
| 5 |
+
"artifact_version": "v0.2.0",
|
| 6 |
"base_model": "microsoft/deberta-v3-large",
|
| 7 |
"base_model_revision": "64a8c8eab3e352a784c658aef62be1662607476f",
|
| 8 |
+
"benchmark_checkpoint_sha256": "10a338d57b6d619f52259a58aca210ecb78f47de44baf0c25477a8f5b06b5d39",
|
| 9 |
+
"benchmark_results": {
|
| 10 |
+
"broad_strict_exact_accuracy": 0.43733333333333335,
|
| 11 |
+
"context_pair_accuracy": 0.724,
|
| 12 |
+
"context_record_accuracy": 0.862,
|
| 13 |
+
"dual_sentence_exact_accuracy": 0.92,
|
| 14 |
+
"dual_span_accuracy": 0.96,
|
| 15 |
+
"identifier_accuracy": 0.98,
|
| 16 |
+
"time_accuracy": 0.744
|
| 17 |
+
},
|
| 18 |
+
"hub_repository": "premove-ai/premove-itn",
|
| 19 |
+
"hub_revision": "v0.2.0",
|
| 20 |
+
"package_version": "0.2.0",
|
| 21 |
+
"production_manifest": "data/models/time_identifier_targeted_run_1/manifest.json",
|
| 22 |
"redistribution": {
|
| 23 |
"base_model_license": "MIT (as listed by microsoft/deberta-v3-large)",
|
| 24 |
"base_model_weights_included": false,
|
| 25 |
"project_license": "MIT",
|
| 26 |
"tokenizer_files_included": true
|
| 27 |
},
|
| 28 |
+
"release_commit": null,
|
| 29 |
+
"release_status": "candidate",
|
| 30 |
+
"source_checkpoint": "dist/time_identifier_targeted_run_1/epoch_3.pt",
|
| 31 |
+
"source_checkpoint_sha256": "10a338d57b6d619f52259a58aca210ecb78f47de44baf0c25477a8f5b06b5d39",
|
| 32 |
+
"source_commit": "d8240652fe92906f4fdf5aea280acf78e4e24221",
|
| 33 |
+
"source_worktree_dirty": false,
|
| 34 |
"supported_span_kinds": [
|
| 35 |
"DIGIT_SEQUENCE",
|
| 36 |
"CARDINAL",
|
|
|
|
| 47 |
"WORD"
|
| 48 |
],
|
| 49 |
"tokenizer_revision": "64a8c8eab3e352a784c658aef62be1662607476f",
|
| 50 |
+
"training_config": {
|
| 51 |
+
"batch_size": 8,
|
| 52 |
+
"dual_collision_rows": 0,
|
| 53 |
+
"epochs": 3,
|
| 54 |
+
"learning_rate": 5e-06,
|
| 55 |
+
"replay_rows": 0,
|
| 56 |
+
"rows": 7440,
|
| 57 |
+
"seed": 20260914,
|
| 58 |
+
"weight_decay": 0.01
|
| 59 |
+
},
|
| 60 |
"training_lineage": {
|
| 61 |
+
"frozen_tests_used_for_selection": false,
|
| 62 |
+
"selected_epoch": 3,
|
| 63 |
+
"selection_basis": "dev_only",
|
| 64 |
+
"starting_artifact_sha256": "119c0f19767b61446e04da1f8f01a001edf97a47a66965e7146db2483b4937a1",
|
| 65 |
+
"training_data_sha256": "ae5ec34e9ff02685212ef6d6702003b51161ad439d6bc2301b55a98f7392ff95",
|
| 66 |
+
"training_rows": 7440
|
| 67 |
}
|
| 68 |
}
|