Wie implementiert man einen guten Obszönitätsfilter?


207

Viele von uns müssen sich mit Benutzereingaben, Suchanfragen und Situationen befassen, in denen der Eingabetext möglicherweise Schimpfwörter oder unerwünschte Sprache enthalten kann. Oft 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 mit einigen Parametern einfach "Ja, das ist sauber" oder "Nein, das ist schmutzig" sagt?

Was sind einige gute Methoden, um Leute zu fangen, die versuchen, das System auszutricksen, wie ein $$, azz oder a55?

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

Bearbeiten: Antwort auf Antworten, die einfach das programmatische Problem vermeiden:

Ich denke, es gibt einen Ort für diese Art von Filter, an dem ein Benutzer beispielsweise mithilfe der öffentlichen Bildsuche Bilder finden kann, die einem sensiblen Community-Pool hinzugefügt werden. Wenn sie nach "Penis" suchen können, werden sie wahrscheinlich viele Bilder von bekommen, yep. Wenn wir keine Bilder davon wollen, ist es ein guter Gatekeeper, das Wort als Suchbegriff zu verhindern, obwohl dies zugegebenermaßen keine narrensichere Methode ist. Die Liste der Wörter überhaupt zu bekommen, ist die eigentliche Frage.

Ich beziehe mich also wirklich auf einen Weg, um herauszufinden, ob ein einzelnes Token schmutzig ist oder nicht, und es dann einfach nicht zuzulassen. Ich würde mir nicht die Mühe machen, ein Gefühl wie die total witzige Referenz "Langhalsgiraffe" zu verhindern. Da kann man nichts machen. :) :)


12
Es ist eine Schande, dass alle Top-Antworten existenzielle und defätistische Ablenkungen von der Programmierherausforderung sind. Da "Cyborg" -Berechnungsdienste wie Mechanical Turk an Fahrt gewinnen und fast die gesamte Software sozial wird, ist es wichtiger denn je, eine Heuristik zu haben, um Inhalte auf die rote Fahne zu setzen und einen Moderator darauf aufmerksam zu machen!
JasonSmith

10
Bitte achten Sie auf den Sprachkontext, insbesondere wenn Sie i18n ausführen. Ich habe einmal versucht, eine Google-Gruppe für den Kurs "Sanal ortamda görselleştirme" einzurichten, der türkisch für "Visualisierung in virtuellen Medien" ist. Google war dumm genug, es abzulehnen, weil der Titel das Wort "anal" enthielt . Sanal [tr] = Virtual [en] und Google beschuldigten mich schamlos der Obszönität! : D Bitte lass solche seltsamen Dinge nicht passieren.
Edgerunner

Was ist, wenn Sie nach dem Wort auf Spanisch suchen ? Auf diese Weise können Sie den Google Bilder-Filter umgehen (wenn Sie in einer anderen Sprache lokalisiert sind).
new123456

Ein weiterer Vorschlag wäre, diese Wörter NICHT zu verbieten, sondern die Benutzer zu registrieren, die sie verwenden. Wenn ein Benutzer / eine IP mehr als 2, 3 oder was auch immer Sie möchten, blockieren Sie diese Person. Auch nicht kinderleicht, aber ich denke, es ist viel unpraktischer, blockiert zu werden und Benutzer / IP / beides ändern zu müssen, als "flauschiger weißer Hase" anstelle von "Muschi" zu schreiben. Zum Teil wissen Benutzer nicht, WELCHE Wörter oder Ausdrücke sie nicht verwenden können, sodass sie nicht einfach so leicht verschiedene schlechte Wörter erraten können, wenn sie gesperrt werden.
Francisco Presencia

1
Obszönitätsfilter sind eine schlechte Idee. Es ist sehr schwer zu unterscheiden zwischen jemandem, der versucht, das System
auszutricksen

Antworten:


176

Obszönitätsfilter: schlechte Idee oder unglaublich schlechte Idee?

Man kann auch die unerzählte Geschichte von Toontowns SpeedChat nicht vergessen , wo selbst die Verwendung einer "sicheren Wort-Whitelist" dazu führte, dass ein 14-Jähriger sie schnell umging: "Ich möchte meine langhalsige Giraffe in Ihren flauschigen weißen Hasen stecken . "

