Как реализовать хороший фильтр ненормативной лексики? - PullRequest
194 голосов
/ 07 ноября 2008

Многим из нас приходится иметь дело с пользовательским вводом, поисковыми запросами и ситуациями, когда вводимый текст может содержать ненормативную лексику или нежелательный язык. Часто это нужно отфильтровать.

Где можно найти хороший список нецензурных слов на разных языках и диалектах?

Доступны ли API для источников, содержащих хорошие списки? Или, может быть, API, который просто говорит «да, это чисто» или «нет, это грязно» с некоторыми параметрами?

Какие есть хорошие методы для ловли людей, пытающихся обмануть систему, например, $$, azz или a55?

Бонусные баллы, если вы предлагаете решения для PHP. :)

Редактировать: Ответ на ответы, в которых говорится, просто избегайте программной проблемы:

Я думаю, что для такого рода фильтров есть место, когда, например, пользователь может использовать общедоступный поиск изображений для поиска изображений, которые добавляются в пул конфиденциальных сообществ. Если они могут искать «пенис», то они, скорее всего, получат много фотографий, да. Если нам не нужны картинки этого, то предотвращение слова в качестве поискового запроса - это хороший привратник, хотя и не надежный метод. Получение списка слов в первую очередь является реальным вопросом.

Так что я действительно имею в виду способ выяснить, является ли грязный токен грязным или нет, а затем просто запретить его. Я бы не стал предотвращать такое чувство, как совершенно смешное упоминание о «длинношерстном жирафе». Вы ничего не можете сделать там. :)

Ответы [ 21 ]

172 голосов
/ 07 ноября 2008

Фильтры непристойности: плохая идея или невероятно плохая идея общения?

Кроме того, нельзя забыть Нерассказанная история SpeedChat в Toontown , где даже при использовании «белого списка безопасных слов» 14-летний подросток быстро обошел его: «Я хочу засунуть моего Жирафа с длинной шеей в вашего пушистого белого зайчика».

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

Полезна также система, которая устраняет анонимность и вводит подотчетность (что хорошо справляется с переполнением стека), особенно для борьбы с G.I.F.T. Джона Габриэля

Вы также спросили, где можно получить списки ненормативной лексики, чтобы начать работу - один проект с открытым исходным кодом, который нужно проверить, это Dansguardian - проверьте исходный код для списков ненормативной лексики по умолчанию. Существует также дополнительная третья сторона Список фраз , которую вы можете загрузить для прокси-сервера, которая может быть полезной для вас полезной информацией.

Отредактируйте в ответ на вопрос edit: Спасибо за разъяснение того, что вы пытаетесь сделать. В этом случае, если вы просто пытаетесь сделать простой текстовый фильтр, есть два способа сделать это. Один из них - создать одно длинное регулярное выражение со всеми запрещенными фразами, которые вы хотите подвергнуть цензуре, и просто выполнить поиск / замену регулярного выражения. Регулярное выражение типа:

$filterRegex = "(boogers|snot|poop|shucks|argh)"

и запустите ее на входной строке, используя preg_match () , чтобы протестировать попадание,

или preg_replace () , чтобы убрать их.

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

Дополнительные примеры программирования на PHP см. На этой странице для несколько продвинутого универсального класса для фильтрации слов, который * выделяет центральные буквы из слов, подвергшихся цензуре, и этот предыдущий вопрос переполнения стека у него также есть пример PHP (главная ценная часть - подход фильтрованных слов на основе SQL - можно обойтись без компенсатора leet-talk, если вы сочтете это ненужным).

Вы также добавили: « Получение списка слов в первую очередь является реальным вопросом. » - в дополнение к некоторым из предыдущих ссылок дансгаурдов, вы можете найти этот удобный. zip из 458 слов, чтобы быть полезными.

39 голосов
/ 19 ноября 2012

Хотя я знаю, что этот вопрос довольно старый, но это часто встречающийся вопрос ...

Существует как причина, так и явная потребность в фильтрах ненормативной лексики (см. Википедия здесь ), но они часто не дают 100% точности по совершенно разным причинам; Контекст и точность .

Это зависит (целиком) от того, чего вы пытаетесь достичь - в самом основном, вы, вероятно, пытаетесь охватить « семь грязных слов », а затем некоторые ... Некоторым предприятиям нужно чтобы отфильтровать самое основное ненормативную лексику: основные нецензурные слова, URL-адреса или даже личную информацию и т. д., но другие должны предотвратить незаконное присвоение имени учетной записи (например, Xbox live) или многое другое ...

Пользовательский контент не только содержит потенциальные нецензурные слова, он также может содержать оскорбительные ссылки на:

  • Сексуальные акты
  • Сексуальная ориентация
  • Религия
  • Этнос
  • Etc ...

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

Я согласен с принятым ответом, что это не определенная наука, и , поскольку язык - это постоянно развивающаяся задача , но в которой коэффициент вылова 90% лучше, чем 0%. Это зависит исключительно от ваших целей - что вы пытаетесь достичь, уровень поддержки, которую вы имеете, и насколько важно удалить ненормативную лексику разных типов.

