Comment implémenter un bon filtre de profanation?

beaucoup d'entre nous ont besoin de traiter les entrées d'utilisateur, les requêtes de recherche, et les situations où le texte d'entrée peut potentiellement contenir le langage grossier ou indésirable. Souvent, ce doit être filtré.

où peut-on trouver une bonne liste de jurons dans différentes langues et dialectes?

y a-t-il des API disponibles pour les sources qui contiennent de bonnes listes? Ou peut-être une API qui dit simplement "oui, c'est propre" ou "non c'est sale", avec quelques les paramètres?

quelles sont les bonnes méthodes pour attraper les gens qui essaient de tromper le système, comme un$, azz, ou a55?

points Bonus si vous offrez des solutions pour PHP. :)

modifier: réponse à des réponses qui disent simplement éviter la question programmatique:

je pense qu'il y a une place pour ce genre de filtre quand, par exemple, un utilisateur peut utiliser la recherche d'image publique pour trouver des images qui obtiennent ajouté à un bassin sensible de la communauté. S'ils peuvent chercher "pénis", alors ils vont probablement obtenir de nombreuses photos de, yep. Si nous ne voulons pas d'images de cela, alors empêcher le mot comme un terme de recherche est un bon gardien, bien que ce ne soit pas une méthode infaillible. Obtenir la liste des mots en premier lieu est la vraie question.

donc je me réfère vraiment à une façon de comprendre qu'un seul jeton est sale ou pas et puis tout simplement le rejeter. Je ne me donnerais pas la peine d'empêcher sentiment comme la référence totalement hilarante "girafe à long cou". Rien que vous pouvez faire là-bas. :)

186
demandé sur codeforester 2008-11-07 23:19:41

20 réponses

Obscénité Filtres: Mauvaise Idée, ou Incroyablement Intercoursing Mauvaise Idée?

aussi, on ne peut pas oublier L'histoire sans nom de la SpeedChat de Toontown, où même en utilisant une "safe-word whitelist", un jeune de 14 ans a rapidement contourné avec: " je veux coller ma girafe au cou long dans ton lapin blanc moelleux."

ligne de fond: en fin de compte, pour tout système que vous mise en œuvre, il n'y a absolument aucun substitut à l'évaluation humaine (par les pairs ou autrement). N'hésitez pas à mettre en œuvre un outil rudimentaire pour se débarrasser des drive-by, mais pour le troll déterminé, vous devez absolument avoir une approche non basée sur un algorithme.

un système qui supprime l'anonymat et introduit la responsabilité (quelque chose que le débordement de la pile fait bien) est également utile, en particulier pour aider à combattre G. I. F. T. de John Gabriel

vous avez également demandé où vous pouvez obtenir des listes de profanation pour vous lancer -- un projet open-source à vérifier est Dansguardian -- vérifier le code source pour leurs listes de profanation par défaut. Il y a également un tiers supplémentaire liste de Phrase que vous pouvez télécharger pour le mandataire qui peut être un point de glanage utile pour vous.

modifier en réponse la question Modifier: Merci pour le des précisions sur ce que vous essayez de faire. Dans ce cas, si vous essayez juste de faire un simple filtre de mots, il y a deux façons de le faire. L'un est de créer un seul long regexp avec toutes les phrases interdites que vous voulez censurer, et simplement faire un regex trouver/remplacer avec elle. Un regex comme:

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

et l'exécuter sur votre chaîne de saisie en utilisant preg_match () pour le test de gros pour un hit,

ou preg_replace() à vide.

vous pouvez également charger ces fonctions avec des tableaux plutôt qu'un seul long regex, et pour les longues listes de mots, il peut être plus facile à gérer. Voir le preg_replace () pour quelques bons exemples sur la façon dont les tableaux peuvent être utilisés de manière flexible.

pour des exemples supplémentaires de programmation PHP, voir cette page pour une classe générique quelque peu avancée pour le filtrage de mots qui * ' s out les lettres centrales de mots censurés, et cette question précédente de débordement de pile qui a aussi un exemple de PHP (la partie principale de valeur là-dedans est L'approche de mot filtré basée sur SQL -- le compensateur de leet-speak peut être dispensé si vous le trouvez inutile).

