Como se implementa um bom filtro de profanação?

Muitos de nós precisam de lidar com a entrada do utilizador, consultas de pesquisa e situações em que o texto de entrada pode potencialmente conter palavrões ou linguagem indesejável. Muitas vezes, isto precisa de ser filtrado.

Onde se pode encontrar uma boa lista de palavrões em várias línguas e dialectos?

existem APIs disponíveis para fontes que contêm boas listas? Ou talvez uma API que simplesmente diz "sim isto é limpo" ou "não isto é sujo" com alguns parâmetros?

o que são alguns bons métodos para apanhar pessoas a tentar enganar o sistema, como um dólar, azz ou a55?

Pontos de bónus se oferecer soluções para o PHP. :)

Editar: resposta às respostas que dizem simplesmente evitar o problema programático:

Eu acho que há um lugar para este tipo de filtro Quando, por exemplo, um usuário pode usar a pesquisa de imagens públicas para encontrar imagens que são adicionadas a uma piscina comunitária sensível. Se eles podem procurar por "pénis", então eles provavelmente obter muitas fotos de, yep. Se não queremos imagens disso, então evitar a palavra como um termo de busca é um bom guardião, embora reconhecidamente não um método infalível. Obter a lista de Palavras em primeiro lugar é a verdadeira questão.

Então, estou a referir-me a uma forma de descobrir de um único símbolo que é sujo ou não e depois simplesmente rejeitá-lo. Não me preocuparia em evitar um sentimento como a hilariante referência "girafa de pescoço longo". Não podes fazer nada lá. :)

Author: codeforester, 2008-11-07

20 answers

Filtros de obscenidade: má ideia,ou Incrivelmente má ideia?

Além disso, não se pode esquecer a história incalculável do Velocista da Toontown, onde mesmo usando uma "lista de palavras-chave" resultou numa criança de 14 anos rapidamente contorná-la com: "Quero enfiar a minha Girafa de pescoço longo pelo teu coelhinho branco fofo." Em última análise, para qualquer sistema que você implemente, não há absolutamente nenhum substituto para a revisão humana (peer ou peer). contrario). Sinta-se livre para implementar uma ferramenta rudimentar para se livrar do drive-by, mas para o troll determinado, você absolutamente deve ter uma abordagem não baseada em algoritmos. Um sistema que remove o anonimato e introduz a prestação de contas (algo que Stack Overflow faz bem) também é útil, particularmente para ajudar a combater o G. I. F. T. de John Gabriel.

Você também perguntou onde você pode obter listas de palavrões para começar -- um projeto de código aberto para verificar é Dansguardian -- check out the source code for their default profanity lists. Existe também uma lista de frases que pode transferir para o proxy que pode ser um ponto de respigamento útil para si.

Editar em resposta a pergunta editar: Obrigado pelo esclarecimento sobre o que você está tentando fazer. Nesse caso, se você está apenas tentando fazer um filtro de palavras simples, há duas maneiras que você pode fazer isso. Um é criar um único e longo regexp com todos os as frases proibidas que você quer censurar, e simplesmente fazer um regex encontrar/substituir com ele. Uma expressão regular como:

$filterRegex = "(boogers|snot|poop|shucks|argh)"

E executá-lo no seu texto de entrada usando preg_ Match () para o teste grossista de uma resposta positiva,

Ou preg_place() para apagá-los.

Você também pode carregar essas funções com arrays em vez de um único regex longo, e para listas de palavras longas, ele pode ser mais gerenciável. Veja o preg_ Place () para alguns bons exemplos de como arrays podem ser usado com flexibilidade.

Para obter exemplos de programação PHP, veja esta página para um um pouco avançada classe genérica para a filtragem de palavras que *'s fora do centro de letras do censurado palavras, e isso anteriores Estouro de Pilha pergunta, que também tem um exemplo PHP (a principal parte valiosa lá é o baseado em SQL palavra filtrada abordagem -- o leet-falar do compensador pode ser dispensada se você achar que é desnecessário).

Você também adicionou: "Obter a lista de palavras em primeiro lugar, a verdadeira questão. " -- além de algumas das ligações Dansgaurdianas anteriores, você pode achar que isto é útil .zip de 458 palavras para ser útil.

 165
Author: HanClinto, 2017-05-23 11:33:17
Embora saiba que esta questão é bastante antiga,mas é uma questão comum...

