Shurik24
@Shurik24
Обычный программист самоучка

Хочу написать фильтр мата, есть идеи как это можно реализовать?

Создаю фильтр мата для своей группы, сделал наброски но умные люди лет 12 - 15 все время пытаются обхитрить фильтр

Вот мой фильтр код фильтра
Код

import re
from fuzzywuzzy import fuzz

dict =   {
    'а' :   '[@|а|а́|a]',
    'б' :   '[б|6|b]',
    'в' :   '[в|b|v]',
    'г' :   '[г|r|g]',
    'д' :   '[д|d]',
    'е' :   '[е|e|ё]',
    'ж' :   '[ж|z|*]',
    'з' :   '[з|3|z]',
    'и' :   '[и|u|i]',
    'й' :   '[й|u|i]',
    'к' :   '[к|k]',
    'л' :   '[л|l]',
    'м' :   '[м|m]',
    'н' :   '[н|h|n]',
    'о' :   '[о|o|0]',
    'п' :   '[п|n|p]',
    'р' :   '[р|r|p]',
    'с' :   '[с|c|s|5|$]',
    'т' :   '[т|m|t]',
    'у' :   '[у́|у|y|u]',
    'ф' :   '[ф|f]',
    'х' :   '[х|x|h]',
    'ц' :   '[ц|c|u]',
    'ч' :   '[ч|c|h]',
    'ш' :   '[ш|щ]',
    'ь' :   '[ь|b]',
    'ы' :   '[ы|i]',
    'ъ' :   '[ъ|ь]',
    'э' :   '[э|e]',
    'ю' :   '[ю|y|u]',
    'я' :   '[я|r]',
    ' ' : '[.|,|!|?|&|)|(|\\|\/|*|-|_|"|\'|;|®]'
}   
# Регулярки для замены похожих букв и символов на русские


CWF = open("CurseWords.txt", "r", encoding = "utf-8")
CurseWords = "".join(CWF.readlines()).split(", ")


def replace_letters(word = None):
    word = word.lower()
    for key, value in dict.items():
        word = re.sub(value, key, word)
    return word

def filter_word(msg):
    msg = msg.split()
    for w in msg:
        w = ''.join([w[i] for i in range(len(w)-1) if w[i+1]!= w[i]]+[w[-1]]).lower()# Здесь убираю символы которые повторяються "Приииииивет" -> "Привет"
        w = replace_letters(w)
        for word in CurseWords:
            b = fuzz.token_sort_ratio(word, w)# Проверяю сходство слов из списка 
            if b >= 85:
                print(f'{w} | {b}% Матерное слово {word}')
                return True
            else: 
                pass


Иногда бывают ложные срабатывания, но это пусть, самая большая проблема это когда пользователи пишут так все слова слитно "Идитевсена***" и вот такие слова я просто без понятия как можно проверить правильно, и чтобы не было ложных срабатываний, пытался сравнивать матерные слова с полным предложением, но тогда такие слова как Употреблять считаются матерными, если есть какие либо идеи как можно это улучшить буду рад выслушать
  • Вопрос задан
  • 2013 просмотров
Решения вопроса 3
dollar
@dollar
Делай добро и бросай его в воду.
Это война снаряда и брони, то есть она бесконечна. Её невозможно выиграть. Как только вы улучшаете броню, противник в ответ улучшает калибр снаряда, и так по кругу. Лучшим решением будет попытаться остановить войну, помешать её течению, а не наращивать мощь вооружения.

Один из способов сделать это - перестать воевать, то есть сдаться. Тогда "игра" закончится. Те, кто пытался "победить систему", будут объявлены победителями и потеряют интерес к дальнейшей борьбе. Хотя останутся и те, для кого мат - это норма, и будут продолжать использовать его.

Второй способ - показать иллюзию победы. То есть тому, кто пытается обойти фильтр, можно показать, что его мат отображается корректно, а все остальные в чате будут видеть звёздочки или слово-заменитель. Конечно, некоторые догадаются, и начнут проверять свои сообщения со второго аккаунта. Но догадаются не все, так что мата в целом станет меньше. К тому же второй аккаунт связан с некоторым гемором, что также отфильтрует лентяев. Останутся только упрямые воины-одиночки, которых легко можно будет просто забанить, например.

Ещё приём - в дополнение к предыдущим - отсроченное наказание (модератором). "Игрок" не будет получать немедленное подкрепление в виде "молодец, обошёл фильтр", а будет вынужден ждать жюри. Однако ждать никто не любит, это тоже сильно бьёт по мотивации продолжать игру в сопротивление системе. Поэтому многие "партизаны" перейдут на сторону добра, ибо скучно.
Ответ написан
Комментировать
lComrade
@lComrade
Тоже писал бота для удаления сообщений с матом. Я создал список матерных корней и проверял наличие хотя бы одного корня в сообщении. Работало неплохо, но некоторые додумались писать мат с ошибками или на английском. Кстати пробелы не учитывались, то есть от слитного написания мата тоже помогало.

Наверное лучшие решение в данном случаи не пытаться вылавливать весь мат, а только большую его часть. И после нескольких матерных слов запрещать писать на 24 часа или временно банить.

Словарь мата, который я использовал: https://github.com/lcomrade/mat-defender-discord-b...
Ответ написан
@mletov
Имеет смысл поставить фильтр только на самые часто употребимые и очевидные бранные слова. Все равно люди найдут как обойти: будут часть букв заменять аналогами из латинского алфавита, спецсимволами или даже просто вставлять картинки с матерными словами, писать "0" вместо "О" и т д.

А для остальных только ручная модерация и бан особо ретивых матерщинников.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы