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ć. :)
źródło
Odpowiedzi:
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:
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.
źródło
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:
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:
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:
Umiarkowanie skomplikowany filtr wymagałby (oprócz podstawowego filtra):
Filtr złożony wymagałby szeregu następujących czynności (oprócz filtra umiarkowanego):
źródło
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!
źródło
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.
źródło
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:
źródło
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.
źródło
Zobacz usługę sieci Web Profanity Filter firmy CDYNE
Testujący adres URL
źródło
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”.
źródło
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ą.
źródło
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.
źródło
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.
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 jquerywtyczka, 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/
wynik
źródło
a$$
a$$
, dodajesz go do listy filtrów.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.
źródło
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.
źródło
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
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:
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.
źródło
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]/i
w 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ć.
źródło
Zgadzam się z daremnością tematu, ale jeśli musisz mieć filtr, sprawdź bukszpan Ninga :
Zobacz także ten post na blogu, aby uzyskać więcej informacji:
źródło
Doszedłem do wniosku, że aby stworzyć dobry filtr wulgaryzmów, potrzebujemy 3 głównych składników, a przynajmniej tak zamierzam. Są to:
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.
źródło
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:
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: jak 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.
źródło
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.
źródło
Nie rób
Ponieważ:
Edycja: Chociaż zgadzam się z komentatorem, który powiedział „cenzura jest zła”, nie taka jest natura tej odpowiedzi.
źródło