Fazit: Letztendlich gibt es für jedes System, das Sie implementieren, absolut keinen Ersatz für eine menschliche Überprüfung (ob Peer oder anderweitig). Fühlen Sie sich frei, ein rudimentäres Tool zu implementieren, um die Drive-bys loszuwerden, aber für den entschlossenen Troll müssen Sie unbedingt einen nicht algorithmischen Ansatz haben.

Ein System, das die Anonymität beseitigt und Verantwortlichkeit einführt (was Stack Overflow gut macht), ist ebenfalls hilfreich, insbesondere um John Gabriels GESCHENK zu bekämpfen

Sie haben auch gefragt, wo Sie Profanitätslisten erhalten können, um loszulegen. Ein Open-Source-Projekt, das Sie überprüfen sollten, ist Dansguardian. Überprüfen Sie den Quellcode auf ihre Standard-Profanitätslisten. Es gibt auch eine zusätzliche Phrasenliste von Drittanbietern , die Sie für den Proxy herunterladen können und die für Sie möglicherweise hilfreich ist.

Bearbeiten Sie als Antwort die Frage bearbeiten: Vielen Dank für die Klarstellung, was Sie versuchen zu tun. In diesem Fall gibt es zwei Möglichkeiten, wie Sie einen einfachen Wortfilter ausführen können. Eine besteht darin, einen einzelnen langen regulären Ausdruck mit allen gesperrten Phrasen zu erstellen, die Sie zensieren möchten, und lediglich einen regulären Ausdruck zu finden / zu ersetzen. Ein Regex wie:

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

und führen Sie es mit preg_match () auf Ihrer Eingabezeichenfolge aus, um einen Großhandelstest für einen Treffer durchzuführen.

oder preg_replace (), um sie auszublenden.

Sie können diese Funktionen auch mit Arrays anstelle eines einzelnen langen regulären Ausdrucks laden. Bei langen Wortlisten ist dies möglicherweise einfacher zu verwalten. In preg_replace () finden Sie einige gute Beispiele dafür, wie Arrays flexibel verwendet werden können.

Weitere Beispiele für die PHP-Programmierung finden Sie auf dieser Seite für eine etwas erweiterte generische Klasse für die Wortfilterung, bei der die Mittelbuchstaben von zensierten Wörtern entfernt sind, sowie für diese vorherige Frage zum Stapelüberlauf, die auch ein PHP-Beispiel enthält (der wichtigste wertvolle Teil darin ist der SQL-basierte Ansatz für gefilterte Wörter (auf den Leet-Speak-Kompensator kann verzichtet werden, wenn Sie dies für unnötig halten).

Sie haben auch hinzugefügt: " Die Liste der Wörter an erster Stelle zu bekommen, ist die eigentliche Frage. " - Zusätzlich zu einigen der vorherigen Dansgaurdian-Links kann diese praktische ZIP- Datei mit 458 Wörtern hilfreich sein.


@JPLemme: Ja, das sollte es - ich hätte es später hinzufügen sollen, da Atwood es so geschrieben hat. :)
HanClinto

"Club Penguin" fügt jeden Tag Hunderte von Einträgen zu seinem Obszönitätsfilter hinzu
Frank Farmer

6
Eine Wortgrenze Wrapper um Ihre regex Optionen würde das verhindern clbuttic Fehler
cjk

@ck: Nur wenn du dir keine Sorgen darüber machst, falsch geschriebene Wörter "F * ckkkk yo 'asssss" herauszufiltern :) Ich bin mir nicht sicher, ob ich meinen Trollen vertraue, dass sie eine sehr genaue Schreibweise haben.
HanClinto

1
Wenn Sie die "Fluffy White Bunny" -Geschichte aus dem Mund des sprichwörtlichen Pferdes hören
F. Randall Farmer

44

Ich weiß zwar, dass diese Frage ziemlich alt ist, aber es ist eine häufig vorkommende Frage ...

Es gibt sowohl einen Grund als auch einen eindeutigen Bedarf an Obszönitätsfiltern (siehe Wikipedia-Eintrag hier ), aber diese sind aus sehr unterschiedlichen Gründen oft nicht 100% genau. Kontext und Genauigkeit .

