Дизайн шаблона для блокировки нежелательного контента

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

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

В конце концов, проект не состоялся, по разным причинам, причем ненормативная лексика была одной.

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

Решения, которые я рассмотрел, были:

  • Запустите его через что-то вроде WebPurify
  • Используйте MechanicalTurk
  • Напишите шаблон регулярного выражения, который ищет слово в списке. Более сложная версия этого будет также рассматривать множественное число и прошедшие времена слова.
  • Напишите массив подозрительных слов и оцените каждое. Если представление превышает оценку, проверка не проходит.

Итак, есть два вопроса:

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

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

3 ответа

Решение

Вы думали о байесовской фильтрации? Байесовская фильтрация предназначена не только для обнаружения спама. Вы можете обучить их различным задачам распознавания текста. Возьмите байесовский фильтр, соберите несколько текстов запросов и начните отмечать их как содержащие ненормативную лексику или нет. Через некоторое время (сколько времени зависит от количества и типа обучающих данных) ваш фильтр сможет обнаруживать запросы, содержащие ненормативную лексику, из запросов, не содержащих ненормативную лексику.

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

Bogofilter

Bogofilter - это автономный байесовский фильтр, который работает в любой операционной системе Unix-y. Он нацелен на фильтрацию электронной почты, но вы можете обучить его любому тексту. Я успешно использовал это для реализации специального фильтра спама для комментариев на моем собственном веб-сайте ( источник). Вы можете взаимодействовать с bogofilter, как вы можете с любым другим приложением командной строки. Посмотрите мою ссылку на исходный код для примера.

Ролл свой

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

Существующие библиотеки PHP

(Ab) использовать существующий фильтр электронной почты

Вы можете использовать стандартную установку SpamAssassin или DSpam и обучить ее распознавать ненормативную лексику. Просто убедитесь, что вы отключили параметры, специально предназначенные для сообщений электронной почты (например, парсинг блоков MIME, чтение заголовков), и просто включите параметры, связанные с обработкой текста на байсовом уровне. DSpam может быть легче адаптироваться. SpamAssassin имеет то преимущество, что вы можете добавлять собственные правила поверх байесовского фильтра. Для SpamAssassin не забудьте отключить все правила по умолчанию и вместо этого написать свои собственные. Все правила по умолчанию нацелены на обнаружение спама.

В прошлом я использовал прославленную форму str_replace, Вот мое обоснование:

  1. Слова ненормативной лексики могут быть заменены глупыми словами, которые передают исходный смысл сообщения, но препятствуют использованию ненормативной лексики
  2. На успешных постах, где выполнялась фильтрация, пользователям показывали сообщение об успешном завершении, но было уведомление о том, что санация была проведена (что-то вроде: "Ваше сообщение было добавлено, горшок".)
  3. Я никогда не хотел, чтобы представление провалилось. Сообщения были опубликованы без цензуры или цензуры. В вашем случае вы можете полностью запретить посты.

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

Как насчет использования нескольких правил сопоставления строк и помещения только тех в очередь на модерацию?

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

Тогда только небольшой процент должен отключить совпадения строк, чтобы оказаться в модерации. Даже при большой базе пользователей это должно сводить время модерирования к минимуму. Вы могли бы даже сделать очевидную ненормативную лексику, например, автоматическое слово f или n не может еще больше сократить оставшийся список.

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

Или просто используйте эту стратегию с фильтрацией Байса, как предложено @Sander.

Изменить: Также кнопка "сообщить о нарушении" поможет вам узнать, справляется ли плохой материал, но это может потребовать сохранения отправленных сообщений на некоторое время, и это может быть не идеально, если это будет очень активно.

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