Domanda

Molti di noi devono occuparsi dell'input dell'utente, delle query di ricerca e delle situazioni in cui il testo di input può potenzialmente contenere volgarità o linguaggio indesiderato. Spesso questo deve essere filtrato.

Dove si trova un buon elenco di parolacce in varie lingue e dialetti?

Ci sono API disponibili per le fonti che contengono buoni elenchi? O forse un'API che dice semplicemente "sì, questo è pulito" oppure " no, questo è sporco " con alcuni parametri?

Quali sono alcuni buoni metodi per catturare persone che cercano di ingannare il sistema, come $$, azz o a55?

Punti bonus se offri soluzioni per PHP. :)

Modifica: risposta a risposte che dicono semplicemente evitare il problema programmatico:

Penso che esista un posto per questo tipo di filtro quando, ad esempio, un utente può utilizzare la ricerca di immagini pubbliche per trovare immagini che vengono aggiunte a un pool di comunità sensibili. Se riescono a cercare "pene", probabilmente otterranno molte immagini di, sì. Se non vogliamo immagini di questo, quindi impedire la parola come termine di ricerca è un buon guardiano, anche se, certamente, non è un metodo infallibile. Ottenere la lista di parole in primo luogo è la vera domanda.

Quindi mi riferisco davvero a un modo per capire che un singolo token è sporco o no e quindi semplicemente non lo consente. Non mi preoccuperei di impedire un sentimento come la giraffa dal collo lungo totalmente esilarante. riferimento. Niente che tu possa fare lì. :)

È stato utile?

Soluzione

Filtri di oscenità: cattiva idea, o Cattiva idea incredibilmente interessante?

Inoltre, non si può dimenticare La storia non raccontata di SpeedChat di Toontown , dove persino usando una whitelist di parole sicure " ha portato un bambino di 14 anni ad aggirarlo rapidamente con: " Voglio attaccare la mia giraffa dal collo lungo sul tuo soffice coniglietto bianco. "

In conclusione: in definitiva, per qualsiasi sistema implementato, non vi è assolutamente alcun sostituto per la revisione umana (sia peer che altro). Sentiti libero di implementare uno strumento rudimentale per sbarazzarti del drive-by, ma per il troll determinato, devi assolutamente avere un approccio non basato su algoritmo.

Un sistema che rimuove l'anonimato e introduce la responsabilità (cosa che Stack Overflow fa bene) è utile anche, in particolare per aiutare a combattere REGALO di John Gabriel

Hai anche chiesto dove puoi ottenere elenchi di volgarità per iniziare: un progetto open source da verificare è Dansguardian - controlla il codice sorgente per gli elenchi di volgarità predefiniti. Esiste anche un Elenco frasi di terze parti che è possibile scaricare per il proxy che può essere utile punto per te.

Modifica in risposta la domanda modifica: Grazie per il chiarimento su cosa stai cercando di fare. In tal caso, se stai solo provando a fare un semplice filtro di parole, ci sono due modi per farlo. Uno è quello di creare una singola regexp lunga con tutte le frasi vietate che si desidera censurare e fare semplicemente una regex per trovarla / sostituirla. Una regex come:

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

ed eseguilo sulla tua stringa di input usando preg_match () per testare all'ingrosso un hit,

o preg_replace () per cancellarli.

Puoi anche caricare quelle funzioni con array piuttosto che con una singola regex lunga e, per elenchi di parole lunghe, potrebbe essere più gestibile. Vedi preg_replace () per alcuni buoni esempi su come gli array possono essere usati in modo flessibile.