Es hängt (ganz) davon ab, was Sie erreichen wollen - im einfachsten Fall versuchen Sie wahrscheinlich, die " sieben Schimpfwörter " zu behandeln, und dann einige ... Einige Unternehmen müssen die grundlegendsten Schimpfwörter herausfiltern: grundlegend Schimpfwörter, URLs oder sogar persönliche Informationen usw., aber andere müssen die illegale Benennung von Konten verhindern (Xbox Live ist ein Beispiel) oder vieles mehr ...

Benutzergenerierte Inhalte enthalten nicht nur potenzielle Schimpfwörter, sondern auch anstößige Verweise auf:

  • Sexuelle Handlungen
  • Sexuelle Orientierung
  • Religion
  • Ethnizität
  • Etc...

Und möglicherweise in mehreren Sprachen. Shutterstock hat bisher grundlegende Schimpfwortlisten in 10 Sprachen entwickelt, aber es ist immer noch grundlegend und sehr stark auf ihre "Tagging" -Bedürfnisse ausgerichtet. Es gibt eine Reihe anderer Listen im Internet.

Ich bin mit der Antwort akzeptiert , dass es nicht eine definierte Wissenschaft ist und als Sprache ist eine sich ständig weiterentwickelnden Herausforderung , aber eine , wo eine 90% ige Erkennungsrate besser als 0% ist. Es hängt nur von Ihren Zielen ab - was Sie erreichen möchten, wie viel Unterstützung Sie haben und wie wichtig es ist, Schimpfwörter unterschiedlicher Art zu entfernen.

Beim Erstellen eines Filters müssen Sie die folgenden Elemente berücksichtigen und wie sie sich auf Ihr Projekt beziehen:

  • Wörter / Sätze
  • Akronyme (FOAD / LMFAO usw.)
  • False Positives (Wörter, Orte und Namen wie "Mishit", "Scunthorpe" und "Titsworth")
  • URLs (Pornoseiten sind ein offensichtliches Ziel)
  • Persönliche Informationen (E-Mail, Adresse, Telefon usw. - falls zutreffend)
  • Sprachauswahl (normalerweise standardmäßig Englisch)
  • Moderation (wie Sie, wenn überhaupt, mit benutzergenerierten Inhalten interagieren können und was Sie damit tun können)

Sie können leicht einen Obszönitätsfilter erstellen, der über 90% der Obszönitäten erfasst, aber Sie werden niemals 100% erreichen. Es ist einfach nicht möglich. Je näher Sie 100% kommen möchten, desto schwieriger wird es ... Nachdem ich in der Vergangenheit eine komplexe Profanity-Engine erstellt habe, die mehr als 500.000 Echtzeitnachrichten pro Tag verarbeitet, würde ich den folgenden Rat geben:

Ein grundlegender Filter würde Folgendes umfassen:

  • Erstellen einer Liste anwendbarer Obszönitäten
  • Entwicklung einer Methode zum Umgang mit Ableitungen von Obszönitäten

Ein mäßig komplexer Filer würde Folgendes beinhalten (zusätzlich zu einem Basisfilter):

  • Verwenden des komplexen Mustervergleichs für erweiterte Ableitungen (mit erweitertem regulären Ausdruck)
  • Umgang mit Leetspeak (l33t)
  • Umgang mit Fehlalarmen

Ein komplexer Filter würde eine Reihe von folgenden Faktoren umfassen (zusätzlich zu einem moderaten Filter):

  • Whitelists und Blacklists
  • Naive Bayes'sche Inferenzfilterung von Phrasen / Begriffen
  • Soundex- Funktionen (wo ein Wort wie ein anderes klingt)
  • Levenshtein Entfernung
  • Stemming
  • Menschliche Moderatoren helfen einer Filter-Engine dabei, anhand von Beispielen zu lernen oder wo Übereinstimmungen ohne Anleitung nicht genau genug sind (ein sich selbst / ständig verbesserndes System).
  • Vielleicht eine Art KI-Motor

28

