Какие техники используются для обработки нецензурной лексики в тексте?
Обработка нецензурной лексики (обсценной, оскорбительной или токсичной) в тексте — важная задача в сфере NLP, особенно в системах модерации контента, чат-ботах, социальных сетях и образовательных приложениях. Методы делятся на три большие категории: обнаружение, маскирование/цензурирование и фильтрация/блокировка.
1. Обнаружение нецензурной лексики
A. Словари ругательств (Blacklists)
Наиболее простой метод — наличие словаря с "запрещёнными" словами. Применяется прямое сопоставление слов из текста со списком.
-
Примеры: английские словари (profanity lists), русские — из открытых источников (включая производные, мат и эвфемизмы)
-
Поддержка регулярных выражений и вариаций слов (например, с заменами букв на цифры: с*ка, suka, суkа, cyka)
Плюсы:
-
Простота
-
Высокая скорость
Минусы:
-
Низкая устойчивость к обходу (обфускации)
-
Много ложноположительных срабатываний (например, фамилии, географические названия)
-
Не покрывает сарказм, контекст
B. Регулярные выражения и эвристики
Обнаружение с учётом:
-
Латинизации (х** → h**)
-
Замены букв цифрами или символами (3б вместо еб)
-
Повторов (сууууууука)
-
Сокращений (пздц, жпг, бл, нах)
-
Использование Unicode-нормализации (одинаковый вид символов)
Пример:
import re
pattern = r'\\b(?:\[сc\]\[уy\]\[кk\]+\[аa@\*\]+)\\b'
re.findall(pattern, text.lower())
2. Маскирование/цензурирование
После обнаружения нежелательной лексики возможны:
A. Замена символов
-
Звёздочки (б****)
-
Частичная маскировка (су**)
-
Использование знаков ($@!%)
def mask_word(word):
return word[0] + "*" * (len(word)-1)
B. Замена синонимами/эвфемизмами
-
“собака” вместо “сука”
-
“чёрт побери” вместо матерных выражений
Используется в детских приложениях, юмористических системах или играх.
C. Удаление оскорбительных фраз
-
Удаление целого предложения, содержащего мат
-
Применяется в некоторых строгих форумах и чатах
3. Модели машинного обучения
Модельные методы распознают токсичность текста даже при отсутствии явных ругательств.
A. Классические ML
-
Использование TF-IDF + логистической регрессии или SVM
-
Обучение на размеченных данных (например, метки toxic / non-toxic)
-
Можно использовать n-граммы, эмбеддинги и прочие признаки
B. Нейросети
-
CNN или BiLSTM поверх векторизованного текста
-
Хорошо распознают ненормативную лексику и завуалированные выражения
C. Transformer-based модели
-
Использование BERT, RoBERTa, XLM-R, RuBERT
-
Обучение на датасетах типа Jigsaw Toxic Comments, RuToxic, ToxicQA
-
Возможность учитывать контекст, сарказм, обфускацию
Пример:
from transformers import pipeline
classifier = pipeline("text-classification", model="unitary/toxic-bert")
classifier("Ты дурак и идиот")
Модель возвращает вероятности токсичности.
4. Поддержка мультиязычности
Ругательства часто миксуются между языками ("русский мат + латиница", "английский текст с русским матом"). Меры:
-
Языковая нормализация (transliteration)
-
Использование мультилингвальных моделей (например, XLM-R)
-
Создание словарей на разных языках и их гибридов
5. Метрики оценки
-
Precision — насколько точны предсказания (важно избегать ложноположительных — false positives)
-
Recall — насколько полно система ловит все случаи
-
F1-score — гармоническое среднее
-
Визуализация: confusion matrix, false positives/negatives в контексте
6. Методы обхода фильтрации (атаки) и защита от них
Пользователи часто пытаются обмануть фильтры:
Метод обхода | Пример | Защита |
---|---|---|
Обфускация | суkа, c*yka | Регулярки, ML модели |
--- | --- | --- |
Латинизация | blyad, cyka | Транслитерация, embeddings |
--- | --- | --- |
Пробелы | с у к а | Удаление пробелов, tokenizer aware |
--- | --- | --- |
Символы | б@н@н, х@ | Нормализация символов |
--- | --- | --- |
Эвфемизмы | жопа мира, иди ты | Обученные модели |
--- | --- | --- |
7. Постобработка и реакция
В зависимости от политики платформы:
-
Мягкая реакция: предупреждение, временное скрытие
-
Жёсткая: бан, удаление, блокировка комментария
-
Интерактивная: предложение заменить слово, автоисправление
8. Примеры библиотек и инструментов
Библиотека/модель | Описание |
---|---|
profanity-check | Лёгкая модель на LogisticRegression |
--- | --- |
profanity-filter | Поддержка замены, обфускации, многозначных слов |
--- | --- |
bad-words-list (GitHub) | Словари для разных языков |
--- | --- |
Toxic-BERT | Модель от Unitary.ai для токсичности |
--- | --- |
DeepPavlov | Модели для анализа токсичности в русскоязычном тексте |
--- | --- |
Perspective API | API от Google Jigsaw для оценки токсичности |
--- | --- |
9. Особенности для русского языка
-
Морфологическое разнообразие мата (корни, приставки, суффиксы)
-
Обилие сленга и завуалированных выражений
-
Большой пласт ругательств с двусмысленными значениями (например, “петух”, “козёл”, “сука”)
-
Эвфемизмы: “блин”, “ёшкин”, “фигня”, “жжжесть”
Для работы с русским:
-
Использовать pymorphy2 или Natasha для морфоанализа
-
Работать с RuBERT или DeepPavlov toxic-classifier
10. Этичность и риски
-
Ошибочная цензура нормального контента (false positives)
-
Культурные различия: в одном языке слово может быть оскорбительным, в другом — нет
-
Возможные способы дискриминации пользователей при ошибочной модерации
Поэтому важен тестинг на реальных данных, возможность ручного оспаривания, а также объяснение причин блокировки (explainability).