Как вы используете хороший фильтр ненормативной лексики?

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

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

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

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

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

Изменить: ответ на ответы, которые просто позволяют избежать проблем с программным обеспечением:

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

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

Ответ 1

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

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

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

Система, которая удаляет анонимность и вводит отчетность (что-то, что делает переполнение стека) также полезно, особенно для того, чтобы помочь бороться с John Gabriel GIFT

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

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

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

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

Основной фильтр будет включать:

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

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

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

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

  • Белые списки и черные списки
  • Наивный байесовский вывод фильтрация фраз/терминов
  • Soundex функции (где слово звучит как другое)
  • Расстояние Левенштейна
  • Stemming
  • Человеческие модераторы, чтобы помочь руководствуровать механизм фильтрации, чтобы учиться на примере или где совпадения недостаточно точны без руководства (система самообучения/улучшения)
  • Возможно, какая-то форма двигателя AI

Ответ 3

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

Ответ 4

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

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

Каким-то образом я получил предложение о работе, но затем выследил список слов профанации (не в отличие от этого) и быстро написал script, чтобы создать новый словарь без всех плохих слов (даже не глядя на список).

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

Ответ 5

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

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

поэтому единственное практическое решение двоякое:

  • будьте готовы часто обновлять словарь.
  • нанять редактора для исправления ложных срабатываний (например, "clbuttic" вместо "classic" ) и ложных негативов (пропущенных!)

Ответ 7

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

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

Ответ 8

Что касается вашего подцелья "trick the system", вы можете справиться с этим, нормализуя как список "плохого слова", так и введенный пользователем текст перед выполнением поиска. например, используйте ряд регулярных выражений (или tr, если у него есть PHP), чтобы преобразовать [z $5] в "s", [4 @] "a" и т.д., затем сравните нормализованный список "плохого слова" с нормализованным текстом. Обратите внимание, что нормализация может потенциально привести к дополнительным ложным срабатываниям, хотя я не могу думать о каких-либо реальных случаях на данный момент.

Большая задача состоит в том, чтобы придумать что-то, что позволит людям процитировать "Перо сильнее меча" при блокировке "p e n я s".

Ответ 9

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

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

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

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

Ответ 10

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

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

Ответ 11

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

Полное раскрытие, я написал этот плагин...

В любом случае.

Подход, с которым я пошел, заключается в том, чтобы разрешить пользователю "Opt-In" фильтровать профанацию. По сути, профанация будет разрешена по умолчанию, но если мои пользователи не хотят ее читать, им это не нужно. Это также помогает с проблемой "l33t sp3 @k".

Концепция - это простой jquery плагин, который вводится сервером, если учетная запись клиента позволяет фильтровать ненормативную лексику. Оттуда это всего лишь пара простых строк, которые вычеркивают ругательств.

Здесь демонстрационная страница
https://chaseflorell.github.io/jQuery.ProfanityFilter/demo/

<div id="foo">
    ass will fail but password will not
</div>

<script>
    // code:
    $('#foo').profanityFilter({
        customSwears: ['ass']
    });
</script>

результат

*** произойдет сбой, но пароль не будет

Ответ 12

не делать. Это просто приводит к проблемам. Один персональный опыт, который у меня есть с фильтрами ненормативной лексики, - это время, когда меня удаляли/запрещали из канала IRC, чтобы упомянуть, что я "направлялся через мост в Хэнкок на пару часов" или что-то в этом роде.

Ответ 13

Я согласен с сообщением HanClinto выше в этом обсуждении. Обычно я использую регулярные выражения для ввода текста со строкой. И это тщетное усилие, поскольку, как вы изначально упомянули, вы должны явно учитывать каждую трюковую форму написания популярных в сети в своем заблокированном списке.

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

Спасибо за идеи.

Правила HanClinto!

Ответ 14

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

$errors = array();  //Initialize error array (I use this with all my PHP form validations)

$SCREENNAME = mysql_real_escape_string($_POST['SCREENNAME']); //Escape the input data to prevent SQL injection when you query the profanity table.

$ProfanityCheckString = strtoupper($SCREENNAME); //Make the input string uppercase (so that 'BaDwOrD' is the same as 'BADWORD').  All your values in the profanity table will need to be UPPERCASE for this to work.