Per ulteriori esempi di programmazione PHP, consultare questa pagina per una classe generica piuttosto avanzata per il filtraggio delle parole che * esclude le lettere centrali dalle parole censurate e questa precedente domanda di overflow dello stack che ha anche un esempio di PHP (la parte più importante in essa è l'approccio basato su parole filtrate basato su SQL - il compensatore leet-speak può essere eliminato se lo trovi non necessario).

Hai anche aggiunto: " Ottenere innanzitutto l'elenco di parole è la vera domanda. " - oltre ad alcuni dei precedenti link Dansgaurdian, potresti trovare questo utile .zip di 458 parole per essere utile.

Altri suggerimenti

Mentre so che questa domanda è piuttosto vecchia, ma è una domanda che si verifica comunemente ...

C'è sia una ragione che una chiara necessità di filtri volgarità (vedi voce Wikipedia qui ), ma spesso cadono a meno di essere accurati al 100% per ragioni ben distinte; Contesto e accuratezza .

Dipende (interamente) da ciò che stai cercando di raggiungere - nella sua forma più elementare, probabilmente stai cercando di coprire il " sette parolacce " e poi alcuni ... Alcune aziende hanno bisogno di filtrare la più volgare delle volgarità: parolacce di base, URL o persino informazioni personali e così via, ma altri devono prevenire la denominazione illecita di account (Xbox Live è un esempio) o molto altro ancora .. .

I contenuti generati dagli utenti non contengono solo potenziali parolacce, ma possono anche contenere riferimenti offensivi a:

  • Atti sessuali
  • Orientamento sessuale
  • Religione
  • Etnia
  • Etc ...

E potenzialmente, in più lingue. Shutterstock ha sviluppato elenchi di parole sporche di base in 10 lingue per data, ma è ancora semplice e molto orientato verso le loro esigenze di "tagging". Ci sono un certo numero di altri elenchi disponibili sul web.

Sono d'accordo con la risposta accettata sul fatto che non è una scienza definita e come il linguaggio è una sfida in continua evoluzione, ma in cui un tasso di cattura del 90% è migliore dello 0% . Dipende esclusivamente dai tuoi obiettivi: cosa stai cercando di raggiungere, il livello di supporto che hai e quanto sia importante rimuovere parolacce di diversi tipi.

Nella creazione di un filtro, è necessario considerare i seguenti elementi e il modo in cui si collegano al progetto:

  • Le parole / frasi
  • Acronimi (FOAD / LMFAO ecc.)
  • Falsi positivi (parole, luoghi e nomi come 'mishit', 'scunthorpe' e 'titsworth')
  • URL (i siti porno sono un obiettivo ovvio)
  • Informazioni personali (e-mail, indirizzo, telefono ecc., se applicabile)
  • Scelta della lingua (di solito inglese per impostazione predefinita)
  • Moderazione (come, se non del tutto, puoi interagire con i contenuti generati dagli utenti e cosa puoi farci)

Puoi facilmente creare un filtro volgarità che cattura il 90% + di volgarità, ma non colpirai mai il 100%. Non è proprio possibile. Più ti avvicini al 100%, più diventa difficile ... Avendo creato un motore di parolacce complesso che in passato gestiva più di 500.000 messaggi in tempo reale al giorno, ti offrirei i seguenti consigli:

Un filtro di base coinvolgerebbe:

  • Creazione di un elenco di volgarità applicabili
  • Sviluppare un metodo per gestire le derivazioni di volgarità

Un filer moderatamente complesso implicherebbe, (oltre a un filtro di base):

  • Utilizzo di combinazioni di schemi complessi per gestire derivazioni estese (utilizzando regex avanzato)
  • Trattare con Leetspeak (l33t)
  • Trattare con falsi positivi

Un filtro complesso implicherebbe un numero di quanto segue (oltre a un filtro moderato):

Non conosco buone librerie per questo, ma qualunque cosa tu faccia, assicurati di sbagliare nella direzione di far passare le cose. Mi sono occupato di sistemi che non mi avrebbero permesso di utilizzare "mpassell" come nome utente, perché contiene " ass " come sottostringa. È un ottimo modo per alienare gli utenti!

Durante una mia intervista di lavoro, la compagnia CTO che mi stava intervistando ha provato un gioco di parole / web che ho scritto in Java. Da un elenco di parole dell'intero dizionario inglese di Oxford, qual è stata la prima parola che è venuta a indovinare?

Certo, la parola più volgare in lingua inglese.

In qualche modo, ho ancora ottenuto l'offerta di lavoro, ma ho quindi rintracciato un elenco di parolacce (non a differenza di questo ) e ha scritto un breve script per generare un nuovo dizionario senza tutte le parolacce (senza nemmeno dover guardare l'elenco).

Per il tuo caso particolare, penso che confrontare la ricerca con parole reali sembra il modo di procedere con un elenco di parole come quello. Gli stili / punteggiatura alternativi richiedono un po 'più di lavoro, ma dubito che gli utenti lo useranno abbastanza spesso da essere un problema.

un sistema di filtraggio volgarità non sarà mai perfetto, anche se il programmatore è insicuro e si tiene al passo con tutti gli sviluppi nudi

detto ciò, è probabile che qualsiasi elenco di "parolacce" funzioni come qualsiasi altro elenco, poiché il problema di fondo è comprensione del linguaggio che è praticamente intrattabile con la tecnologia attuale

quindi, l'unica soluzione pratica è duplice:

  1. preparati ad aggiornare frequentemente il tuo dizionario
  2. assumere un editore umano per correggere falsi positivi (ad es. "clbuttic" invece di "classico") e falsi negativi (oops! perso uno!)

L'unico modo per impedire l'input offensivo dell'utente è impedire l'input dell'utente.

Se insisti nel consentire l'input dell'utente e hai bisogno di moderazione, incorpora i moderatori umani.

Per quanto riguarda il tuo "trucco del sistema" domanda secondaria, puoi gestirlo normalizzando sia la "cattiva parola" elenco e il testo inserito dall'utente prima di effettuare la ricerca. ad esempio, utilizzare una serie di regex (o tr se PHP lo possiede) per convertire [z $ 5] in " s " ;, [4 @] a " a " ;, ecc., quindi confronta la "parolaccia" normalizzata " elenco rispetto al testo normalizzato. Nota che la normalizzazione potrebbe potenzialmente portare a ulteriori falsi positivi, anche se al momento non riesco a pensare a nessun caso reale.

La sfida più grande è trovare qualcosa che permetta alle persone di citare " La penna è più potente della spada " durante il blocco di " p e n i s " ;.

Attenzione ai problemi di localizzazione: ciò che è una parolaccia in una lingua potrebbe essere una parola perfettamente normale in un'altra.

Un esempio attuale di questo: ebay usa un approccio dizionario per filtrare "parolacce" dal feedback. Se provi a inserire la traduzione tedesca di " questa è stata una transazione perfetta " (" das war eine perfekte Transaktion "), ebay rifiuterà il feedback a causa di parolacce.

Perché? Perché la parola tedesca per " era " è "guerra", e "guerra" è nel dizionario ebay di " parolacce " ;.

Quindi attenzione ai problemi di localizzazione.

Se riesci a fare qualcosa come Digg / Stackoverflow in cui gli utenti possono ridimensionare / contrassegnare contenuti osceni ... fallo.

Quindi tutto ciò che devi fare è rivedere il "cattivo" utenti e bloccarli se infrangono le regole.

Sono un po 'in ritardo alla festa, ma ho una soluzione che potrebbe funzionare per alcuni che leggono questo. È in javascript anziché php, ma c'è un motivo valido per farlo.

  

Informativa completa, ho scritto questo plugin ...

In ogni modo.

L'approccio che ho seguito è quello di consentire a un utente di " Opt-In " al loro filtro volgarità. Fondamentalmente volgarità sarà consentito per impostazione predefinita, ma se i miei utenti non vogliono leggerlo, non devono farlo. Questo aiuta anche con il "l33t sp3 @ k" problema.

Il concetto è un semplice che viene iniettato dal server se l'account del client sta abilitando il filtro volgarità. Da lì, sono solo un paio di semplici linee che cancellano le imprecazioni.

Ecco la pagina demo
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>

risultato

  

*** fallirà ma la password no

Non farlo. Porta solo a problemi. Un'esperienza personale clacuttica che ho con i filtri volgari è il momento in cui sono stato espulso / bandito da un canale IRC per aver menzionato che stavo "attraversando il ponte verso Hancock per un paio d'ore". o qualcosa in tal senso.

Sono d'accordo con il post di HanClinto più in alto in questa discussione. In genere utilizzo espressioni regolari per far corrispondere le stringhe al testo di input. E questo è uno sforzo inutile, poiché, come hai menzionato in origine, devi rendere esplicitamente conto di ogni forma di trucco popolare nella rete nel tuo "bloccato". lista.

In una nota a margine, mentre altri stanno discutendo l'etica della censura, devo essere d'accordo sul fatto che una qualche forma è necessaria sul web. Ad alcune persone piace semplicemente pubblicare volgarità perché può essere immediatamente offensivo per un grande numero di persone e non richiede assolutamente alcuna riflessione da parte dell'autore.

Grazie per le idee.

Regole HanClinto!

Una volta che hai una buona tabella MYSQL con alcune parolacce che vuoi filtrare (ho iniziato con uno dei collegamenti in questo thread), puoi fare qualcosa del genere:

$errors = array();  //Initialize error array (I use this with all my PHP form validations)

$SCREENNAME = mysql_real_escape_string(

Una volta che hai una buona tabella MYSQL con alcune parolacce che vuoi filtrare (ho iniziato con uno dei collegamenti in questo thread), puoi fare qualcosa del genere:

<*>

Sono sicuro che esiste un modo più efficiente per eseguire tutte quelle sostituzioni, ma non sono abbastanza intelligente da capirlo (e questo sembra funzionare bene, anche se in modo inefficiente).

Credo che dovresti sbagliare per consentire agli utenti di registrarsi e utilizzare gli umani per filtrare e aggiungere alla tua parolaccia come richiesto. Anche se tutto dipende dal costo di un falso positivo (parola ok contrassegnata come cattiva) rispetto a un falso negativo (la parolaccia passa). Ciò dovrebbe in definitiva governare quanto aggressivo o conservatore sei nella tua strategia di filtro.

Vorrei anche fare molta attenzione se si desidera utilizzare i caratteri jolly, poiché a volte possono comportarsi in modo più oneroso di quanto si pensi.

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

Sono sicuro che esiste un modo più efficiente per eseguire tutte quelle sostituzioni, ma non sono abbastanza intelligente da capirlo (e questo sembra funzionare bene, anche se in modo inefficiente).

Credo che dovresti sbagliare per consentire agli utenti di registrarsi e utilizzare gli umani per filtrare e aggiungere alla tua parolaccia come richiesto. Anche se tutto dipende dal costo di un falso positivo (parola ok contrassegnata come cattiva) rispetto a un falso negativo (la parolaccia passa). Ciò dovrebbe in definitiva governare quanto aggressivo o conservatore sei nella tua strategia di filtro.

Vorrei anche fare molta attenzione se si desidera utilizzare i caratteri jolly, poiché a volte possono comportarsi in modo più oneroso di quanto si pensi.

Ho raccolto 2200 parolacce in 12 lingue: 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.

Sono disponibili le opzioni dump MySQL, JSON, XML o CSV.

https://github.com/turalus/openDB

Ti suggerirei di eseguire questo SQL nel tuo DB e di controllare ogni volta che l'utente immette qualcosa.

Francamente, lascerei che ottengano il "trucco del sistema" parole e vietarle invece, che sono solo io. Ma semplifica anche la programmazione.

Quello che farei è implementare un filtro regex in questo modo: / [\ s] dooby (doo?) [\ s] / i oppure la parola è prefissata su altri, / [\ s] Doob (er | ed | est) [\ s] / . Ciò impedirebbe di filtrare parole come assuaged, il che è perfettamente valido, ma richiederebbe anche la conoscenza delle altre varianti e l'aggiornamento del filtro effettivo se ne impari uno nuovo. Ovviamente questi sono tutti esempi, ma dovresti decidere come farlo da solo.

Non sto per scrivere tutte le parole che conosco, non quando in realtà non voglio conoscerle.

Sono d'accordo con l'inutilità dell'argomento, ma se devi avere un filtro, dai un'occhiata a Boxwood di Ning a>:

  

Boxwood è un'estensione PHP per la rapida sostituzione di più parole in un pezzo di testo. Supporta la corrispondenza tra maiuscole e minuscole. Richiede che il testo su cui opera sia codificato come UTF-8.

Vedi anche questo post sul blog per maggiori dettagli:

  

Con Boxwood, puoi avere la tua lista di termini di ricerca quanto vuoi - l'algoritmo di ricerca e sostituzione non rallenta con più parole nell'elenco di parole da cercare. Funziona costruendo un trie di tutti i termini di ricerca e quindi scansiona il testo del soggetto solo una volta, percorrendo gli elementi del trie e confrontandoli con i caratteri nel testo. Supporta la corrispondenza US-ASCII e UTF-8, con maiuscole o minuscole e insensibili, e ha una logica di controllo dei confini delle parole incentrata sull'inglese.

Ho concluso, per creare un buon filtro volgare abbiamo bisogno di 3 componenti principali, o almeno è quello che ho intenzione di fare. Questi sono:

  1. Il filtro: un servizio in background che verifica contro una lista nera, un dizionario o qualcosa del genere.
  2. Non consentire account anonimo
  3. Segnala abuso

Un bonus, sarà quello di premiare in qualche modo coloro che contribuiscono con accurati giornalisti di abusi e puniscono l'autore del reato, ad es. sospendere i loro account.

Anche in ritardo nel gioco, ma facendo alcune ricerche e inciampato qui. Come altri hanno già detto, è quasi quasi impossibile se fosse automatizzato, ma se il tuo progetto / requisito può comportare in alcuni casi (ma non sempre) interazioni umane per verificare se è profano o meno, puoi considerare ML. https: // docs. microsoft.com/en-us/azure/cognitive-services/content-moderator/text-moderation-api#profanity è la mia scelta attuale in questo momento per diversi motivi:

  • Supporta molte localizzazioni
  • Continuano ad aggiornare il database, quindi non devo tenere il passo con gli ultimi gergi o lingue (problema di manutenzione)
  • Quando c'è un'alta probabilità (cioè il 90% o più) puoi semplicemente negarlo pragmaticamente
  • Puoi osservare la categoria che causa una bandiera che può essere o meno volgarità e che qualcuno può esaminarla per insegnare che è o non è profana.

Per le mie necessità, era / è basato su un servizio commerciale di facile utilizzo (OK, videogiochi) che altri utenti possono / vedranno il nome utente, ma il design richiede che debba passare attraverso il filtro parolacce per rifiutare il nome utente offensivo. La parte triste di questo è il classico "clbuttic" molto probabilmente si verificherà un problema poiché i nomi utente sono in genere una singola parola (fino a N caratteri) a volte più parole concatenate ... Ancora una volta, il servizio cognitivo di Microsoft non contrassegnerà "Assist". come Text.HasProfanity = true ma può contrassegnare una delle categorie come probabile.

Mentre il PO chiede, che ne è di un "$$", ecco un risultato quando lo ho passato attraverso il filtro: inserisci qui la descrizione dell'immagine , come puoi vedere, ha determinato non è profano, ma ha un'alta probabilità che lo sia, quindi le bandiere come raccomandazioni di revisione (interazioni umane).

Quando la probabilità è alta, posso tornare indietro " mi dispiace, quel nome è già preso " (anche se non lo è) in modo che sia meno offensivo per le persone anti-censura o qualcosa del genere, se non vogliamo integrare la revisione umana o restituire " Il tuo nome utente è stato notificato al dipartimento operativo dal vivo, potresti attendi che il tuo nome utente venga esaminato e approvato o scegli un altro nome utente " ;. O qualunque cosa ...

A proposito, il costo / prezzo per questo servizio è abbastanza basso per il mio scopo (con che frequenza viene cambiato il nome utente?), ma ancora, per OP forse il design richiede query più intense e potrebbe non essere l'ideale per pagare / abbonati per i servizi ML o non può avere revisioni / interazioni umane. Tutto dipende dal design ... Ma se il design si adatta al conto, forse questa può essere la soluzione di OP.

Se interessati, posso elencare i contro nel commento in futuro.

Non farlo.

A causa:

  • Clbuttic
  • La volgarità non è OMG EVIL
  • La volgarità non può essere definita in modo efficace
  • La maggior parte delle persone probabilmente non gradisce essere "protette". dalla volgarità

Modifica: anche se sono d'accordo con il commentatore che ha affermato che "la censura è sbagliata", questa non è la natura di questa risposta.

I filtri volgari sono una cattiva idea. Il motivo è che non puoi cogliere ogni parolaccia. Se ci provi, ottieni falsi positivi.

Parole da prendere

Diciamo solo che vuoi catturare la F-Word. Facile vero? Bene, vediamo.

Puoi scorrere una stringa per trovare " fuck. " Sfortunatamente, le persone ingannano i filtri al giorno d'oggi. Il filtro volgarità non ha rilevato "fuk."

Si può provare a verificare la presenza di più ortografie e varianti della parola, ma ciò rallenterà le prestazioni del codice. Per catturare la parola F, devi cercare "Fuc", "Fuc", "Fuk", "Fuk", "F ***", ecc. E l'elenco potrebbe continuare all'infinito .

Evitare l'innocenza

Okay, che ne dici di renderlo maiuscole e minuscole e ignorare gli spazi in modo che catturi " F u C k " ;? Potrebbe sembrare una buona idea, ma qualcuno può semplicemente bypassare il filtro volgarità con " F.U.C.K. "

Ignori la punteggiatura.

Ora questo è un vero problema, dato che una frase come " Inferno o, ecco! " prenderà come " inferno " e " Wh culo su? " riprende come " ass. "

E ci sono un sacco di parole che devi escludere dal filtro, come " Contro tit ution, " perché c'è " tit " in esso.

Le persone possono anche usare parole sostitutive, come " Frack. " Lo blocchi anche tu? Che dire di "penna è" per "pene"? Il tuo programma non ha intelligenza artificiale per sapere se la stringa è buona o cattiva.

Non utilizzare i filtri volgarità. Sono difficili da sviluppare e sono lenti come una scansione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top