Фильтр ненормативной лексики с нечетким поиском в рубиновых рельсах - PullRequest
0 голосов
/ 04 февраля 2012

Я новичок в рельсах.

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

profanity_filter, если вообще есть грязное слово, допустим, "foulword" возвращает "f******d"

Если какой-либо пользователь играет умно и набирает "foulwoord" или "foulwordd" или "foulllword" и т. Д., Он не обнаруживает это как грязное слово.

Есть ли способ убедиться, что он обнаруживает эти пользовательские умные слова?

Ждем помощи!

Спасибо!

1 Ответ

3 голосов
/ 04 февраля 2012

Сколько грязных слов нужно отфильтровать?

Один из подходов состоит в том, чтобы использовать что-то вроде Diff::LCS (из самоцвета diff-lcs), чтобы проверить, сколько букв отличаются между проверяемым словом и каждым грязным словом. Если у вас есть много грязных слов для проверки, это может быть очень медленно. Одна вещь, которую вы могли бы сделать, чтобы сделать ее намного быстрее, это включить словарь "хороших" слов. Сохраните «хороший» словарь в Set, и прежде чем проверять каждое слово содержания, сначала проверьте, есть ли оно в словаре. Если это так, вы можете двигаться дальше. (Если вы хотите сделать проверку словаря очень быстрой, сохраните его в поисковой строке.)

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

Другой подход - генерировать варианты для каждого ненормативного слова и сохранять их в «плохом» словаре. Если вы сгенерируете каждое слово, которое отличается на 1 букву от ненормативной лексики, для каждого ненормативного слова будет примерно 200-500. Вы также можете генерировать слова, которые отличаются от нецензурной лексики только путем замены буквы «о» на ноль и т. Д.

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

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

...