Loule's picture
Auto-improve cycle 8 — F1=95.7%
fe19ac3 verified
---
language:
- fr
- en
license: apache-2.0
library_name: transformers
tags:
- text-classification
- toxicity
- moderation
- multilingual
- twitch
- chat-moderation
datasets:
- custom
pipeline_tag: text-classification
metrics:
- f1
widget:
- text: "GG bien joue le stream !"
example_title: "Normal (FR)"
- text: "Tu es un connard"
example_title: "Insulte (FR)"
- text: "ntm fdp"
example_title: "Insulte obfusquee (FR)"
- text: "Ca tue ce jeu"
example_title: "Figuratif gaming (FR)"
- text: "Les arabes dehors"
example_title: "Haine (FR)"
- text: "Great stream, keep it up!"
example_title: "Normal (EN)"
- text: "Kill yourself"
example_title: "Menace (EN)"
- text: "k y s noob"
example_title: "Menace obfusquee (EN)"
model-index:
- name: egide-toxicity-model
results:
- task:
type: text-classification
name: Multi-label Toxicity Classification
metrics:
- name: F1 Micro
type: f1
value: 0.970
- name: F1 Macro
type: f1
value: 0.969
---
# Egide Toxicity Model
Modele de detection de toxicite multilingue (francais/anglais) concu pour la moderation de chat Twitch.
## Description
Ce modele a ete entraine pour la classification multi-label de contenu toxique. Il a ete concu specifiquement pour le projet [Egide](https://github.com/Loule95450/Egide), un bot de moderation Twitch alimente par l'IA.
Le modele detecte **6 categories de toxicite** sans aucune regle codee en dur : tout repose sur l'inference IA.
## Categories
| Label | Description |
|---|---|
| `toxicity` | Contenu toxique general |
| `insult` | Insultes directes ou indirectes |
| `hate` | Discours de haine (racisme, xenophobie) |
| `sexual` | Contenu sexiste / a caractere sexuel |
| `threat` | Menaces de violence |
| `identity_attack` | Attaques basees sur l'identite (homophobie, transphobie, etc.) |
## Performance
Evalue sur un jeu de test de 243 exemples (15% du dataset) :
| Categorie | F1 Score |
|---|---|
| **toxicity** | 0.981 |
| **insult** | 0.974 |
| **hate** | 0.949 |
| **sexual** | 1.000 |
| **threat** | 0.966 |
| **identity_attack** | 0.945 |
| **F1 Micro** | **0.970** |
| **F1 Macro** | **0.969** |
## Points forts
- **Multilingue** : Comprend le francais et l'anglais nativement
- **Texte obfusque** : Detecte les insultes deguisees comme "ntm", "n t m", "fdp", "f.d.p", "c0nn4rd", "k y s", etc.
- **Contexte gaming** : Ne flag PAS les expressions figuratives courantes en gaming ("ca tue ce jeu", "je suis mort de rire", "this game is killing me")
- **Argot Twitch** : Entraine sur du vocabulaire de chat Twitch (emotes, abreviations, slang)
- **Zero faux pattern** : Aucune regex, aucune liste de mots interdits, 100% IA
## Utilisation
```python
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
model_name = "Loule/egide-toxicity-model"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
model.eval()
LABELS = ["toxicity", "insult", "hate", "sexual", "threat", "identity_attack"]
def predict(text):
inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=128)
with torch.no_grad():
logits = model(**inputs).logits
probs = torch.sigmoid(logits).squeeze().tolist()
return {label: round(prob, 4) for label, prob in zip(LABELS, probs)}
# Exemples
print(predict("Tu es un connard"))
# -> toxicity: 0.98, insult: 0.95, ...
print(predict("ntm fdp"))
# -> toxicity: 0.97, insult: 0.93, ...
print(predict("GG bien joue le stream !"))
# -> toxicity: 0.01, insult: 0.01, ... (PAS toxique)
print(predict("Ca tue ce jeu"))
# -> toxicity: 0.03, insult: 0.02, ... (PAS flag comme toxique)
```
## Utilisation avec FastAPI (Egide AI Service)
```bash
cd apps/ai-service
pip install -r requirements.txt
python main.py # Lance le service sur le port 8000
```
```bash
curl -X POST http://localhost:8000/analyze \
-H "Content-Type: application/json" \
-d '{"text": "ntm sale race"}'
```
## Entrainement
- **Type** : Multi-label classification
- **Loss** : BCEWithLogitsLoss
- **Epochs** : 10 (best model a l'epoch 7)
- **Batch size** : 8
- **Learning rate** : 2e-5
- **Warmup** : 10%
- **Dataset** : 539 exemples curates x3 augmentation = 1617 exemples
- Insultes francaises (standard + obfusquees)
- Discours de haine (racisme, xenophobie, antisemitisme)
- Sexisme
- Homophobie / transphobie
- Menaces (standard + obfusquees)
- Insultes anglaises (standard + obfusquees)
- ~150 exemples non-toxiques (chat Twitch, expressions figuratives, emotes)
## Architecture du projet Egide
```
Twitch Chat -> Node.js Bot (tmi.js) -> HTTP -> Python AI Service (FastAPI) -> Moderation
```
Le bot Node.js envoie les messages au service Python via HTTP. Le service charge ce modele et retourne les scores de toxicite. Aucun pattern n'est code en dur.
## Limitations
- Entraine principalement sur du francais et de l'anglais. D'autres langues peuvent fonctionner mais avec moins de precision.
- Le dataset d'entrainement est relativement petit (539 exemples uniques). Des ameliorations sont possibles en ajoutant plus de donnees.
- Les nouvelles formes d'obfuscation non vues a l'entrainement peuvent echapper a la detection.
## Licence
Apache 2.0
## Citation
```bibtex
@misc{egide-toxicity-model,
author = {Loule},
title = {Egide Toxicity Model - Multilingual Toxicity Detection for Twitch Chat},
year = {2025},
publisher = {HuggingFace},
url = {https://huggingface.co/Loule/egide-toxicity-model}
}
```