@vseminelybim
Python ботоводство и прочая грязюка

Как можно реализовать фильтрацию текста на python?

В общем, пишу некоторого бота, который проверяет сообщения на содержание ключевых слов, но никак не могу додуматься до правильной и рабочей настройке фильтрации. Например, подаётся сообщение: "Этот текст содержит ключевые слова Сова, Волк, Лиса, которые пропускают сообщение, но также содержит слово Жираф, которое не пропускает сообщение." В данном случае, сообщение не должно пройти проверку. То есть, даже если сообщение состоит из сотни положительных(в плане прохождения) слов и одного отрицательного, то сообщение не должно пройти дальше. В итоге у меня есть 2 списка(положительные и отрицательные слова) и строка сообщения. Как мне правильно выполнить поиск слов из списков в данной строке? Наверное, можно как-то реализовать через циклы или сравнение списков(если превратить строку в список), но мне чего-то не хватает. Буду благодарен за любой ответ!
  • Вопрос задан
  • 371 просмотр
Пригласить эксперта
Ответы на вопрос 2
@alexbprofit
Junior SE
проверять содержит ли текст хотябы одно из запрещенных слов, к примеру:

banned = ['жираф']
def text_contains_banned(text):
    for word in banned:
        if word in text:
            return False
    return True
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
Ну во-первых - это будет соревнование брони и снаряда, т.к. пользователи будут пытаться обходить ваш блэклист. Так что не ожидайте, что решение будет "раз и навсегда".
Во-вторых, должно ли сообщение содержать хоть одно слово из белого списка, чтобы быть пропущенным? Не очень ясно, что вы имели ввиду под белым списком.
В-третьих, и сообщение, и элементы фильтра должны подвергаться предварительной нормализации. Речь не только о приведении к регистру, но и работе с омографами (простейший случай - русское и латинское "о"), а также удалении некоторых символов (например, символ невидимого пробела или комбинаторные символы). Можно решить, заменяя перед проверкой разные символы на простейший омограф, например, русское о на латинское - как в сообщении, так и при подготовке черного и белого списков.
В-четвёртых, нужно подумать о ложных срабатываниях. Грубо говоря, если мы не удаляем пробелы, пользователю достаточно написать "б л я" чтобы обойти нашу систему. Если удаляем, "гребля" будет давать ложное положительное срабатывание. Если занесём "гребля" в белый список и сделаем так, чтобы оно имело приоритет перед пересекающимся словом из чёрного списка - то тогда будет ложное отрицательное срабатывание на "игре бля". Разумеется, список слов зависит от контекста сообщений, но его составление будет долгим итерационным процессом.

С учётом вышесказанного -
1. нормализовать строку,
2. проверить вхождение подстрок из чёрного списка,
3. если они есть - проверить, есть ли вхождения подстрок из белого списка, пересекающиеся с вхождениями чёрного.
4. убрать из рассмотрения все пересекающиеся вхождения чёрного списка
5. если остались вхождения из чёрного списка - реагируем на сообщение как на нежелательное. Иначе считаем его допустимым.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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