Bagaimana Anda menerapkan filter senonoh yang baik?

208

Banyak dari kita perlu berurusan dengan input pengguna, permintaan pencarian, dan situasi di mana teks input berpotensi mengandung kata-kata kotor atau bahasa yang tidak diinginkan. Seringkali ini perlu disaring.

Di mana orang dapat menemukan daftar kata-kata umpatan yang baik dalam berbagai bahasa dan dialek?

Apakah ada API yang tersedia untuk sumber yang berisi daftar bagus? Atau mungkin API yang hanya mengatakan "ya ini bersih" atau "tidak ini kotor" dengan beberapa parameter?

Apa saja metode yang bagus untuk menangkap orang yang mencoba menipu sistem, seperti $$, azz, atau a55?

Poin bonus jika Anda menawarkan solusi untuk PHP. :)

Sunting: Respons terhadap jawaban yang mengatakan cukup hindari masalah program:

Saya pikir ada tempat untuk filter semacam ini ketika, misalnya, pengguna dapat menggunakan pencarian gambar publik untuk menemukan gambar yang ditambahkan ke kumpulan komunitas yang sensitif. Jika mereka dapat mencari "penis", maka mereka kemungkinan akan mendapatkan banyak gambar, ya. Jika kita tidak menginginkan foto-foto itu, maka mencegah kata sebagai istilah pencarian adalah penjaga gerbang yang baik, meskipun diakui bukan metode yang mudah. Mendapatkan daftar kata di tempat pertama adalah pertanyaan sebenarnya.

Jadi saya benar-benar merujuk pada cara untuk mengetahui token tunggal yang kotor atau tidak dan kemudian tidak mengizinkannya. Saya tidak akan repot mencegah sentimen seperti referensi "jerapah berleher panjang" yang benar-benar lucu. Tidak ada yang bisa Anda lakukan di sana. :)

Ben Throop
sumber
12
Sayang sekali bahwa semua jawaban teratas adalah pengalihan eksistensial dan kekalahan dari tantangan pemrograman. Dengan layanan komputasi "cyborg" seperti Mechanical Turk memperoleh tenaga, dan hampir semua perangkat lunak menjadi sosial, lebih penting daripada sebelumnya untuk memiliki heuristik untuk menandai konten merah dan membawanya ke perhatian moderator!
JasonSmith
10
Harap berhati-hati dengan konteks bahasa, terutama jika Anda menggunakan i18n. Saya pernah mencoba membuat Grup Google untuk kursus yang saya berikan disebut "Sanal ortamda görselleştirme" yang merupakan turki untuk "Visualisasi di media virtual". Google cukup bodoh untuk menolaknya karena judulnya mengandung kata "anal" . Sanal [tr] = Virtual [en] dan Google tanpa malu menuduh saya tidak senonoh! : D Tolong jangan biarkan hal-hal aneh seperti ini terjadi.
edgerunner
Bagaimana jika Anda mencari kata dalam bahasa Spanyol ? Anda sebenarnya dapat menyiasati filter Gambar Google dengan cara itu (jika Anda dilokalisasi ke bahasa lain).
new123456
Saran lain BUKAN untuk melarang kata-kata ini, tetapi untuk mendaftarkan pengguna yang menggunakannya. Jika pengguna / IP mendapatkan lebih dari 2, 3 atau apa pun yang Anda inginkan, maka blokir orang itu. Tidak aman juga, tapi saya pikir itu jauh lebih nyaman untuk diblokir dan harus mengubah pengguna / IP / keduanya daripada menulis 'kelinci putih berbulu' daripada 'vagina'. Sebagian, pengguna tidak tahu kata atau ekspresi APA yang tidak dapat mereka gunakan, sehingga mereka tidak bisa hanya menebak kata-kata buruk dengan mudah ketika mereka diblokir.
Francisco Presencia
1
Filter senonoh adalah ide yang buruk. Sangat sulit untuk membedakan antara seseorang yang mencoba menipu sistem ("Fudge you!") Dan seseorang yang secara sah berbicara tentang sesuatu yang benar-benar tepat ("Saya suka chocolate fudge.")
clickbait

Jawaban:

177

