File size: 9,506 Bytes
0b88048
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dc493fc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
725454c
dc493fc
 
 
 
 
 
 
 
 
 
 
 
 
 
725454c
dc493fc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
---
language:
- en
- si
- ta
license: cc-by-4.0
base_model: sentence-transformers/LaBSE
pipeline_tag: text-classification
tags:
- banking
- priority-classification
- ticket-triage
- labse
- multilingual
- code-mixed
- sinhala
- tamil
metrics:
- f1
---

# Swift-Support LaBSE Priority Classifier (v1.0)

A fine-tuned **LaBSE** (Language-Agnostic BERT Sentence Embedding) model that assigns an
escalation priority β€” **Low / Medium / High** β€” to a banking support ticket written in any of five
language tracks. Built for the **Swift** support-ticket triage project, alongside
[`Swift-Support/labse-intent-1.0`](https://huggingface.co/Swift-Support/labse-intent-1.0).

## Model details

* **Base architecture:** `sentence-transformers/LaBSE` (471M parameters, 501k vocabulary)
* **Task:** 3-class text classification (priority / urgency)
* **Classes:** `Low`, `Medium`, `High`
* **Languages:** English, Sinhala, Tamil, Singlish (romanized Sinhala), Tanglish (romanized Tamil)
* **Regime:** one multilingual model over all five tracks β€” *not* five per-language models

The headline metric is **macro-F1**, never accuracy: the class distribution is roughly
55% Low / 36% Medium / 9% High, so accuracy flatters a model that neglects `High`.

## Evaluation

Trained on `train+dev` (49,990 rows = 9,998 tickets Γ— 5 languages), scored **once** on the
held-out test set (15,395 rows = 3,079 tickets Γ— 5 languages). Frozen split `e7b5934392cd`; test
tickets come from the official BANKING77 test file and were never used for model selection.

**Pooled test macro-F1: 0.8901** (accuracy 0.9008)

Per-class F1: `Low` 0.9206 Β· `Medium` 0.8760 Β· `High` 0.8735

### Against the alternatives (pooled test macro-F1)

| model | macro-F1 |
|---|---:|
| `gemma-3-1b` multitask (shared head) | 0.8904 |
| **LaBSE (this model)** | **0.8901** |
| `gemma-3-1b` (LoRA, single-task) | 0.8898 |
| mmBERT | 0.8887 |
| XLM-RoBERTa base | 0.8872 |
| TF-IDF + LinearSVC (classical champion) | 0.8722 |
| TF-IDF + logistic regression | 0.8683 |

The classical champion's 95% CI is [0.8605, 0.8831], so this model clears its upper bound β€” a
real, if modest, win. The Gemma multitask variant is a statistical tie, not a better model.

### Per language, on test

| track | LaBSE (this model) | classical TF-IDF | delta |
|---|---:|---:|---:|
| English | **0.9229** | 0.9032 | +0.0197 |
| Sinhala | **0.9179** | 0.8745 | +0.0434 |
| Singlish (romanized) | 0.8817 | **0.8915** | βˆ’0.0098 |
| Tamil | **0.9130** | 0.8905 | +0.0225 |
| Tanglish (romanized) | **0.8142** | 0.7994 | +0.0148 |
| **ALL (pooled)** | **0.8901** | 0.8722 | +0.0179 |

Two things worth stating plainly:

1. **The classical baseline still wins on Singlish.** LaBSE gives back most of its native-script
   advantage on romanized text β€” a pattern that also shows up in linear probing, where LaBSE has
   the *largest* native-minus-romanized gap of any backbone in the roster.
2. **Tanglish is the weak track**, 7–10 points below every other language for both model families.

## ⚠️ The label ceiling β€” read this before quoting 0.89

The training labels were generated by an LLM prompt, not by human annotators. On a 500-ticket
benchmark set that *was* annotated by hand, those prompt labels agree with human judgement at
**0.7722 macro-F1** (95% CI [0.7263, 0.8147]; raw agreement 0.804, Cohen's ΞΊ = 0.644).

This does **not** cap the number above β€” against the prompt labels a model could in principle
reach 1.0. It caps what the number *means*. This model has learned the labeling rule well; the
rule itself agrees with a human 77% of the time. **Quoting 0.89 as "priority accuracy" overstates
what a human reviewer would call correct.** Any external write-up should state the 0.7722 figure
alongside it.

## Usage

```python
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer

repo = "Swift-Support/labse-priority-1.0"
tok = AutoTokenizer.from_pretrained(repo)
model = AutoModelForSequenceClassification.from_pretrained(repo).eval()

texts = ["Someone has taken money from my account and nobody is helping me!",
         "How do I activate my new card?"]

with torch.no_grad():
    batch = tok(texts, return_tensors="pt", padding=True, truncation=True, max_length=128)
    probs = model(**batch).logits.softmax(-1)

for text, p in zip(texts, probs):
    print(model.config.id2label[int(p.argmax())], f"{p.max():.3f}", "|", text)
```

Two things that will silently corrupt results if you get them wrong:

* **`max_length=128` must match training.** It is not stored in the checkpoint.
* **Read the label from `model.config.id2label`, never from a hardcoded index.** This checkpoint
  carries an explicit mapping (`0: Low, 1: Medium, 2: High`). A wrong index guess does not raise β€”
  it silently returns the wrong priority.

Cost: ~1.9 GB resident, roughly 100–300 ms per ticket on CPU. Load the model once at process
start, never per request.

## Training

| | |
|---|---|
| base | `sentence-transformers/LaBSE` |
| fit portion | `train+dev`, 49,990 rows |
| epochs | 3 (best epoch: 3 of 3) |
| learning rate | 2e-5 |
| batch size | 32 |
| max sequence length | 128 |
| class imbalance | `class_weight` (balanced) |
| precision | fp16 |
| hardware | Kaggle T4, ~112 rows/s, 22 min wall |

`best_epoch = 3 of 3` β€” the model was still improving when training stopped, which is what a
consistent labeling target looks like.

## Limitations

* **Romanized text is synthetic.** Singlish is rule-generated from Sinhala and Tanglish is
  machine-translated, so both are cleaner and more regular than text a human would type. The
  Singlish and Tanglish numbers above are an optimistic upper bound, and no romanized-specific
  conclusion from this model should be trusted until it is re-measured on human-typed data.
* **Labels are LLM-generated** β€” see the label ceiling section.
* **Domain-bound.** Derived from BANKING77; behaviour outside retail-banking support is untested.
* **Not calibrated.** The softmax scores are not probabilities you should threshold on without
  re-calibrating; a threshold tuned by cross-validation on a sibling task failed to transfer to
  test in this project.
* Trained and evaluated only on the five tracks listed. LaBSE covers 109 languages, but nothing
  here measures the other 104.

## Citation & provenance

Derived from [BANKING77](https://huggingface.co/datasets/PolyAI/banking77) (PolyAI, CC-BY-4.0),
translated into Sinhala and Tamil and romanized into Singlish and Tanglish. Priority labels were
generated by an LLM prompt and benchmarked against human annotation as described above.

Training data: [`Swift-Support/swift-support-tickets-1.0`](https://huggingface.co/datasets/Swift-Support/swift-support-tickets-1.0)

### How to cite

**Citing BANKING77 alone is not sufficient attribution for this corpus.** BANKING77 supplies
the English text and the 77-way intent labels β€” 20% of the rows and one of the three label
columns. The rest is this project's work:

| | |
|---|---|
| Rows whose text is **new** (Sinhala, Tamil, Singlish, Tanglish) | **52,308 of 65,385 β€” 80%** |
| Rows inherited from BANKING77 (English) | 13,077 β€” 20% |
| Label columns inherited | 1 (`category` / intent) |
| Label columns **added** | 2 (`sentiment`, `priority`) β€” 26,154 new per-ticket assignments |
| Split | the frozen `id`-level split is this project's, not BANKING77's |

If you use the translated tracks, the sentiment or priority labels, the frozen split, or any
of the models, **cite this work**. If you additionally use the English text or the intent
labels, cite BANKING77 as well. Both licences are CC-BY-4.0, so attribution is a licence
condition, not a courtesy.

### This work β€” the corpus

```bibtex
@misc{swift_tickets_2026,
  author       = {Sithija Seneviratne and Ruththiragayan Sutharsan and Shazan Shaheed},
  title        = {Swift Support Tickets: A Multilingual Ticket-Triage Corpus for Sinhala,
                  Tamil and English, Including Romanized Code-Mixed Text},
  year         = {2026},
  publisher    = {Hugging Face},
  howpublished = {\url{https://huggingface.co/datasets/Swift-Support/swift-support-tickets-1.0}},
  note         = {Derived from BANKING77. Adds four language tracks and the sentiment and
                  priority label columns. Paper in preparation.}
}
```

### This work β€” the models

```bibtex
@misc{swift_models_2026,
  author       = {Sithija Seneviratne and Ruththiragayan Sutharsan and Shazan Shaheed},
  title        = {Swift: Multilingual Baselines for Support-Ticket Triage in Sinhala,
                  Tamil and English},
  year         = {2026},
  publisher    = {Hugging Face},
  howpublished = {\url{https://huggingface.co/Swift-Support}},
  note         = {Intent, sentiment and priority classifiers. Paper in preparation.}
}
```

### BANKING77 β€” the source of the English text and the intent labels

```bibtex
@inproceedings{casanueva2020banking77,
  author    = {Casanueva, I{\~n}igo and Tem{\v c}inas, Tadas and Gerz, Daniela and
               Henderson, Matthew and Vuli{\'c}, Ivan},
  title     = {Efficient Intent Detection with Dual Sentence Encoders},
  booktitle = {Proceedings of the 2nd Workshop on Natural Language Processing for
               Conversational AI},
  pages     = {38--45},
  year      = {2020},
  publisher = {Association for Computational Linguistics},
  doi       = {10.18653/v1/2020.nlp4convai-1.5},
  url       = {https://aclanthology.org/2020.nlp4convai-1.5/}
}
```