Muitos de nós precisam lidar com a entrada do usuário, consultas de pesquisa e situações em que o texto de entrada pode conter palavrões ou linguagem indesejável. Muitas vezes, isso precisa ser filtrado.
Onde podemos encontrar uma boa lista de palavrões em vários idiomas e dialetos?
Existem APIs disponíveis para fontes que contêm boas listas? Ou talvez uma API que simplesmente diga "sim, isso está limpo" ou "não, isso está sujo" com alguns parâmetros?
Quais são alguns bons métodos para capturar pessoas tentando enganar o sistema, como $$, azz ou a55?
Pontos de bônus se você oferecer soluções para PHP. :)
Editar: resposta a respostas que dizem simplesmente evitar o problema programático:
Eu acho que existe um lugar para esse tipo de filtro quando, por exemplo, um usuário pode usar a pesquisa de imagens públicas para encontrar fotos que são adicionadas a um pool de comunidade sensível. Se eles puderem procurar "pênis", provavelmente obterão muitas fotos, sim. Se não queremos imagens disso, impedir a palavra como um termo de pesquisa é um bom porteiro, embora não seja um método infalível. Obter a lista de palavras em primeiro lugar é a verdadeira questão.
Então, eu estou realmente me referindo a uma maneira de descobrir que um único token está sujo ou não e, em seguida, simplesmente o desaprovo. Eu não me incomodaria em impedir um sentimento como a referência totalmente hilária de "girafa de pescoço comprido". Nada que você possa fazer lá. :)
fonte
Respostas:
Filtros de obscuridade: má ideia ou má ideia incrivelmente intercambiável?
Além disso, não se pode esquecer o Speedthat da Untold History of Toontown , onde, mesmo usando uma "lista de permissões de palavras seguras", uma criança de 14 anos rapidamente a contornou com: "Quero enfiar minha girafa de pescoço comprido em seu fofo coelho branco . "
Conclusão: em última análise, para qualquer sistema implementado, não há absolutamente nenhum substituto para a revisão humana (seja de pares ou não). Sinta-se à vontade para implementar uma ferramenta rudimentar para se livrar dos drive-by's, mas para o troll determinado, você absolutamente deve ter uma abordagem não baseada em algoritmos.
Um sistema que remove o anonimato e introduz responsabilidade (algo que o Stack Overflow faz bem) também é útil, principalmente para ajudar a combater o PRESENTE de John Gabriel
Você também perguntou onde você pode obter listas de palavrões para começar - um projeto de código aberto a ser verificado é o Dansguardian - verifique o código-fonte para suas listas de palavrões padrão. Também há uma Lista de frases de terceiros adicional que você pode baixar para o proxy, que pode ser um ponto de coleta útil para você.
Edite em resposta a pergunta edit: Obrigado pelo esclarecimento sobre o que você está tentando fazer. Nesse caso, se você está apenas tentando criar um filtro de palavras simples, há duas maneiras de fazê-lo. Uma é criar um único regexp longo com todas as frases proibidas que você deseja censurar e apenas fazer um regex encontrar / substituir por ele. Uma regex como:
e execute-o na sua string de entrada usando preg_match () para testar por atacado uma ocorrência,
ou preg_replace () para apagá-los.
Você também pode carregar essas funções com matrizes em vez de uma única regex longa e, para listas longas de palavras, pode ser mais gerenciável. Veja preg_replace () para alguns bons exemplos de como matrizes podem ser usadas de maneira flexível.
Para obter exemplos adicionais de programação PHP, consulte esta página para obter uma classe genérica um pouco avançada para filtragem de palavras que * é a letra central das palavras censuradas, e a pergunta anterior Stack Overflow que também possui um exemplo PHP (a principal parte valiosa da a abordagem de palavras filtradas baseada em SQL - o compensador de fala leet pode ser dispensado se você achar desnecessário).
Você também adicionou: " Obter a lista de palavras em primeiro lugar é a verdadeira questão. " - além de alguns dos links dansgaurdianos anteriores, você pode achar útil esse .zip de 458 palavras útil.
fonte
Embora eu saiba que essa pergunta é bastante antiga, mas é uma pergunta comum ...
Existe uma razão e uma necessidade distinta de filtros de palavrões (consulte a entrada da Wikipedia aqui ), mas eles geralmente não são 100% precisos por motivos muito distintos; Contexto e precisão .
Depende (totalmente) do que você está tentando alcançar - no mais básico, você provavelmente está tentando cobrir as " sete palavras sujas " e depois algumas ... Algumas empresas precisam filtrar o mais básico dos palavrões: básico palavrões, URLs ou mesmo informações pessoais e assim por diante, mas outros precisam evitar nomes ilícitos de contas (o Xbox live é um exemplo) ou muito mais ...
O conteúdo gerado pelo usuário não contém apenas palavrões em potencial, também pode conter referências ofensivas a:
E potencialmente, em vários idiomas. A Shutterstock desenvolveu listas básicas de palavras sujas em 10 idiomas até o momento, mas ainda é básica e muito orientada para suas necessidades de 'marcação'. Existem várias outras listas disponíveis na web.
Concordo com a resposta aceita de que não é uma ciência definida e que a linguagem é um desafio em constante evolução , mas em que uma taxa de captura de 90% é melhor que 0%. Depende apenas dos seus objetivos - o que você está tentando alcançar, o nível de suporte que você tem e o quão importante é remover palavrões de diferentes tipos.
Ao criar um filtro, é necessário considerar os seguintes elementos e como eles se relacionam com o seu projeto:
Você pode criar facilmente um filtro de palavrões que captura mais de 90% de palavrões, mas nunca atingirá 100%. Simplesmente não é possível. Quanto mais você quer chegar a 100%, mais difícil fica ... Depois de criar um mecanismo complexo de palavrões no passado que lidava com mais de 500 mil mensagens em tempo real por dia, eu daria o seguinte conselho:
Um filtro básico envolveria:
Um arquivador moderadamente complexo envolveria (além de um filtro básico):
Um filtro complexo envolveria vários dos seguintes itens (além de um filtro moderado):
fonte
Não conheço boas bibliotecas para isso, mas faça o que fizer, certifique-se de errar na direção de deixar as coisas passarem. Eu lidei com sistemas que não me permitiam usar "mpassell" como nome de usuário, porque ele contém "ass" como substring. Essa é uma ótima maneira de alienar os usuários!
fonte
Durante uma entrevista de emprego minha, o CTO da empresa que estava me entrevistando experimentou um jogo de palavras / web que escrevi em Java. De uma lista de palavras de todo o dicionário Oxford English, qual foi a primeira palavra que surgiu?
Obviamente, a palavra mais suja do idioma inglês.
De alguma forma, ainda recebi a oferta de emprego, mas depois localizei uma lista de palavrões (não muito diferente desta ) e escrevi um script rápido para gerar um novo dicionário sem todas as palavrões (sem precisar olhar para a lista) .
Para o seu caso em particular, acho que comparar a pesquisa com palavras reais parece o caminho a seguir com uma lista de palavras como essa. Os estilos / pontuação alternativos exigem um pouco mais de trabalho, mas duvido que os usuários usem isso com frequência suficiente para ser um problema.
fonte
um sistema de filtragem de palavrões nunca será perfeito, mesmo se o programador estiver seguro e a par de todos os desenvolvimentos nus
Dito isso, é provável que qualquer lista de 'palavrões' seja tão boa quanto qualquer outra lista, já que o problema subjacente é o entendimento da linguagem, que é praticamente intratável com a tecnologia atual.
portanto, a única solução prática é dupla:
fonte
A única maneira de impedir a entrada ofensiva do usuário é impedir toda a entrada do usuário.
Se você insistir em permitir a entrada do usuário e precisar de moderação, incorpore moderadores humanos.
fonte
Dê uma olhada no Serviço Web do Filtro de Profanidade da CDYNE
URL de teste
fonte
Em relação à subquestão "enganar o sistema", você pode lidar com isso normalizando a lista de "palavrões" e o texto inserido pelo usuário antes de fazer sua pesquisa. por exemplo, use uma série de expressões regulares (ou tr, se o PHP tiver) para converter [z $ 5] em "s", [4 @] em "a" etc. texto. Observe que a normalização pode levar a falsos positivos adicionais, embora eu não consiga pensar em nenhum caso real no momento.
O maior desafio é encontrar algo que permita que as pessoas citem "A caneta é mais poderosa que a espada" e, ao mesmo tempo, bloqueie "pênis".
fonte
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 disso: o ebay usa uma abordagem de dicionário para filtrar "palavrões" dos comentários. Se você tentar inserir a tradução alemã de "esta foi uma transação perfeita" ("das war eine perfekte Transaktion"), o ebay rejeitará o feedback devido a palavrões.
Por quê? Porque a palavra alemã para "was" é "guerra" e "guerra" está no dicionário ebay de "palavrões".
Portanto, cuidado com os problemas de localização.
fonte
Se você pode fazer algo como Digg / Stackoverflow, em que os usuários podem votar / marcar conteúdo obsceno ... faça isso.
Então, tudo que você precisa fazer é revisar os usuários "impertinentes" e bloqueá-los se eles violarem as regras.
fonte
Estou um pouco atrasado para a festa, mas tenho uma solução que pode funcionar para quem lê isso. Está em javascript, em vez de php, mas há uma razão válida para isso.
Enfim.
A abordagem adotada é permitir que um usuário "aceite" sua filtragem de palavrões. Basicamente, palavrões serão permitidos por padrão, mas se meus usuários não quiserem ler, eles não precisam. Isso também ajuda com o problema "l33t sp3 @ k".
O conceito é simples jqueryplug-in que é injetado pelo servidor se a conta do cliente estiver ativando 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/
resultado
fonte
a$$
a$$
, adicione-o à lista de filtros.Eu coletei 2200 palavrões em 12 idiomas: en, ar, cs, da, de, e, es, fa, fi, fr, oi, hu, it, ja, ko, nl, no, pl, pt, ru, sv , th, tlh, tr, zh.
As opções de dump do MySQL, JSON, XML ou CSV estão disponíveis.
https://github.com/turalus/openDB
Eu sugiro que você execute esse SQL no seu banco de dados e verifique sempre que o usuário inserir algo.
fonte
Não. Isso apenas leva a problemas. Uma experiência pessoal clbuttic que eu tenho com filtros de palavrões é o momento em que fui expulso / banido de um canal de IRC por mencionar que eu estava "encabeçando a ponte para Hancock por algumas horas" ou algo nesse sentido.
fonte
Eu concordo com o post de HanClinto acima nesta discussão. Geralmente, uso expressões regulares para corresponder ao texto de entrada. E este é um esforço inútil, pois, como você mencionou originalmente, você deve explicar explicitamente todas as formas artísticas de escrever populares na rede em sua lista "bloqueada".
Em uma nota lateral, enquanto outros estão debatendo a ética da censura, devo concordar que alguma forma é necessária na web. Algumas pessoas simplesmente gostam de postar vulgaridade, porque pode ser instantaneamente ofensivo para um grande corpo de pessoas e não requer absolutamente nenhum pensamento por parte do autor.
Obrigado pelas idéias.
Regras do HanClinto!
fonte
Depois de ter uma boa tabela MYSQL com algumas palavrões que você deseja filtrar (comecei com um dos links deste segmento), você pode fazer algo assim:
Tenho certeza de que existe uma maneira mais eficiente de fazer todas essas substituições, mas não sou inteligente o suficiente para descobrir isso (e isso parece funcionar bem, embora de maneira ineficiente).
Eu acredito que você deve errar ao permitir que os usuários se registrem e usar humanos para filtrar e adicionar à sua tabela de palavrões, conforme necessário. Embora tudo dependa do custo de um falso positivo (palavra ok sinalizada como ruim) versus um falso negativo (palavra ruim é exibida). Em última análise, isso deve governar o quão agressivo ou conservador você é em sua estratégia de filtragem.
Eu também tomaria muito cuidado se você quiser usar caracteres curinga, pois eles às vezes podem se comportar mais onerosamente do que você pretende.
fonte
Sinceramente, eu os deixaria divulgar as palavras "truque do sistema" e as baniria, que sou apenas eu. 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 é prefixada nos outros/[\s]doob(er|ed|est)[\s]/
. Isso impediria a filtragem de palavras como amenizado, o que é perfeitamente válido, mas também exigiria o conhecimento de outras variantes e a atualização do filtro real, se você aprender um novo. Obviamente, esses são todos exemplos, mas você teria que decidir como fazer isso sozinho.Não vou digitar todas as palavras que conheço, não quando realmente não quero conhecê-las.
fonte
Concordo com a futilidade do assunto, mas se você tem que ter um filtro, confira Ning Boxwood :
Consulte também esta postagem no blog para obter mais detalhes:
fonte
Concluí que, para criar um bom filtro de palavrões, precisamos de três componentes principais, ou pelo menos é o que vou fazer. Estes são eles:
Um bônus, será recompensar de alguma forma aqueles que contribuírem com repórteres de abuso precisos e punir o agressor, por exemplo, suspender suas contas.
fonte
Também no final do jogo, mas fazendo algumas pesquisas e tropeçou por aqui. Como outros já mencionaram, é quase quase impossível se ele foi automatizado, mas se o seu design / requisito puder envolver em alguns casos (mas não o tempo todo) interações humanas para revisar se é profano ou não, você pode considerar o ML. https://docs.microsoft.com/pt-br/azure/cognitive-services/content-moderator/text-moderation-api#profanity é minha escolha atual no momento por vários motivos:
Para minha necessidade, foi / é baseado em serviço comercial público (OK, videogames) que outros usuários podem / verão o nome de usuário, mas o design exige que seja necessário passar por um filtro de palavrões para rejeitar nomes de usuário ofensivos. A parte triste disso é que o problema clássico "clbuttic" provavelmente ocorrerá, já que os nomes de usuário geralmente são uma única palavra (até N caracteres), às vezes várias palavras concatenadas ... Novamente, o serviço cognitivo da Microsoft não sinaliza "Assistência" como texto. HasProfanity = true, mas pode sinalizar uma das categorias com probabilidade de alta.
Como o OP pergunta, o que dizer de "a $$", eis um resultado quando eu o passei pelo filtro: como você pode ver, ele determinou que não é profano, mas tem alta probabilidade de ser, então sinaliza como recomendações de revisão (interações humanas).
Quando a probabilidade é alta, posso voltar "Sinto muito, esse nome já está sendo usado" (mesmo que não seja), para que seja menos ofensivo para pessoas anti-censura ou algo assim, se não quisermos para integrar a revisão humana ou retornar "Seu nome de usuário foi notificado ao departamento de operação em tempo real, você pode aguardar a revisão e aprovação do seu nome de usuário ou escolher outro nome de usuário". Como queiras...
A propósito, o custo / preço desse serviço é bastante baixo para o meu objetivo (com que frequência o nome de usuário é alterado?), Mas, novamente, para OP, talvez o design exija consultas mais intensas e talvez não seja o ideal para pagar / assinar Serviços de ML, ou não pode ter revisão / interações humanas. Tudo depende do design ... Mas se o design se encaixa na conta, talvez essa seja a solução da OP.
Se estiver interessado, posso listar os contras no comentário no futuro.
fonte
Os filtros de palavrões são uma má ideia. A razão é que você não consegue entender todos os palavrões. Se você tentar, obtém falsos positivos.
Catching Words
Vamos apenas dizer que você quer pegar o F-Word. Fácil né? Bem vamos ver.
Você pode percorrer uma string para encontrar "fuck". Infelizmente, as pessoas enganam os filtros hoje em dia. O filtro de palavrões não pegou "fuk".
Pode-se tentar verificar várias grafias e variantes da palavra, mas isso diminuirá o desempenho do seu código. Para capturar o F-Word, você precisa procurar "fuc", "Fuc", "fuk", "Fuk", "F ***", etc. E a lista continua.
Evitando a inocência
Ok, então que tal torná-lo sem distinção entre maiúsculas e minúsculas e ignorar os espaços para que ele apareça "F u C k"? Pode parecer uma boa ideia, mas alguém pode simplesmente ignorar o filtro de palavrões com "FUCK"
Você ignora a pontuação.
Agora isso é um problema real, já que uma frase como " Inferno , aí!" vai pegar como "inferno" e "Wh ass up?" pega como "burro".
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 palavras substitutas, como "Frack". Você bloqueou isso também? E quanto a "caneta é" para "pênis"? Seu programa não possui inteligência artificial para saber se a sequência é boa ou ruim.
Não use filtros de palavrões. Eles são difíceis de desenvolver e são tão lentos quanto um rastreamento.
fonte
Não.
Porque:
Edit: Embora eu concorde com o comentarista que disse que "a censura está errada", essa não é a natureza desta resposta.
fonte