Pergunta

Como você gosta de indivíduos que cuidaram do desafio básico de filtrar palavrões, obviamente não se pode enfrentar todos os cenários, mas seria bom ter um no nível mais básico como primeira linha de defesa.

Em obj-c eu tenho

NSString *tokens = [text componentsSeparatedByString:@" "];

E então eu percorro cada token para ver se alguma das palavras -chave (eu tenho cerca de 400 em uma lista) são encontradas em cada token.

Perceber falsos positivos também são um problema, se a palavra for uma combinação perfeita, é sinalizada como palavrões, caso contrário, se mais de três palavras com palavrões forem encontrados sem serem combinados perfeitos, ela também é sinalizada como palavrões.

Mais tarde, usarei um serviço da web que aborda o problema com mais precisão, mas eu realmente só preciso de algo básico. Então, se você escrevesse a palavra pênis, ela seria travessa travessa, uma palavra ruim escrita.

Foi útil?

Solução

Eu só tenho uma sugestão para tokenizar a string. Seus caminhos funcionam bem se as palavras forem todas separadas por strings, mas esse raramente é o caso na maioria dos cenários de uso, pois você normalmente precisaria lidar com linhas de newines, pontuação etc. Tente isso se estiver interessado:

NSMutableCharacterSet *separators = [NSMutableCharacterSet punctuationCharacterSet];

[separators formUnionWithCharacterSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

NSArray *words = [bigString componentsSeparatedByCharactersInSet:separators];

Fonte: http://www.tech-recipes.com/rx/3418/cocoa-explode-brak-nsstring-into-individual-dords/

Outras dicas

Filtros de obscenidade: má idéia, ou uma má idéia incrivelmente intercalada?

Jeff tem um artigo interessante a considerar antes de embarcar em tal parte do código:

http://www.codinghorror.com/blog/2008/10/obscenity-filters-bad-idea-or-inncredivelmente-intercoursing-bad-idea.html

Bem, pesquisar dessa maneira certamente não é a maneira mais eficiente de procurar palavrões ... uma abordagem mais eficiente seria construir um autômato de estado finito para detectar as palavras e executar o texto uma vez através desse FSA. Você realmente não precisa dividir as cordas para encontrar palavrões, e toda essa divisão adiciona alocação extra e copiagem de que você não precisa. Além disso, pode haver padrões comuns em algumas das palavras na lista negra, que você não está explorando pesquisando cada palavra individualmente.

Dito isto, acho que 400 palavras são muito. Quem, exatamente, é seu público? E se um usuário tiver uma pergunta médica? Tais perguntas devem ser realmente proibidas? Só posso pensar em um punhado de palavras que seriam consideradas profanas em qualquer contexto, portanto, você pode repensar a filtragem.

Um par de coisas:

  • FSA não funcionará necessariamente dependendo de quão inteligente você deseja que o filtro seja
  • Regex geralmente é extremamente lento, dependendo de quantos você deseja correr
  • 400 palavras são um pouco baixas, dependendo de suas necessidades e Langauges
  • Há vários casos extremamente complicados para ter cuidado ao filtrar, principalmente a incorporação de palavras como "assumir"

Minha empresa, Inversoft, constrói uma solução de filtragem comercial e é bastante inteligente. Ele não usa Regex ou FSA, mas possui uma tecnologia de processamento linear rápido personalizado que a torna extremamente rápida e precisa (mais de 4.000 mensagens por segundo). Ele também possui mais de 600 palavras em inglês em várias categorias, incluindo gírias, insultos raciais, drogas, gangues, religiosos, etc.

Se você estiver procurando uma solução inteligente com reconhecimento de contexto com suporte, verifique o Fale Clean Speak do Inversoft. Vincular a OBJ-C deve ser simples usando o XML WebService.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top