Jak wdrożyć dobry filtr wulgaryzmów?

207

Wielu z nas musi radzić sobie z wprowadzaniem danych przez użytkowników, wyszukiwanymi zapytaniami i sytuacjami, w których tekst wejściowy może potencjalnie zawierać wulgaryzmy lub niepożądany język. Często trzeba to odfiltrować.

Gdzie można znaleźć dobrą listę przekleństw w różnych językach i dialektach?

Czy są dostępne interfejsy API dla źródeł, które zawierają dobre listy? A może interfejs API, który po prostu mówi „tak, to jest czyste” lub „nie, to jest brudne” z niektórymi parametrami?

Jakie są dobre metody łapania ludzi próbujących oszukać system, na przykład $$, azz lub a55?

Punkty bonusowe, jeśli oferujesz rozwiązania dla PHP. :)

Edycja: Odpowiedzi na odpowiedzi, które mówią, po prostu unikaj problemu programowego:

Myślę, że istnieje miejsce na tego rodzaju filtr, gdy na przykład użytkownik może skorzystać z publicznego wyszukiwania obrazów, aby znaleźć zdjęcia, które zostaną dodane do wrażliwej puli społeczności. Jeśli będą mogli wyszukać „penisa”, prawdopodobnie uzyskają wiele zdjęć, tak. Jeśli nie chcemy tego zdjęcia, to zapobieganie temu słowu jako wyszukiwanemu hasłu jest dobrym gatekeeperem, choć nie jest to niezawodna metoda. Uzyskanie listy słów w pierwszej kolejności to prawdziwe pytanie.

Naprawdę mam na myśli sposób, w jaki sposób rozszyfrowanie jednego tokena jest brudne lub nie, a następnie po prostu go nie dopuszczam. Nie zawracałbym sobie głowy zapobieganiem takim sentymentom, jak całkowicie zabawne odniesienie do „żyrafy z długą szyją”. Nic tam nie możesz zrobić. :)

Ben Throop
źródło
12
Szkoda, że ​​wszystkie najważniejsze odpowiedzi to egzystencjalne i defetystyczne odmiany od wyzwania programistycznego. Ponieważ usługi obliczeniowe „cyborga”, takie jak Mechanical Turk, zyskują na popularności, a prawie całe oprogramowanie staje się społecznościowe, ważniejsze niż kiedykolwiek jest heurystyka w celu oznaczania treści flagą i zwrócenia jej uwagi moderatora!
JasonSmith
10
Uważaj na kontekst językowy, szczególnie jeśli korzystasz z i18n. Kiedyś próbowałem założyć Grupę Google na kurs, który prowadziłem pod nazwą „Sanal ortamda görselleştirme”, który jest po turecku dla „Wizualizacji w mediach wirtualnych”. Google był na tyle głupi, by go odrzucić, ponieważ tytuł zawierał słowo „anal” . Sanal [tr] = Virtual [en] i Google bezwstydnie oskarżyli mnie o wulgaryzmy! : D Proszę, nie pozwól, aby zdarzyły się takie dziwne rzeczy.
edgerunner,
Co powiesz na szukanie tego słowa po hiszpańsku ? Możesz w ten sposób obejść filtr obrazów Google (jeśli jesteś zlokalizowany w innym języku).
new123456
Inną sugestią byłoby NIE zakazanie tych słów, ale rejestracja użytkowników, którzy ich używają. Jeśli użytkownik / adres IP uzyska więcej niż 2, 3 lub cokolwiek chcesz, zablokuj tę osobę. Nie jest też niezawodny, ale myślę, że o wiele bardziej niewygodne jest blokowanie i zmiana użytkownika / adresu IP / obu niż pisanie „puszystego białego króliczka” zamiast „cipki”. Część użytkowników nie wie, Z JAKICH słów lub wyrażeń nie mogą korzystać, więc nie mogą tak łatwo odgadnąć różnych złych słów, gdy zostają zbanowani.
Francisco Presencia
1
Filtry wulgaryzmów to zły pomysł. Bardzo trudno jest odróżnić kogoś, kto próbuje oszukać system („Fudge you!”) Od kogoś, kto słusznie mówi o czymś całkowicie odpowiednim („Lubię krówki czekoladowe.”)
clickbait