Ich kenne keine guten Bibliotheken dafür, aber was auch immer Sie tun, stellen Sie sicher, dass Sie sich in die Richtung irren, Dinge durchzulassen. Ich habe mich mit Systemen befasst, die es mir nicht erlauben würden, "mpassell" als Benutzernamen zu verwenden, da es "ass" als Teilzeichenfolge enthält. Das ist eine großartige Möglichkeit, Benutzer zu entfremden!


17
oder "Cockpit" in einem Spiel mit fliegenden Raumschiffen zu verbieten
Shinhan

24

Während eines Vorstellungsgesprächs von mir hat der CTO der Firma, der mich interviewt hat, ein Wort- / Webspiel ausprobiert, das ich in Java geschrieben habe. Was war das erste Wort, das aus einer Wortliste des gesamten Oxford English Dictionary erraten wurde?

Natürlich das schlechteste Wort in der englischen Sprache.

Irgendwie bekam ich immer noch das Stellenangebot, aber dann habe ich eine Schimpfwortliste gefunden ( ähnlich wie diese ) und ein schnelles Skript geschrieben, um ein neues Wörterbuch ohne alle schlechten Wörter zu erstellen (ohne die Liste überhaupt ansehen zu müssen). .

Für Ihren speziellen Fall klingt der Vergleich der Suche mit echten Wörtern wie der Weg zu einer solchen Wortliste. Die alternativen Stile / Interpunktion erfordern etwas mehr Arbeit, aber ich bezweifle, dass Benutzer dies oft genug verwenden werden, um ein Problem zu sein.


8
Off Topic, aber was ist das schlechteste Wort? Ich habe es immer als das c-Wort oder das n-Wort angesehen, aber ich gehe davon aus, dass die Leute denken, das f-Wort sei
Jeff

2
"Ich bezweifle, dass Benutzer dies oft genug nutzen werden, um ein Problem zu sein." Halten Sie die Hoffnung am Leben. Sobald Benutzer über den Filter stolpern, werden sie nach Umgehungsmöglichkeiten suchen. Es könnte so einfach sein, wie Buchstaben durch Zahlen zu ersetzen, um Leerzeichen ungerade zu platzieren usw.).
BryanH

21

Ein Obszönitätsfilter-System wird niemals perfekt sein, selbst wenn der Programmierer überfordert ist und über alle nackten Entwicklungen auf dem Laufenden bleibt

Das heißt, jede Liste von "ungezogenen Wörtern" wird wahrscheinlich genauso gut funktionieren wie jede andere Liste, da das zugrunde liegende Problem das Sprachverständnis ist, das mit der aktuellen Technologie so gut wie unlösbar ist

Die einzige praktische Lösung ist also zweierlei:

  1. Seien Sie darauf vorbereitet, Ihr Wörterbuch regelmäßig zu aktualisieren
  2. Stellen Sie einen menschlichen Redakteur ein, um falsch positive (z. B. "clbuttic" statt "classic") und falsch negative (oops! verpasste!) zu korrigieren.

1
Erkennen Sie einfach das Wort mit Leerzeichen auf beiden Seiten, Punkt danach, Nein?
David D

1
H3ll kein Mann, das funktioniert nur für die trivialsten Fälle; Wir haben es hier mit Menschen zu tun, und sie sind ziemlich schlau :)
Steven A. Lowe

14

Die einzige Möglichkeit, anstößige Benutzereingaben zu verhindern, besteht darin, alle Benutzereingaben zu verhindern.

Wenn Sie darauf bestehen, Benutzereingaben zuzulassen, und Moderation benötigen, sollten Sie menschliche Moderatoren einbeziehen.



7

In Bezug auf Ihre Unterfrage "Trick the System" können Sie dies behandeln, indem Sie vor der Suche sowohl die Liste der "schlechten Wörter" als auch den vom Benutzer eingegebenen Text normalisieren. Verwenden Sie z. B. eine Reihe von regulären Ausdrücken (oder tr, wenn PHP es hat), um [z $ 5] in "s", [4 @] zu konvertieren. in "a" usw. , und vergleichen Sie dann die normalisierte "Bad Word" -Liste mit der normalisierten Text. Beachten Sie, dass die Normalisierung möglicherweise zu zusätzlichen Fehlalarmen führen kann, obwohl mir derzeit keine tatsächlichen Fälle einfallen.