Existe uma razão e uma necessidade distinta de filtros de profanação (ver A entrada na Wikipédia aqui ), mas muitas vezes não são 100% precisos por razões muito distintas; contexto e Precisão.

[[1]} depende (totalmente) do que você está tentando alcançar-no que é mais básico, você provavelmente está tentando cobrir o "Sete Palavras sujas " e então cerca... Algumas empresas precisam filtrar o mais básico dos palavrões: palavras básicas de palavrões, URLs ou até mesmo informações pessoais e assim por diante, mas outros precisam evitar nomes ilícitos de contas (Xbox live é um exemplo) ou muito mais...

O Conteúdo Gerado pelo Utilizador não contém apenas palavras de palavrões potenciais, Pode também conter referências ofensivas a:

  • actos sexuais
  • orientação Sexual
  • Religião
  • etnia
  • Etc...

E potencialmente, em várias línguas. O Shutterstock desenvolveu listas básicas de Palavras sujas {[[5]} em 10 línguas até à data, mas ainda é básico e muito orientado para as suas necessidades de 'tagging'. Há uma série de outras listas disponíveis na web.

Concordo com a resposta aceite que não é uma ciência definida e Como a linguagem é um desafio em constante evolução mas um desafio em que uma taxa de captura de 90% é melhor do que 0%. Depende puramente de seus objetivos - o que você está tentando alcançar, o nível de apoio que você tem e como é importante remover profanidades de diferentes tipos.

Ao construir um filtro, você precisa considerar os seguintes elementos e como eles se relacionam com o seu projecto:

  • palavras / frases
  • acrónimos (FOAD / LMFAO etc)
  • falsos positivos (palavras, lugares e nomes como 'mishit', 'scunthorpe' e 'titsworth')
  • URLs (sites pornográficos são um alvo óbvio) Pessoal informações (e - mail, endereço, telefone, etc-se aplicável)
  • escolha da língua (normalmente Inglês por omissão)
  • moderação (como, se de todo, você pode interagir com o Conteúdo Gerado pelo Usuário e o que você pode fazer com ele)
Podes facilmente construir um filtro de profanação que captura 90% ou mais de profanidades, mas nunca atingirás 100%. Não é possível. Quanto mais perto você quer chegar a 100%, mais difícil se torna... Tendo construído um complexo motor de profanação no passado que lidou com mais de 500 mil mensagens em tempo real por dia, eu ofereceria o seguinte conselho:

Um filtro básico envolveria:

  • elaborar uma lista das profissões aplicáveis
  • ([18]}desenvolver um método para lidar com derivações de profanidades

Um filtro moderadamente complexo envolveria, (além de um filtro básico):

  • usando padrões complexos para lidar com derivações alargadas (usando a expressão regular avançada)
  • Negociação com Leetspeak (l33t)
  • lidar com falsos positivos

Um filtro complexo envolveria um número dos seguintes (além de um filtro moderado):

 37
Author: nickhar, 2012-11-19 05:42:52
Não conheço nenhuma boa biblioteca para isto, mas faças o que fizeres, certifica-te de que erras na direcção de deixar passar as coisas. Já lidei com sistemas que não me permitiriam usar "mpassell" como um nome de utilizador, porque contém "ass" como uma substring. É uma óptima maneira de alienar utilizadores!
 24
Author: Matt Passell, 2008-11-07 20:26:00
Durante uma entrevista de emprego Minha, a empresa CTO que me entrevistava testou um jogo de palavras/web que escrevi em Java. De uma lista de palavras de todo o dicionário de inglês de Oxford, qual foi a primeira palavra que surgiu para ser adivinhado? É claro, a palavra mais feia da língua inglesa.

De alguma forma, eu ainda recebi a oferta de trabalho, mas então eu rastreei uma lista de palavras de profanidade (não ao contrário deste ) e escrevi um script rápido para gerar um novo dicionário sem todos os as palavras ruins (sem sequer ter que olhar para a lista).

Para o seu caso particular, acho que comparar a pesquisa com palavras reais soa como o caminho a seguir com uma lista de palavras como essa. Os estilos alternativos / pontuação requerem um pouco mais de trabalho, mas eu duvido que os usuários vão usar isso muitas vezes o suficiente para ser um problema.

 23
Author: Matthew, 2008-11-07 22:36:23
Um sistema de Filtragem de palavrões nunca será perfeito, mesmo que o programador seja convencido e esteja a par de todos os desenvolvimentos nus.

Dito isto, qualquer lista de 'palavras malandras' é provável que funcione bem como qualquer outra lista, uma vez que o problema subjacente é compreensão da linguagem que é praticamente intratável com a tecnologia actual

Então, a única solução prática é dupla:

  1. esteja preparado para actualizar o seu dicionário frequentemente
  2. contratar um editor humano para corrigir falsos positivos (por exemplo, "clbuttic" em vez de "classic") e falsos negativos (oops! falhou um!)
 21
Author: Steven A. Lowe, 2009-08-24 20:49:48

Dá uma vista de olhos ao serviço Web de Filtragem de palavrões da CDYNE

A testar o URL

 13
Author: Tim Cavanaugh, 2008-11-07 20:27:24

A única maneira de prevenir a entrada ofensiva do utilizador é impedir toda a entrada do utilizador.

Se você insiste em permitir a entrada do Usuário e precisa de moderação, então incorporar moderadores humanos.

 12
Author: Axel, 2008-11-07 20:42:39
Em relação à sua sub-pergunta" truque do sistema", você pode lidar com isso normalizando tanto a lista de" palavra ruim " quanto o texto introduzido pelo Usuário antes de fazer sua pesquisa. por exemplo, Use uma série de regexes (ou tr se o PHP o tiver) para converter [z$5] para "s", [4@] A "a", etc. em seguida, compare a lista normalizada de "palavra ruim" com o texto normalizado. Note que a normalização pode potencialmente levar a falsos positivos adicionais, embora eu não possa pensar em nenhum caso real de momento.

O maior desafio é encontrar algo que permita às pessoas citarem "a caneta é mais poderosa que a espada" enquanto bloqueia "P E n i s".

 7
Author: Dave Sherohman, 2008-11-08 01:35:13

Cuidado com as questões de localização: o que é uma palavra de ordem numa língua pode ser uma palavra perfeitamente normal noutra.

Um exemplo actual disto: o ebay usa uma abordagem de dicionário para filtrar "palavras más" do feedback. Se você tentar entrar na tradução alemã de" this was a perfect transaction "("das war eine perfekte Transaktion"), o ebay vai rejeitar o feedback devido a palavras ruins.

Porquê? Porque a palavra alemã para " ERA "é " guerra", e "guerra" está no dicionário ebay de "mau". palavra". Por isso, cuidado com as questões de localização.
 7
Author: Sam, 2010-04-27 12:55:55

Se você pode fazer algo como Digg/Stackoverflow onde os usuários podem baixar / marcar conteúdo obsceno... fazer.

Então tudo que você precisa fazer é rever os usuários "naughty", e bloqueá-los se eles quebrarem as regras.

 6
Author: scunliffe, 2008-11-07 20:46:59
Estou um pouco atrasado para a festa, mas tenho uma solução que pode funcionar para alguns que leram isto. Está em javascript em vez de php, mas há uma razão válida para isso.

Revelação completa, eu escrevi este plugin...

Enfim. A minha abordagem é permitir que um utilizador opte pela sua filtragem de profanação. Basicamente palavrões serão permitidos por padrão, mas se meus usuários não querem lê-lo, eles não precisam. Isto também ajuda com a edição "l33t sp3@k".

O conceito é um simples plugin jquery que é injectado pelo servidor se a conta do cliente estiver a activar a filtragem de palavrões. A partir daí, são apenas algumas linhas simples que apagam os palavrões.

Aqui está a página de demonstração.
https://chaseflorell.github.io/jQuery.ProfanityFilter/demo/
<div id="foo">
    ass will fail but password will not
</div>

<script>
    // code:
    $('#foo').profanityFilter({
        customSwears: ['ass']
    });
</script>

Resultado

** * vai falhar mas a senha não vai

 4
Author: Chase Florell, 2015-08-19 20:01:53
Concordo com o post de HanClinto nesta discussão. Eu geralmente uso expressões regulares para texto de entrada de correspondência de texto. E este é um esforço vÃ, como você mencionou originalmente você tem que explicar explicitamente para cada forma de truque de escrever popular na net em sua lista "bloqueada". Por outro lado, enquanto outros debatem a ética da censura, devo concordar que alguma forma é necessária na web. Algumas pessoas simplesmente gostam de postar vulgaridade porque pode ser imediatamente ofensivo para um grande corpo de pessoas, e requer absolutamente nenhum pensamento da parte do autor. Obrigado pelas ideias. HanClinto é o maior!
 2
Author: , 2009-02-24 20:30:20
Uma vez que você tem uma boa tabela MYSQL de algumas palavras ruins que você quer filtrar( eu comecei com uma das ligações neste tópico), você pode fazer algo assim:
$errors = array();  //Initialize error array (I use this with all my PHP form validations)

$SCREENNAME = mysql_real_escape_string($_POST['SCREENNAME']); //Escape the input data to prevent SQL injection when you query the profanity table.

$ProfanityCheckString = strtoupper($SCREENNAME); //Make the input string uppercase (so that 'BaDwOrD' is the same as 'BADWORD').  All your values in the profanity table will need to be UPPERCASE for this to work.

$ProfanityCheckString = preg_replace('/[_-]/','',$ProfanityCheckString); //I allow alphanumeric, underscores, and dashes...nothing else (I control this with PHP form validation).  Pull out non-alphanumeric characters so 'B-A-D-W-O-R-D' shows up as 'BADWORD'.

$ProfanityCheckString = preg_replace('/1/','I',$ProfanityCheckString); //Replace common numeric representations of letters so '84DW0RD' shows up as 'BADWORD'.

$ProfanityCheckString = preg_replace('/3/','E',$ProfanityCheckString);

$ProfanityCheckString = preg_replace('/4/','A',$ProfanityCheckString);

$ProfanityCheckString = preg_replace('/5/','S',$ProfanityCheckString);

$ProfanityCheckString = preg_replace('/6/','G',$ProfanityCheckString);

$ProfanityCheckString = preg_replace('/7/','T',$ProfanityCheckString);

$ProfanityCheckString = preg_replace('/8/','B',$ProfanityCheckString);

$ProfanityCheckString = preg_replace('/0/','O',$ProfanityCheckString); //Replace ZERO's with O's (Capital letter o's).

$ProfanityCheckString = preg_replace('/Z/','S',$ProfanityCheckString); //Replace Z's with S's, another common substitution.  Make sure you replace Z's with S's in your profanity database for this to work properly.  Same with all the numbers too--having S3X7 in your database won't work, since this code would render that string as 'SEXY'.  The profanity table should have the "rendered" version of the bad words.

$CheckProfanity = mysql_query("SELECT * FROM DATABASE.TABLE p WHERE p.WORD = '".$ProfanityCheckString."'");
if(mysql_num_rows($CheckProfanity) > 0) {$errors[] = 'Please select another Screen Name.';} //Check your profanity table for the scrubbed input.  You could get real crazy using LIKE and wildcards, but I only want a simple profanity filter.

if (count($errors) > 0) {foreach($errors as $error) {$errorString .= "<span class='PHPError'>$error</span><br /><br />";} echo $errorString;} //Echo any PHP errors that come out of the validation, including any profanity flagging.


//You can also use these lines to troubleshoot.
//echo $ProfanityCheckString;
//echo "<br />";
//echo mysql_error();
//echo "<br />";
Tenho a certeza de que há uma maneira mais eficiente de fazer todas essas substituições, mas não sou inteligente o suficiente para descobrir (e isto parece funcionar bem, embora ineficientemente). Acho que deves errar ao permitir que os utilizadores se registem, e usar os humanos para filtrar e Adicionar à tua mesa de profanação como necessario. Embora tudo dependa do custo de um falso positivo (palavra OK sinalizada como ruim) versus um falso negativo (palavra ruim passa). Isso deve, em última análise, determinar o quão agressivo ou conservador você é em sua estratégia de filtragem.

Eu também teria muito cuidado se você quiser usar wildcards, uma vez que às vezes eles podem se comportar mais onerously do que você pretende.

 2
Author: andrew, 2011-08-16 02:33:47

Reuni 2200 palavras más em 12 línguas: en, ar, cs, da, de, eo, es, fa, fi, fr, hi, hu, it, ja, ko, nl, no, pl, pt, ru, sv, th, tlh, tr, zh.

As opções MySQL dump, JSON, XML ou CSV estão disponíveis.

Https://github.com/turalus/openDB

Sugiro que execute este SQL no seu DB e verifique sempre que o Utilizador introduza alguma coisa.
 2
Author: Tural Ali, 2017-03-03 08:22:10
Francamente, deixava-os tirar as palavras "enganar o sistema" e bani-las, que sou só eu. Mas também torna a programação mais simples.

O que eu faria era implementar um filtro regex como este: {[[0]} ou a palavra é prefixada nos outros, /[\s]doob(er|ed|est)[\s]/. Isso evitaria filtrar palavras como suavaged, o que é perfeitamente válido, mas também exigiria conhecimento das outras variantes e atualização do filtro real se você aprender um novo. Obviamente estes são todos exemplos, mas você tens de decidir como fazê-lo sozinho.

Não vou escrever todas as palavras que conheço, não quando não as Quero conhecer.
 1
Author: Robert K, 2008-11-07 20:25:28
Não, só leva a problemas. Uma experiência pessoal clbuttic que eu tenho com filtros de profanidade é o tempo em que eu fui kick/banido de um canal IRC por mencionar que eu estava "indo sobre a ponte para Hancock por um par de horas" ou algo para esse efeito.
 1
Author: Adam Jaskiewicz, 2008-11-07 20:37:46
Eu concordo com a futilidade do sujeito, mas se você tem que ter um filtro, confira Ning's {[[2]}Boxwood:

Boxwood é uma extensão PHP para substituição rápida de várias palavras em um pedaço de texto. Suporta correspondências sensíveis a maiúsculas e minúsculas. Requer que o texto que opera seja codificado como UTF-8.

Veja Também este post no blog para mais detalhes:

Com Boxwood, você pode ter a sua lista de termos de pesquisa o tempo que quiser -- o algoritmo de pesquisa e substituição não fica mais lento com mais palavras na lista de palavras a procurar. Ele funciona através da construção de uma trie de todos os Termos de busca e, em seguida, varre o seu texto assunto apenas uma vez, caminhando por elementos da trie e comparando-os com personagens em seu texto. Ele suporta US-ASCII e UTF-8, correspondência sensível a maiúsculas ou insensível, e tem alguma verificação de limites de palavras centrada em inglês logico.

 1
Author: Gordon, 2010-09-30 09:01:18
Para criar um bom filtro de profanação, precisamos de três componentes principais, ou pelo menos é o que vou fazer. Estes são:
  1. The filter: a background service that verify against a blacklist, dictionary or something like that.
  2. não permitir uma conta anónima
  3. Denunciar abuso
Um bónus, será recompensar de alguma forma aqueles que contribuem com repórteres de abusos precisos e punir o infractor, por exemplo, suspender as suas contas.
 1
Author: Jaider, 2015-04-22 14:27:16
Não.

Porque:

  • Clbuttic
  • Profanação não é maldade OMG.
  • a profanação não pode ser definida de forma eficaz
  • A maioria das pessoas provavelmente não gosta de ser "protegida" de profanação.

Edit: embora eu concorde com o comentarista que disse "censura é errado", essa não é a natureza desta resposta.

 -1
Author: eyelidlessness, 2012-11-16 03:20:11

Filtros de palavrões são uma má ideia.A razão é que não consegues apanhar todas as palavrinhas. Se tentares, ficas com falsos positivos.

Apanhar Palavras

Digamos que queres apanhar a palavra começada por "F". Fácil, não é? Vejamos. Podes passar por uma corda para encontrar "foda-se"."Infelizmente, as pessoas hoje em dia enganam filtros. O filtro de palavrões não captou "fuk"."

Pode-se tentar verificar se existem várias grafias e variantes da palavra, mas isso irá abranda o desempenho do teu código. Para pegar a palavra-F, você precisa procurar por "fuc", "Fuc", "fuk"," Fuk", " F***", etc. E a lista continua.

Evitar A Inocência Então, que tal torná-lo insensível a maiúsculas e ignorar espaços para que ele apanhe "F U C k"? Isso pode parecer uma boa ideia, mas alguém pode ignorar o filtro de profanação com "F. U. C. K." Ignoras a pontuação. Isso é que é um problema, já que uma frase como:" vai pegar como "inferno" e "Cu para cima"?"pega como" rabo."

E há um monte de palavras que você tem que excluir do filtro, como "Constit, porque há" tit "nele.

As pessoas também podem usar palavras substitutas, como " Frack."Também bloqueias isso? E que tal "caneta" para "pénis"? O seu programa não tem inteligência artificial para saber se a corda é boa ou má.

Não uses filtros de palavrões. São difíceis de desenvolver., e são lentos como um rastejar.

 -2
Author: clickbait, 2015-06-21 19:52:25