Фильтр ненормативной лексики с использованием регулярного выражения (список из 100 слов) - PullRequest
6 голосов
/ 30 ноября 2011

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

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

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

Ответы [ 2 ]

4 голосов
/ 01 декабря 2011

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

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

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

  • Элемент списка
  • hello
  • hello
  • h_e_l_l_o
  • | - | ello
  • h3llo
  • "привет там" (эта фраза может не содержать никаких оскорбительных слов, но в совокупности они профанны)

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

  • bash it
  • ssh тихое время

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

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

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

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

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

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

...