Pergunta

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

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

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

Quais são alguns bons métodos para a captura de pessoas tentando enganar o sistema, como a $$, azz, ou a55?

pontos

bônus se você oferecer soluções para PHP. :)

Edit: Resposta a 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 imagem pública para encontrar fotos que são adicionados a uma piscina comunidade sensível. Se eles podem procurar por "pênis", então provavelmente eles vão ter muitas imagens de, sim. Se não queremos imagens de que, em seguida, evitando a palavra como um termo de pesquisa é uma boa gatekeeper, embora reconhecidamente não é um método infalível. Obtendo a lista de palavras em primeiro lugar é a verdadeira questão.

Então, eu estou realmente se referindo a uma maneira de descobrir de um único token está sujo ou não e, em seguida, simplesmente proibi-la. Eu não iria se preocupar evitando um sentimento como o de referência totalmente hilariante "girafa de pescoço comprido". Nada que você pode fazer lá. :)

Foi útil?

Solução

Obscenidade Filtros: Bad Idea, ou incrivelmente Intercoursing Bad Idea?

Além disso, não se pode esquecer The Untold History of SpeedChat de Toontown, onde mesmo usando uma "safe-palavra whitelist" resultou em um 14 anos de idade contornando-o rapidamente com: "Eu quero enfiar meu pescoço longo Giraffe acima de seu coelho branco macio."

A linha inferior: Em última análise, para qualquer sistema que você implementar, não há absolutamente nenhum substituto para a revisão humana (seja por pares ou não). Sinta-se livre para implementar uma ferramenta rudimentar para se livrar do drive-by de, mas para o determinado trolls, você absolutamente deve ter uma abordagem não baseada em algoritmo.

Um sistema que remove o anonimato e introduz a prestação de contas (algo que Stack Overflow faz bem) é útil também, em particular, a fim de ajudar a combater dom de John Gabriel

Você também perguntou onde você pode obter listas de palavrões para você começar - um projeto open-source para verificar se Dansguardian - confira o código fonte para as suas listas profanidade padrão. Há também um terceiro adicional Frase Lista que você pode baixar para o proxy que pode ser um rabiscos útil ponto para você.

Editar em resposta a edição pergunta: Obrigado pelo esclarecimento do que você está tentando fazer. Nesse caso, se você está apenas tentando fazer um filtro de palavras simples, existem duas maneiras que você pode fazê-lo. Uma delas é criar uma única expressão regular longa com todas as frases proibidas que pretende censor, e apenas fazer um achado regex / substituir com ele. A regex como:

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

e executá-lo em sua cadeia de entrada utilizando preg_match () para teste atacado por um hit,

ou preg_replace () em branco-los.

Você também pode carregar essas funções com matrizes em vez de um único regex muito tempo, e para listas de palavras longas, pode ser mais controlável. Veja a href="http://us.php.net/preg_replace" rel="noreferrer"> preg_replace ()

Para exemplos de programação PHP adicionais, consulte esta página para uma classe genérica pouco avançada por palavra filtragem que * é as letras centro de palavras censuradas, e este anterior Stack Overflow pergunta que também tem um exemplo PHP (a principal parte valiosa lá é a abordagem palavra filtrada baseado em SQL - o compensador leet-speak pode ser dispensada se você achar que é desnecessário).

Você também acrescentou: " Obtendo a lista de palavras em primeiro lugar é a verdadeira questão ." - além de alguns dos links Dansgaurdian anteriores, você pode encontrar este prático .zip de 458 palavras para ser útil.

Outras dicas

Enquanto eu sei que esta questão é bastante antigo, mas é uma questão comumente ocorrem ...

Há uma razão e uma grande necessidade de filtros profanidade (ver Wikipedia aqui ), mas muitas vezes eles caem longe de ser 100% exato por razões muito distintas; Contexto e precisão .