Odpowiedzi:

176

Filtry nieprzyzwoitości: zły pomysł lub niewiarygodnie współżycie ze złym pomysłem?

Nie można też zapomnieć The Untold History of Toontown's SpeedChat , w którym nawet użycie „bezpiecznej białej listy” spowodowało, że 14-latek szybko ominął ją: „Chcę wcisnąć moją żyrafę z długą szyją do twojego puszystego białego króliczka . ”

Podsumowując: Ostatecznie, dla każdego systemu, który wdrażasz, absolutnie nie ma substytutu dla ludzkiej oceny (czy to rówieśniczej czy innej). Zaimplementuj podstawowe narzędzie do pozbycia się przejeżdżających, ale dla określonego trolla absolutnie musisz mieć podejście nie oparte na algorytmach.

Pomocny jest także system, który usuwa anonimowość i wprowadza odpowiedzialność (coś, co dobrze robi przepełnienie stosu), szczególnie w celu walki z PREZENTEM Johna Gabriela

Pytałeś także, gdzie możesz uzyskać listy wulgaryzmów na początek - jeden projekt typu open source do sprawdzenia to Dansguardian - sprawdź kod źródłowy ich domyślnych list wulgaryzmów. Istnieje również dodatkowa lista fraz stron trzecich , którą można pobrać dla serwera proxy, która może być pomocnym punktem zbierania.

Edytuj w odpowiedzi edytuj pytanie: Dziękujemy za wyjaśnienie, co próbujesz zrobić. W takim przypadku, jeśli próbujesz wykonać prosty filtr słów, możesz to zrobić na dwa sposoby. Jednym z nich jest utworzenie jednego długiego wyrażenia regularnego ze wszystkimi zakazanymi frazami, które chcesz cenzurować, i po prostu wykonaj wyszukiwanie wyrażenia regularnego za jego pomocą. Wyrażenie regularne takie jak:

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

i uruchom go na swoim ciągu wejściowym za pomocą preg_match (), aby hurtowo przetestować działanie,

lub preg_replace (), aby je usunąć.

Możesz również załadować te funkcje tablicami zamiast pojedynczego długiego wyrażenia regularnego, a dla długich list słów może być łatwiejsze do zarządzania. Zobacz preg_replace (), aby znaleźć kilka dobrych przykładów elastycznego używania tablic.

Aby uzyskać dodatkowe przykłady programowania w PHP, zobacz tę stronę dla nieco bardziej zaawansowanej ogólnej klasy do filtrowania słów, która * znajduje się poza środkowymi literami od cenzurowanych słów, oraz w poprzednim pytaniu dotyczącym przepełnienia stosu, które również zawiera przykład PHP (główną cenną częścią jest oparte na SQL podejście do filtrowanych słów - kompensator leet-speak może być pominięty, jeśli okaże się to niepotrzebne).

Dodałeś także: „ Pierwsze pytanie to prawdziwe pytanie. ” - oprócz niektórych poprzednich linków Dansgaurdian, przydatny może być ten przydatny plik .zip zawierający 458 słów.

HanClinto
źródło
@JPLemme: Tak, powinien - powinienem był dodać [sic], ponieważ tak pisał Atwood. :)
HanClinto,
„Club Penguin” dodaje setki wpisów do ich filtru wulgaryzmów codziennie : raphkoster.com/2008/05/09/...
Frank Farmer
6
Słowo granica wrapper wokół regex opcji uniemożliwiałoby clbuttic błąd
CJK
@ck: Tylko jeśli nie martwisz się możliwością odfiltrowania błędnie napisanych słów „F * ckkkk yo 'asssss” :) Nie jestem pewien, czy ufam moim trollom, że mają bardzo precyzyjną pisownię.
HanClinto
1
Jeśli chcesz usłyszeć historię „Puszystego białego królika” z przysłowiowego pyska konia, jest to teraz odcinek podcastu: socialmediaclarity.tumblr.com/post/70499341079/…
F. Randall Farmer,
44

