File size: 3,045 Bytes
c4b78b4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ba66e2f
 
 
c4b78b4
 
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
---
language:
- ru
license: mit
pipeline_tag: text-classification
tags:
- toxicity
- multi-task
- rubert
- moderation
metrics:
- f1
---

# Multi-Task Toxicity Classification Model (ruBERT-tiny2)

Данная модель предназначена для автоматической модерации русскоязычных текстов и одновременно решает 3 задачи классификации:
1. **Profanity** — ненормативная лексика и мат.
2. **Threat** — угрозы насилия и физической расправы.
3. **Illegal** — обсуждение/призывы к противоправным и запрещенным действиям.

Основана на лёгком энкодере `cointegrated/rubert-tiny2` с тремя независимыми классификационными головами.

## 📊 Метрики на Валидации

| Категория | Precision | Recall | F1-Score | Оптимальный порог |
| :--- | :---: | :---: | :---: | :---: |
| **Profanity** | 0.8484 | 0.8534 | 0.8509 | 0.90 |
| **Threat** | 0.6532 | 0.8526 | 0.7397 | 0.85 |
| **Illegal** | 0.0000 | 0.0000 | 0.0000 | 0.50 |

**Итоговый Macro F1-Score:** 0.5302

## 🚀 Пример использования (Python / PyTorch)

```python
import torch
import torch.nn as nn
from huggingface_hub import hf_hub_download
from transformers import AutoModel, AutoTokenizer


class MultiTaskToxicityEncoder(nn.Module):

    def __init__(self, model_name="cointegrated/rubert-tiny2"):
        super().__init__()
        self.encoder = AutoModel.from_pretrained(model_name)
        hidden_size = self.encoder.config.hidden_size
        self.profanity_head = nn.Linear(hidden_size, 1)
        self.threat_head = nn.Linear(hidden_size, 1)
        self.illegal_head = nn.Linear(hidden_size, 1)

    def forward(self, input_ids, attention_mask):
        outputs = self.encoder(
            input_ids=input_ids, attention_mask=attention_mask
        )
        cls_embedding = outputs.last_hidden_state[:, 0, :]
        return {
            "profanity": self.profanity_head(cls_embedding).squeeze(-1),
            "threat": self.threat_head(cls_embedding).squeeze(-1),
            "illegal": self.illegal_head(cls_embedding).squeeze(-1),
        }


# Загрузка токенизатора и весов
repo_id = "fdlvaaa/rubert-tiny2-multitask-toxicity"
tokenizer = AutoTokenizer.from_pretrained(repo_id)
model = MultiTaskToxicityEncoder()

weights_path = hf_hub_download(repo_id=repo_id, filename="model.pt")
model.load_state_dict(torch.load(weights_path, map_location="cpu"))
model.eval()

# Инференс
text = "Ты еще пожалеешь, я найду тебя!"
inputs = tokenizer(text, return_tensors="pt")

with torch.no_grad():
    outputs = model(inputs["input_ids"], inputs["attention_mask"])
    probs = {
        k: torch.sigmoid(v).item() for k, v in outputs.items()
    }

print("Вероятности:", probs)