Die größere Herausforderung besteht darin, etwas zu finden, mit dem die Leute "Der Stift ist mächtiger als das Schwert" zitieren können, während "Penis" blockiert werden.


14
Vergessen Sie nicht experten-exchange.com und pen-island.com; Diese Site-URLs enthielten einmal keine Bindestriche.
BryanH

7

Vorsicht vor Lokalisierungsproblemen: Was in einer Sprache ein Schimpfwort ist, kann in einer anderen Sprache ein ganz normales Wort sein.

Ein aktuelles Beispiel hierfür: ebay verwendet einen Wörterbuchansatz, um "schlechte Wörter" aus Rückmeldungen herauszufiltern. Wenn Sie versuchen, die deutsche Übersetzung von "das war eine perfekte Transaktion" einzugeben, lehnt ebay das Feedback aufgrund schlechter Worte ab.

Warum? Denn das deutsche Wort für "war" ist "Krieg" und "Krieg" steht im eBay-Wörterbuch für "schlechte Worte".

Achten Sie also auf Lokalisierungsprobleme.


6

Wenn Sie etwas wie Digg / Stackoverflow tun können, bei dem die Benutzer obszöne Inhalte herabstimmen / markieren können, tun Sie dies.

Dann müssen Sie nur noch die "ungezogenen" Benutzer überprüfen und sie blockieren, wenn sie gegen die Regeln verstoßen.


4

Ich bin etwas spät zur Party, aber ich habe eine Lösung, die für einige, die dies lesen, funktionieren könnte. Es ist in Javascript anstelle von PHP, aber es gibt einen gültigen Grund dafür.

Vollständige Offenlegung, ich habe dieses Plugin geschrieben ...

Sowieso.

Der Ansatz, den ich gewählt habe, besteht darin, einem Benutzer das "Opt-In" für seine Obszönitätsfilterung zu ermöglichen. Grundsätzlich ist Profanität standardmäßig erlaubt, aber wenn meine Benutzer sie nicht lesen möchten, müssen sie dies nicht tun. Dies hilft auch beim Problem "l33t sp3 @ k".

Das Konzept ist einfach Plugin, das vom Server injiziert wird, wenn das Konto des Clients die Profanitätsfilterung aktiviert. Von dort sind es nur ein paar einfache Zeilen, die die Schwüre auslöschen.

Hier ist die Demoseite
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, Passwort jedoch nicht


Hier ist eine jsFiddle-Arbeitsdemo , die diese Antwort begleitet.
Chase Florell

Sehr naiv. Nicht gefilterta$$
Winger Sendon

3
@ EmperorAiman ​​es war nie beabsichtigt, l33t speak herauszufiltern . Ich empfehle nicht, das zu filtern, da es ein verlorener Kampf ist. Der Profanitätsfilter, den ich veröffentlicht habe, wurde "erstellt, damit Benutzer sich für die Profanitätsfilterung" anmelden "können. Dies bedeutet, dass es am besten auf einer Site verwendet wird, die standardmäßig Profanität zulässt. Wenn Sie filtern möchten a$$, fügen Sie es der Filterliste hinzu.
Chase Florell

4

Ich habe 2200 schlechte Wörter in 12 Sprachen gesammelt: en, ar, cs, da, de, eo, es, fa, fi, fr, hi, hu, es, ja, ko, nl, nein, pl, pt, ru, sv , th, tlh, tr, zh.

Es stehen MySQL-Dump-, JSON-, XML- oder CSV-Optionen zur Verfügung.

https://github.com/turalus/openDB

Ich würde vorschlagen, dass Sie diese SQL in Ihrer Datenbank ausführen und jedes Mal überprüfen, wenn der Benutzer etwas eingibt.


2

Tu es nicht. Es führt nur zu Problemen. Eine persönliche Erfahrung, die ich mit Obszönitätsfiltern gemacht habe, ist die Zeit, in der ich von einem IRC-Kanal gekickt / gebannt wurde, weil ich erwähnt habe, dass ich "für ein paar Stunden über die Brücke nach Hancock gefahren bin" oder so etwas in diesem Sinne.


2

