223 Stimmen

Wie implementiert man einen guten Schimpfwortfilter?

Viele von uns müssen mit Benutzereingaben, Suchanfragen und Situationen umgehen, in denen der Eingabetext möglicherweise Schimpfwörter oder unerwünschte Sprache enthält. Oftmals muss dies herausgefiltert werden.

Wo kann man eine gute Liste von Schimpfwörtern in verschiedenen Sprachen und Dialekten finden?

Gibt es APIs für Quellen, die gute Listen enthalten? Oder vielleicht eine API, die einfach sagt "ja, das ist sauber" oder "nein, das ist schmutzig" mit einigen Parametern?

Welche guten Methoden gibt es, um Leute zu erwischen, die versuchen, das System auszutricksen, wie z. B. a$$, azz oder a55?

Bonuspunkte, wenn Sie Lösungen für PHP anbieten :)

Edit: Antwort auf die Antworten, die besagen, dass man das programmatische Problem einfach vermeiden sollte:

Ich denke, dass diese Art von Filter sinnvoll ist, wenn beispielsweise ein Nutzer die öffentliche Bildersuche nutzen kann, um Bilder zu finden, die in einen sensiblen Gemeinschaftspool aufgenommen werden. Wenn sie nach "Penis" suchen können, dann werden sie wahrscheinlich viele Bilder von "ja" erhalten. Wenn wir solche Bilder nicht wollen, dann ist das Verbot des Wortes als Suchbegriff eine gute, wenn auch zugegebenermaßen nicht narrensichere Methode. Die eigentliche Frage ist, wie man die Liste der Wörter überhaupt erhält.

Ich suche also nach einer Möglichkeit, herauszufinden, ob ein einzelnes Token schmutzig ist oder nicht, und es dann einfach zu verbieten. Ich würde mir nicht die Mühe machen, eine Bemerkung wie die total witzige "Langhalsgiraffe" zu verhindern. Da kann man nichts machen :)

15 Stimmen

Es ist eine Schande, dass alle Top-Antworten existenzielle und defätistische Ablenkungen von der Programmierherausforderung sind. Angesichts der zunehmenden Bedeutung von "Cyborg"-Computerdiensten wie Mechanical Turk und der Tatsache, dass fast jede Software zu einer sozialen Plattform wird, ist es wichtiger denn je, eine Heuristik zu haben, um Inhalte mit einer roten Markierung zu versehen und sie einem Moderator zur Kenntnis zu bringen!

12 Stimmen

Bitte achten Sie auf den Sprachkontext, besonders wenn Sie i18n machen. Ich habe einmal versucht, eine Google-Gruppe für einen Kurs namens "Sanal ortamda görsellestirme" einzurichten, was auf Türkisch "Visualisierung in virtuellen Medien" heißt. Google war dumm genug, es abzulehnen. weil der Titel das Wort "anal" enthielt . Sanal[tr]=Virtual[en] und Google beschuldigte mich schamlos der Gotteslästerung! :D Bitte lassen Sie nicht zu, dass solche seltsamen Dinge passieren.

0 Stimmen

Wie wäre es, wenn Sie nach dem Wort suchen in Spanisch ? Sie können den Google-Bilder-Filter auf diese Weise umgehen (wenn Sie in einer anderen Sprache lokalisiert sind).

6voto

scunliffe Punkte 60080

Wenn Sie so etwas wie Digg/Stackoverflow machen können, wo die Nutzer obszöne Inhalte herunterstufen/markieren können, dann tun Sie das.

Dann müssen Sie nur noch die "unartigen" Nutzer überprüfen und sie sperren, wenn sie gegen die Regeln verstoßen.

4voto

HidekiAI Punkte 2883

Auch spät im Spiel, aber einige Recherchen und stolperte über hier. Wie andere erwähnt haben, ist es fast unmöglich, wenn es automatisiert wurde, aber wenn Ihr Design / Anforderung kann in einigen Fällen (aber nicht immer) menschliche Interaktionen zu überprüfen, ob es profan ist oder nicht, können Sie ML betrachten. https://docs.microsoft.com/en-us/azure/cognitive-services/content-moderator/text-moderation-api#profanity ist aus mehreren Gründen meine derzeitige Wahl:

  • Unterstützt viele Lokalisierungen
  • Die Datenbank wird ständig aktualisiert, so dass ich nicht mit den neuesten Slangs oder Sprachen Schritt halten muss (Wartungsproblem).
  • Wenn die Wahrscheinlichkeit hoch ist (d.h. 90 % oder mehr), kann man sie einfach pragmatisch verneinen
  • Sie können nach Kategorien Ausschau halten, die eine Markierung hervorrufen, bei der es sich um Gotteslästerung handeln kann oder auch nicht, und können jemanden beauftragen, sie zu überprüfen, um festzustellen, ob es sich um Gotteslästerung handelt oder nicht.

Für meinen Bedarf war/ist es ein öffentlichkeitsfreundlicher kommerzieller Dienst (OK, Videospiele), bei dem andere Benutzer den Benutzernamen sehen können/wollen, aber das Design erfordert, dass er durch einen Schimpfwortfilter geht, um anstößige Benutzernamen abzuweisen. Das Traurige daran ist, dass das klassische "clbuttic"-Problem höchstwahrscheinlich auftreten wird, da Benutzernamen in der Regel aus einem einzigen Wort (bis zu N Zeichen) oder manchmal aus mehreren zusammenhängenden Wörtern bestehen... Auch hier wird Microsofts kognitiver Dienst "Assist" nicht als Text.HasProfanity=true kennzeichnen, sondern möglicherweise eine der Kategorien mit hoher Wahrscheinlichkeit kennzeichnen.

