File size: 3,503 Bytes
8153a62
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
---
library_name: transformers
pipeline_tag: text-classification
tags:
  - email
  - text-classification
language:
  - en
---

## mailSort

Repo minimal (Python) pour **entraîner, évaluer et publier** un modèle de classification multi-classes d’e-mails à partir du dataset Hugging Face [`FlowRank/labeled_emails`](https://huggingface.co/datasets/FlowRank/labeled_emails).

Le script principal est `mailsort.train` (Transformers `Trainer`).

### Prérequis

- Python géré par `uv` (ce repo est prévu pour être lancé avec `uv run`)
- (Optionnel) un GPU CUDA si tu veux accélérer l’entraînement
- (Optionnel) un token HF si tu veux publier sur le Hub

### Installation

`uv` installe/synchronise automatiquement les dépendances la première fois.

```bash
uv sync
```

### Entraîner + évaluer (train + test)

Par défaut, le script charge le dataset **depuis le Hub** et utilise ses splits `train` et `test`.
L’évaluation se fait à chaque epoch, puis une évaluation finale est exécutée à la fin.
Les artefacts (modèle, tokenizer) sont sauvegardés dans `outputs/` (ou le dossier passé via `--output-dir`).

```bash
uv run python -m mailsort.train \
  --dataset-id FlowRank/labeled_emails \
  --model-name distilbert-base-uncased \
  --hub-model-id FlowRank/mailSort \
  --num-train-epochs 2
```

### Tester / évaluer uniquement

Le script n’a pas (encore) de mode “eval-only”.
Le **minimum** pour faire uniquement une passe rapide est de mettre `--num-train-epochs 0` (ce qui évite l’entraînement) et de garder la phase `evaluate`.

```bash
uv run python -m mailsort.train --num-train-epochs 0
```

### Évaluer sur le split `test` du dataset (recommandé)

Après ton entraînement dans `outputs/`, tu peux évaluer proprement sur le **split `test`** de `FlowRank/labeled_emails` :

```bash
uv run python -m mailsort.eval --model outputs --dataset-id FlowRank/labeled_emails --split test
```

(Optionnel) Pour un test rapide :

```bash
uv run python -m mailsort.eval --model outputs --split test --max-samples 200
```

### Publier sur le Hub (FlowRank/mailSort)

Le push se fait automatiquement si la variable d’environnement `HF_TOKEN` (ou `HUGGINGFACE_HUB_TOKEN`) est définie.

```bash
export HF_TOKEN="..."
uv run python -m mailsort.train --hub-model-id FlowRank/mailSort
```

### Publier via Git (README à la racine + artefacts dans `model/`)

Pour avoir un repo Hugging Face “complet” (doc + poids) tout en gardant une structure propre, on met :

- `README.md` à la racine (documentation + model card)
- les artefacts (config, poids, tokenizer) dans `model/`

Hugging Face pourra charger le modèle via `subfolder="model"`.

1) Préparer le dossier `model/` à partir de `outputs/` :

```bash
uv run python -m mailsort.prepare_model --outputs-dir outputs --model-dir model
```

2) Commit + push vers le repo Hugging Face `FlowRank/mailSort` :

```bash
git add README.md model
git commit -m "Add model artifacts under model/ + docs"
git push
```

### Inférence (utiliser le modèle publié)

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

tok = AutoTokenizer.from_pretrained("FlowRank/mailSort", subfolder="model")
model = AutoModelForSequenceClassification.from_pretrained("FlowRank/mailSort", subfolder="model")
clf = pipeline("text-classification", model=model, tokenizer=tok, truncation=True)
text = "Subject: Insurance claim\n\nBody: Hello, I need to update my policy..."
print(clf(text))
```