Filter Kecabulan: Gagasan Buruk, atau Gagasan Luar Biasa yang Menyulam?

Juga, salah satu tidak bisa melupakan The Untold History of SpeedChat Toontown ini , di mana bahkan menggunakan "safe-kata whitelist" mengakibatkan berusia 14 tahun cepat menghindari dengan: "Saya ingin tetap saya lama-berleher jerapah up kelinci berbulu putih Anda . "

Intinya: Pada akhirnya, untuk sistem apa pun yang Anda laksanakan, sama sekali tidak ada pengganti untuk tinjauan manusia (baik rekan maupun bukan). Merasa bebas untuk mengimplementasikan alat yang belum sempurna untuk menyingkirkan drive-by, tetapi untuk troll yang ditentukan, Anda benar-benar harus memiliki pendekatan berbasis non-algoritma.

Sebuah sistem yang menghilangkan anonimitas dan memperkenalkan akuntabilitas (sesuatu yang dilakukan Stack Overflow dengan baik) sangat membantu juga, khususnya untuk membantu memerangi GIFT John Gabriel

Anda juga bertanya di mana Anda bisa mendapatkan daftar senonoh untuk memulai - satu proyek open-source untuk memeriksa adalah Dansguardian - periksa kode sumber untuk daftar senonoh default mereka. Ada juga Daftar Frasa pihak ketiga tambahan yang bisa Anda unduh untuk proxy yang mungkin bisa membantu Anda mengumpulkan poin.

Edit sebagai respons, edit pertanyaan: Terima kasih atas klarifikasi tentang apa yang Anda coba lakukan. Dalam hal ini, jika Anda hanya mencoba melakukan filter kata sederhana, ada dua cara yang dapat Anda lakukan. Salah satunya adalah membuat regexp panjang tunggal dengan semua frasa terlarang yang ingin Anda sensor, dan hanya melakukan pencarian / ganti regex dengannya. Regex seperti:

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

dan jalankan di string input Anda menggunakan preg_match () untuk menguji grosir untuk hit,

atau preg_replace () untuk mengosongkannya.

Anda juga dapat memuat fungsi-fungsi itu dengan array daripada regex panjang tunggal, dan untuk daftar kata yang panjang, mungkin lebih mudah dikelola. Lihat preg_replace () untuk beberapa contoh yang baik tentang bagaimana array dapat digunakan secara fleksibel.

Untuk contoh pemrograman PHP tambahan, lihat halaman ini untuk kelas generik agak maju untuk pemfilteran kata * yang keluar dari pusat huruf dari kata-kata yang disensor, dan pertanyaan Stack Overflow sebelumnya yang juga memiliki contoh PHP (bagian berharga utama di sana adalah pendekatan kata terfilter berbasis SQL - kompensator leet-speak dapat ditiadakan jika Anda merasa tidak perlu).

Anda juga menambahkan: " Mendapatkan daftar kata-kata di tempat pertama adalah pertanyaan sebenarnya. " - Selain beberapa tautan Dansgaurdian sebelumnya, Anda mungkin menemukan .zip 458 kata yang berguna ini bisa membantu.

HanClinto
sumber
@ JPLemme: Ya seharusnya - saya seharusnya menambahkan [sic] setelah itu, karena itulah bagaimana Atwood mengejanya. :)
HanClinto
"Club Penguin" menambahkan ratusan entri ke filter senonoh mereka setiap hari : raphkoster.com/2008/05/09/…
Frank Farmer
6
Pembungkus batas kata di sekitar opsi regex Anda akan mencegah kesalahan
clbuttic
@ck: Hanya jika Anda tidak khawatir bisa menyaring kata yang salah eja "F * ckkkk yo 'asssss" :) Saya tidak yakin saya percaya pada troll saya untuk memiliki ejaan yang sangat tepat.
HanClinto
1
Jika Anda ingin mendengar cerita "Fluffy White Bunny" dari mulut pepatah kuda, ini adalah episode podcast sekarang: socialmediaclarity.tumblr.com/post/70499341079/…
F. Randall Farmer
44

Sementara saya tahu bahwa pertanyaan ini cukup lama, tetapi ini adalah pertanyaan yang biasa terjadi ...