Ich stimme dem Beitrag von HanClinto weiter oben in dieser Diskussion zu. Ich verwende im Allgemeinen reguläre Ausdrücke, um den eingegebenen Text mit Zeichenfolgen abzugleichen. Und dies ist eine vergebliche Anstrengung, da Sie, wie Sie ursprünglich erwähnt haben, jede im Internet beliebte Trickform des Schreibens in Ihrer "blockierten" Liste explizit berücksichtigen müssen.

Nebenbei bemerkt, während andere über die Ethik der Zensur debattieren, muss ich zustimmen, dass im Internet eine Form erforderlich ist. Manche Leute veröffentlichen einfach gerne Vulgarität, weil sie für eine große Anzahl von Menschen sofort beleidigend sein kann und absolut keine Gedanken des Autors erfordert.

Danke für die Ideen.

HanClinto Regeln!


2

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 Folgendes 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 klug genug, um es herauszufinden (und dies scheint in Ordnung zu sein, wenn auch ineffizient).

Ich bin der Meinung, dass Sie sich irren sollten, wenn Sie Benutzern erlauben, sich zu registrieren, und Menschen verwenden, um Ihre Profanitätstabelle nach Bedarf zu filtern und zu ergänzen. Obwohl alles von den Kosten eines falschen Positivs (okay, als schlecht gekennzeichnet) im Vergleich zu einem falsch negativen (schlechtes Wort kommt durch) abhängt. Das sollte letztendlich bestimmen, wie aggressiv oder konservativ Sie in Ihrer Filterstrategie sind.

Ich wäre auch sehr vorsichtig, wenn Sie Platzhalter verwenden möchten, da diese sich manchmal belastender verhalten können, als Sie beabsichtigen.


1

Ehrlich gesagt würde ich sie die "Trick the System" -Wörter herausholen lassen und sie stattdessen verbieten, was nur ich bin. Es vereinfacht aber auch die Programmierung.

Was ich tun würde, ist einen Regex-Filter wie folgt zu implementieren: /[\s]dooby (doo?)[\s]/ioder das Wort wird anderen vorangestellt , /[\s]doob(er|ed|est)[\s]/. Diese würden das Filtern von Wörtern wie "assuaged" verhindern, was durchaus gültig ist, aber auch die Kenntnis der anderen Varianten und die Aktualisierung des eigentlichen Filters erfordern, wenn Sie einen neuen lernen. Natürlich sind dies alles Beispiele, aber Sie müssten selbst entscheiden, wie Sie es tun möchten.

Ich werde nicht alle Wörter eingeben, die ich kenne, nicht, wenn ich sie nicht wirklich wissen möchte.


1

Ich bin mit der Sinnlosigkeit des Themas einverstanden, aber wenn Sie einen Filter benötigen, schauen Sie sich Nings Buchsbaum an :

Boxwood ist eine PHP-Erweiterung zum schnellen Ersetzen mehrerer Wörter in einem Textstück. Es unterstützt Matching ohne Berücksichtigung der Groß- und Kleinschreibung. Es erfordert, dass der Text, mit dem es arbeitet, als UTF-8 codiert wird.

Weitere Informationen finden Sie auch in diesem Blogbeitrag:

Mit Boxwood können Sie die Liste der Suchbegriffe beliebig lang gestalten. Der Such- und Ersetzungsalgorithmus wird nicht langsamer, wenn mehr Wörter in der Liste der zu suchenden Wörter enthalten sind. Es funktioniert, indem Sie einen Versuch aller Suchbegriffe erstellen und dann Ihren Betreff-Text nur einmal scannen, Elemente des Verses durchgehen und sie mit Zeichen in Ihrem Text vergleichen. Es unterstützt US-ASCII und UTF-8, Matching zwischen Groß- und Kleinschreibung oder ohne Berücksichtigung der Groß- und Kleinschreibung, und verfügt über eine englischzentrierte Logik zur Überprüfung der Wortgrenzen.


1

Ich kam zu dem Schluss, dass wir 3 Hauptkomponenten benötigen, um einen guten Profanitätsfilter zu erstellen, oder zumindest ist es das, was ich tun werde. Diese sind sie:

  1. Der Filter: Ein Hintergrunddienst, der anhand einer schwarzen Liste, eines Wörterbuchs oder Ähnlichem überprüft.
  2. Anonymer Account nicht zulassen
  3. Missbrauch melden

