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. :) :)
quelle
Antworten:
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:
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.
quelle
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:
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:
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:
Ein mäßig komplexer Filer würde Folgendes beinhalten (zusätzlich zu einem Basisfilter):
Ein komplexer Filter würde eine Reihe von folgenden Faktoren umfassen (zusätzlich zu einem moderaten Filter):
quelle
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!
quelle
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.
quelle
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:
quelle
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.
quelle
Schauen Sie sich den Profanity Filter Web Service von CDYNE an
URL testen
quelle
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.
quelle
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.
quelle
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.
quelle
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.
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 jqueryPlugin, 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/
Ergebnis
quelle
a$$
a$$
, fügen Sie es der Filterliste hinzu.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.
quelle
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.
quelle
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!
quelle
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:
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.
quelle
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]/i
oder 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.
quelle
Ich bin mit der Sinnlosigkeit des Themas einverstanden, aber wenn Sie einen Filter benötigen, schauen Sie sich Nings Buchsbaum an :
Weitere Informationen finden Sie auch in diesem Blogbeitrag:
quelle
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:
Ein Bonus ist es, diejenigen zu belohnen, die mit genauen Missbrauchsreportern beitragen und den Täter bestrafen, z. B. ihre Konten sperren.
quelle
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:
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: Wie 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.
quelle
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.
quelle
Tu es nicht.
Weil:
Bearbeiten: Obwohl ich dem Kommentator zustimme, der sagte, "Zensur ist falsch", ist dies nicht die Natur dieser Antwort.
quelle