Chociaż wiem, że to pytanie jest dość stare, ale często pojawia się pytanie ...

Istnieje zarówno powód, jak i wyraźna potrzeba filtrów wulgaryzmów (patrz wpis w Wikipedii tutaj ), ale często nie są one w 100% dokładne z bardzo różnych powodów; Kontekst i dokładność .

To zależy (w całości) od tego, co próbujesz osiągnąć - w najprostszym przypadku prawdopodobnie próbujesz opisać „ siedem nieprzyzwoitych słów ”, a potem kilka… Niektóre firmy muszą filtrować najbardziej podstawowe wulgaryzmy: podstawowe przeklinać słowa, adresy URL, a nawet dane osobowe itd., ale inni muszą zapobiegać nielegalnemu nazywaniu konta (przykładem jest Xbox Live) lub znacznie więcej ...

Treści generowane przez użytkowników nie tylko zawierają potencjalne przekleństwa, ale mogą również zawierać obraźliwe odniesienia do:

  • Akty seksualne
  • Orientacja seksualna
  • Religia
  • Pochodzenie etniczne
  • Itp...

I potencjalnie w wielu językach. Shutterstock opracował do tej pory podstawowe listy nieczytelnych słów w 10 językach, ale nadal jest on prosty i bardzo zorientowany na potrzeby związane z tagowaniem. Istnieje wiele innych list dostępnych w sieci.

Zgadzam się z przyjętą odpowiedzią, że nie jest to nauka naukowa, a ponieważ język jest ciągle ewoluującym wyzwaniem, ale tym, w którym 90% wskaźnik połowu jest lepszy niż 0%. Zależy to wyłącznie od twoich celów - tego, co próbujesz osiągnąć, poziomu wsparcia i tego, jak ważne jest usunięcie wulgaryzmów różnego rodzaju.

Budując filtr, należy wziąć pod uwagę następujące elementy i ich związek z projektem:

  • Słowa / frazy
  • Akronimy (FOAD / LMFAO itp.)
  • Fałszywe alarmy (słowa, miejsca i nazwy, takie jak „mishit”, „scunthorpe” i „titsworth”)
  • Adresy URL (strony porno są oczywistym celem)
  • Dane osobowe (e-mail, adres, telefon itp. - jeśli dotyczy)
  • Wybór języka (zazwyczaj angielski domyślnie)
  • Moderacja (w jaki sposób, jeśli w ogóle, możesz wchodzić w interakcje z treściami generowanymi przez użytkowników i co możesz z tym zrobić)

Możesz łatwo zbudować filtr wulgaryzmów, który przechwytuje ponad 90% wulgaryzmów, ale nigdy nie osiągniesz 100%. To po prostu niemożliwe. Im bardziej chcesz osiągnąć 100%, tym trudniej się robi ... Po zbudowaniu w przeszłości złożonego silnika wulgaryzmów, który obsługiwał ponad 500 000 wiadomości w czasie rzeczywistym dziennie, oferuję następujące porady:

Podstawowy filtr obejmowałby:

  • Zbudowanie listy obowiązujących wulgaryzmów
  • Opracowanie metody radzenia sobie z pochodnymi wulgaryzmów

Umiarkowanie skomplikowany filtr wymagałby (oprócz podstawowego filtra):

  • Korzystanie ze złożonego dopasowania wzorca do radzenia sobie z rozszerzonymi pochodnymi (przy użyciu zaawansowanego wyrażenia regularnego)
  • Radzenie sobie z Leetspeak ( L33T )
  • Radzenie sobie z fałszywymi pozytywami

Filtr złożony wymagałby szeregu następujących czynności (oprócz filtra umiarkowanego):

  • Białe i czarne listy
  • Naiwne bayesowskie wnioskowanie filtrujące frazy / terminy
  • Funkcje Soundex (gdzie słowo brzmi jak inne)
  • Odległość Levenshteina
  • Przybitka
  • Ludzcy moderatorzy, którzy pomagają w kierowaniu silnikiem filtrującym, aby uczyć się na przykładach lub w przypadku, gdy dopasowania nie są wystarczająco dokładne bez wskazówek (system samokontroli / ciągłego ulepszania)
  • Być może jakiś silnik AI