$ProfanityCheckString = preg_replace('/[_-]/','',$ProfanityCheckString); //I allow alphanumeric, underscores, and dashes...nothing else (I control this with PHP form validation).  Pull out non-alphanumeric characters so 'B-A-D-W-O-R-D' shows up as 'BADWORD'.

$ProfanityCheckString = preg_replace('/1/','I',$ProfanityCheckString); //Replace common numeric representations of letters so '84DW0RD' shows up as 'BADWORD'.

$ProfanityCheckString = preg_replace('/3/','E',$ProfanityCheckString);

$ProfanityCheckString = preg_replace('/4/','A',$ProfanityCheckString);

$ProfanityCheckString = preg_replace('/5/','S',$ProfanityCheckString);

$ProfanityCheckString = preg_replace('/6/','G',$ProfanityCheckString);

$ProfanityCheckString = preg_replace('/7/','T',$ProfanityCheckString);

$ProfanityCheckString = preg_replace('/8/','B',$ProfanityCheckString);

$ProfanityCheckString = preg_replace('/0/','O',$ProfanityCheckString); //Replace ZERO with O (Capital letter o's).

$ProfanityCheckString = preg_replace('/Z/','S',$ProfanityCheckString); //Replace Z with S's, another common substitution.  Make sure you replace Z with S in your profanity database for this to work properly.  Same with all the numbers too--having S3X7 in your database won't work, since this code would render that string as 'SEXY'.  The profanity table should have the "rendered" version of the bad words.

$CheckProfanity = mysql_query("SELECT * FROM DATABASE.TABLE p WHERE p.WORD = '".$ProfanityCheckString."'");
if(mysql_num_rows($CheckProfanity) > 0) {$errors[] = 'Please select another Screen Name.';} //Check your profanity table for the scrubbed input.  You could get real crazy using LIKE and wildcards, but I only want a simple profanity filter.

if (count($errors) > 0) {foreach($errors as $error) {$errorString .= "<span class='PHPError'>$error</span><br /><br />";} echo $errorString;} //Echo any PHP errors that come out of the validation, including any profanity flagging.


//You can also use these lines to troubleshoot.
//echo $ProfanityCheckString;
//echo "<br />";
//echo mysql_error();
//echo "<br />";

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

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

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

Ответ 15

Я собрал 2200 плохих слов на 12 языках: en, ar, cs, da, de, eo, es, fa, fi, fr, hi, hu, it, ja, ko, nl, no, pl, pt, ru, sv, th, tlh, tr, zh.

Доступны параметры дампа MySQL, JSON, XML или CSV.

https://github.com/turalus/openDB

Я предлагаю вам выполнить этот SQL в вашей БД и проверять каждый раз, когда пользователь вводит что-то.

Ответ 16

Честно говоря, я позволил бы им получить слова "trick the system" и запретить их, а это только я. Но это также упрощает программирование.

Что бы я сделал, так это реализовать фильтр регулярных выражений: /[\s]dooby (doo?)[\s]/i или слово префикс на других, /[\s]doob(er|ed|est)[\s]/. Это предотвратило бы фильтрацию слов, таких как assuaged, что совершенно верно, но также потребует знания других вариантов и обновления фактического фильтра, если вы изучите новый. Очевидно, что это все примеры, но вам придется решить, как сделать это самостоятельно.

Я не собираюсь печатать все слова, которые я знаю, а не тогда, когда я действительно не хочу их знать.

Ответ 17

Я согласен с тщетностью предмета, но если у вас есть фильтр, посмотрите Ning Boxwood:

Boxwood - это расширение PHP для быстрой замены нескольких слов в части текста. Он поддерживает чувствительность к регистру и нечувствительность к регистру. Он требует, чтобы текст, на котором он работал, кодировался как UTF-8.

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

С Boxwood вы можете иметь список поисковых терминов до тех пор, пока вам нравится - алгоритм поиска и замены не замедляется, и больше слов в списке слов, которые нужно искать. Он работает, создавая три из всех поисковых терминов, а затем просматривает текст объекта только один раз, идя по элементам trie и сравнивая их с символами вашего текста. Он поддерживает US-ASCII и UTF-8, чувствительность к регистру или нечувствительность и имеет некоторую англоязычную логику проверки границ слов.

Ответ 18

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

  • Фильтр: фоновый сервис, который проверяет черный список, словарь или что-то в этом роде.
  • Не разрешать анонимную учетную запись
  • Сообщить о нарушении

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