Da sich der Auftraggeber fragt, was mit "a$$" ist, hier ein Ergebnis, als ich es durch den Filter laufen ließ: enter image description here Wie Sie sehen können, hat es festgestellt, dass es nicht gotteslästerlich ist, aber es hat eine hohe Wahrscheinlichkeit, dass es das ist, so dass es Empfehlungen zur Überprüfung (menschlicher Interaktionen) ausgibt.

Wenn die Wahrscheinlichkeit hoch ist, kann ich entweder "Es tut mir leid, dieser Name ist bereits vergeben" zurückgeben (auch wenn er es nicht ist), damit er weniger beleidigend für Anti-Zensur-Personen oder so ist, wenn wir keine menschliche Überprüfung integrieren wollen, oder ich kann "Ihr Benutzername wurde der Abteilung für Live-Betrieb mitgeteilt, Sie können warten, bis Ihr Benutzername überprüft und genehmigt wird, oder einen anderen Benutzernamen wählen". Oder was auch immer...

Übrigens sind die Kosten/Preise für diesen Dienst für meine Zwecke recht niedrig (wie oft wird der Benutzername geändert?), aber auch hier gilt, dass das Design von OP vielleicht intensivere Abfragen erfordert und es nicht ideal ist, für ML-Dienste zu bezahlen/abonnieren oder keine menschliche Überprüfung/Interaktion zu haben. Es hängt alles vom Design ab... Aber wenn das Design passt, kann dies vielleicht die Lösung für OP sein.

Bei Interesse kann ich in Zukunft die Nachteile im Kommentar auflisten.

4voto

Chase Florell Punkte 44519

Ich bin ein wenig zu spät zu der Partei, aber ich habe eine Lösung, die für einige, die dies lesen funktionieren könnte. Es ist in javascript statt php, aber es gibt einen triftigen Grund dafür.

Vollständige Offenlegung: Ich habe dieses Plugin geschrieben...

Wie auch immer.

Der Ansatz, den ich gewählt habe, besteht darin, dem Benutzer die Möglichkeit zu geben, die Filterung von Schimpfwörtern einzustellen. Grundsätzlich sind Schimpfwörter standardmäßig erlaubt, aber wenn meine Nutzer sie nicht lesen wollen, müssen sie es auch nicht. Das hilft auch bei dem "l33t sp3@k"-Problem.

Das Konzept ist einfach jquery Plugin, das vom Server injiziert wird, wenn das Kundenkonto die Profanitätsfilterung aktiviert hat. Von dort aus sind es nur ein paar einfache Zeilen, die die Schimpfwörter ausblenden.

Hier ist die Demo-Seite
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>

Ergebnis

*** wird fehlschlagen, aber das Passwort nicht

0 Stimmen

Hier ist ein jsFiddle Arbeitsdemo um diese Antwort zu begleiten.

0 Stimmen

Sehr naiv. Hat nicht gefiltert a$$

3 Stimmen

@EmperorAiman es war nie beabsichtigt, zu filtern l33t sprechen . Ich empfehle nicht zu versuchen, das zu filtern, denn es ist ein aussichtsloser Kampf. Der Filter für Schimpfwörter, den ich gepostet habe, ist so aufgebaut, dass die Benutzer die Möglichkeit haben, sich für die Filterung von Schimpfwörtern zu entscheiden, was bedeutet, dass er am besten auf einer Website verwendet wird, die Schimpfwörter standardmäßig zulässt. Wenn Sie filtern möchten a$$ und fügen Sie sie dann der Filterliste hinzu.

3voto

andrew Punkte 21

Sobald Sie eine gute MYSQL-Tabelle mit einigen schlechten Wörtern haben, die Sie filtern möchten (ich habe mit einem der Links in diesem Thread begonnen), können Sie etwas wie folgt tun:

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

Ich bin mir sicher, dass es einen effizienteren Weg gibt, all diese Ersetzungen vorzunehmen, aber ich bin nicht schlau genug, um das herauszufinden (und das scheint gut zu funktionieren, wenn auch ineffizient).

Ich bin der Meinung, dass Sie die Registrierung der Benutzer zulassen sollten und die Menschen dazu benutzen sollten, die Tabelle der Schimpfwörter zu filtern und nach Bedarf zu ergänzen. Allerdings hängt alles von den Kosten eines falschen Positivs (ein gutes Wort wird als schlecht markiert) gegenüber einem falschen Negativ (ein schlechtes Wort kommt durch) ab. Das sollte letztendlich bestimmen, wie aggressiv oder konservativ Sie bei Ihrer Filterstrategie vorgehen.

Ich würde auch sehr vorsichtig sein, wenn Sie Wildcards verwenden wollen, da sie sich manchmal lästiger verhalten können, als Sie beabsichtigen.

2voto

Ich stimme dem Beitrag von HanClinto weiter oben in dieser Diskussion zu. Ich verwende in der Regel reguläre Ausdrücke, um Eingabetext zu überprüfen. Und das ist eine vergebliche Mühe, da man, wie Sie anfangs erwähnten, in der "blockierten" Liste explizit alle im Netz verbreiteten Schreibtricks berücksichtigen muss.

Nebenbei bemerkt, während andere über die Ethik der Zensur debattieren, muss ich zustimmen, dass eine gewisse Form im Web notwendig ist. Manche Leute haben einfach Spaß daran, vulgäre Dinge zu posten, weil sie sofort eine große Anzahl von Menschen beleidigen können, ohne dass der Autor darüber nachdenken muss.

Ich danke Ihnen für die Anregungen.

HanClinto regiert!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X