nickhar
źródło
28

Nie znam na to żadnych dobrych bibliotek, ale cokolwiek zrobisz, upewnij się, że popełnisz błąd w kierunku przepuszczania rzeczy. Miałem do czynienia z systemami, które nie pozwoliłyby mi użyć „mpassell” jako nazwy użytkownika, ponieważ zawiera on „tyłek” jako podciąg. To świetny sposób na wyobcowanie użytkowników!

Matt Passell
źródło
17
lub zakazanie „kokpitu” w grze latających statków kosmicznych
Shinhan
24

Podczas mojej rozmowy o pracę firma CTO, która przeprowadzała ze mną wywiad, wypróbowała grę słowną / internetową napisaną w Javie. Jakie było pierwsze słowo, które można odgadnąć z listy słów w całym słowniku Oxford English?

Oczywiście najbardziej obrzydliwe słowo w języku angielskim.

Jakoś wciąż dostałem ofertę pracy, ale potem wyśledziłem listę wulgaryzmów ( podobnie jak ta ) i napisałem szybki skrypt do wygenerowania nowego słownika bez wszystkich złych słów (nawet bez konieczności patrzenia na listę) .

W twoim szczególnym przypadku myślę, że porównywanie wyszukiwania z prawdziwymi słowami brzmi jak droga z taką listą słów. Alternatywne style / znaki interpunkcyjne wymagają nieco więcej pracy, ale wątpię, aby użytkownicy używali tego wystarczająco często, aby stanowić problem.

Mateusz
źródło
8
Nie na temat, ale jakie jest najbardziej obrzydliwe słowo? Zawsze uważałem to za słowo c lub n, ale zakładam, że ludzie myślą, że słowo f to
Jeff
2
„Wątpię, aby użytkownicy używali tego wystarczająco często, aby stanowić problem” . Gdy użytkownicy natkną się na filtr, będą pracować nad znalezieniem sposobów na obejście. Może to być tak proste, jak zamiana liter na cyfry na nieparzyste rozmieszczenie spacji itp.).
BryanH
21

system filtrowania wulgaryzmów nigdy nie będzie idealny, nawet jeśli programista jest pewny siebie i dotrzymuje kroku nagim zmianom

powiedziano jednak, że każda lista „niegrzecznych słów” będzie działać tak samo dobrze, jak każda inna lista, ponieważ podstawowym problemem jest zrozumienie języka, które jest prawie trudne do rozwiązania przy obecnej technologii

więc jedyne praktyczne rozwiązanie jest dwojakie:

  1. bądź przygotowany na częste aktualizowanie słownika
  2. zatrudnić ludzkiego redaktora, aby poprawić fałszywe pozytywy (np. „clbuttic” zamiast „classic”) i fałszywe negatywy (oops! przegapiłem jeden!)
Steven A. Lowe
źródło
1
Po prostu wykryj słowo ze spacjami po obu stronach, kropka po, Nie?
David D
1
H3ll żaden człowiek, który działa tylko w najbardziej trywialnych przypadkach; mamy tu do czynienia z ludźmi, a oni są całkiem sprytni :)
Steven A. Lowe
14

Jedynym sposobem uniknięcia obraźliwego wprowadzania danych przez użytkownika jest uniemożliwienie wprowadzania danych przez wszystkich użytkowników.

Jeśli nalegasz na umożliwienie wkładu użytkownika i potrzebujesz moderacji, włącz ludzi moderujących.

Axel
źródło
7

Jeśli chodzi o zapytanie „podstępny system”, możesz sobie z tym poradzić, normalizując zarówno listę „złych słów”, jak i wprowadzony przez użytkownika tekst przed rozpoczęciem wyszukiwania. np. użyj serii wyrażeń regularnych (lub tr, jeśli PHP je posiada), aby przekonwertować [z $ 5] na „s”, [4 @] na „a” itd., a następnie porównaj znormalizowaną listę „złych słów” ze znormalizowaną tekst. Zauważ, że normalizacja może potencjalnie prowadzić do dodatkowych fałszywych trafień, chociaż w tej chwili nie mogę wymyślić żadnych rzeczywistych przypadków.

