Фильтр ненормативной лексики с использованием регулярного выражения (список из 100 слов)

Как правильно убрать ненормативную лексику из заданной строки:
1) У меня есть список из 100 слов для поиска в массиве строк. 2) Как правильно обрабатывать отдельные слова? Как большинство людей справляются с этим? Например слово масса. Тогда иногда частичное слово также плохо - предположим, что foobar - чрезвычайно ненормативное слово, которое я могу запретить foobar и foobar* и *foobar.

Так вы помещаете все слова в одно выражение или просматриваете список?

Какой правильный способ справиться с этим? Я использую Groovy/Grails, но любые примеры современных языков приветствуются.

3 ответа

Это довольно сложная проблема, которую нужно решить, и вам нужно определить, будут ли работать регулярные выражения для вас и как вы обрабатываете встраивание (когда вы добавляете слово из словаря к ненормативной лексике, например, frackface, за исключением реального F-слова).

Регулярные выражения, как правило, имеют ограничение по продолжительности, и это обычно не позволяет вам использовать одно регулярное выражение для всех ваших слов. Выполнение нескольких регулярных выражений для строки очень медленно, в зависимости от того, какая производительность вам нужна и насколько велик ваш черный список. Мы изначально внедрили CleanSpeak как систему регулярных выражений, но она не масштабировалась, и мы переписали ее, используя другой механизм.

Вам также нужно учитывать фразы, знаки препинания, пробелы, лексику и другие языки. Все это делает регулярные выражения менее привлекательными в качестве решения. Вот несколько примеров использования слова hello (предположим, что это ненормативная лексика для этого упражнения):

  • Элемент списка
  • Привет
  • Привет
  • Привет
  • |-| ELLO
  • h3llo
  • "Привет!" (эта фраза может не содержать никаких оскорбительных слов, но в сочетании они ненормативны)

Вам также необходимо обрабатывать крайние случаи, когда два или более словарных (белых) слова содержат ненормативную лексику, когда они находятся рядом друг с другом. Некоторые примеры, которые содержат s-слово:

  • разбей это
  • ssh это тихое время

Это, очевидно, не ненормативная лексика, но большинство доморощенных и многие коммерческие решения имеют проблемы с этими делами.

Последние 3 года мы потратили на совершенствование фильтра, используемого CleanSpeak, чтобы гарантировать, что он обрабатывает все эти случаи, и мы продолжаем настраивать его и улучшать его. Мы также потратили 8 месяцев на совершенствование нашей системы для повышения производительности, и она может обрабатывать около 5000 сообщений в секунду. Нельзя сказать, что вы не можете создать что-то полезное, но будьте готовы к решению многих проблем, которые могут возникнуть, а также к созданию системы, которая не использует регулярные выражения.

  1. Объединить каждое слово в список слов - (foobar|foobaz|...)
  2. Затем установите охранников по обе стороны от группы для посторонних персонажей

    [^!@#$%^&*]*(foobar|foobaz|foofii)[^!@#$%^&*]*

Кроме того, вы, вероятно, захотите использовать флаг без учета регистра, чтобы он также соответствовал таким словам, как FooBaz и fOObaR.

Что касается производительности, то конкатенация это как одно большое регулярное выражение, вероятно, самая быстрая (хотя я не эксперт). Алгоритм регулярных выражений довольно эффективен при поиске и обработке условий ветвления. По сути, это должно быть лучше, чем O(mn) (где m это количество слов и n размер текста, который вы ищете)

Я работал над этим обработчиком регулярных выражений, и он должен соответствовать пробелам и другим символам между ними:

      /^f(\s|.{1,2})?o?(\s|.{1,2})?o.*$/gi

Подтверждает:

фу

фу

f oo

foobar

Другие вопросы по тегам