Ada alasan dan kebutuhan khusus akan filter yang tidak senonoh (lihat entri Wikipedia di sini ), tetapi filter tersebut sering kurang akurat 100% karena alasan yang sangat berbeda; Konteks dan akurasi .

Tergantung (sepenuhnya) pada apa yang ingin Anda capai - pada dasarnya, Anda mungkin mencoba untuk menutupi " tujuh kata kotor " dan kemudian beberapa ... Beberapa bisnis perlu memfilter kata-kata kotor yang paling mendasar: basic bersumpah kata-kata, URL atau bahkan informasi pribadi dan sebagainya, tetapi yang lain perlu untuk mencegah penamaan akun terlarang (Xbox live adalah contoh) atau lebih ...

Konten yang dibuat pengguna tidak hanya mengandung kata-kata umpatan yang potensial, tetapi juga dapat berisi referensi yang menyinggung:

  • Tindakan seksual
  • Orientasi seksual
  • Agama
  • Etnisitas
  • Dll ...

Dan berpotensi, dalam berbagai bahasa. Shutterstock telah mengembangkan daftar kata-kata kotor dasar dalam 10 bahasa hingga saat ini, tetapi masih dasar dan sangat berorientasi pada kebutuhan 'penandaan' mereka. Ada sejumlah daftar lain yang tersedia di web.

Saya setuju dengan jawaban yang diterima bahwa itu bukan ilmu pasti dan karena bahasa adalah tantangan yang terus berkembang tetapi di mana tingkat tangkapan 90% lebih baik dari 0%. Ini sepenuhnya tergantung pada tujuan Anda - apa yang Anda coba capai, tingkat dukungan yang Anda miliki dan seberapa penting untuk menghilangkan kata-kata kotor dari berbagai jenis.

Dalam membangun filter, Anda perlu mempertimbangkan elemen-elemen berikut dan bagaimana mereka berhubungan dengan proyek Anda:

  • Kata / frasa
  • Akronim (FOAD / LMFAO dll)
  • Positif palsu (kata-kata, tempat, dan nama seperti 'mishit', 'scunthorpe' dan 'titsworth')
  • URL (situs porno adalah target yang jelas)
  • Informasi pribadi (email, alamat, telepon, dll - jika ada)
  • Pilihan bahasa (biasanya bahasa Inggris secara default)
  • Moderasi (bagaimana, jika sama sekali, Anda dapat berinteraksi dengan konten yang dibuat pengguna dan apa yang dapat Anda lakukan dengannya)

Anda dapat dengan mudah membangun filter senonoh yang menangkap 90% + senonoh, tetapi Anda tidak akan pernah mencapai 100%. Itu tidak mungkin. Semakin dekat Anda ingin mencapai 100%, semakin sulit menjadi ... Setelah membangun mesin senonoh yang kompleks di masa lalu yang menangani lebih dari 500 ribu pesan realtime per hari, saya akan menawarkan saran berikut:

Filter dasar akan melibatkan:

  • Membuat daftar kata-kata kotor yang berlaku
  • Mengembangkan metode berurusan dengan derivasi kata-kata kotor

Filer yang cukup kompleks akan melibatkan, (Selain filter dasar):

  • Menggunakan pencocokan pola yang kompleks untuk menangani derivasi diperpanjang (menggunakan regex canggih)
  • Berurusan dengan Leetspeak (l33t)
  • Berurusan dengan positif palsu

Filter kompleks akan melibatkan sejumlah hal berikut (Selain filter moderat):

  • Daftar putih dan daftar hitam
  • Penyaringan inferensi bayesian naif dari frasa / istilah
  • Fungsi Soundex (di mana kata terdengar seperti yang lain)
  • Jarak Levenshtein
  • Stemming
  • Moderator manusia untuk membantu memandu mesin penyaringan untuk belajar dengan contoh atau di mana kecocokan tidak cukup akurat tanpa bimbingan (sistem yang memperbaiki diri)
  • Mungkin beberapa bentuk mesin AI
nickhar
sumber
28