Największym wyzwaniem jest wymyślenie czegoś, co pozwoli ludziom cytować „ Pióro jest potężniejsze od miecza”, blokując jednocześnie „penisy”.

Dave Sherohman
źródło
14
Nie zapomnij ekspertów-exchange.com i pen-island.com; te adresy URL witryny kiedyś nie zawierały łączników.
BryanH
7

Uważaj na problemy z lokalizacją: to, co jest przekleństwem w jednym języku, może być zupełnie normalnym słowem w innym.

Jeden obecny przykład tego: eBay używa słownika do filtrowania „złych słów” z informacji zwrotnych. Jeśli spróbujesz wpisać niemieckie tłumaczenie „to była idealna transakcja” („das war eine perfekte Transaktion”), ebay odrzuci informację zwrotną z powodu złych słów.

Czemu? Ponieważ niemieckie słowo „był” to „wojna”, a „wojna” znajduje się w słowniku „złych słów” w serwisie eBay.

Uważaj więc na problemy z lokalizacją.

Sam
źródło
6

Jeśli możesz zrobić coś takiego jak Digg / Stackoverflow, w którym użytkownicy mogą głosować / oznaczać obsceniczne treści ... zrób to.

Następnie wszystko, co musisz zrobić, to przejrzeć „niegrzecznych” użytkowników i zablokować ich, jeśli złamią zasady.

scunliffe
źródło
4

Jestem trochę spóźniony na przyjęcie, ale mam rozwiązanie, które może działać dla niektórych, którzy to czytają. Jest w javascript zamiast w php, ale istnieje uzasadniony powód.

Pełne ujawnienie, napisałem tę wtyczkę ...

Tak czy inaczej.

Podejście, które zastosowałem, polega na zezwoleniu użytkownikowi na „opt-in” na filtrowanie wulgaryzmów. Zasadniczo wulgaryzmy będą domyślnie dozwolone, ale jeśli moi użytkownicy nie chcą tego czytać, nie muszą. Pomaga to również w rozwiązaniu problemu „l33t sp3 @ k”.

Pomysł jest prosty wtyczka, która zostaje wstrzyknięta przez serwer, jeśli konto klienta umożliwia filtrowanie wulgaryzmów. Stamtąd jest tylko kilka prostych linii, które usuwają przekleństwa.

Oto strona demonstracyjna
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>

wynik

*** nie powiedzie się, ale hasło nie

Chase Florell
źródło
Oto działające demo jsFiddle, które towarzyszy tej odpowiedzi.
Chase Florell,
Bardzo naiwny. Nie filtrowanoa$$
Winger Sendon
3
@EmperorAiman ​​nigdy nie miał na celu odfiltrowania mowy . Nie polecam tego filtrować, ponieważ jest to przegrana bitwa. Filtr wulgaryzmów, który zamieściłem, jest „zbudowany, aby umożliwić użytkownikom„ włączenie ”filtrowania wulgaryzmów”. co oznacza, że ​​najlepiej używać go w witrynie, która domyślnie dopuszcza wulgaryzmy. Jeśli chcesz filtrować a$$, dodajesz go do listy filtrów.
Chase Florell
4

Zebrałem 2200 złych słów w 12 językach: 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.

Dostępne są opcje zrzutu MySQL, JSON, XML lub CSV.

https://github.com/turalus/openDB

Sugeruję, abyś wykonał ten SQL w swojej bazie danych i sprawdzał za każdym razem, gdy użytkownik coś wprowadzi.

Tural Ali
źródło
2

Nie rób To tylko prowadzi do problemów. Jednym z moich osobistych doświadczeń z filtrami wulgaryzmów jest czas, w którym zostałem wyrzucony / zbanowany z kanału IRC za to, że wspomniałem, że „jechałem przez kilka godzin mostem do Hancock” lub coś w tym rodzaju.

Adam Jaskiewicz
źródło
2

Zgadzam się z postem HanClinto wyżej w tej dyskusji. Zazwyczaj używam wyrażeń regularnych do dopasowywania tekstu wejściowego. I to jest próżny wysiłek, ponieważ, jak pierwotnie wspomniałeś, musisz jawnie uwzględnić każdą sztuczkę pisania popularną w sieci na liście „zablokowanych”.

