Фильтр ненормативной лексики с использованием регулярного выражения (список из 100 слов)
Как правильно убрать ненормативную лексику из заданной строки:
1) У меня есть список из 100 слов для поиска в массиве строк.
2) Как правильно обрабатывать отдельные слова? Как большинство людей справляются с этим? Например слово масса. Тогда иногда частичное слово также плохо - предположим, что foobar - чрезвычайно ненормативное слово, которое я могу запретить foobar и foobar* и *foobar.
Так вы помещаете все слова в одно выражение или просматриваете список?
Какой правильный способ справиться с этим? Я использую Groovy/Grails, но любые примеры современных языков приветствуются.
3 ответа
Это довольно сложная проблема, которую нужно решить, и вам нужно определить, будут ли работать регулярные выражения для вас и как вы обрабатываете встраивание (когда вы добавляете слово из словаря к ненормативной лексике, например, frackface, за исключением реального F-слова).
Регулярные выражения, как правило, имеют ограничение по продолжительности, и это обычно не позволяет вам использовать одно регулярное выражение для всех ваших слов. Выполнение нескольких регулярных выражений для строки очень медленно, в зависимости от того, какая производительность вам нужна и насколько велик ваш черный список. Мы изначально внедрили CleanSpeak как систему регулярных выражений, но она не масштабировалась, и мы переписали ее, используя другой механизм.
Вам также нужно учитывать фразы, знаки препинания, пробелы, лексику и другие языки. Все это делает регулярные выражения менее привлекательными в качестве решения. Вот несколько примеров использования слова hello (предположим, что это ненормативная лексика для этого упражнения):
- Элемент списка
- Привет
- Привет
- Привет
- |-| ELLO
- h3llo
- "Привет!" (эта фраза может не содержать никаких оскорбительных слов, но в сочетании они ненормативны)
Вам также необходимо обрабатывать крайние случаи, когда два или более словарных (белых) слова содержат ненормативную лексику, когда они находятся рядом друг с другом. Некоторые примеры, которые содержат s-слово:
- разбей это
- ssh это тихое время
Это, очевидно, не ненормативная лексика, но большинство доморощенных и многие коммерческие решения имеют проблемы с этими делами.
Последние 3 года мы потратили на совершенствование фильтра, используемого CleanSpeak, чтобы гарантировать, что он обрабатывает все эти случаи, и мы продолжаем настраивать его и улучшать его. Мы также потратили 8 месяцев на совершенствование нашей системы для повышения производительности, и она может обрабатывать около 5000 сообщений в секунду. Нельзя сказать, что вы не можете создать что-то полезное, но будьте готовы к решению многих проблем, которые могут возникнуть, а также к созданию системы, которая не использует регулярные выражения.
- Объединить каждое слово в список слов -
(foobar|foobaz|...)
Затем установите охранников по обе стороны от группы для посторонних персонажей
[^!@#$%^&*]*(foobar|foobaz|foofii)[^!@#$%^&*]*
Кроме того, вы, вероятно, захотите использовать флаг без учета регистра, чтобы он также соответствовал таким словам, как FooBaz и fOObaR.
Что касается производительности, то конкатенация это как одно большое регулярное выражение, вероятно, самая быстрая (хотя я не эксперт). Алгоритм регулярных выражений довольно эффективен при поиске и обработке условий ветвления. По сути, это должно быть лучше, чем O(mn)
(где m
это количество слов и n
размер текста, который вы ищете)
Я работал над этим обработчиком регулярных выражений, и он должен соответствовать пробелам и другим символам между ними:
/^f(\s|.{1,2})?o?(\s|.{1,2})?o.*$/gi
Подтверждает:
фу
фу
f oo
foobar