Ein Bonus ist es, diejenigen zu belohnen, die mit genauen Missbrauchsreportern beitragen und den Täter bestrafen, z. B. ihre Konten sperren.


1

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

  • Unterstützt viele Lokalisierungen
  • Sie aktualisieren die Datenbank ständig, sodass ich nicht mit den neuesten Slangs oder Sprachen Schritt halten muss (Wartungsproblem).
  • Wenn es eine hohe Wahrscheinlichkeit gibt (dh 90% oder mehr), können Sie dies einfach pragmatisch ablehnen
  • Sie können nach Kategorien suchen, die eine Flagge verursachen, die möglicherweise profan ist oder nicht, und Sie können sie von jemandem überprüfen lassen, um zu lehren, dass sie profan ist oder nicht.

Für meine Bedürfnisse war / ist es ein öffentlich zugänglicher kommerzieller Dienst (OK, Videospiele), bei dem andere Benutzer den Benutzernamen sehen können / werden, aber das Design erfordert, dass der Profanitätsfilter durchlaufen werden muss, um einen anstößigen Benutzernamen abzulehnen. Der traurige Teil dabei ist, dass das klassische "clbuttic" -Problem höchstwahrscheinlich auftreten wird, da Benutzernamen normalerweise ein einzelnes Wort (bis zu N Zeichen) aus manchmal mehreren verketteten Wörtern sind ... Auch hier kennzeichnet der kognitive Dienst von Microsoft "Assist" nicht als Text. HasProfanity = true, kennzeichnet jedoch möglicherweise eine der Kategorien als wahrscheinlich hoch.

Wie das OP fragt, was ist mit "a $$"? Hier ist ein Ergebnis, als ich es durch den Filter geleitet habe: Geben Sie hier die Bildbeschreibung einWie Sie sehen können, hat es festgestellt, dass es nicht profan ist, aber es hat eine hohe Wahrscheinlichkeit, dass es dies ist, und wird daher als Empfehlungen gekennzeichnet der Überprüfung (menschliche Interaktionen).

Wenn die Wahrscheinlichkeit hoch ist, kann ich entweder "Es tut mir leid, dieser Name ist bereits vergeben" zurückgeben (auch wenn dies nicht der Fall ist), damit es für Personen gegen Zensur weniger anstößig ist oder so, wenn wir nicht wollen Um die Überprüfung durch den Menschen zu integrieren oder zurückzugeben "Ihr Benutzername wurde der Live-Betriebsabteilung mitgeteilt, können Sie warten, bis Ihr Benutzername überprüft und genehmigt wurde, oder einen anderen Benutzernamen auswählen". Oder Wasauchimmer...

Übrigens sind die Kosten / der Preis für diesen Service für meinen Zweck recht niedrig (wie oft wird der Benutzername geändert?), Aber auch für OP erfordert das Design möglicherweise intensivere Abfragen und ist möglicherweise nicht ideal zum Bezahlen / Abonnieren ML-Dienste oder können keine menschliche Überprüfung / Interaktion haben. Es hängt alles vom Design ab ... Aber wenn das Design der Rechnung entspricht, kann dies möglicherweise die Lösung von OP sein.

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


-2

Obszönitätsfilter sind eine schlechte Idee. Der Grund ist, dass Sie nicht jedes Schimpfwort fangen können. Wenn Sie es versuchen, erhalten Sie falsch positive Ergebnisse.

Wörter fangen

Sagen wir einfach, Sie möchten das F-Wort fangen. Einfach richtig? Okay, lass uns nachsehen.

Sie können eine Zeichenfolge durchlaufen, um "fuck" zu finden. Leider betrügen die Leute heutzutage Filter. Der Obszönitätsfilter hat "Fuk" nicht aufgenommen.

Man kann versuchen, nach mehreren Schreibweisen und Varianten des Wortes zu suchen, aber das verlangsamt die Leistung Ihres Codes. Um das F-Wort zu fangen, müssen Sie nach "fuc", "Fuc", "fuk", "Fuk", "F ***" usw. suchen. Und die Liste geht weiter und weiter.