Saya tidak tahu ada perpustakaan yang bagus untuk ini, tapi apa pun yang Anda lakukan, pastikan bahwa Anda salah arah dalam membiarkan barang-barang masuk. Saya sudah berurusan dengan sistem yang tidak memungkinkan saya untuk menggunakan "mpassell" sebagai nama pengguna, karena berisi "pantat" sebagai substring. Itu cara yang bagus untuk mengasingkan pengguna!

Matt Passell
sumber
17
atau melarang "kokpit" dalam permainan pesawat ruang angkasa terbang
Shinhan
24

Selama wawancara pekerjaan saya, CTO perusahaan yang mewawancarai saya mencoba permainan kata / web yang saya tulis di Jawa. Dari daftar kata seluruh kamus Bahasa Inggris Oxford, apa kata pertama yang muncul untuk ditebak?

Tentu saja, kata yang paling kotor dalam bahasa Inggris.

Entah bagaimana, saya masih mendapat tawaran pekerjaan, tetapi saya kemudian melacak daftar kata-kata yang tidak senonoh (tidak seperti yang ini ) dan menulis skrip cepat untuk membuat kamus baru tanpa semua kata-kata buruk (tanpa harus melihat daftar) .

Untuk kasus khusus Anda, saya pikir membandingkan pencarian dengan kata-kata nyata terdengar seperti cara untuk pergi dengan daftar kata seperti itu. Gaya / tanda baca alternatif membutuhkan sedikit lebih banyak pekerjaan, tapi saya ragu pengguna akan menggunakannya cukup sering untuk menjadi masalah.

Matius
sumber
8
Di luar topik, tapi apa kata yang paling kotor? Saya selalu menganggapnya sebagai kata c atau kata n, tetapi saya berasumsi bahwa orang berpikir kata f adalah
Jeff
2
"Saya ragu pengguna akan menggunakan itu cukup sering untuk menjadi masalah" Tetaplah hidup. Setelah pengguna menemukan filter, mereka akan berupaya menemukan cara menghindari. Ini bisa sesederhana mengganti huruf dengan angka dengan penempatan spasi ganjil, dll).
BryanH
21

sistem penyaringan kata-kata kotor tidak akan pernah sempurna, bahkan jika programmer itu cocksure dan terus mengikuti semua perkembangan telanjang

yang mengatakan, daftar 'kata-kata nakal' cenderung berkinerja sama baiknya dengan daftar lainnya, karena masalah yang mendasarinya adalah pemahaman bahasa yang cukup sulit diterapkan dengan teknologi saat ini

jadi, satu-satunya solusi praktis ada dua:

  1. bersiaplah untuk sering memperbarui kamus Anda
  2. pekerjakan seorang editor manusia untuk mengoreksi positif palsu (mis. "clbuttic" alih-alih "klasik") dan negatif palsu (oops! ketinggalan satu!)
Steven A. Lowe
sumber
1
Hanya mendeteksi kata dengan spasi di kedua sisi, berhenti penuh setelah, Tidak?
David D
1
H3ll no man, itu hanya bekerja untuk kasus yang paling sepele; kita berurusan dengan manusia di sini, dan mereka cukup pintar :)
Steven A. Lowe
14

Satu-satunya cara untuk mencegah input pengguna yang ofensif adalah dengan mencegah semua input pengguna.

Jika Anda bersikeras mengizinkan input pengguna dan membutuhkan moderasi, maka sertakan moderator manusia.

Axel
sumber
7

Mengenai subquestion "trik sistem" Anda, Anda dapat mengatasinya dengan menormalkan daftar "kata buruk" dan teks yang dimasukkan pengguna sebelum melakukan pencarian. mis., Gunakan serangkaian regex (atau tr jika PHP memilikinya) untuk mengonversi [z $ 5] menjadi "s", [4 @] menjadi "a", dll., lalu membandingkan daftar "kata buruk" yang dinormalisasi dengan yang dinormalisasi teks. Perhatikan bahwa normalisasi berpotensi menyebabkan tambahan positif palsu, walaupun saya tidak dapat memikirkan kasus aktual saat ini.

Tantangan yang lebih besar adalah menemukan sesuatu yang akan membuat orang mengutip " Pena lebih kuat dari pedang" sambil memblokir "peni".

