Комментарии 79
я считаю это все полумерами, но статью написали хорошо.
такие фильтры часто только подогревают интерес к шалунству
такие фильтры часто только подогревают интерес к шалунству
Это в общем-то все понимают. Но зачастую посетители жалуются на матерящихся индивидов (здесь же могут быть дети!), а вот модерировать 24/7 вряд ли кто сможет.
как на счет того, чтобы придумать саморегуляцию? карму, бан за 10 «жалоб», етс?
Это помогает только при закрытой регистрации, как здесь например. Если же пользователь может спокойно нарегить еще 10 аккаунтов — никакая карма не поможет. Можно вводить ограничения для новичков, но это не сильно приятно для самих новичков и может отвернуть их от сервиса.
Можно придумать и другие системы саморегуляции. Например если на какой-то конкретный комментарий или статью больше 5 жалоб — то просто не отображать его и с последующим разбирательством или записью в базу…
Как минимум система саморегуляции нужна в параллели с системой фильтрования…
Как минимум система саморегуляции нужна в параллели с системой фильтрования…
Саморегуляция и мат несовместимы? Возьмите любой «пост ненависти» — матерный коммент заплюсуют.
лучше тогда сделать постмодерацию. т.е. чтоб фильтр срабатывал постфактум и нарушители наказывались (ro например). тогда они будут материться сколько влезет, а бан отхватывать по факту многочисленных нарушений и сразу хороший. а когда слова фильтруются сразу, они будут находить способы. кнопочка «Пожаловаться» тоже рулит, банилку потом можно выдавать особо активным пользователям
НЛО прилетело и опубликовало эту надпись здесь
К сожалению, идея заменять мат на более мягкие выражения была воспринята хабром неоднозначно.
Можно еще попробовать такой вариант: матерщиннику показываем его вариант, а вот остальной общественности — измененный фильтром. Ох не сразу они догадаются наверное :)
Необходим большой словарь;
Не учитывается морфология русского языка;
вот изза этих двух пунктов, ваш фильтр ничем практически не отличается от аналогов:)
но пост хорош, мне понравилось разъяснение… и самооценка
Не учитывается морфология русского языка;
вот изза этих двух пунктов, ваш фильтр ничем практически не отличается от аналогов:)
но пост хорош, мне понравилось разъяснение… и самооценка
Самые хорошие фильтры работают без словарей в чистом виде, а на основе морфологии и алгоритмов оценки. В зависимости от языка оценивают корни, приставки и т.д., оценивают «обычность» (выделяется ли фраза — допустим спецсимволы и числа в середине слова), а иногда направленность поста (opinion mining) — резкая ли она положительно/отрицательно или нейтральная. Но такие фильтры ресурсоёмкие.
xxx: Нет такого мат-фильтра, который бы остановил русского человека
bash.org.ru
bash.org.ru
Кстати, на форуме dkLab, на «Складе готовых решений» лежит навороченный класс для определения мата на php
Размер: 27,84 KB
большой словарь наверно… со всего баша собирали)))
большой словарь наверно… со всего баша собирали)))
>> Метод обнаружения мата основывается на корнях и предлогах русского языка, а не на словаре.
Ху*ней маятесь.
На мой взгляд, критика должна быть конструктивной. «Х**нёй маетесь» — не конструктивно, так как не предлагает никакого выхода из ситуации. Если бы вы написали что-то вроде: «Вы делаете бесполезную работу, уже выполненную в таких-то проектах», это было бы уже лучше. Человек бы знал, с чем сравнивать свою работу. Если бы вы написали что-то вроде: «Лучше использовать подобный подход в автоматической модерации ...», это было бы ещё лучше, так как даёт направление для дальнейшего развития.
А так вы «х**нёй маятесь». Нечего сказать — молчите.
А так вы «х**нёй маятесь». Нечего сказать — молчите.
Может, он просто проверял, есть ли мат-фильтры на Хабре :)
Ну ладно, перефразирую: Автор изобретает perpetuum mobile, потому что идея мат-фильтра невозможна, потому что мат не в конкретных словах, а в смысле и контексте. Даже если оставить юзерам только знаки препинания, они все равно смогут материться, например, пресловутым ascii артом.
очешуеть, я думал, что все просто проверяют по словарю. Причем не целые слова, так что слово «оглобля» превращается в «огло***». А у вас целые сотни регулярных выражений. Но результат все равно не идеальный. Кузнецов, например ущемляете в праве использовать профессиональные термины. ".Х.U.Й." оно не пропустит, а вот "_ХУЙ_", я так понял, пропускает. Так что есть куда улучшать.
Да вообще оба варианта должно проглотить. А вот с кузнецами действительно проблема. Хотя теоретически можно еще «белый список» организовать…
Разве? Насколько я помню регулярные выражения, как правило, "\W" — это любой символ кроме цифры, буквы или подчеркивания. Т.е. в слове "_хуй_" подчеркивания вроде бы будут частью слова. Учитывая «Ну и чтобы не было ложных срабатываний будем отрабатывать только слово целиком» слово "_хуй_" должно пропустить, если его нет в словаре.
А вообще, хорошо бы видеть реализацию этого, и иметь возможность потестировать.
Белый список это вариант. Можно проверять вхождения запретных слов в тестируемое слово исключая словарные. Т.е. пройтись по какому нибудь словарю без мата, выбрать там слова в которые есть матерные подстроки и занести их в белый список. Тогда «оглобля» окажется в белом списке и не будет зацензурена. А «оххуительно» будет, ибо в нем подстрока «хуй». Можно усложнить, что бы учесть подчеркивания, повторы, ударения. Чтобы слова типа «охууу´ительно» тоже цензурило. Но надо не переусердствовавать, что бы во фразе «ох, уйди прочь» оно не нашло мата.
А вообще, хорошо бы видеть реализацию этого, и иметь возможность потестировать.
Белый список это вариант. Можно проверять вхождения запретных слов в тестируемое слово исключая словарные. Т.е. пройтись по какому нибудь словарю без мата, выбрать там слова в которые есть матерные подстроки и занести их в белый список. Тогда «оглобля» окажется в белом списке и не будет зацензурена. А «оххуительно» будет, ибо в нем подстрока «хуй». Можно усложнить, что бы учесть подчеркивания, повторы, ударения. Чтобы слова типа «охууу´ительно» тоже цензурило. Но надо не переусердствовавать, что бы во фразе «ох, уйди прочь» оно не нашло мата.
Действительно, подчеркивание я из этого символьного класса упустил. В прочем остальные предложенные вами варианты будут нормально отбракованы — ударение, удвоение букв, разные слова.
Реализацию постараюсь выложить в следующий раз — на данный момент выглядит не очень и поэтому показывать пока не хочу :).
Реализацию постараюсь выложить в следующий раз — на данный момент выглядит не очень и поэтому показывать пока не хочу :).
НЛО прилетело и опубликовало эту надпись здесь
хороший вариант это поиск «фонетически близких» слов. Есть соответствующие азбуки и алгоритмы. Подобные алгоритмы позволяют обходить опечатки и намеренные искажения слов (в неких пределах, естественно). Однако, могут по случайности захватывать и вполне приличные в написании слова.
Вообще, идеальный порядок недостижим. Но приемлемого уровня можно достичь, если ввести внятные правила и беспристрастную модерацию («вахтёром», например;).
Вообще, идеальный порядок недостижим. Но приемлемого уровня можно достичь, если ввести внятные правила и беспристрастную модерацию («вахтёром», например;).
Видел нечто подобное для английского языка (soundex и т.п.). Есть примеры для русского?
к сожалению, я только слушал рассказы знакомого, о приведении в порядок электронной библиотеки МИАН'а. Судя по его рассказам — да, есть. Или, по крайней мере, это не так сложно изобразить самому. Но конкретнее ничего не смогу сказать, так как занимаюсь совсем другими вещами.
Писал давно простенькую реализацию, с поиском фамилий справлялась.
github.com/Breathless/Codeine/blob/master/Driver/Process/Text/Metaphone/Default.php
github.com/Breathless/Codeine/blob/master/Driver/Process/Text/Metaphone/Default.php
после минутного зависания в гугле прочёл логичную идею: можно использовать транслитерацию в английский и затем уже soundex.
Да, я как раз про Soundex хотел сказать, он описан у Кнута в «Искусстве программирования». Такая встроенная функция даже есть в oracle, но, к сожалению, работает только с английским.
community.livejournal.com/ru_php/1062493.html
вот такое поделие есть. И ниже в комментариях сравнение с транслитерацией и потом soundex'ом.
community.livejournal.com/ru_php/1062493.html?thread=14696797#t14696797
На самом деле, думаю, нужный алгоритм давно существует и написан Яндексом. Просто я даже не знаю что спросить у поисковика, чтобы получить внятный ответ.
вот такое поделие есть. И ниже в комментариях сравнение с транслитерацией и потом soundex'ом.
community.livejournal.com/ru_php/1062493.html?thread=14696797#t14696797
На самом деле, думаю, нужный алгоритм давно существует и написан Яндексом. Просто я даже не знаю что спросить у поисковика, чтобы получить внятный ответ.
Очень актуальный вопрос для меня. Как раз пишу сейчас чат. Спасибо за статью.
НЛО прилетело и опубликовало эту надпись здесь
набор регулярок гинерируемых по словарю будет непроизводительно(это же тысячу вызовов регулярок)
предлагаю вначале привести строку в нормальную форму, что б все возможные варианты написания слова ХЛЕБ, такие как
Хлеб >
предлагаю вначале привести строку в нормальную форму, что б все возможные варианты написания слова ХЛЕБ, такие как
Хлеб >
парсер…
XLеб HлеБ hleb хЛеБ преобразовались в hleb, а уже в нормализованной строке сделать поиск по словарю
XLеб HлеБ hleb хЛеБ преобразовались в hleb, а уже в нормализованной строке сделать поиск по словарю
Получается примерно тоже самое, только путем серии замен. Вообще не обязательно на каждое слово делать отдельную регулярку, можно «склеить» несколько слов в одну.
Вообще ваш вариант имеет право на жизнь, меня смущает только то, как определить на какую часть оригинальной фразы сработал фильтр — бывает полезно для отбраковки ложных срабатываний.
Вообще ваш вариант имеет право на жизнь, меня смущает только то, как определить на какую часть оригинальной фразы сработал фильтр — бывает полезно для отбраковки ложных срабатываний.
Мелькнула в голове мысль.
Для фильтрации мата можно использовать матан-капчу. Схема следующая.
Если в сообщении обнаружено подозрение на мат, пишется предупреждение, и просьба решить матан-капчу. На каждое подозрительное слово — одна матан-капча. Уровень подозрительности при фильтрации можно повысить. Пользователь ставится перед выбором: или решай матан-пример, или убирай матерные слова.
То есть, тут работает принцип — у нас мат возможен. Но только для тех, кто готов пошевелить мозгами, чтобы его в чистом виде протолкнуть.
Думаю, поток тупого немотивированного мата резко снизится, останется только «грамотный» мат, написанный для пущщей экспресси.
Для фильтрации мата можно использовать матан-капчу. Схема следующая.
Если в сообщении обнаружено подозрение на мат, пишется предупреждение, и просьба решить матан-капчу. На каждое подозрительное слово — одна матан-капча. Уровень подозрительности при фильтрации можно повысить. Пользователь ставится перед выбором: или решай матан-пример, или убирай матерные слова.
То есть, тут работает принцип — у нас мат возможен. Но только для тех, кто готов пошевелить мозгами, чтобы его в чистом виде протолкнуть.
Думаю, поток тупого немотивированного мата резко снизится, останется только «грамотный» мат, написанный для пущщей экспресси.
А вот этот фильтр смотрели? Весьма интересно работает.
cpansearch.perl.org/src/ILYAS/Lingua-RU-Antimat-1.00/Antimat.pm
Только для utf8 придётся перекодировать.
Только для utf8 придётся перекодировать.
В свое время нашел где-то регулярку:
$pattern = "\w{0,5}[хx]([хx\s\!@#\$%\^&*+-\|\/]{0,6})[уy]([уy\s\!@#\$%\^&*+-\|\/]{0,6})[ёiлeеюийя]\w{0,7}|\w{0,6}[пp]([пp\s\!@#\$%\^&*+-\|\/]{0,6})[iие]([iие\s\!@#\$%\^&*+-\|\/]{0,6})[3зс]([3зс\s\!@#\$%\^&*+-\|\/]{0,6})[дd]\w{0,10}|[сcs][уy]([уy\!@#\$%\^&*+-\|\/]{0,6})[4чkк]\w{1,3}|\w{0,4}[bб]([bб\s\!@#\$%\^&*+-\|\/]{0,6})[lл]([lл\s\!@#\$%\^&*+-\|\/]{0,6})[yя]\w{0,10}|\w{0,8}[её][bб][лске@eыиаa][наи@йвл]\w{0,8}|\w{0,4}[еe]([еe\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})[uу]([uу\s\!@#\$%\^&*+-\|\/]{0,6})[н4ч]\w{0,4}|\w{0,4}[еeё]([еeё\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})[нn]([нn\s\!@#\$%\^&*+-\|\/]{0,6})[уy]\w{0,4}|\w{0,4}[еe]([еe\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})[оoаa@]([оoаa@\s\!@#\$%\^&*+-\|\/]{0,6})[тnнt]\w{0,4}|\w{0,10}[ё]([ё\!@#\$%\^&*+-\|\/]{0,6})[б]\w{0,6}|\w{0,4}[pп]([pп\s\!@#\$%\^&*+-\|\/]{0,6})[иeеi]([иeеi\s\!@#\$%\^&*+-\|\/]{0,6})[дd]([дd\s\!@#\$%\^&*+-\|\/]{0,6})[oоаa@еeиi]([oоаa@еeиi\s\!@#\$%\^&*+-\|\/]{0,6})[рr]\w{0,12}";
$string = 'Да вы, бля, все суки охуевшие совсем ебанулись, вашу мать, пидорасня хренова.';
echo mb_eregi_replace($pattern, '[у нас не ругаются матом]', $string);
На выходе получаем: Да вы, [у нас не ругаются матом], все [у нас не ругаются матом] [у нас не ругаются матом] совсем [у нас не ругаются матом], вашу мать, [у нас не ругаются матом] хренова.
$pattern = "\w{0,5}[хx]([хx\s\!@#\$%\^&*+-\|\/]{0,6})[уy]([уy\s\!@#\$%\^&*+-\|\/]{0,6})[ёiлeеюийя]\w{0,7}|\w{0,6}[пp]([пp\s\!@#\$%\^&*+-\|\/]{0,6})[iие]([iие\s\!@#\$%\^&*+-\|\/]{0,6})[3зс]([3зс\s\!@#\$%\^&*+-\|\/]{0,6})[дd]\w{0,10}|[сcs][уy]([уy\!@#\$%\^&*+-\|\/]{0,6})[4чkк]\w{1,3}|\w{0,4}[bб]([bб\s\!@#\$%\^&*+-\|\/]{0,6})[lл]([lл\s\!@#\$%\^&*+-\|\/]{0,6})[yя]\w{0,10}|\w{0,8}[её][bб][лске@eыиаa][наи@йвл]\w{0,8}|\w{0,4}[еe]([еe\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})[uу]([uу\s\!@#\$%\^&*+-\|\/]{0,6})[н4ч]\w{0,4}|\w{0,4}[еeё]([еeё\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})[нn]([нn\s\!@#\$%\^&*+-\|\/]{0,6})[уy]\w{0,4}|\w{0,4}[еe]([еe\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})[оoаa@]([оoаa@\s\!@#\$%\^&*+-\|\/]{0,6})[тnнt]\w{0,4}|\w{0,10}[ё]([ё\!@#\$%\^&*+-\|\/]{0,6})[б]\w{0,6}|\w{0,4}[pп]([pп\s\!@#\$%\^&*+-\|\/]{0,6})[иeеi]([иeеi\s\!@#\$%\^&*+-\|\/]{0,6})[дd]([дd\s\!@#\$%\^&*+-\|\/]{0,6})[oоаa@еeиi]([oоаa@еeиi\s\!@#\$%\^&*+-\|\/]{0,6})[рr]\w{0,12}";
$string = 'Да вы, бля, все суки охуевшие совсем ебанулись, вашу мать, пидорасня хренова.';
echo mb_eregi_replace($pattern, '[у нас не ругаются матом]', $string);
На выходе получаем: Да вы, [у нас не ругаются матом], все [у нас не ругаются матом] [у нас не ругаются матом] совсем [у нас не ругаются матом], вашу мать, [у нас не ругаются матом] хренова.
Цензура это зло, вместо того чтоб фильтровать слова, лучше просто «фильтровать неадекватов». И я не говорю о банах и прочих карательных мерах, я говорю о превентивных методах. В хорошем коллективе, никакие фильтры не нужны, ибо в таковых народ сам «фильтрует свой базар», всё что нужно это задать «нужный ритм».
Скажем так, мы тоже так думали до достижения 1000+ человек в одном чате…
Я регулярно сижу на форумах с 1000+ человек (именно активных) фильтры мата срабатывают дай бог раз в неделю. Добиться этого удалось очень просто, администрация просто задала ритм общения в вежливом ключе, и народ подхватил. Когда регистрируется новый пользователь, то он видит что тут приличное место, и ведёт себя прилично. (Исключения бывают только в случае конфликтов, когда пользователь нервничает и злится, тогда ему плевать на культуру и он матерится, таких надо «остудить», это не всегда просто, но всегда возможно.)
А где можно попробовать?
Просто интересно, выдержит ли система большой загиб?
Просто интересно, выдержит ли система большой загиб?
По опыту многолетнего модерирования общегородской локалки с чатом на базе DC++ скажу, что абсолютно любые матфильтры обходятся на ура. Слишком навороченные регулярки только мешают обычным пользователям. Если в чате есть дибилы, то ничто не поможет, кроме бана по ip.
в украинском языке ещё сложнее. у нас есть такие слова как «роблять» (делают на русском), «розробляти» (разрабатывать). очень много будет ложных срабатываний.
Несколько лет жил в студенческом общежитии, был у нас irc-сервер. Было прям как вы описали: мат, ругань, баны и т.п. Баны помогали плохо, так как ник можно сменить, а внешний айпи был один на всю общагу. Люди делали запароленные каналы, чтобы пообщаться спокойно, эти пароли регулярно вскрывали, каналы захватывали… В общем, обычное такое студ.общежитие. Потом я поехал учиться за границу. Студ. городок, десяток общаг, больше тысячи студентов в локальной сети (в русской общаге было меньше сотни), тоже irc-server. На каналах нет операторов, нет даже chanserv-а, но банить никого не нужно — все общаются спокойно и доброжелательно. Кроме чата был свой news-сервер с большим трафиком, но и там не возникало нужды кого-либо банить.
+10
Это как детское воспитание. Если ребенку еще в детском садике объяснить что слова такие-то и такие-то нехорошие и их употребление — это неуважение и не только к другим, но и к себе, то и по мере взросления он этих слов будет употреблять не много и не часто. А если у человека матерное слово это просто просто «часть речи» (предлог или союз), то никакие модерации и даны по IP не спасут. Он будет считать, что он прав а остальные нет.
Это как детское воспитание. Если ребенку еще в детском садике объяснить что слова такие-то и такие-то нехорошие и их употребление — это неуважение и не только к другим, но и к себе, то и по мере взросления он этих слов будет употреблять не много и не часто. А если у человека матерное слово это просто просто «часть речи» (предлог или союз), то никакие модерации и даны по IP не спасут. Он будет считать, что он прав а остальные нет.
Запретный плод сладок, потому и у нас так получается, что если за мат получишь Бан, то большинство проявляет спортивный интерес. А там никто никого не банит, вот и не матерятся в той степени, в которой это у нас.
не люблю я такие полуалгоритмы
пользы от них никакой
больше проблем
пользы от них никакой
больше проблем
А я пользуюсь вот такими «регулярками» .*ху(й|и|я|е|ли|ле).*
Мат иногда бывает в тему.
спасибо автору за эту статью, особенно за «Расстояние Левенштейна», очень полезная штука, зуб даю что пригодится не раз.
НЛО прилетело и опубликовало эту надпись здесь
250 слов в студию!
Я всегда смогу найти способ написания матерного слова, который поймёт человек, но не поймёт парсер :)
в этом посте я увидел больше мата, чем на всём хабре за месяц. отлично, отлично, господа борцы с матом.
Дабы отсекать всякие извращения с заменами букв посреди слова, нужно принудительно транслировать их в язык превалирующий в данной фразе и выдавать именно в транслированном виде(просто получать их транскрипцию в этот язык). Например: Я пошел купить hleba => Я пошел купить хлеба.
Таким образом отсекутся слова с замененными схожими буквами и их проще будет проверять, и после транслирования они уже не будут матами. Но будет проблема со всякими именами, аббревиатурами и тд.
Таким образом отсекутся слова с замененными схожими буквами и их проще будет проверять, и после транслирования они уже не будут матами. Но будет проблема со всякими именами, аббревиатурами и тд.
мои попытки написания мат-фильтра в свое время споткнулись на слове «витебляне», после чего фильтр был благополучно заброшен
я на одном проекте решал так:
1. разбиваем строку по пробелам
2. проверяем слова на принадлежность к белому списку слов
3. если пусто, то проверяем регуляркой
4. если пусто, проверяем по доп базе написаной ручками
после нескольких месяцев тестирования и заполнения баз, эффект отличный.
один минус, ресурсоемко :(
1. разбиваем строку по пробелам
2. проверяем слова на принадлежность к белому списку слов
3. если пусто, то проверяем регуляркой
4. если пусто, проверяем по доп базе написаной ручками
после нескольких месяцев тестирования и заполнения баз, эффект отличный.
один минус, ресурсоемко :(
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Пишем фильтр «плохих» слов