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

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

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

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

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

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

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

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

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

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

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

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

Система, которая устраняет анонимность и вводит отчетность (что-то, что делает переполнение стека) также полезно, особенно для того, чтобы помочь бороться с ПОДАРОК ​​Джона Габриэля

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Посмотрите на веб-службу фильтров Proanity Filter CDYNE

Тестирование URL

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

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

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

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

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

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

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

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

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

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

Не.

Потому как:

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

Редактировать: Хотя я согласен с комментатором, который сказал, что «цензура неверна», это не характер этого ответа.

Я немного опаздываю на вечеринку, но у меня есть решение, которое может работать для тех, кто это читает. Это в 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> 

результат

*** не удастся, но пароль не будет

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

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

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

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

Правила HanClinto!

Когда у вас есть хорошая таблица 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 'BADWORD' 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's with O's (Capital letter o's). $ProfanityCheckString = preg_replace('/Z/','S',$ProfanityCheckString); //Replace Z's with S's, another common substitution. Make sure you replace Z's with S'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 />"; 

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

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

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

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

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

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

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

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

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

  • Быстрая замена нескольких строк в PHP

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

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

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

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

Я собрал 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 dump, JSON, XML или CSV.

https://github.com/turalus/openDB

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

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

Ловля слов

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

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

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

Избегайте невинности

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

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

Теперь это реальная проблема, поскольку предложение типа « Черт возьми , вот!» заберет как «ад» и «Wh ass up?» поднимается как «задница».

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

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

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