Na marginesie, podczas gdy inni debatują nad etyką cenzury, muszę zgodzić się, że jakaś forma jest konieczna w Internecie. Niektórzy ludzie po prostu lubią publikować wulgaryzmy, ponieważ mogą być natychmiast obraźliwe dla dużej grupy ludzi i nie wymagają absolutnie żadnej refleksji ze strony autora.

Dziękuję za pomysły.

HanClinto rządzi!


źródło
2

Gdy masz już dobrą tabelę MYSQL zawierającą złe słowa, które chcesz filtrować (zacząłem od jednego z łączy w tym wątku), możesz zrobić coś takiego:

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

Jestem pewien, że istnieje bardziej skuteczny sposób na wykonanie wszystkich tych zamian, ale nie jestem wystarczająco inteligentny, aby to rozgryźć (i wydaje się, że działa to dobrze, choć nieefektywnie).

Uważam, że powinieneś popełnić błąd, pozwalając użytkownikom rejestrować się i wykorzystywać ludzi do filtrowania i dodawania do tabeli wulgaryzmów zgodnie z wymaganiami. Chociaż wszystko zależy od kosztu fałszywie dodatniego (dobre słowo oznaczone jako złe) w porównaniu z fałszywym ujemnym (złe słowo dostaje się). To powinno ostatecznie decydować o tym, jak agresywny lub konserwatywny jesteś w swojej strategii filtrowania.

Byłbym również bardzo ostrożny, jeśli chcesz używać symboli wieloznacznych, ponieważ czasami mogą one zachowywać się bardziej uciążliwie, niż planujesz.

Andrzej
źródło
1

Szczerze mówiąc, pozwoliłbym im wydobyć słowa „oszukuj system” i zamiast tego je zbanować, a to tylko ja. Ale upraszcza także programowanie.

Chciałbym zaimplementować taki filtr wyrażenia regularnego: /[\s]dooby (doo?)[\s]/iw przeciwnym razie słowo jest poprzedzone innymi,/[\s]doob(er|ed|est)[\s]/ . Uniemożliwiłyby one filtrowanie słów takich jak assuaged, co jest całkowicie poprawne, ale wymagałyby również znajomości innych wariantów i aktualizacji rzeczywistego filtra, jeśli nauczysz się nowego. Oczywiście są to wszystkie przykłady, ale musisz sam zdecydować, jak to zrobić.

Nie zamierzam wpisywać wszystkich znanych mi słów, nie kiedy nie chcę ich znać.

Robert K.
źródło
1

Zgadzam się z daremnością tematu, ale jeśli musisz mieć filtr, sprawdź bukszpan Ninga :

Boxwood to rozszerzenie PHP do szybkiego zastępowania wielu słów w jednym tekście. Obsługuje rozróżnianie wielkości liter i rozróżnianie wielkości liter. Wymaga, aby tekst, na którym działa, był zakodowany jako UTF-8.

Zobacz także ten post na blogu, aby uzyskać więcej informacji:

W Boxwood możesz mieć dowolną długość wyszukiwanych haseł - algorytm wyszukiwania i zamiany nie zwalnia, gdy więcej słów na liście słów do wyszukania. Działa, tworząc zestaw wszystkich wyszukiwanych terminów, a następnie skanuje tekst tematu tylko raz, schodząc po elementach i porównując je ze znakami w tekście. Obsługuje US-ASCII i UTF-8, rozróżnianie wielkości liter lub niewrażliwe, i ma pewną logikę sprawdzania granicy słów w języku angielskim.

Gordon
źródło
1

Doszedłem do wniosku, że aby stworzyć dobry filtr wulgaryzmów, potrzebujemy 3 głównych składników, a przynajmniej tak zamierzam. Są to:

  1. Filtr: usługa działająca w tle, która weryfikuje na czarnej liście, w słowniku lub czegoś podobnego.
  2. Nie zezwalaj na anonimowe konto
  3. Zgłoś nadużycie