При построении фильтра необходимо учитывать следующие элементы и их отношение к вашему проекту:

  • Слова / фразы
  • Сокращения (FOAD / LMFAO и т. Д.)
  • Ложные срабатывания (слова, места и названия, такие как «мишит», «скунторп» и «титсворт»)
  • URL-адрес (порносайты являются очевидной мишенью)
  • Личная информация (электронная почта, адрес, телефон и т. Д. - если применимо)
  • Выбор языка (обычно по умолчанию английский)
  • Модерация (как, если вообще, вы можете взаимодействовать с пользовательским контентом и что вы можете с ним делать)

Вы можете легко создать фильтр ненормативной лексики, который фиксирует более 90% ненормативной лексики, но вы никогда не достигнете 100%. Это просто невозможно. Чем ближе вы хотите приблизиться к 100%, тем сложнее становится ... Создав в прошлом сложный механизм ненормативной лексики, который обрабатывал более 500 тыс. Сообщений в реальном времени в день, я бы предложил следующий совет:

Базовый фильтр будет включать:

  • Создание списка применимых ненормативной лексики
  • Разработка метода борьбы с ненормативной лексикой

Умеренно сложный файлер (в дополнение к базовому фильтру):

  • Использование сложного сопоставления с образцом для работы с расширенными деривациями (с использованием расширенного регулярного выражения)
  • Работа с Leetspeak (l33t)
  • Работа с ложными срабатываниями

Сложный фильтр будет включать в себя ряд следующих (в дополнение к умеренному фильтру):

26 голосов
/ 07 ноября 2008

Я не знаю каких-либо хороших библиотек для этого, но что бы вы ни делали, убедитесь, что вы ошиблись в направлении пропуска вещей. Я имел дело с системами, которые не позволяют мне использовать «mpassell» в качестве имени пользователя, потому что он содержит «ass» в качестве подстроки. Это отличный способ оттолкнуть пользователей!

23 голосов
/ 08 ноября 2008

Во время моего собеседования, технический директор компании, который брал у меня интервью, попробовал создать словесную / веб-игру, которую я написал на Java. Из списка слов всего Оксфордского словаря английского языка, какое первое слово было предложено угадать?

Конечно, самое грязное слово в английском языке.

Так или иначе, я все еще получил предложение о работе, но затем я отследил список ненормативной лексики (не в отличие от этого ) и написал быстрый скрипт для создания нового словаря без всех плохих слов ( даже без просмотра списка).

В вашем конкретном случае я думаю, что сравнение поиска с реальными словами звучит как способ составления списка слов. Альтернативные стили / знаки препинания требуют немного больше работы, но я сомневаюсь, что пользователи будут использовать это достаточно часто, чтобы вызвать проблемы.

21 голосов
/ 08 ноября 2008

система фильтрации ненормативной лексики никогда не будет идеальной, даже если программист вздрогнет и будет в курсе всех ню событий

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

Итак, единственное практическое решение имеет два аспекта:

  1. будьте готовы регулярно обновлять ваш словарь
  2. нанять редактора-человека для исправления ложных срабатываний (например, «clbuttic» вместо «классических») и ложных отрицаний (ой! Пропустил один!)
13 голосов
/ 07 ноября 2008

Единственный способ предотвратить оскорбительный ввод пользователя - запретить весь ввод пользователя.

Если вы настаиваете на разрешении пользовательского ввода и нуждаетесь в модерации, то включите модераторов-людей.

13 голосов
/ 07 ноября 2008
7 голосов
/ 08 ноября 2008

Что касается подвопроса «обмануть систему», вы можете справиться с этим, нормализуя как список «плохих слов», так и введенный пользователем текст перед выполнением поиска. Например, используйте серию регулярных выражений (или tr , если есть в PHP), чтобы преобразовать [z $ 5] в "s", [4 @] в " а "и т. д., затем сравните нормализованный список" плохое слово "с нормализованным текстом. Обратите внимание, что нормализация потенциально может привести к дополнительным ложным срабатываниям, хотя в настоящий момент я не могу вспомнить ни одного фактического случая.

Более сложная задача состоит в том, чтобы придумать что-то, что позволило бы людям цитировать «ручка сильнее меча», в то же время блокируя «пенисы».

7 голосов
/ 27 апреля 2010

Остерегайтесь проблем с локализацией: какое ругательство на одном языке может быть совершенно нормальным словом на другом.

Один текущий пример этого: ebay использует словарный подход для фильтрации «плохих слов» из обратной связи. Если вы попытаетесь ввести немецкий перевод «это была совершенная транзакция» («das war eine perfekte Transaktion»), ebay отклонит отзыв из-за плохих слов.

Почему? Потому что немецкое слово «был» - «война», а «война» в словаре «плохих слов» на ebay.

Так что будьте осторожны с проблемами локализации.

6 голосов
/ 07 ноября 2008

Если вы можете сделать что-то вроде Digg / Stackoverflow, где пользователи могут понизить / пометить непристойный контент ... сделайте это.

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

...