Основной фильтр ненормативной лексики в Objective C для iPhone
Как вы, как единомышленники, справились с основной проблемой фильтрации ненормативной лексики, очевидно, что невозможно справиться с каждым сценарием, но было бы неплохо иметь один на самом базовом уровне в качестве первой линии защиты.
В Obj-c у меня есть
NSString *tokens = [text componentsSeparatedByString:@" "];
И затем я перебираю каждый токен, чтобы увидеть, найдено ли какое-либо из ключевых слов (у меня около 400 в списке) в каждом токене.
Осознание ложных срабатываний также является проблемой, если слово является идеальным соответствием, оно помечается как ненормативная лексика, в противном случае, если найдено более 3 слов с ненормативной лексикой без идеального совпадения, оно также помечается как ненормативная лексика.
Позже я воспользуюсь веб-сервисом, который более точно решит проблему, но мне просто нужно что-то простое. Так что, если бы вы написали слово "пенис", это было бы очень плохо, плохо написано.
4 ответа
У меня просто есть предложение для токенизации строки. Ваши способы работают хорошо, если все слова разделены строками, но это редко встречается в большинстве сценариев использования, поскольку вам обычно приходится иметь дело с символами новой строки, пунктуацией и т. Д. Попробуйте это, если вам интересно:
NSMutableCharacterSet *separators = [NSMutableCharacterSet punctuationCharacterSet];
[separators formUnionWithCharacterSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSArray *words = [bigString componentsSeparatedByCharactersInSet:separators];
Источник: http://www.tech-recipes.com/rx/3418/cocoa-explode-break-nsstring-into-individual-words/
Фильтры непристойности: плохая идея или невероятно слаженная плохая идея?
У Джеффа есть интересная статья, которую стоит рассмотреть, прежде чем приступать к такому коду:
Что ж, поиск таким образом, безусловно, не самый эффективный способ поиска ненормативной лексики... более эффективным подходом было бы создание автомата с конечным состоянием для обнаружения слов и однократного прохождения текста через этот FSA. Вам на самом деле не нужно разбивать строки, чтобы найти ненормативную лексику, и все это расщепление добавляет дополнительное распределение и копирование накладных расходов, которые вам не нужны. Кроме того, в некоторых словах из черного списка могут быть общие закономерности, которые вы не используете, выполняя поиск по каждому слову в отдельности.
Тем не менее, я думаю, что 400 слов это довольно много. Кто именно ваша аудитория? Что делать, если у пользователя есть медицинский вопрос? Должны ли такие вопросы быть на самом деле запрещены? Я могу думать только о нескольких словах, которые будут считаться бранными в любом контексте, поэтому вы можете переосмыслить фильтрацию.
Пара вещей:
- FSA не обязательно будет работать в зависимости от того, насколько интеллектуальным вы хотите, чтобы фильтр был
- Regex, как правило, очень медленный в зависимости от того, сколько вы хотите запустить
- 400 слов несколько мало, в зависимости от ваших потребностей и языков
- Существует несколько чрезвычайно сложных случаев, которые следует учитывать при фильтрации, особенно встраивание таких слов, как "ASSume".
Моя компания, Inversoft, создает коммерческое решение для фильтрации, и оно достаточно интеллектуально. Он не использует регулярные выражения или FSA, но имеет специально разработанную технологию быстрой линейной обработки, которая делает его чрезвычайно быстрым и точным (4000+ сообщений в секунду). Он также содержит более 600 английских слов в ряде категорий, включая сленг, расовые оскорбления, наркотики, банды, религиозные и т. Д.
Если вы ищете интеллектуальное контекстно-зависимое решение с поддержкой, вам стоит обратиться к Clean Speak от Inversoft. Подключить его к Obj-C просто, используя XML WebService.