Ответ 19

Также в конце игры, но проводил некоторые исследования и наткнулся здесь. Как уже упоминали другие, это почти почти невозможно, если бы это было автоматизировано, но если ваш дизайн/требование может включать в некоторых случаях (но не всегда) человеческие взаимодействия, чтобы проверить, является ли это нечестным или нет, вы можете рассмотреть ОД. https://docs.microsoft.com/en-us/azure/cognitive-services/content-moderator/text-moderation-api#profanity - мой текущий выбор по нескольким причинам:

  • Поддерживает много локализации
  • Они продолжают обновлять базу данных, поэтому мне не нужно идти в ногу с последними сленгами или языками (проблема обслуживания)
  • Когда есть высокая вероятность (т.е. 90% или более), вы можете просто отрицать это
  • Вы можете наблюдать за категорией, которая вызывает флаг, который может быть или не быть ненормативной лексикой, и может попросить кого-нибудь просмотреть его, чтобы узнать, что он является или не профан.

Для моих нужд это было/основано на общедоступном коммерческом сервисе (ОК, видеоигры), который другие пользователи могут/будут видеть имя пользователя, но дизайн требует, чтобы ему пришлось пройти фильтр ненормативной лексики, чтобы отклонить оскорбительное имя пользователя. Самое печальное в этом то, что классическая проблема "clbuttic", скорее всего, возникнет, поскольку имена пользователей обычно состоят из одного слова (до N символов) из нескольких соединенных слов... Опять-таки, служба познания Microsoft не будет помечать "Assist" как текст. HasProfanity = true, но может указывать высокую вероятность одной из категорий.

Как ОП спрашивает, что насчет "$$", вот результат, когда я пропустил его через фильтр: enter image description here, как вы можете видеть, он определил, что он не профан, но у него есть высокая вероятность того, что это так, поэтому флаги как рекомендации рассмотрения (взаимодействия человека).

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

Кстати, цена/цена на эту услугу для моей цели довольно низкая (как часто меняется имя пользователя?), Но, опять же, для OP, возможно, дизайн требует более интенсивных запросов и, возможно, не идеален для оплаты/подписки на ML-сервисы, или не могут иметь обзор/взаимодействие с человеком. Все зависит от дизайна... Но если дизайн действительно отвечает всем требованиям, возможно, это может быть OP-решением.

Если интересно, могу перечислить минусы в комментарии в будущем.

Ответ 20

Фильтры непристойности - плохая идея. Причина в том, что вы не можете поймать каждое ругательство. Если вы попытаетесь, вы получите ложные срабатывания.

Ловля слов

Скажем, вы хотите поймать F-Word. Легко, правда? Хорошо, посмотрим.

Вы можете прокрутить строку, чтобы найти "fuck". К сожалению, сейчас люди трюки фильтруют. Фильтр ненормативной лексики не взял "фук".

Можно попробовать проверить несколько вариантов написания и варианты слова, но это замедлит производительность вашего кода. Чтобы поймать F-Word, вам нужно искать "fuc", "Fuc", "fuk", "Fuk", "F ***" и т.д. И список можно продолжать и продолжать.

Избежать невинности

Хорошо, так как насчет того, чтобы сделать регистр нечувствительным и игнорировать пробелы, чтобы он ловил "F u C k"? Это может показаться хорошей идеей, но кто-то может просто обойти фильтр профанации с помощью "F.U.C.K."

Вы игнорируете пунктуацию.

Теперь это реальная проблема, так как предложение " Ад o, есть!" будет подниматься как "ад" и "Wh ass вверх?" поднимается как "задница".

И есть куча слов, которые вы должны исключить из фильтра, например "Cons tit, потому что там есть" tit ".

Люди также могут использовать слова-заменители, такие как "Frack". Вы тоже блокируете это? Как насчет "перо" для "пениса"? У вашей программы нет искусственного интеллекта, чтобы знать, хороша или плохая строка.

Не используйте фильтры profanity. Их трудно развить, и они так же медленны, как сканирование.

Ответ 21

Не.

Потому что:

  • Clbuttic
  • Ненависть не OMG EVIL
  • Профинансирование не может быть эффективно определено
  • Большинство людей, вероятно, не считают, что они "защищены" от ненормативной лексики.

Изменить: Хотя я согласен с комментатором, который сказал, что "цензура ошибочна", это не характер этого ответа.