Dave Sherohman
sumber
14
Jangan lupa expert-exchange.com dan pen-island.com; url situs tersebut dulu tidak mengandung tanda hubung.
BryanH
7

Waspadalah terhadap masalah pelokalan: apa itu kata sumpah serapah dalam satu bahasa mungkin kata yang sangat normal di bahasa lain.

Salah satu contoh saat ini: ebay menggunakan pendekatan kamus untuk menyaring "kata-kata buruk" dari umpan balik. Jika Anda mencoba memasukkan terjemahan bahasa Jerman "ini transaksi yang sempurna" ("das war eine perfekte Transaktion"), ebay akan menolak umpan balik karena kata-kata buruk.

Mengapa? Karena kata Jerman untuk "dulu" adalah "perang", dan "perang" dalam kamus ebay "kata-kata buruk".

Jadi waspadalah terhadap masalah pelokalan.

Sam
sumber
6

Jika Anda dapat melakukan sesuatu seperti Digg / Stackoverflow di mana pengguna dapat mengunduh / menandai konten yang tidak senonoh ... lakukanlah.

Maka yang perlu Anda lakukan adalah meninjau pengguna "nakal", dan memblokir mereka jika mereka melanggar aturan.

scunliffe
sumber
4

Saya agak terlambat ke pesta, tetapi saya punya solusi yang mungkin berhasil untuk beberapa yang membaca ini. Itu di javascript bukan php, tapi ada alasan yang sah untuk itu.

Pengungkapan penuh, saya menulis plugin ini ...

Bagaimanapun.

Pendekatan yang saya gunakan adalah mengizinkan pengguna untuk "Memilih" ke penyaringan kata-kata kotor mereka. Pada dasarnya senonoh akan diizinkan secara default, tetapi jika pengguna saya tidak ingin membacanya, mereka tidak harus membacanya. Ini juga membantu dengan masalah "l33t sp3 @ k".

Konsepnya sederhana plugin yang akan disuntikkan oleh server jika akun klien memungkinkan penyaringan kata-kata kotor. Dari sana, hanya beberapa garis sederhana yang menghapus sumpah serapah.

Inilah halaman demo
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>

hasil

*** akan gagal tetapi kata sandi tidak

Chase Florell
sumber
Berikut ini demo kerja jsFiddle untuk menyertai jawaban ini.
Chase Florell
Sangat naif. Tidak memfiltera$$
Winger Sendon
3
@ EmperorAiman ​​itu tidak pernah dimaksudkan untuk memfilter l33t berbicara . Saya tidak menyarankan mencoba memfilternya, karena ini adalah pertempuran yang kalah. Filter tidak senonoh yang saya posting adalah "dibangun untuk memungkinkan pengguna" Memilih "untuk memfilter senonoh". artinya yang terbaik digunakan di situs yang memungkinkan senonoh secara default. Jika Anda ingin memfilter a$$, maka Anda menambahkannya ke daftar filter.
Chase Florell
4

Saya mengumpulkan 2200 kata-kata buruk dalam 12 bahasa: en, ar, cs, da, de, eo, es, fa, fi, fr, hai, itu, ja, ko, nl, tidak, pl, pt, ru, sv , th, tlh, tr, zh.

Opsi dump MySQL, JSON, XML atau CSV tersedia.

https://github.com/turalus/openDB

Saya sarankan Anda untuk mengeksekusi SQL ini ke dalam DB Anda dan periksa setiap kali pengguna memasukkan sesuatu.

Tural Ali
sumber
2

Jangan. Itu hanya menyebabkan masalah. Salah satu pengalaman pribadi clbuttic yang saya miliki dengan filter senonoh adalah waktu di mana saya ditendang / dilarang dari saluran IRC karena menyebutkan bahwa saya "menuju jembatan ke Hancock selama beberapa jam" atau sesuatu seperti itu.

Adam Jaskiewicz
sumber
2

Saya setuju dengan postingan HanClinto yang lebih tinggi dalam diskusi ini. Saya biasanya menggunakan ekspresi reguler untuk teks input string-match. Dan ini adalah usaha yang sia-sia, seperti, seperti yang Anda sebutkan sebelumnya, Anda harus secara eksplisit memperhitungkan setiap bentuk trik penulisan populer di internet dalam daftar "diblokir" Anda.