Depende (total) do que você está tentando alcançar - pelo que é mais básico, provavelmente você está tentando cobrir o " sete palavras sujas " e, em seguida, alguns ... algumas empresas precisam filtrar o mais básico de palavras de baixo calão: básico palavrões, URLs ou informações mesmo pessoal e assim por diante, mas outros precisam evitar ilícito conta nomear (Xbox live é um exemplo) ou muito mais ...

conteúdo gerado pelo usuário não apenas conter potenciais palavrões, ele também pode conter referências ofensivas para:

  • Os atos sexuais
  • Orientação sexual
  • Religião
  • Etnia
  • Etc ...

E, potencialmente, em vários idiomas. Shutterstock desenvolveu listas de palavras-sujas básicos em 10 idiomas para data, mas ainda é básica e muito orientado para as suas necessidades de etiquetagem ". Há uma série de outras listas disponíveis na web.

Eu concordo com a resposta aceita que não é uma ciência definido e como a linguagem é uma constante evolução desafio , mas um onde a taxa de captura de 90% é melhor do que 0% . Ele depende apenas de seus objetivos -. O que você está tentando alcançar, o nível de apoio que você tem e como é importante para remover palavrões de diferentes tipos

Na construção de um filtro, você precisa considerar os seguintes elementos e como eles se relacionam com o seu projeto:

  • Words / frases
  • Acronyms (FOAD / LMFAO etc)
  • falsos positivos (palavras, lugares e nomes como 'mishit', 'Scunthorpe' e 'Titsworth')
  • URLs (sites pornográficos são um alvo óbvio)
  • As informações pessoais (e-mail, endereço, telefone etc - se for o caso)
  • escolha de idioma (normalmente Inglês, por padrão)
  • Moderação (como, se em tudo, você pode interagir com conteúdo gerado pelo usuário e que você pode fazer com ele)

Você pode facilmente construir um filtro de palavrões que captura 90% + de palavrões, mas você nunca atingiu 100%. Não é apenas possível. Quanto mais perto você deseja obter a 100%, mais difícil se torna ... Tendo construído um motor palavrões complexo no passado que tratou mais de 500 mil mensagens em tempo real por dia, eu oferecer o seguinte conselho:

Um filtro básico envolveria:

  • Criar uma lista de palavrões aplicáveis ??
  • O desenvolvimento de um método de lidar com derivações de palavrões

Um arquivador moderadamente complexa envolveria, (Em adição a um filtro de base):

  • Usando complexo correspondência de padrões para lidar com derivações prolongados (usando regex avançado)
  • Leetspeak (l33t)
  • falsos positivos

Um filtro complexo envolveria um número das seguintes (para além de um filtro de moderada):

  • Whitelists e blacklists
  • inferência bayesiana Naive filtragem de frases / termos
  • Soundex funções (onde uma palavra soa como outra)
  • Levenshtein
  • Stemming
  • moderadores humanos para ajudar a guiar um motor de filtragem para aprender por exemplo, ou quando jogos não são suficientes precisos sem orientação (a / continuamente-melhoria do sistema de self)
  • Talvez alguma forma de mecanismo de AI

Eu não sei de nenhum boas bibliotecas para isso, mas faça o que fizer, certifique-se de que você errar na direção de deixar coisas completamente. Eu lidei com sistemas que não me permitem usar "mpassell" como um nome de usuário, porque ele contém "ass" como uma substring. Essa é uma ótima maneira dos usuários Alienar!

Durante uma entrevista de trabalho da mina, a empresa CTO que estava me entrevistando experimentou um jogo de palavras / web que eu escrevi em Java. Fora de uma lista de palavras de todo o dicionário de Inglês Oxford, qual foi a primeira palavra que veio a ser imaginado?

É claro que a palavra mais falta no idioma Inglês.

De alguma forma, eu ainda tenho a oferta de trabalho, mas eu então rastreou uma lista de palavras palavrões (não ao contrário esta ) e escreveu um script rápido para gerar um novo dicionário sem que todas as palavras más (mesmo sem ter que olhar para a lista).

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

um sistema de filtragem de palavras de baixo calão nunca será perfeito, mesmo se o programador é seguro de si e mantém a par de todos os desenvolvimentos nus

Dito isso, qualquer lista de 'palavras feias' é susceptível de executar, bem como qualquer outra lista, uma vez que o problema subjacente é compreensão da linguagem que é praticamente intratável com a tecnologia atual

então, a única solução prática é duplo:

  1. estar preparado para atualizar seu dicionário com frequência
  2. contratar um editor humano para corrigir falsos positivos (por exemplo, "clbuttic" em vez de "clássico") e falsos negativos (oops! Perdeu um!)

A única maneira de evitar a entrada do usuário ofensiva é para evitar toda a entrada do usuário.

Se você insistir em permitir a entrada do usuário e necessidade moderação, em seguida, incorporar moderadores humanos.

Quanto à sua "enganar o sistema" subquestão, você pode lidar com isso por normalizar tanto a lista "palavra ruim" e o texto digitado pelo usuário antes de fazer sua pesquisa. por exemplo, utilizar uma série de expressões regulares (ou tr se o PHP tem) para converter [z $ 5] para "s", [4 @] para "a", etc., e depois comparar a lista normalizada "mau palavra" contra o texto normalizado. Note-se que a normalização pode potencialmente levar a falsos positivos adicionais, embora eu não consigo pensar em nenhum dos casos reais no momento.

O desafio maior é o de chegar a algo que vai deixar as pessoas citar "O caneta é mais poderosa que a espada", enquanto bloqueando "p e n i s".

Cuidado com os problemas de localização: o que é um palavrão em um idioma pode ser uma palavra perfeitamente normal em outro

.

Um exemplo atual deste: ebay usa uma abordagem de dicionário para filtro "maus palavras" de feedback. Se você tentar entrar na tradução alemã do "esta era uma operação perfeita" ( "das war eine perfekte Transação"), ebay irá rejeitar o feedback devido a más palavras.

Por quê? Porque a palavra alemã para "era" é "guerra" e "guerra" está em ebay dicionário de "maus palavras".

Então, cuidado com problemas de localização.

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

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

Estou um pouco atrasado para a festa, mas eu tenho uma solução que o trabalho poder para alguns que ler isso. É em javascript em vez de php, mas há uma razão válida para isso.

A divulgação completa, eu escrevi este plugin ...

De qualquer forma.

A abordagem que eu tenho ido com é permitir que um usuário para "Opt-In" para sua filtragem profanação. Basicamente palavrões será permitido por padrão, mas se meus usuários não quero lê-lo, eles não têm. Isso também ajuda com o "sp3 l33t @ k" a questão.

O conceito é simples plugin que injetado pelo servidor se a conta do cliente está permitindo a filtragem de palavras de baixo calão. De lá, é apenas um par simples linhas que apagar os jura.

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

*** falhará mas senha não irá

Não faça isso. Ele só leva a problemas. Uma experiência pessoal clbuttic que tenho com filtros profanidade é o momento onde eu estava kick / proibido de um canal de IRC para mencionar que eu estava "indo sobre a ponte para Hancock por algumas horas", ou algo nesse sentido.

Concordo com o post de HanClinto mais acima nesta discussão. Eu geralmente usar expressões regulares para entrada de texto cadeia de jogo. E este é um esforço vão, como, como você originalmente mencionado você tem que explicitamente representam todas as formas truque de escrever populares na rede em sua "bloqueado" lista.

Em uma nota lateral, enquanto outros estão debatendo a ética de censura, devo concordar que alguma forma é necessário na web. Algumas pessoas simplesmente desfrutar de postagem vulgaridade, porque pode ser instantaneamente ofensivo para um grande grupo de pessoas, e não requer absolutamente nenhum pensou por parte do autor.

Obrigado pelas ideias.

regras HanClinto!

Uma vez que você tem uma tabela boa MYSQL de algumas palavras ruins que você deseja filtrar (I começou com um dos links neste tópico), você pode fazer algo como isto:

$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 />";

Eu tenho certeza que é uma maneira mais eficiente de fazer todas essas substituições, mas eu não sou inteligente o suficiente para descobrir isso (e isso parece funcionar bem, ainda que de forma ineficiente).

Eu acredito que você deve errar no lado de permitir aos usuários registrar e usar seres humanos para filtrar e adicionar à sua mesa palavrões, conforme necessário. Apesar de tudo isso depende do custo de um falso positivo (palavra está bem sinalizado como ruim) versus um falso negativo (mau palavra fica through). Que deverá vir a governar como agressivo ou conservador você está em sua estratégia de filtragem.

Também gostaria de ter muito cuidado se você quiser usar curingas, uma vez que, por vezes, pode comportar mais onerosa do que você pretende.

Eu colecionava 2200 más palavras em 12 línguas: en, ar, cs, da, de, eo, es, fa, fi, fr, oi, hu, que, ja, ko, nl, não, PL, PT, ru, sv, th, tlh, tr, zh.

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

https://github.com/turalus/openDB

Eu sugiro que você executar este SQL em seu banco de dados e verificação de cada vez que quando entradas do usuário alguma coisa.

Francamente, eu deixá-los chegar o "truque do sistema" palavras fora e bani-los em vez disso, que é só comigo. Mas também torna a programação mais simples.

O que eu faria é implementar um filtro regex assim: /[\s]dooby (doo?)[\s]/i ou a palavra é prefixado em outros, /[\s]doob(er|ed|est)[\s]/. Estes impediria palavras de filtragem como amenizada, o que é perfeitamente válido, mas também exigiria o conhecimento das outras variantes e atualizar o filtro real se você aprender um novo. Obviamente estes são todos os exemplos, mas você tem que decidir como fazê-lo sozinho.

Eu não estou prestes a escrever todas as palavras que eu conheço, não quando eu realmente não quero saber deles.

Eu concordo com a futilidade do assunto, mas se você tem que ter um filtro, confira Ning Boxwood :

buxo é uma extensão do PHP para a substituição rápida de várias palavras em um pedaço de texto. Ele suporta maiúsculas de minúsculas e maiúsculas e minúsculas correspondência. Ela exige que o texto que ele opera em ser codificado como UTF-8.

Veja também este post para mais detalhes:

Com Buxo, você pode ter sua lista de termos de pesquisa ser tão longo como você gosta - a busca e substituir algoritmo não fica mais lento com mais palavras na lista de palavras que procurar. Ele funciona através da construção de um trie de todos os termos de pesquisa e, em seguida, verifica o texto do assunto apenas uma vez, andando elementos do trie e comparando-as com caracteres em seu texto. Ele suporta US-ASCII e UTF-8, maiúsculas de minúsculas ou correspondência insensível, e tem alguma palavra fronteira lógica verificação Inglês-centric.

concluí, a fim de criar um filtro bom palavrões precisamos de 3 componentes principais, ou pelo menos é o que eu vou fazer. Estes são:

  1. O filtro:. Um serviço de fundo que verificar contra uma lista negra, dicionário ou algo assim
  2. Não permitir conta anônima
  3. Denunciar abuso

Um bônus, será para recompensar de alguma forma aqueles que contribuem com repórteres abuso precisos e punir o ofensor, por exemplo, suspender as suas contas.

Também no final do jogo, mas fazendo algumas pesquisas e metida aqui. Como já foi mencionado, é apenas quase quase impossível se fosse automatizado, mas se a sua concepção / exigência pode envolver em alguns casos (mas não o tempo todo) interações humanas para revisão se é profano ou não, você pode considerar ML. https: // docs. microsoft.com/en-us/azure/cognitive-services/content-moderator/text-moderation-api#profanity é a minha escolha atual agora por várias razões:

  • suporta muitos localização
  • Eles manter a atualização do banco de dados, então eu não tenho que manter-se com as mais recentes gírias ou línguas (problema de manutenção)
  • Quando há uma alta probabilidade (ou seja, 90% ou mais) você pode simplesmente negar pragmaticamente
  • Você pode observar para a categoria que faz com que uma bandeira que podem ou não ser palavrões, e pode ter revisão alguém para ensinar que é ou não é profano.