Premią będzie nagradzanie w jakiś sposób tych, którzy przyczyniają się do dokładnego zgłaszania nadużyć i karanie sprawcy, np. Zawieszenie konta.

Jaider
źródło
1

Również w późnej fazie gry, ale przeprowadziłem kilka badań i natknąłem się tutaj. Jak wspomnieli inni, jest to prawie niemożliwe, jeśli zostanie zautomatyzowane, ale jeśli twój projekt / wymaganie może wymagać w niektórych przypadkach (ale nie przez cały czas) interakcji międzyludzkich w celu sprawdzenia, czy jest wulgarny, czy nie, możesz rozważyć ML. https://docs.microsoft.com/en-us/azure/cognitive-services/content-moderator/text-moderation-api#profanity jest obecnie moim aktualnym wyborem z wielu powodów:

  • Obsługuje wiele lokalizacji
  • Ciągle aktualizują bazę danych, więc nie muszę nadążać za najnowszymi slangami ani językami (problem z konserwacją)
  • Kiedy istnieje wysokie prawdopodobieństwo (tj. 90% lub więcej), możesz po prostu pragmatycznie temu zaprzeczyć
  • Możesz obserwować kategorię, która powoduje flagę, która może, ale nie musi, być wulgaryzmem, i może ktoś poprosić o sprawdzenie, czy jest lub nie jest wulgarna.

Na moją potrzebę była / jest oparta na publicznej usłudze komercyjnej (OK, gry wideo), którą inni użytkownicy mogą / zobaczą nazwę użytkownika, ale projekt wymaga, aby musiał przejść przez filtr wulgaryzmów, aby odrzucić obraźliwą nazwę użytkownika. Smutną częścią tego jest to, że klasyczny problem „clbuttic” najprawdopodobniej wystąpi, ponieważ nazwy użytkowników są zwykle jednym słowem (do N znaków) niekiedy połączonych wielu słów… Ponownie usługa poznawcza Microsoft nie będzie oznaczać „Assist” jako Text. HasProfanity = true, ale może oznaczać, że jedna z kategorii może być wysoka.

Gdy OP pyta, co z „a $$”, oto wynik, gdy przepuściłem go przez filtr: wprowadź opis zdjęcia tutajjak widać, ustalił, że nie jest wulgarny, ale ma duże prawdopodobieństwo, że tak jest, więc oznacza jako rekomendacje recenzowania (interakcje międzyludzkie).

Kiedy prawdopodobieństwo jest wysokie, mogę albo wrócić: „Przykro mi, że to imię jest już zajęte” (nawet jeśli nie jest), aby było mniej obraźliwe dla osób przeciwnych cenzurze lub czegoś takiego, jeśli nie chcemy w celu zintegrowania recenzji użytkownika lub zwróć „Twoja nazwa użytkownika została powiadomiona w dziale operacji na żywo, możesz poczekać na sprawdzenie i zatwierdzenie swojej nazwy użytkownika lub wybrać inną nazwę użytkownika”. Lub cokolwiek...

Nawiasem mówiąc, koszt / cena tej usługi jest dość niska dla mojego celu (jak często zmienia się nazwa użytkownika?), Ale znowu, dla OP może projekt wymaga bardziej intensywnych zapytań i może nie być idealny do płacenia / subskrypcji Usługi ML, lub nie mogą mieć przeglądu / interakcji między ludźmi. Wszystko zależy od projektu ... Ale jeśli projekt pasuje do rachunku, być może może to być rozwiązanie OP.

W razie zainteresowania mogę wymienić minusy w komentarzu w przyszłości.

HidekiAI
źródło
-2

Filtry wulgaryzmów to zły pomysł. Powodem jest to, że nie można złapać każdego przekleństwa. Jeśli spróbujesz, otrzymasz fałszywe alarmy.

Łapanie słów

Powiedzmy, że chcesz złapać F-Word. Łatwe, prawda? Więc, zobaczmy.

Możesz zapętlić ciąg znaków, aby znaleźć „kurwa”. Niestety w dzisiejszych czasach ludzie oszukują filtry. Filtr wulgaryzmów nie rozpoznał „fuk”.