Di samping catatan, sementara yang lain memperdebatkan etika sensor, saya harus setuju bahwa beberapa bentuk diperlukan di web. Beberapa orang hanya menikmati memposting vulgar karena dapat langsung menyinggung banyak orang, dan sama sekali tidak memerlukan pemikiran penulis.

Terima kasih untuk idenya.

Aturan HanClinto!


sumber
2

Setelah Anda memiliki tabel MYSQL yang baik dari beberapa kata-kata buruk yang ingin Anda filter (saya mulai dengan salah satu tautan di utas ini), Anda dapat melakukan sesuatu seperti ini:

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

Saya yakin ada cara yang lebih efisien untuk melakukan semua penggantian itu, tapi saya tidak cukup pintar untuk mengetahuinya (dan ini tampaknya bekerja dengan baik, meskipun tidak efisien).

Saya percaya bahwa Anda harus melakukan kesalahan dengan memperbolehkan pengguna untuk mendaftar, dan menggunakan manusia untuk memfilter dan menambahkan ke tabel senonoh Anda seperti yang diperlukan. Padahal itu semua tergantung pada biaya dari false positive (kata oke ditandai sebagai buruk) versus false negative (kata buruk didapat). Yang pada akhirnya harus mengatur seberapa agresif atau konservatif Anda dalam strategi penyaringan Anda.

Saya juga akan sangat berhati-hati jika Anda ingin menggunakan wildcard, karena mereka kadang-kadang dapat berperilaku lebih berat daripada yang Anda inginkan.

andrew
sumber
1

Terus terang, saya membiarkan mereka mengeluarkan kata-kata "tipuan sistem" dan mencabutnya, yang hanya saya. Tetapi itu juga membuat pemrograman lebih sederhana.

Apa yang akan saya lakukan adalah menerapkan filter regex seperti: /[\s]dooby (doo?)[\s]/iatau kata itu diawali oleh orang lain,/[\s]doob(er|ed|est)[\s]/ ,. Ini akan mencegah pemfilteran kata-kata seperti assuaged, yang benar-benar valid, tetapi juga membutuhkan pengetahuan tentang varian lain dan memperbarui filter yang sebenarnya jika Anda mempelajari yang baru. Jelas ini semua adalah contoh, tetapi Anda harus memutuskan bagaimana melakukannya sendiri.

Saya tidak akan mengetik semua kata yang saya tahu, tidak ketika saya tidak benar-benar ingin mengetahuinya.

Robert K.
sumber
1

Saya setuju dengan kesia-siaan subjek, tetapi jika Anda harus memiliki filter, lihat Boxwood Ning :

Boxwood adalah ekstensi PHP untuk penggantian cepat beberapa kata dalam sepotong teks. Ini mendukung pencocokan case-sensitive dan case-sensitive. Ini mengharuskan teks yang dioperasikan untuk dikodekan sebagai UTF-8.

Lihat juga posting blog ini untuk lebih jelasnya:

Dengan Boxwood, Anda dapat membuat daftar istilah pencarian selama Anda mau - algoritma pencarian dan ganti tidak semakin lambat dengan lebih banyak kata dalam daftar kata yang harus dicari. Ini bekerja dengan membangun sebuah trie dari semua istilah pencarian dan kemudian memindai teks subjek Anda sekali saja, menyusuri elemen-elemen dari trie dan membandingkannya dengan karakter-karakter dalam teks Anda. Ini mendukung US-ASCII dan UTF-8, pencocokan case-sensitive atau tidak sensitif, dan memiliki beberapa logika pemeriksaan batas kata yang berpusat pada Bahasa Inggris.

Gordon
sumber
1

Saya menyimpulkan, untuk membuat filter senonoh yang baik kita perlu 3 komponen utama, atau setidaknya itu yang akan saya lakukan. Inilah mereka:

  1. Filter: layanan latar belakang yang memverifikasi terhadap daftar hitam, kamus, atau semacamnya.
  2. Tidak mengizinkan akun anonim
  3. Laporkan Penyalahgunaan

