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

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

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

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

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

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

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

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

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

Жаль, что все главные ответы - экзистенциальные и пораженческие отклонения от задачи программирования. Ввиду того, что «киборгские» вычислительные сервисы, такие как Mechanical Turk, набирают обороты, и почти все программное обеспечение становится социальным, как никогда важно иметь эвристику, чтобы пометить контент и привлечь внимание модератора!

JasonSmith 29.09.2009 15:02

Пожалуйста, будьте осторожны с языковым контекстом, особенно если вы используете i18n. Однажды я попытался создать группу Google для курса, который я читал, под названием «Sanal ortamda görselleştirme», что по-турецки означает «Визуализация в виртуальных медиа». Google был достаточно глуп, чтобы отклонить его потому что в названии было слово "анальный". Sanal [tr] = Virtual [en] и Google беззастенчиво обвинили меня в ненормативной лексике! : D Пожалуйста, не позволяйте происходить таким странным вещам.

edgerunner 19.09.2010 16:05

А как насчет того, чтобы найти слово в испанский? Таким образом можно обойти фильтр изображений Google (если вы локализованы на какой-то другой язык).

new123456 21.07.2011 05:46

Еще одно предложение - НЕ запрещать эти слова, а регистрировать пользователей, которые их используют. Если пользователь / IP получает больше 2, 3 или что угодно, заблокируйте этого человека. Это тоже не надежно, но я думаю, что гораздо неудобнее быть заблокированным и сменить пользователя / IP / обоих, чем писать «пушистый белый кролик» вместо «киска». Отчасти пользователи не знают, КАКИЕ слова или выражения они не могут использовать, поэтому они не могут просто угадывать разные плохие слова так легко, как их забанят.

Francisco Presencia 15.07.2012 12:19

Фильтры ненормативной лексики - плохая идея. Очень сложно отличить кого-то, пытающегося обмануть систему («Фаджи вам!»), И того, кто законно говорит о чем-то совершенно подходящем («Мне нравится шоколадная помадка»).

clickbait 03.06.2016 23:05
pip install -U expletives?
alvas 04.05.2017 10:07

Предлагаю не способствовать тоталитаризму и устроиться на настоящую работу.

Philosophist 07.11.2020 02:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
211
7
114 261
20
Перейти к ответу Данный вопрос помечен как решенный

Ответы 20

Ответ принят как подходящий

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

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

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

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

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

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

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

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

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

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

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

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

@JPLemme: Да, это должно быть - я должен был добавить [sic] потом, так как Этвуд это написал. :)

HanClinto 11.11.2008 21:37

«Клуб пингвинов» добавляет сотни записей в свой фильтр ненормативной лексики ежедневно: raphkoster.com/2008/05/09/…

Frank Farmer 20.06.2009 04:02

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

cjk 27.04.2010 17:03

@ck: Только если вас не беспокоит возможность отфильтровать неправильно написанные слова «F * ckkkk yo 'asssss» :) Я не уверен, что доверяю своим троллям очень точное написание.

HanClinto 28.04.2010 00:46

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

Alix Axel 26.07.2011 06:08

Удобная ревизия вашего регулярного выражения: $filterRegex = '/\b(boogers|snot|poop|shucks|argh)\b/i'; при условии, что вы не хотите блокировать опечатки в таких вещах, как «это не мое правописание,« жирные пальцы ». ;)

Bob Davies 08.07.2012 05:44

Так что вам не нужно ловить: b006ers, Booger, Booger, Booger, Booger или sɹǝbooq.

BryanH 16.11.2012 07:29

Если вы хотите услышать историю «Пушистый белый кролик» из уст пресловутой лошади, сейчас это эпизод подкаста: socialmediaclarity.tumblr.com/post/70499341079/…

F. Randall Farmer 20.12.2013 12:39

Не надо.

Потому что:

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

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

10 голосов за этот отказ? Как будто всякий, кто хочет отфильтровать ненормативную лексику, должен быть морализирующим недоумком? Печаль во благо. Это правильный вопрос, и язвительные ответы на него не следует вознаграждать. -1.

Kluge 08.11.2008 00:45

@Kludge: Ты единственный, кто сказал "морализаторское недоумение", на самом деле я вообще ничего не сказал о моральной природе внедрения фильтра ненормативной лексики. Митч упоминает отчасти причину, по которой я сказал «не надо», и это не язвительный проездной. Иногда «не надо» является правильным ответом на «как мне ...?» [продолжение]

eyelidlessness 08.11.2008 04:57

Я думаю, что это один из таких случаев. То, что вы не согласны, - это нормально, но я не думаю, что вам стоит вдаваться в подробности. И если вы хотите спросить Почему, я думаю, этого делать не следует, я буду рад уточнить ответ.

eyelidlessness 08.11.2008 04:58

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

Kluge 08.11.2008 20:09

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

eyelidlessness 09.11.2008 20:21

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

pspahn 27.04.2012 00:32

