AlucardV commited on
Commit
cc9d817
·
verified ·
1 Parent(s): f2a302f

Upload README.md with huggingface_hub

Browse files
Files changed (1) hide show
  1. README.md +92 -0
README.md ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ language: ru
3
+ license: mit
4
+ tags:
5
+ - toxicity
6
+ - multi-task
7
+ - rubert-tiny2
8
+ - text-classification
9
+ metrics:
10
+ - f1
11
+ - precision
12
+ - recall
13
+ ---
14
+
15
+ # Multi-Task Toxicity Classifier for Russian
16
+
17
+ Модель для одновременного определения трёх классов токсичности в русскоязычных текстах:
18
+
19
+ - **Profanity** (мат/ненормативная лексика)
20
+ - **Threat** (угрозы)
21
+ - **Illegal** (запросы о незаконных действиях)
22
+
23
+ Основана на **cointegrated/rubert-tiny2** и имеет три независимые классификационные головы.
24
+
25
+ ## Метрики на валидационной выборке
26
+
27
+ | Класс | Порог | F1-score | Precision | Recall |
28
+ |------------|-------|----------|-----------|--------|
29
+ | Profanity | 0.75 | 0.982 | 0.990 | 0.973 |
30
+ | Threat | 0.50 | 1.000 | 1.000 | 1.000 |
31
+ | Illegal | 0.10 | 0.997 | 1.000 | 0.994 |
32
+
33
+ ## Использование
34
+
35
+ ```python
36
+ import torch
37
+ from transformers import AutoTokenizer
38
+ from huggingface_hub import hf_hub_download
39
+ import json
40
+
41
+ # Загрузка модели и токенизатора
42
+ model_path = hf_hub_download(repo_id="AlucardV/kinopotok-toxicity-multitask-model", filename="pytorch_model.bin")
43
+ config_path = hf_hub_download(repo_id="AlucardV/kinopotok-toxicity-multitask-model", filename="config.json")
44
+ tokenizer = AutoTokenizer.from_pretrained("AlucardV/kinopotok-toxicity-multitask-model")
45
+
46
+ # Определение класса модели
47
+ class MultiTaskToxicityEncoder(torch.nn.Module):
48
+ def __init__(self, model_name):
49
+ super().__init__()
50
+ from transformers import AutoModel
51
+ self.encoder = AutoModel.from_pretrained(model_name)
52
+ hidden_size = self.encoder.config.hidden_size
53
+ self.profanity_head = torch.nn.Linear(hidden_size, 1)
54
+ self.threat_head = torch.nn.Linear(hidden_size, 1)
55
+ self.illegal_head = torch.nn.Linear(hidden_size, 1)
56
+
57
+ def forward(self, input_ids, attention_mask):
58
+ outputs = self.encoder(input_ids=input_ids, attention_mask=attention_mask)
59
+ cls = outputs.last_hidden_state[:, 0, :]
60
+ return {
61
+ "profanity": self.profanity_head(cls).squeeze(-1),
62
+ "threat": self.threat_head(cls).squeeze(-1),
63
+ "illegal": self.illegal_head(cls).squeeze(-1),
64
+ }
65
+
66
+ # Загрузка весов
67
+ config = json.load(open(config_path))
68
+ model = MultiTaskToxicityEncoder(config["model_name"])
69
+ model.load_state_dict(torch.load(model_path, map_location="cpu"))
70
+ model.eval()
71
+
72
+ # Функция предсказания
73
+ def predict(text):
74
+ inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True, max_length=128)
75
+ with torch.no_grad():
76
+ outputs = model(inputs["input_ids"], inputs["attention_mask"])
77
+ probs = {k: torch.sigmoid(v).item() for k, v in outputs.items()}
78
+ thresholds = {
79
+ "profanity": 0.7500000000000002,
80
+ "threat": 0.5000000000000001,
81
+ "illegal": 0.1,
82
+ }
83
+ results = {
84
+ k: {
85
+ "toxic": probs[k] >= thresholds[k],
86
+ "confidence": f"{probs[k]*100:.1f}%"
87
+ } for k in probs
88
+ }
89
+ return results
90
+
91
+ # Пример
92
+ print(predict("Ты что, совсем охренел, мудак?"))