Многим из нас приходится иметь дело с пользовательским вводом, поисковыми запросами и ситуациями, когда вводимый текст может содержать ненормативную лексику или нежелательный язык. Часто это нужно отфильтровать.
Где можно найти хороший список нецензурных слов на разных языках и диалектах?
Доступны ли API для источников, которые содержат хорошие списки? Или, может быть, API, который просто говорит «да, это чисто» или «нет, это грязно» с некоторыми параметрами?
Каковы хорошие методы для ловли людей, пытающихся обмануть систему, например, $$, azz или a55?
Бонусные баллы, если вы предлагаете решения для PHP. :)
Изменить: Ответ на ответы, которые говорят, просто избежать программной проблемы:
Я думаю, что есть место для такого рода фильтров, когда, например, пользователь может использовать общедоступный поиск изображений, чтобы найти изображения, которые будут добавлены в чувствительный пул сообщества. Если они могут искать «пенис», то они, скорее всего, получат много фотографий, да. Если нам не нужны картинки этого, то предотвращение слова в качестве поискового запроса - это хороший привратник, хотя и не надежный метод. Получение списка слов в первую очередь является реальным вопросом.
Так что я действительно имею в виду способ выяснить, является ли грязный токен грязным или нет, а затем просто запретить его. Я бы не стал предотвращать такое чувство, как совершенно смешное упоминание о «длинношерстном жирафе». Вы ничего не можете сделать там. :)
источник
Ответы:
Фильтры непристойности: плохая идея или невероятно плохая идея общения?
Кроме того, нельзя не вспомнить «Неописанную историю» SpeedChat в Тоунтауне , где даже использование «белого списка безопасных слов» привело к тому, что 14-летний парень быстро обошел его: «Я хочу засунуть своего жирафа с длинной шеей в вашего пушистого белого зайчика». «.
Итог: в конечном счете, для любой системы, которую вы внедряете, ничто не может заменить рецензирование человеком (независимо от того, является ли оно аналогичным или нет). Не стесняйтесь реализовывать элементарный инструмент, чтобы избавиться от попутчиков, но для решительного тролля вам абсолютно необходим подход, не основанный на алгоритмах.
Также полезна система, которая устраняет анонимность и вводит подотчетность (что хорошо справляется с переполнением стека), особенно для борьбы с ПОДАРОКОМ Джона Габриэля.
Вы также спросили, где вы можете получить списки ненормативной лексики, чтобы начать - один проект с открытым исходным кодом, который нужно проверить, это Dansguardian - проверьте исходный код для списков ненормативной лексики по умолчанию. Существует также дополнительный список фраз третьей стороны, который вы можете загрузить для прокси-сервера, который может быть полезным для вас.
Отредактируйте в ответ на вопрос edit: Спасибо за разъяснение того, что вы пытаетесь сделать. В этом случае, если вы просто пытаетесь сделать простой фильтр слов, есть два способа сделать это. Один из них - создать одно длинное регулярное выражение со всеми запрещенными фразами, которые вы хотите подвергнуть цензуре, и просто выполнить поиск / замену регулярного выражения. Регулярное выражение, как:
и запустите его на входной строке, используя preg_match (), чтобы протестировать результат на хит,
или preg_replace () чтобы убрать их.
Вы также можете загружать эти функции с массивами, а не с одним длинным регулярным выражением, и для длинных списков слов это может быть более управляемым. Смотрите preg_replace () для некоторых хороших примеров того, как можно гибко использовать массивы.
Дополнительные примеры программирования на PHP см. На этой странице с несколько более сложным универсальным классом для фильтрации слов, который * выделяет центральные буквы из цензурированных слов, и этот предыдущий вопрос о переполнении стека, в котором также есть пример PHP (основная ценная часть которого есть основанный на SQL подход отфильтрованного слова - можно обойтись без компенсатора речи, если в этом нет необходимости).
Вы также добавили: « Получение списка слов в первую очередь является реальным вопросом». В дополнение к некоторым предыдущим ссылкам Дансгаурда, вам может пригодиться этот полезный ZIP- файл из 458 слов.
источник
Хотя я знаю, что этот вопрос довольно старый, но это часто встречающийся вопрос ...
Существует как причина, так и явная потребность в фильтрах ненормативной лексики (см. Статью в Википедии здесь ), но они часто не достигают 100% точности по совершенно разным причинам; Контекст и точность .
Это зависит (целиком) от того, чего вы пытаетесь достичь - в самом основном, вы, вероятно, пытаетесь охватить « семь грязных слов », а затем некоторые ... Некоторым предприятиям необходимо отфильтровать самое основное из ненормативной лексики: ругайтесь словами, URL-адресами или даже личной информацией и т. д., но другие должны предотвращать незаконное присвоение имени учетной записи (например, Xbox live) или многое другое ...
Пользовательский контент не только содержит потенциальные ругательства, но также может содержать оскорбительные ссылки на:
И, возможно, на нескольких языках. На сегодняшний день компания Shutterstock разработала базовые списки грязных слов на 10 языках, но они все еще являются базовыми и в значительной степени ориентированы на их нужды в тегировании. В Интернете есть ряд других списков.
Я согласен с принятым ответом, что это не определенная наука, и, поскольку язык - это постоянно развивающаяся проблема, но проблема, когда коэффициент вылова составляет 90%, лучше, чем 0%. Это зависит исключительно от ваших целей - что вы пытаетесь достичь, уровень поддержки у вас и насколько важно удалить ненормативную лексику разных типов.
При построении фильтра необходимо учитывать следующие элементы и их связь с вашим проектом:
Вы можете легко создать фильтр ненормативной лексики, который фиксирует более 90% ненормативной лексики, но вы никогда не достигнете 100%. Это просто невозможно. Чем ближе вы хотите приблизиться к 100%, тем сложнее становится ... Создав в прошлом сложный механизм ненормативной лексики, который обрабатывал более 500 тыс. Сообщений в режиме реального времени в день, я бы предложил следующий совет:
Базовый фильтр будет включать:
Умеренно сложный файлер будет включать (в дополнение к базовому фильтру):
Сложный фильтр будет включать в себя ряд следующих (в дополнение к умеренному фильтру):
источник
Я не знаю каких-либо хороших библиотек для этого, но что бы вы ни делали, убедитесь, что вы ошибаетесь в направлении пропуска вещей. Я имел дело с системами, которые не позволяют мне использовать «mpassell» в качестве имени пользователя, потому что он содержит «ass» в качестве подстроки. Это отличный способ оттолкнуть пользователей!
источник
Во время моего собеседования, технический директор компании, который брал у меня интервью, попробовал создать словесную / веб-игру, которую я написал на Java. Из списка слов всего оксфордского словаря английского языка, какое было первое слово, которое было предложено угадать?
Конечно, самое грязное слово в английском языке.
Так или иначе, я все еще получил предложение о работе, но затем я отследил список ненормативной лексики (не похожий на этот ) и написал быстрый скрипт для генерации нового словаря без всех плохих слов (даже без необходимости просматривать список) ,
Для вашего конкретного случая, я думаю, что сравнение поиска с реальными словами звучит так же, как и список слов. Альтернативные стили / знаки препинания требуют немного больше работы, но я сомневаюсь, что пользователи будут использовать это достаточно часто, чтобы стать проблемой.
источник
система фильтрации ненормативной лексики никогда не будет идеальной, даже если программист вздрагивает и идет в ногу со всеми обнаженными разработками
Тем не менее, любой список «непослушных слов», вероятно, будет работать так же хорошо, как и любой другой список, поскольку основная проблема заключается в понимании языка, которое в значительной степени трудно поддается современной технологии.
Итак, единственное практическое решение имеет два аспекта:
источник
Единственный способ предотвратить оскорбительный ввод пользователя - запретить весь ввод пользователя.
Если вы настаиваете на разрешении пользовательского ввода и нуждаетесь в модерации, то включайте модераторов-людей.
источник
Взгляните на веб-сервис фильтра CDANE Profanity.
Тестирование URL
источник
Что касается подвопроса «обмануть систему», вы можете справиться с этим, нормализуя как список «плохих слов», так и введенный пользователем текст перед выполнением поиска. Например, используйте серию регулярных выражений (или tr, если он есть у PHP), чтобы преобразовать [z $ 5] в «s», [4 @] в «a» и т. д., затем сравните нормализованный список «плохих слов» с нормализованным текст. Обратите внимание, что нормализация потенциально может привести к дополнительным ложным срабатываниям, хотя в настоящий момент я не могу вспомнить ни одного фактического случая.
Более сложная задача - придумать что-то, что позволит людям цитировать « ручка сильнее меча», в то же время блокируя «пенис».
источник
Остерегайтесь вопросов локализации: что ругательство на одном языке может быть совершенно нормальным словом на другом.
Один текущий пример этого: ebay использует словарный подход для фильтрации «плохих слов» по отзывам. Если вы попытаетесь ввести немецкий перевод «это была совершенная транзакция» («das war eine perfekte Transaktion»), ebay отклонит отзыв из-за плохих слов.
Зачем? Потому что немецкое слово «был» - «война», а «война» в словаре «плохих слов» на ebay.
Так что остерегайтесь вопросов локализации.
источник
Если вы можете сделать что-то вроде Digg / Stackoverflow, где пользователи могут понизить / пометить непристойный контент ... сделайте это.
Тогда все, что вам нужно сделать, это просмотреть «непослушных» пользователей и заблокировать их, если они нарушают правила.
источник
Я немного опоздал на вечеринку, но у меня есть решение, которое может сработать для тех, кто читает это. Это в javascript вместо php, но есть веская причина для этого.
В любом случае.
Подход, который я выбрал, заключается в том, чтобы позволить пользователю «согласиться» на их фильтрацию ненормативной лексики. В основном ненормативная лексика будет разрешена по умолчанию, но если мои пользователи не хотят читать ее, они не должны. Это также помогает с проблемой «l33t sp3 @ k».
Концепция проста JQueryплагин, который вводится сервером, если учетная запись клиента включает фильтрацию ненормативной лексики. Оттуда это просто пара простых строк, которые вычеркивают ругательства.
Вот демонстрационная страница
https://chaseflorell.github.io/jQuery.ProfanityFilter/demo/
результат
источник
a$$
a$$
, то вы добавляете его в список фильтров.Я собрал 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 в вашей БД и проверять каждый раз, когда пользователь что-то вводит.
источник
Не. Это просто приводит к проблемам. Один из моих личных опытов с фильтрами ненормативной лексики - это время, когда меня выгнали / забанили на канале IRC за упоминание о том, что я «направляюсь через мост на Хэнкок на пару часов» или что-то в этом роде.
источник
Я согласен с постом HanClinto выше в этой дискуссии. Я обычно использую регулярные выражения для совпадения строк входного текста. И это тщетное усилие, так как, как вы изначально упоминали, вы должны явно учитывать все хитрые формы письма, популярные в сети, в вашем «заблокированном» списке.
С другой стороны, в то время как другие обсуждают этику цензуры, я должен согласиться с тем, что какая-то форма необходима в Интернете. Некоторым людям просто нравится публиковать вульгарность, потому что она может быть мгновенно оскорбительной для большого количества людей и абсолютно не требует размышлений со стороны автора.
Спасибо за идеи.
Правила HanClinto!
источник
Если у вас есть хорошая таблица MYSQL с некоторыми плохими словами, которые вы хотите отфильтровать (я начал с одной из ссылок в этой теме), вы можете сделать что-то вроде этого:
Я уверен, что есть более эффективный способ сделать все эти замены, но я не достаточно умен, чтобы понять это (и это, кажется, работает хорошо, хотя и неэффективно).
Я считаю, что вам следует ошибиться, если вы позволите пользователям регистрироваться и использовать людей для фильтрации и добавления в вашу таблицу ненормативной лексики по мере необходимости. Хотя все зависит от стоимости ложного срабатывания (хорошо помеченное как плохое слово) и ложного отрицания (плохое слово проходит). Это должно в конечном итоге определять, насколько агрессивны или консервативны вы в своей стратегии фильтрации.
Я также был бы очень осторожен, если вы хотите использовать подстановочные знаки, поскольку иногда они могут вести себя более обременительно, чем вы предполагаете.
источник
Честно говоря, я бы позволил им вывести слова «обмануть систему» и запретить их, а это только я. Но это также упрощает программирование.
То, что я сделал бы, это реализовать фильтр регулярных выражений, например, так:
/[\s]dooby (doo?)[\s]/i
или это слово с префиксом в других/[\s]doob(er|ed|est)[\s]/
. Это предотвратит фильтрацию слов, таких как предикат, что вполне допустимо, но также потребует знания других вариантов и обновления фактического фильтра, если вы изучите новый. Очевидно, что это все примеры, но вам придется решить, как сделать это самостоятельно.Я не собираюсь печатать все слова, которые я знаю, не тогда, когда я на самом деле не хочу их знать.
источник
Я согласен с бесполезностью субъекта, но если у вас есть , чтобы иметь фильтр, проверить Нин самшит :
Также см. Этот блог для более подробной информации:
источник
Я пришел к выводу, что для создания хорошего фильтра ненормативной лексики нам нужно 3 основных компонента, или, по крайней мере, это то, что я собираюсь сделать. Это они:
Бонусом будет то, чтобы как-то вознаградить тех, кто вносит свой вклад с помощью точных издевательств над журналистами, и наказать обидчика, например, приостановить их учетные записи.
источник
Также в конце игры, но проводил некоторые исследования и наткнулся здесь. Как уже упоминали другие, это почти почти невозможно, если бы это было автоматизировано, но если ваш дизайн / требование может включать в некоторых случаях (но не всегда) человеческие взаимодействия для проверки, является ли это нечестным или нет, вы можете рассмотреть ОД. https://docs.microsoft.com/en-us/azure/cognitive-services/content-moderator/text-moderation-api#profanity - мой текущий выбор по нескольким причинам:
Для меня это было / основано на общедоступной коммерческой службе (ОК, видеоигры), которую другие пользователи могут / увидят имя пользователя, но дизайн требует, чтобы ему пришлось пройти фильтр ненормативной лексики, чтобы отклонить оскорбительное имя пользователя. Грустная часть этого вопроса в том, что классическая проблема «clbuttic», скорее всего, возникнет, поскольку имена пользователей, как правило, состоят из одного слова (до N символов) из нескольких соединенных слов… Опять же, когнитивная служба Microsoft не будет помечать «Assist» как текст. HasProfanity = true, но может указывать высокую вероятность для одной из категорий.
Как ОП спрашивает, а как насчет «$$», вот результат, когда я пропустил его через фильтр: как вы можете видеть, он определил, что это не нечестно, но имеет высокую вероятность, что это так, поэтому помечает как рекомендации обзора (взаимодействия человека).
Когда вероятность высока, я могу либо вернуться назад: «Извините, это имя уже занято» (даже если это не так), чтобы оно было менее оскорбительным для лиц, не занимающихся цензурой, или что-то еще, если мы не хотим чтобы интегрировать обзор людей или вернуть «Ваше имя пользователя было уведомлено в оперативном отделе эксплуатации, вы можете подождать, пока ваше имя пользователя будет просмотрено и одобрено, или выбрать другое имя пользователя». Или что угодно ...
Кстати, цена / цена на эту услугу для моей цели довольно низкая (как часто меняется имя пользователя?), Но, опять же, для OP, возможно, дизайн требует более интенсивных запросов и, возможно, не идеален для оплаты / подписки на ML-сервисы, или не могут иметь обзор / взаимодействие с человеком. Все зависит от дизайна ... Но если дизайн отвечает всем требованиям, возможно, это может быть решением OP.
Если интересно, могу перечислить минусы в комментарии в будущем.
источник
Фильтры ненормативной лексики - плохая идея. Причина в том, что вы не можете уловить каждое ругательство. Если вы попытаетесь, вы получите ложные срабатывания.
Ловить слова
Скажем так, вы хотите поймать F-Word. Легко, правда? Ну посмотрим.
Вы можете перебрать строку, чтобы найти «ебать». К сожалению, в наши дни люди используют фильтры. Фильтр ненормативной лексики не улавливал "fuk".
Можно попытаться проверить наличие нескольких вариантов написания и вариантов слова, но это снизит производительность вашего кода. Чтобы поймать F-Word, вам нужно искать «fuc», «Fuc», «fuk», «Fuk», «F ***» и т. Д. И этот список можно продолжать и продолжать.
Избежание невинности
Итак, как насчет того, чтобы сделать его без учета регистра и игнорировать пробелы, чтобы он ловил "F u C k"? Это может звучать как хорошая идея, но кто-то может просто обойти фильтр ненормативной лексики с "FUCK"
Вы игнорируете пунктуацию.
Теперь это реальная проблема, так как предложение типа « Черт возьми ! будет воспринимать как "ад" и "как задницу ?" воспринимает как "задницу"
И там уже кучу слов , которые вы должны исключить из фильтра, таких как «Cons синица социологическое загрязнение» , потому что это «синица» в нем.
Люди могут также использовать замещающие слова, такие как «Frack». Вы тоже это блокируете? А как насчет «ручка» для «пенис»? Ваша программа не имеет искусственного интеллекта, чтобы знать, хороша ли строка или нет.
Не используйте ненормативную лексику. Их трудно развивать, и они так же медленны, как ползать.
источник
Не.
Так как:
Изменить: Хотя я согласен с комментатором, который сказал, что «цензура не так», это не характер этого ответа.
источник