Sebagai bonus, itu akan memberi hadiah entah bagaimana mereka yang berkontribusi dengan reporter pelecehan yang akurat dan menghukum pelaku, misalnya menangguhkan akun mereka.

Jaider
sumber
1

Juga terlambat dalam permainan, tetapi melakukan beberapa penelitian dan tersandung di sini. Seperti yang telah disebutkan oleh orang lain, hampir tidak mungkin jika itu otomatis, tetapi jika desain / persyaratan Anda dapat melibatkan beberapa orang (tetapi tidak setiap saat) interaksi manusia untuk meninjau apakah itu profan atau tidak, Anda dapat mempertimbangkan ML. https://docs.microsoft.com/en-us/azure/cognitive-services/content-moderator/text-moderation-api#profanity adalah pilihan saya saat ini dengan berbagai alasan:

  • Mendukung banyak pelokalan
  • Mereka terus memperbarui database, jadi saya tidak harus mengikuti slangs atau bahasa terbaru (masalah pemeliharaan)
  • Ketika ada probabilitas tinggi (yaitu 90% atau lebih), Anda bisa menolaknya secara pragmatis
  • Anda dapat mengamati untuk kategori yang menyebabkan bendera yang mungkin atau mungkin tidak senonoh, dan dapat meminta seseorang memeriksanya untuk mengajarkan bahwa itu adalah atau tidak senonoh.

Untuk kebutuhan saya, ini didasarkan pada layanan komersial yang ramah-publik (OK, videogame) dimana pengguna lain mungkin / akan melihat nama pengguna, tetapi desain mengharuskannya melalui filter kata-kata kotor untuk menolak nama pengguna yang menyinggung. Bagian yang menyedihkan tentang ini adalah masalah klasik "clbuttic" yang kemungkinan besar akan terjadi karena nama pengguna biasanya terdiri dari satu kata (hingga N karakter) yang terkadang terdiri dari beberapa kata yang digabungkan ... Sekali lagi, layanan kognitif Microsoft tidak akan menandakan "Membantu" sebagai Teks. HasProfanity = true tetapi mungkin menandai salah satu kategori kemungkinan menjadi tinggi.

Seperti yang ditanyakan oleh OP, bagaimana dengan "a $$", inilah hasilnya ketika saya melewatinya melalui filter:, masukkan deskripsi gambar di siniseperti yang Anda lihat, ia telah menentukan itu bukan hal yang profan, tetapi ia memiliki probabilitas tinggi, jadi flags sebagai rekomendasi ulasan (interaksi manusia).

Ketika probabilitas tinggi, saya dapat kembali "Maaf, nama itu sudah diambil" (bahkan jika tidak) sehingga kurang menyinggung orang-orang anti-sensor atau sesuatu, jika kita tidak mau untuk mengintegrasikan ulasan manusia, atau mengembalikan "Nama pengguna Anda telah diberitahukan ke departemen operasi langsung, Anda dapat menunggu nama pengguna Anda ditinjau dan disetujui atau memilih nama pengguna lain". Atau terserah...

Ngomong-ngomong, biaya / harga untuk layanan ini cukup rendah untuk tujuan saya (seberapa sering nama pengguna diubah?), Tetapi sekali lagi, untuk OP mungkin desain menuntut permintaan yang lebih intensif dan mungkin tidak ideal untuk membayar / berlangganan Layanan-ML, atau tidak dapat memiliki ulasan / interaksi manusia. Itu semua tergantung pada desain ... Tapi jika desain tidak sesuai dengan tagihan, mungkin ini bisa menjadi solusi OP.

Jika tertarik, saya bisa daftar kontra di komentar di masa depan.

HidekiAI
sumber
-2

Filter senonoh adalah ide yang buruk. Alasannya adalah bahwa Anda tidak dapat menangkap setiap kata sumpah. Jika Anda mencoba, Anda mendapatkan hasil positif palsu.

Menangkap kata-kata

Anggap saja Anda ingin menangkap F-Word. Mudah kan? Baiklah mari kita lihat.

Anda dapat memutar melalui string untuk menemukan "fuck." Sayangnya, orang menipu filter saat ini. Filter sumpah serapah tidak mengambil "fuk."