@pspahn, «не надо» - это правильный ответ на любой вопрос, в котором нужно найти решение не той проблемы. Конечно, есть допустимые случаи, когда контент следует модерировать, но «фильтр ненормативной лексики» - не то.

eyelidlessness 27.04.2012 02:03

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

pspahn 27.04.2012 21:03

@eyelidlessness По вашим рассуждениям, ответы на Stack Overflow будут широко открыты для выражения всевозможных мнений о том, что делается в вопросах. Переполнение стека - это ресурс вопросов и ответов, а не дискуссионный форум, и ответы могут быть использованы только чтобы дать ответ (в смысле «решение», а не в смысле «ответа»). Я никогда не предполагал, что оставлю этот биржевой комментарий пользователю с 5-значным представлением, но: Пожалуйста, прочтите страницу О, чтобы лучше понять формат сайта.

Adi Inbar 10.04.2014 01:32

В любом случае, это попало в очередь на просмотр LQP и, вероятно, скоро будет удалено.

Adi Inbar 10.04.2014 01:34

Честно говоря, я просмотрел другие ответы, и половина из них - мнения, а не реальные ответы. : |

Adi Inbar 10.04.2014 01:47

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

eyelidlessness 12.04.2014 03:58

представьте, что на вашем веб-сайте есть страница с автозаполнением "самых популярных поисковых запросов", и вы показываете "titfuck" в результатах №1. Вот где это полезно.

Rafael Sanches 07.11.2016 22:30

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

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

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

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

или запретить "кабину" в игре о летающих космических кораблях

Shinhan 08.11.2008 00:28

Взгляните на Веб-служба фильтра ненормативной лексики CDYNE

URL-адрес тестирования

Круто .. но он не поднял (.) (.)

Jason Jong 21.06.2011 08:10

Осторожный. CDYNE больше не обслуживает этот продукт. Вы можете использовать его на свой страх и риск.

Sari Rahal 23.09.2014 17:15

URL-адрес проверки Ссылка не работает.

Gaurav Sharma 14.07.2020 16:28

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

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

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

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

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

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

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

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

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

Просто найдите слово с пробелами с обеих сторон, точка после него, нет?

David D 21.11.2013 21:37

H3ll no man, это работает только в самых тривиальных случаях; мы имеем дело с людьми здесь, и они довольно умные :)

Steven A. Lowe 21.11.2013 21:53

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

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

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

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

Не по теме, а какое самое нецензурное слово? Я всегда считал это словом c или словом n, но я предполагаю, что люди думают, что слово f

Jeff 07.10.2011 03:29
"Я сомневаюсь, что пользователи будут использовать это достаточно часто, чтобы стать проблемой" Сохраняйте надежду. Как только пользователи наткнутся на фильтр, они будут работать над поиском способов обхода. Это может быть так же просто, как замена букв цифрами, нечетное размещение пробелов и т. д.).
BryanH 16.11.2012 07:26

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

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

Не забывайте expert-exchange.com и pen-island.com; эти URL-адреса сайтов когда-то не содержали дефисов.

BryanH 05.02.2013 23:10

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

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

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

HanClinto рулит!

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

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

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

Так что остерегайтесь проблем с локализацией.

Я согласен с бесполезностью этой темы, но если вам нужен фильтр, посмотрите Ning Самшит:

Boxwood is a PHP extension for fast replacement of multiple words in a piece of text. It supports case-sensitive and case-insensitive matching. It requires that the text it operates on be encoded as UTF-8.

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

With Boxwood, you can have your list of search terms be as long as you like -- the search and replace algorithm doesn't get slower with more words on the list of words to look for. It works by building a trie of all the search terms and then scans your subject text just once, walking down elements of the trie and comparing them to characters in your text. It supports US-ASCII and UTF-8, case-sensitive or insensitive matching, and has some English-centric word boundary checking logic.

Если у вас есть хорошая таблица 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'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 />";

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

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

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

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

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

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

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

Full disclosure, I wrote this plugin...

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

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

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

Вот демонстрационная страница
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>

результат

*** will fail but password will not

Вот jsFiddle рабочая демонстрация, сопровождающий этот ответ.

Chase Florell 19.08.2015 22:55

Очень наивно. Не фильтровал a$$

wingerse 09.04.2016 00:18

@EmperorAiman ​​никогда не предназначалось для фильтрации l33t говорить. Я не рекомендую пытаться фильтровать это, поскольку это проигрышная битва. Фильтр ненормативной лексики, который я опубликовал, «построен для того, чтобы пользователи могли« соглашаться »на фильтрацию ненормативной лексики». Это означает, что его лучше всего использовать на сайте, где по умолчанию разрешена ненормативная лексика. Если вы хотите отфильтровать a$$, вы добавляете его в список фильтров.

Chase Florell 12.04.2016 20:37

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

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

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

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

  • Половые акты
  • Сексуальная ориентация
  • Религия
  • Этническая принадлежность
  • Так далее...

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

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

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

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

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

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

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

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

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

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

Я собрал 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 в своей БД и проверять каждый раз, когда пользователь что-то вводит.

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

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

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

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

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

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

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

Другие вопросы по теме