SlerpE commited on
Commit
31b5d34
·
verified ·
1 Parent(s): 151bf82

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +184 -3
README.md CHANGED
@@ -1,3 +1,184 @@
1
- ---
2
- license: apache-2.0
3
- ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ ---
4
+
5
+ # Классификатор опасного контента для детей
6
+
7
+ Этот проект представляет собой модель машинного обучения, предназначенную для автоматического определения потенциально опасного контента для детей в русскоязычных текстах. Модель классифицирует текст на две категории: `safe` (безопасный) и `dangerous` (опасный).
8
+
9
+ Система построена на двухкомпонентной архитектуре:
10
+ 1. **Векторизация текста:** Используется мощная модель `Qwen/Qwen3-Embedding-4B` для преобразования текста в числовые векторы (эмбеддинги), которые улавливают семантический смысл.
11
+ 2. **Классификация:** Поверх эмбеддингов работает простая и быстрая модель **логистической регрессии**, обученная различать "опасные" и "безопасные" векторы.
12
+
13
+ ## 🎯 Назначение модели
14
+
15
+ Модель обучена выявлять следующие категории опасного контента на русском языке:
16
+
17
+ 1. **Кибербуллинг и оскорбления:** Прямые угрозы, унижения и травля в чатах.
18
+ 2. **Опасные челленджи:** Призывы к участию в рискованных для жизни и здоровья действиях.
19
+ 3. **Груминг:** Диалоги с незнакомцами, направленные на получение личной информации (адрес, телефон, фото).
20
+ 4. **Жестокое обращение с животными:** Тексты, оправдывающие или поощряющие насилие над животными.
21
+ 5. **Пропаганда РПП:** Контент, пропагандирующий нездоровое пищевое поведение (анорексия, булимия).
22
+ 6. **Контент сексуального характера:** Обсуждения и описания неприемлемого для детей характера.
23
+ 7. **Насилие и жестокость:** Описание сцен насилия, нанесения увечий.
24
+
25
+ ## 🛠️ Технический стек
26
+
27
+ * **Python 3.8+**
28
+ * **PyTorch:** для работы нейросетевой модели эмбеддингов.
29
+ * **Transformers (Hugging Face):** для загрузки и использования модели Qwen.
30
+ * **Scikit-learn:** для использования обученного классификатора логистической регрессии.
31
+ * **Joblib:** для загрузки файла с классификатором.
32
+
33
+ ## 🚀 Установка
34
+
35
+ 1. **Клонируйте репозиторий:**
36
+ ```bash
37
+ git clone https://huggingface.co/SlerpE/Dangerous_Content_Classifier
38
+ cd Dangerous_Content_Classifier
39
+ ```
40
+
41
+ 2. **Создайте и активируйте виртуальное окружение:**
42
+ ```bash
43
+ python -m venv venv
44
+ source venv/bin/activate
45
+ ```
46
+
47
+ 3. **Установите зависимости:**
48
+ ```bash
49
+ pip install -r requirements.txt
50
+ ```
51
+
52
+ 4. **Пример использования:**
53
+ ```python
54
+ import torch
55
+ from transformers import AutoModel, AutoTokenizer
56
+ import numpy as np
57
+ import joblib
58
+
59
+ # --- КОНФИГУРАЦИЯ ---
60
+ QWEN_MODEL_NAME = "Qwen/Qwen3-Embedding-4B"
61
+ CLASSIFIER_PATH = 'logistic_regression_classifier.joblib'
62
+
63
+ print("Загрузка моделей... Это может занять некоторое время.")
64
+
65
+ # --- ШАГ 1: ЗАГРУЗКА ВСЕХ НЕОБХОДИМЫХ МОДЕЛЕЙ ---
66
+
67
+ # 1.1 Загружаем модель Qwen для получения эмбеддингов
68
+ device = "cuda" if torch.cuda.is_available() else "cpu"
69
+ qwen_tokenizer = AutoTokenizer.from_pretrained(QWEN_MODEL_NAME, trust_remote_code=True)
70
+ qwen_model = AutoModel.from_pretrained(QWEN_MODEL_NAME, trust_remote_code=True).to(device)
71
+ qwen_model.eval()
72
+
73
+ # Если у токенизатора нет pad_token, установим его
74
+ if qwen_tokenizer.pad_token is None:
75
+ qwen_tokenizer.pad_token = qwen_tokenizer.eos_token
76
+
77
+ # 1.2 Загружаем обученный классификатор
78
+ classifier = joblib.load(CLASSIFIER_PATH)
79
+
80
+ print(f"Модели загружены. Используется устройство: {device}")
81
+ print("-" * 30)
82
+
83
+
84
+ def classify_text(text: str):
85
+ """
86
+ Классифицирует один текст, определяя, является ли он "опасным".
87
+
88
+ Args:
89
+ text (str): Входной текст для классификации.
90
+
91
+ Returns:
92
+ dict: Словарь с предсказанной меткой и уверенностью модели.
93
+ """
94
+ # --- Этап 1: Получение эмбеддинга для текста ---
95
+ with torch.no_grad():
96
+ inputs = qwen_tokenizer(text, return_tensors="pt", truncation=True, max_length=512).to(device)
97
+ outputs = qwen_model(**inputs)
98
+ # Усредняем эмбеддинги
99
+ embedding = outputs.last_hidden_state.mean(dim=1).cpu().numpy()
100
+
101
+ # --- Этап 2: Предсказание с помощью классификатора ---
102
+
103
+ # scikit-learn ожидает на вход 2D-массив (список примеров),
104
+ # поэтому мы преобразуем наш 1D-вектор в массив из одного элемента
105
+ # (из [e1, e2, ...] в [[e1, e2, ...]])
106
+ embedding_2d = embedding.reshape(1, -1)
107
+
108
+ # Получаем предсказание (0 или 1)
109
+ prediction = classifier.predict(embedding_2d)[0]
110
+
111
+ # Получаем вероятность принадлежности к каждому классу
112
+ probabilities = classifier.predict_proba(embedding_2d)[0]
113
+
114
+ # Определяем метку и уверенность
115
+ if prediction == 1:
116
+ label = "dangerous"
117
+ confidence = probabilities[1]
118
+ else:
119
+ label = "safe"
120
+ confidence = probabilities[0]
121
+
122
+ return {
123
+ "text": text,
124
+ "predicted_label": label,
125
+ "confidence": f"{confidence:.2%}" # Форматируем в проценты
126
+ }
127
+
128
+ # --- ПРИМЕР ИСПОЛЬЗОВАНИЯ ---
129
+ if __name__ == "__main__":
130
+
131
+ test_texts = [
132
+ "Мальчик играл с котенком на зеленой лужайке.",
133
+ "Это просто ужасно, ты никому не нужен, лучше бы тебя не было.",
134
+ "Давай дружить и вместе строить замки из песка!",
135
+ "Если не перестанешь, я тебя найду и тебе не поздоровится.",
136
+ "Попробуй челлендж - не есть 3 дня. Если ты его пройдёшь - получишь 5 тысяч рублей",
137
+ "Сейчас тебе придёт код в СМС, ты должен срочно сообщить его мне. Ты меня понял?! Иначе я тебя забаню на этом сервере!"
138
+ ]
139
+
140
+ for text_to_check in test_texts:
141
+ result = classify_text(text_to_check)
142
+ print(f"Текст: \"{result['text']}\"")
143
+ print(f" -> Вердикт: {result['predicted_label']} (Уверенность: {result['confidence']})")
144
+ print("-" * 20)
145
+ ```
146
+
147
+ **Пример вывода в консоль:**
148
+
149
+ ```
150
+ ------------------------------
151
+ Текст: "Мальчик играл с котенком на зеленой лужайке."
152
+ -> Вердикт: safe (Уверенность: 100.00%)
153
+ --------------------
154
+ Текст: "Это просто ужасно, ты никому не нужен, лучше бы тебя не было."
155
+ -> Вердикт: dangerous (Уверенность: 99.98%)
156
+ --------------------
157
+ Текст: "Давай дружить и вместе строить замки из песка!"
158
+ -> Вердикт: safe (Уверенность: 100.00%)
159
+ --------------------
160
+ Текст: "Если не перестанешь, я тебя найду и тебе не поздоровится."
161
+ -> Вердикт: dangerous (Уверенность: 99.74%)
162
+ --------------------
163
+ Текст: "Попробуй челлендж - не есть 3 дня. Если ты его пройдёшь - получишь 5 тысяч рублей"
164
+ -> Вердикт: dangerous (Уверенность: 99.38%)
165
+ --------------------
166
+ Текст: "Сейчас тебе придёт код в СМС, ты должен срочно сообщить его мне. Ты меня понял?! Иначе я тебя забаню на этом сервере!"
167
+ -> Вердикт: dangerous (Уверенность: 92.71%)
168
+ --------------------
169
+ ```
170
+
171
+
172
+ ## ⚠️ Ограничения
173
+
174
+ * **Контекст:** Модель анализирует только предоставленный текст и может не улавливать сложный контекс��, сарказм или иронию.
175
+ * **Новые угрозы:** Модель обучена на известных ей типах угроз. Новые виды угроз могут быть не распознаны.
176
+ * **Только русский язык:** Модель была обучена и протестирована исключительно на русскоязычных данных.
177
+ * **Не является заменой модерации:** Данный инструмент следует рассматривать как вспомогательное средство для предварительной фильтрации контента, а не как полную замену ручной модерации.
178
+
179
+
180
+
181
+
182
+ ## 📄 Лицензия
183
+
184
+ Этот проект распространяется под лицензией Apache 2.0. Подробности смотрите в файле `LICENSE`.