Orang dapat mencoba memeriksa beberapa ejaan dan varian kata, tetapi itu akan memperlambat kinerja kode Anda. Untuk menangkap F-Word, Anda perlu mencari "fuc", "Fuc", "fuk", "Fuk", "F ***", dll. Dan daftarnya terus bertambah.

Menghindari Kepolosan

Oke, jadi bagaimana kalau membuatnya case-insensitive dan mengabaikan spasi sehingga menangkap "Fu Ck"? Itu mungkin terdengar seperti ide yang bagus, tetapi seseorang dapat memotong filter sumpah serapah dengan "FUCK"

Anda mengabaikan tanda baca.

Nah, itu benar-benar masalah, karena kalimat seperti " Aduh , di sana!" akan mengambil sebagai "neraka," dan "Wh ass up?" mengambil sebagai "keledai."

Dan ada banyak kata yang harus Anda kecualikan dari filter, seperti "Kontra tit ution," karena ada "tit" di dalamnya.

Orang juga dapat menggunakan kata-kata pengganti, seperti "Frack." Anda memblokir itu juga? Bagaimana dengan "pena" untuk "penis"? Program Anda tidak memiliki kecerdasan buatan untuk mengetahui apakah string itu baik atau buruk.

Jangan gunakan filter senonoh. Mereka sulit untuk dikembangkan, dan mereka selambat merangkak.

clickbait
sumber
2
-1 tidak menjawab pertanyaan OP dan sebagian besar adalah komentar pendapat. Ada banyak kasus penggunaan yang valid untuk utilitas ini. Misalnya membersihkan kode sumber sebelum audit sehingga perusahaan tidak merasa malu.
davidjmcclelland
-3

Jangan.

Karena:

  • Clbuttic
  • Senonoh bukanlah OMG EVIL
  • Kata-kata kotor tidak dapat didefinisikan secara efektif
  • Sebagian besar orang mungkin tidak menghargai "dilindungi" dari kata-kata kotor

Sunting: Sementara saya setuju dengan komentator yang mengatakan "sensor salah", itu bukan sifat dari jawaban ini.

kelopak mata
sumber
90
10 upvotes untuk jawaban ini? Seolah-olah siapa pun yang ingin menyaring kata-kata kotor harus setengah sadar moral? Menyedihkan. Ini adalah pertanyaan yang valid dan respons drive-by snarky tidak boleh dihargai. -1.
Kluge
12
@Kludge: Anda satu-satunya yang mengatakan "moralisasi setengah cerdas", sebenarnya saya tidak mengatakan apa-apa tentang sifat moral menerapkan filter kata-kata kotor sama sekali. Mitch mengemukakan sebagian alasan saya mengatakan "jangan", dan itu bukan drive-by yang snarky. Terkadang "tidak" adalah jawaban yang benar untuk "bagaimana saya ...?" [lanjutan]
kelopak mata
2
@eyelidlessness: Mungkin Anda benar bahwa saya terlalu banyak membaca jawaban satu kata Anda. Tetapi karena Anda tidak menguraikan, saya tidak bisa memastikan apakah keberatan Anda karena alasan moral atau alasan teknis. Saya akui bahwa saya bosan dengan komentar "sensor dalam bentuk apa pun yang buruk".
Kluge
5
-1. "Jangan" bukan jawaban yang valid terlepas dari masalah moral atau teknis. Ada banyak waktu di mana sangat tepat untuk memfilter konten berdasarkan sifat konten. Bayangkan sebuah situs e-commerce yang menjual pakaian dalam wanita dan menawarkan fitur 'Ulasan'. Apakah Anda benar-benar ingin anak lelaki praremaja mengotori situs Anda dengan sampah? Tentu saja tidak. Dan mungkin terlalu rumit untuk memiliki proses persetujuan manusia. Filter sederhana untuk menolak ulasan dengan sampah adalah hal yang baik.
pspahn
3
@ pspahn, "jangan" adalah jawaban yang benar untuk setiap pertanyaan yang meminta solusi untuk masalah yang salah. Tentu saja ada kasus yang valid di mana konten harus dimoderasi, tetapi "filter tidak senonoh" bukan.
kelopak mata