加载中…
加载中…
Classifieur binaire (non haineux / haineux) obtenu par fine-tuning de camembert-base sur FrenchHateSpeechSuperset.
Démo : Ezeck01/detecteur-discours-haineux
Seuil de décision 0,23 (choisi sur la validation, voir plus bas).
| Classe | Précision | Rappel | F1 |
|---|---|---|---|
| non haineux | 0,870 | 0,774 | 0,819 |
| haineux | 0,791 | 0,881 | 0,834 |
| macro | 0,831 | 0,827 | 0,826 |
PR-AUC 0,901 · ROC-AUC 0,912. Matrice de confusion : 441 VN, 129 FP, 66 FN, 489 VP.
Le jeu contient 42 660 lignes, mais seulement 7 499 textes distincts : plus de 80 % des lignes sont des doublons. Sans déduplication, les mêmes phrases se retrouvent à la fois en entraînement et en test, et les scores sont artificiellement gonflés. Après déduplication, les classes sont quasi équilibrées (50,7 % / 49,3 %).
Découpage stratifié : 5 249 entraînement / 1 125 validation / 1 125 test. Le test n'est utilisé qu'une fois, pour les chiffres ci-dessus.
camembert-base, 3 époques, lr 2e-5, batch 32, longueur max. 128, fp16 (GPU T4, ≈ 2 min)Le seuil est stocké dans config.json (seuil_decision).
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
repo = "Ezeck01/camembert-hate-speech-fr"
tok = AutoTokenizer.from_pretrained(repo)
model = AutoModelForSequenceClassification.from_pretrained(repo).eval()
seuil = model.config.seuil_decision # 0.23
texte = "Tu es vraiment nul et tu ne vaux rien"
with torch.no_grad():
p = torch.softmax(model(**tok(texte, return_tensors="pt")).logits, dim=1)[0, 1].item()
print("haineux" if p >= seuil else "non haineux", round(p, 2))
Ezéchiel Sawadogo — M2 Langue & Informatique, Sorbonne Université · site · GitHub
almanach/camembert-base