Można spróbować sprawdzić wiele pisowni i wariantów słowa, ale spowolni to wydajność kodu. Aby złapać F-Word, musisz poszukać „fuc”, „Fuc”, „fuk”, „Fuk”, „F ***” itd. Lista jest długa.

Unikanie niewinności

Okej, a co powiesz na to, aby nie rozróżniała wielkości liter i ignorowała spacje, aby łapała „F u C k”? To może brzmieć jak dobry pomysł, ale ktoś może po prostu ominąć filtr wulgaryzmów za pomocą „FUCK”

Ignorujesz interpunkcję.

To prawdziwy problem, ponieważ zdanie takie jak „Do diabła , tam!” wybierze jako „piekło” i „co za tyłek ?” przyjmuje postać „tyłka”.

I są tam kilka słów, które trzeba wyłączyć z filtrem, takich jak „przeciw tit ution”, bo w nim nie ma „cycki”.

Ludzie mogą również używać słów zastępczych, takich jak „Frack”. Też to blokujesz? A co z „długopisem” oznacza „penisa”? Twój program nie ma sztucznej inteligencji, aby wiedzieć, czy łańcuch jest dobry czy zły.

Nie używaj filtrów wulgaryzmów. Trudno je opracować i są tak wolne jak pełzanie.

Clickbait
źródło
2
-1 nie odpowiada na pytanie OP i jest głównie komentarzem do opinii. Istnieje wiele prawidłowych przypadków użycia tego narzędzia. Na przykład czyszczenie kodu źródłowego przed audytem, ​​aby firma nie była zawstydzona.
davidjmcclelland
-3

Nie rób

Ponieważ:

  • Clbuttic
  • Wulgaryzmy to nie ZŁO OMG
  • Wulgaryzmy nie można skutecznie zdefiniować
  • Większość ludzi prawdopodobnie nie docenia „ochrony” przed wulgaryzmami

Edycja: Chociaż zgadzam się z komentatorem, który powiedział „cenzura jest zła”, nie taka jest natura tej odpowiedzi.

brak powiek
źródło
90
10 głosów za brak odpowiedzi? Jakby ktoś, kto chce odfiltrować wulgaryzmy, musi być moralizującym pół dowcipem? O jeny. To ważne pytanie i nie należy nagradzać nikczemnych, podchwytliwych odpowiedzi. -1.
Kluge
12
@Kludge: Jesteś jedynym, który powiedział „moralizujący pół dowcipu”, w rzeczywistości nie powiedziałem nic o moralnej naturze wdrożenia filtru wulgaryzmów. Mitch wspomina o jednym z powodów, dla których powiedziałem „nie” i nie jest to ponura jazda. Czasami „nie” jest prawidłową odpowiedzią na „jak ...?” [kont.]
powiek
2
@eyelidlessness: Być może masz rację, że przeczytałem zbyt wiele w twojej odpowiedzi na jedno słowo. Ale skoro nie rozwinąłeś tego, nie mogłem stwierdzić, czy twoje zastrzeżenia miały podłoże moralne, czy techniczne. Przyznam, że mam dość komentarzy „cenzura w jakiejkolwiek formie jest zła”.
Kluge
5
-1. „Nie” nie jest prawidłową odpowiedzią niezależnie od kwestii moralnych lub technicznych. Jest wiele razy, w których idealnie jest filtrować zawartość na podstawie jej charakteru. Wyobraź sobie witrynę e-commerce sprzedającą bieliznę damską i oferującą funkcję „recenzji”. Czy naprawdę chcesz, by chłopcy w wieku dojrzewania śmiecili Twoją witrynę śmieciami? Oczywiście nie. I może jest to zbyt uciążliwe, aby proces zatwierdzania przez człowieka był zbyt skomplikowany. Prosty filtr do odrzucania recenzji za pomocą śmieci jest dobrą rzeczą.
pspahn
3
@pspahn, „nie” to poprawna odpowiedź na każde pytanie z pytaniem o rozwiązanie niewłaściwego problemu. Z pewnością istnieją uzasadnione przypadki, w których treść powinna być moderowana, ale „filtr wulgaryzmów” nie jest tym.
powiek