vous avez également ajouté: " obtenir la liste des mots en premier lieu est la vraie question. " -- en plus de certains des liens Dansgaurdiens précédents, vous pouvez trouvez à portée de main .zip de 458 mots à utiliser.

165
répondu HanClinto 2017-05-23 11:33:17

bien que je sache que cette question est assez ancienne, mais c'est une question courante...

il y a à la fois une raison et un besoin distinct de filtres de profanation (voir Wikipedia entry here ), mais ils sont souvent loin d'être exacts à 100% pour des raisons très distinctes; Context et accuracy .

cela dépend (entièrement) de ce que vous essayez de réaliser - au plus haut basique, vous essayez probablement de couvrir le " sept mots sales " et puis quelques... Certaines entreprises doivent filtrer les insultes les plus basiques: jurons de base, URLs ou même Informations personnelles et ainsi de suite, mais d'autres doivent empêcher la dénomination illicite de comptes (Xbox live en est un exemple) ou bien plus encore...

le contenu généré par L'utilisateur ne contient pas seulement des jurons potentiels, il peut aussi contenir des références offensantes à:

  • actes sexuels
  • orientation sexuelle
  • Religion
  • Ethnicité
  • etc...

et potentiellement, dans plusieurs langues. Shutterstock a développé "1519290920 de base" sale mots-listes en 10 langues à ce jour, mais il reste basique et très orienté leur marquage besoins. Il existe un certain nombre d'autres listes disponibles sur le web.

je suis d'accord avec la réponse acceptée selon laquelle il ne s'agit pas d'une science définie et comme la langue est une langue en constante évolution défi mais où un taux de capture de 90% est supérieur à 0%. Cela dépend purement de vos objectifs - ce que vous tentez d'atteindre, le niveau de soutien que vous avez et l'importance d'éliminer les profanations de différents types.

dans la construction d'un filtre, vous devez tenir compte de ce qui suit les éléments et comment ils se rapportent à votre projet:

  • mots / phrases
  • Acronymes (FOAD/ LMFAO etc)
  • faux positifs (mots, lieux et noms comme "mishit", "scunthorpe" et "titsworth")
  • URLs (sites pornographiques sont une cible évidente)
  • renseignements personnels (courriel, adresse, téléphone, etc. - s'il y a lieu)
  • langue choix (généralement l'anglais par défaut)
  • Modération (comment, le cas échéant, vous pouvez interagir avec le contenu généré par l'utilisateur et ce que vous pouvez faire avec elle)

vous pouvez facilement construire un filtre de profanation qui capture 90%+ des profanations, mais vous ne toucherez jamais 100%. C'est juste pas possible. Plus vous voulez vous rapprocher de 100%, plus cela devient difficile... Ayant construit un moteur de profanation complexe dans le passé qui traitait plus de 500K messages en temps réel par le jour, je donnerais le conseil suivant:

un filtre de base impliquerait:

  • établissement d'une liste des profanités applicables
  • Développement d'une méthode de traiter avec les dérivations de jurons

un déclarant modérément complexe impliquerait, (en plus d'un filtre de base):

  • utilisant des pattern matching pour traiter étendue des dérivations (utilisation avancée des regex)
  • Traitant de Leetspeak (3ll3)
  • Traitant de faux positifs

un filtre complexe impliquerait un certain nombre des éléments suivants (en plus d'un filtre modéré):

37
répondu nickhar 2012-11-19 05:42:52

Je ne connais pas de bonnes bibliothèques pour cela, mais quoi que vous fassiez, assurez-vous que vous vous trompiez dans le sens de laisser passer les choses. J'ai eu affaire à des systèmes qui ne me permettraient pas d'utiliser "mpassell" comme nom d'utilisateur, parce qu'il contient "ass" comme substrat. C'est une excellente façon d'aliéner les utilisateurs!

24
répondu Matt Passell 2008-11-07 20:26:00

au cours d'une de mes entrevues d'emploi, la société CTO qui m'interviewait a essayé un jeu de mots/web que j'ai écrit en Java. Sur une liste de mots de L'ensemble du dictionnaire anglais Oxford, quel était le premier mot qui est venu à être deviné?

bien sûr, le mot le plus grossier de la langue anglaise.

D'une façon ou d'une autre, j'ai quand même eu l'offre d'emploi, mais j'ai alors trouvé une liste de mots profanés (pas contrairement à celui-ci ) et j'ai écrit un rapide script pour générer un nouveau dictionnaire, sans tous les mauvais mots (sans même avoir à regarder la liste).

pour votre cas particulier, je pense que comparer la recherche à de vrais mots ressemble à la façon de procéder avec une liste de mots comme ça. Les styles/ponctuations alternatifs nécessitent un peu plus de travail, mais je doute que les utilisateurs utiliseront cela assez souvent pour être un problème.

23
répondu Matthew 2008-11-07 22:36:23

un système de filtrage de blasphèmes ne sera jamais parfait, même si le programmeur est impitoyable et se tient au courant de tous les développements nudistes

cela dit, toute une liste de " mots coquins est probablement à effectuer ainsi que toute autre liste, puisque le problème sous-jacent est compréhension de langage qui est à peu près insoluble avec la technologie actuelle

ainsi, la seule solution pratique est double:

  1. soyez prêt à mettre à jour votre dictionnaire fréquemment
  2. embaucher un rédacteur en chef pour corriger les faux positifs (par exemple" clbuttic "au lieu de" classique") et les faux négatifs (oops! manqué!)
21
répondu Steven A. Lowe 2009-08-24 20:49:48

la seule façon d'empêcher les entrées d'utilisateur offensantes est d'empêcher toutes les entrées d'utilisateur.

si vous insistez pour permettre l'entrée de l'utilisateur et avez besoin de modération, puis intégrer modérateurs humains.

12
répondu Axel 2008-11-07 20:42:39

en ce qui concerne votre sous-question" trick the system", vous pouvez gérer cela en normalisant à la fois la liste des" mauvais mots " et le texte saisi par l'utilisateur avant de faire votre recherche. par exemple, utiliser une série de regexes (ou tr si PHP L'a) pour convertir [z$5] en "s", [4@] à "a", etc., puis comparez la liste normalisée des "mauvais mots" avec le texte normalisé. Notez que la normalisation pourrait éventuellement conduire à plus de faux positif, bien que je ne puisse pas penser à des cas réels pour le moment.

le plus grand défi est de trouver quelque chose qui permettra aux gens de citer "le" stylo est plus puissant que l'épée"tout en bloquant" p E N i s".

7
répondu Dave Sherohman 2008-11-08 01:35:13

méfiez-vous des questions de localisation: ce qui est un juron dans une langue peut être un mot parfaitement normal dans une autre.

un exemple actuel de ceci: ebay utilise une approche de dictionnaire pour filtrer" mauvais mots " de rétroaction. Si vous essayez de saisir la traduction allemande de "this was a perfect transaction" ("das war eine perfekte Transaktion"), ebay rejettera les commentaires en raison de mauvais mots.

pourquoi? Parce que le mot allemand pour "Était" est "Guerre", et "war "est dans le dictionnaire ebay de"bad words".

méfiez-vous donc des problèmes de localisation.

7
répondu Sam 2010-04-27 12:55:55

si vous pouvez faire quelque chose comme Digg/Stackoverflow où les utilisateurs peuvent descendre/marquer le contenu obscène... faire.

alors tout ce que vous devez faire est de passer en revue les utilisateurs "méchants", et les bloquer s'ils enfreignent les règles.

6
répondu scunliffe 2008-11-07 20:46:59

je suis un peu en retard à la fête, mais j'ai une solution qui pourrait fonctionner pour ceux qui lisent ceci. C'est en javascript au lieu de php, mais il y a une raison valable.

full disclosure, j'ai écrit ce plugin...

de toute façon.

l'approche que j'ai adoptée est de permettre à un utilisateur de" S'inscrire " à leur filtrage des blasphèmes. Fondamentalement, le blasphème sera autorisé par défaut, mais si mes utilisateurs ne sont pas envie de le lire, ils n'ont pas à. Cela aide également avec le "l33t sp3@k" question.

le concept est un simple plugin qui est injecté par le serveur si le compte du client permet le filtrage de langage grossier. De là, c'est juste quelques lignes simples qui effacent les jurons.

Voici la page Démo

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>

résultat

* * * échouera mais le mot de passe ne sera pas

4
répondu Chase Florell 2015-08-19 20:01:53

je suis d'accord avec HanClinto post plus haut dans cette discussion. J'utilise généralement des expressions régulières pour faire correspondre le texte d'entrée à une chaîne de caractères. Et c'est un effort vain, car, comme vous l'avez mentionné à l'origine, vous devez explicitement rendre compte de chaque forme truquée d'écriture populaire sur le net dans votre liste "bloquée".

sur une note secondaire, tandis que d'autres débattent de l'éthique de la censure, je dois admettre qu'une certaine forme est nécessaire sur le web. Certaines personnes aiment simplement afficher la vulgarité parce qu'il peut être instantanément offensant pour un grand nombre de personnes, et ne nécessite absolument aucune pensée de la part de l'auteur.

Merci pour les idées.

hanclinto règne!

2
répondu 2009-02-24 20:30:20

une fois que vous avez une bonne table MYSQL de quelques mauvais mots que vous voulez filtrer (j'ai commencé avec un des liens dans ce fil), vous pouvez faire quelque chose comme ceci:

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

je suis sûr qu'il y a un moyen plus efficace de faire tous ces remplacements, mais je ne suis pas assez intelligent pour le comprendre (et cela semble fonctionner bien, bien qu'inefficace).

je crois que vous devriez errer du côté de permettre aux utilisateurs de s'enregistrer, et d'utiliser des humains pour filtrer et ajoutez à votre table de profanation. Bien que tout dépende du coût d'un faux positif (mot correct marqué comme mauvais) versus un faux négatif (mot mauvais passe). Cela devrait finalement déterminer à quel point vous êtes agressif ou conservateur dans votre stratégie de filtrage.

je serais également très prudent si vous voulez utiliser des caractères génériques, car ils peuvent parfois se comporter plus tôt que vous ne le souhaitez.

2
répondu andrew 2011-08-16 02:33:47

j'ai recueilli 2200 mauvais mots dans 12 langues: 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.

Les options

MySQL dump, JSON, XML ou CSV sont disponibles.

https://github.com/turalus/openDB

je vous suggère d'exécuter ce SQL dans votre base de données et de vérifier chaque fois que l'utilisateur entre quelque chose.

2
répondu Tural Ali 2017-03-03 08:22:10

franchement, je les laisserais sortir les mots" trick the system " et les bannir à la place, ce qui est juste moi. Mais cela simplifie aussi la programmation.

ce que je ferais c'est implémenter un filtre regex comme ça: /[\s]dooby (doo?)[\s]/i ou alors le mot est préfixé sur les autres, /[\s]doob(er|ed|est)[\s]/ . Cela empêcherait de filtrer des mots comme assuaged, qui est parfaitement valide, mais exigerait également la connaissance des autres variantes et la mise à jour du filtre réel si vous apprenez un nouveau. Évidemment ce sont tous des exemples, mais vous devez décider comment le faire vous-même.

Je ne vais pas taper tous les mots que je connais, pas quand je ne veux pas les connaître.

1
répondu Robert K 2008-11-07 20:25:28

Non. Ça ne mène qu'à des problèmes. Une expérience personnelle clbuttique que j'ai avec les filtres de profanation est le moment où j'ai été frappé/banni d'une chaîne IRC pour avoir mentionné que j'étais "sur le pont de Hancock pour quelques heures" ou quelque chose à cet effet.

1
répondu Adam Jaskiewicz 2008-11-07 20:37:46

je suis d'accord avec la futilité du sujet, mais si vous devez avoir un filtre, cochez Ning Boxwood :

Boxwood est une extension PHP pour le remplacement rapide de plusieurs mots dans un morceau de texte. Il prend en charge la casse et insensible à la casse. Il exige que le texte sur lequel il opère soit codé en UTF-8.

Voir Aussi ce billet de blog pour plus de détails:

avec Boxwood, vous pouvez avoir votre liste de termes de recherche aussi longtemps que vous le souhaitez -- la recherche et remplacer l'algorithme ne ralentit pas avec plus de mots sur la liste de mots à rechercher. Il fonctionne en construisant un tri de tous les termes de recherche, puis scanne votre texte sujet juste une fois, en descendant les éléments de la tri et en les comparant aux caractères dans votre texte. Il prend en charge US-ASCII et UTF-8, l'appariement sensible à la casse ou insensible, et possède une certaine logique de vérification des limites des mots centrée sur l'anglais.

1
répondu Gordon 2010-09-30 09:01:18

j'ai conclu, afin de créer un bon filtre de profanation, nous avons besoin de 3 Composants principaux, ou du moins c'est ce que je vais faire. C'est ce qu'ils sont:

  1. Le filtre: un service d'arrière-plan qui permet de vérifier à l'encontre d'une liste noire, de dictionnaire ou quelque chose comme ça.
  2. pas de compte anonyme
  3. Signaler un abus

un bonus, il sera de récompenser d'une manière ou d'une autre ceux qui contribuent avec abuser les journalistes et punir le contrevenant, par exemple suspendre leurs comptes.

1
répondu Jaider 2015-04-22 14:27:16

Non.

parce que:

  • Clbuttic
  • profanation is not OMG EVIL
  • Blasphème ne peut pas être défini
  • la plupart des gens n'apprécient probablement pas d'être" protégés "des blasphèmes

Edit: bien que je sois d'accord avec le commentateur qui a dit "la censure est fausse", que n'est pas la nature de cette réponse.

-1
répondu eyelidlessness 2012-11-16 03:20:11

les filtres de profanation sont une mauvaise idée. la raison est que vous ne pouvez pas attraper tous les mots jurés. Si vous essayez, vous obtenez des faux positifs.

Attraper Les Mots

disons juste que vous voulez attraper le mot en F. Facile, droit? Eh bien, voyons.

vous pouvez faire une boucle à travers une chaîne pour trouver "fuck."Malheureusement, les gens trient les filtres de nos jours. Le filtre de profanation n'a pas capté "fuk"."

On peut essayer de vérifier plusieurs orthographes et variantes du mot, mais cela ralentira les performances de votre code. Pour attraper le mot en F, vous devez chercher "fuc"," Fuc"," fuk"," Fuk"," F***", etc. Et la liste s'allonge encore et.

Eviter L'Innocence

OK, alors pourquoi ne pas le rendre insensible et ignorer les espaces pour qu'il attrape "F U C k"? Ça pourrait sembler une bonne idée, mais quelqu'un peut juste contourner le filtre de profanation avec " F. U. C. K."

vous ignorez la ponctuation.

maintenant c'est un vrai problème, puisqu'une phrase comme Hell o, là!"va ramasser comme "l'enfer" et "Wh cul ?"ramasse comme "le cul."

et il y a un tas de mots que vous devez exclure du filtre, comme "Cons tit ution", parce qu'il y a" tit " dedans.

les gens peuvent aussi utiliser des mots de substitution, comme la "Fracturation."Vous bloquer? Et "stylo" pour "pénis"? Votre programme n'a pas d'intelligence artificielle pour savoir si la chaîne est bon ou mauvais.

N'utilisez pas de filtres de profanation. Ils sont difficiles à développer, et ils sont aussi lents qu'un rampement.

-2
répondu clickbait 2015-06-21 19:52:25