Para minha necessidade, foi / é baseado em serviço comercial público-friendly (OK, videogames) que outros usuários podem / vão ver o nome de usuário, mas o projeto exige que ele tem que ir através do filtro de palavras de baixo calão para rejeitar nome de usuário ofensiva. A parte triste sobre isso é o clássico problema de "clbuttic" provavelmente irá ocorrer desde que nomes de usuários são a palavra geralmente única (até N caracteres) de, por vezes, várias palavras concatenadas ... Novamente, serviço cognitiva da Microsoft não vai bandeira "Assist" como texto. HasProfanity = true, mas pode um bandeira da probabilidade categorias a ser elevado.

Como os inquéritos OP, que sobre "a $$", aqui está o resultado quando passou através do filtro: enter descrição da imagem aqui , como você pode ver, ele determinou que não é profano, mas tem alta probabilidade de que ele é, então bandeiras como recomendações de revisão (interações humanas).

Quando a probabilidade é alta, I pode voltar "Sinto muito, esse nome já está tomada" (mesmo que não é), de modo que é menos ofensivo para pessoas anti-censura ou algo assim, se nós don 't querem integrar revisão humana, ou retornar 'seu nome de usuário ter sido notificado para o departamento de operação ao vivo, você pode esperar para o seu nome de usuário para ser revisto e aprovado ou escolheu outro nome de usuário'. Ou o que quer ...

A propósito, o custo / preço para este serviço é bastante baixa para o meu propósito (quantas vezes é que o nome de usuário é alterado?), Mas novamente, para OP talvez os de design demandas consultas mais intensivas e pode não ser ideal para pagamento / subscrever ML-serviços, ou não pode ter humano-review / interações. Tudo depende do projeto ... Mas se o design faz caber a conta, talvez isso pode ser a solução da OP.

Se estiver interessado, posso listar os contras no comentário no futuro.

Do not.

Porque:

  • Clbuttic
  • A profanidade não é MAU OMG
  • A profanidade não pode ser efetivamente definido
  • A maioria das pessoas muito provavelmente não gostam de ser "protegido" de palavrões

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

filtros profanidade são uma má idéia. A razão é que você não pode pegar cada palavrão. Se você tentar, você obtém resultados falso-positivos.

Catching Words

Vamos apenas dizer que você quer pegar o F-Word. Fácil, não é? Bem, vamos ver.

Você pode percorrer uma corda para encontrar "fuck". Infelizmente, as pessoas enganar filtros de hoje em dia. O filtro de palavras de baixo calão não pegar "fuk".

Pode-se tentar verificar se há várias grafias e variantes da palavra, mas que vai abrandar o desempenho do seu código. Para pegar o F-Word, você precisa olhar para "fuc", "Fuc", "fuk", "Fu", "F ***", etc. E a lista vai sobre e sobre.

Evitar Inocência

A aprovação, assim como sobre torná-lo case-insensitive e ignorar espaços para que ele pega "F u C k"? Esse som pode gostar uma boa idéia, mas alguém pode simplesmente ignorar o filtro de palavras de baixo calão com "F.U.C.K."

Você ignora pontuação.

Agora que é um problema real, uma vez que uma frase como " Inferno o, lá!" vai pegar como "inferno" e "Wh ass em cima?" pega como "bunda".

E lá é um monte de palavras que você tem que excluir o filtro, como "Contras tit ution", porque há "tit" nele.

As pessoas também podem usar as palavras substitutas, como "Frack." Você bloquear isso também? E sobre a "caneta é" para "pênis"? Seu programa não tem inteligência artificial para saber se a string é bom ou ruim.

Não use filtros de palavrões. Eles são difíceis de desenvolver, e eles são tão lento como um rastreamento.

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