Unschuld vermeiden

Okay, wie wäre es, wenn Sie die Groß- und Kleinschreibung nicht berücksichtigen und Leerzeichen ignorieren, damit "F u C k" abgefangen wird? Das mag nach einer guten Idee klingen, aber jemand kann den Profanitätsfilter mit "FUCK" einfach umgehen.

Sie ignorieren die Interpunktion.

Das ist ein echtes Problem, da ein Satz wie " Hell o, there!" wird als "Hölle" und "Wh ass up?" nimmt als "Arsch" auf.

Und es gibt eine Reihe von Wörtern, die Sie aus dem Filter ausschließen müssen, z. B. "Cons tit ution“ , weil es „tit“ drin.

Menschen können auch Ersatzwörter wie "Frack" verwenden. Blockierst du das auch? Was ist mit "Stift ist" für "Penis"? Ihr Programm verfügt nicht über künstliche Intelligenz, um festzustellen, ob die Zeichenfolge gut oder schlecht ist.

Verwenden Sie keine Obszönitätsfilter. Sie sind schwer zu entwickeln und so langsam wie ein Kriechen.


2
-1 beantwortet keine OP-Frage und ist meistens ein Meinungskommentar. Es gibt viele gültige Anwendungsfälle für dieses Dienstprogramm. Zum Beispiel das Bereinigen des Quellcodes vor einem Audit, damit sich das Unternehmen nicht schämt.
Davidjmcclelland

-3

Tu es nicht.

Weil:

  • Clbuttic
  • Obszönität ist nicht OMG EVIL
  • Obszönitäten können nicht effektiv definiert werden
  • Die meisten Menschen schätzen es höchstwahrscheinlich nicht, vor Obszönitäten "geschützt" zu sein

Bearbeiten: Obwohl ich dem Kommentator zustimme, der sagte, "Zensur ist falsch", ist dies nicht die Natur dieser Antwort.


90
10 Upvotes für diese Nichtantwort? Als ob jemand, der Obszönitäten filtern will, ein moralisierender Halbwitz sein muss? Guter Kummer. Dies ist eine gültige Frage, und snarky Drive-by-Antworten sollten nicht belohnt werden. -1.
Kluge

12
@Kludge: Du bist der einzige, der "moralisierenden halben Witz" gesagt hat, tatsächlich habe ich nichts über die moralische Natur der Implementierung eines Obszönitätsfilters gesagt. Mitch spricht einen Teil des Grundes an, warum ich "nicht" gesagt habe, und es ist kein snarky Drive-by. Manchmal ist "nicht" die richtige Antwort auf "wie mache ich ...?" [Fortsetzung]
Augenlidlosigkeit

2
@eyelidlessness: Vielleicht hast du recht, dass ich zu viel in deine Einzelwortantwort gelesen habe. Aber da Sie nicht näher darauf eingegangen sind, konnte ich nicht sagen, ob Ihre Einwände aus moralischen oder technischen Gründen waren. Ich gebe zu, dass ich es leid bin, "Zensur in irgendeiner Form ist schlecht" zu kommentieren.
Kluge

5
-1. "Nicht" ist keine gültige Antwort, unabhängig von moralischen oder technischen Fragen. Es gibt viele Fälle, in denen es durchaus angebracht ist, Inhalte nach der Art des Inhalts zu filtern. Stellen Sie sich eine E-Commerce-Website vor, auf der Damenunterwäsche verkauft und die Funktion "Bewertungen" angeboten wird. Wollen Sie wirklich, dass vorpubertäre Jungen Ihre Website mit Müll verschmutzen? Natürlich nicht. Und vielleicht ist es zu umständlich, ein menschliches Genehmigungsverfahren durchzuführen. Ein einfacher Filter, um Bewertungen mit Müll zu verweigern, ist eine gute Sache.
pspahn

3
@pspahn, "nicht" ist die richtige Antwort auf jede Frage, die nach einer Lösung für das falsche Problem fragt. Es gibt sicherlich gültige Fälle, in denen Inhalte moderiert werden sollten, aber ein "Obszönitätsfilter" ist es nicht.
Augenlidlosigkeit
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.