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. :)
sumber
Jawaban:
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:
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.
sumber
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:
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:
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:
Filer yang cukup kompleks akan melibatkan, (Selain filter dasar):
Filter kompleks akan melibatkan sejumlah hal berikut (Selain filter moderat):
sumber
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!
sumber
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.
sumber
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:
sumber
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.
sumber
Lihatlah Layanan Web Filter Senonoh CDYNE
URL pengujian
sumber
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".
sumber
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.
sumber
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.
sumber
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.
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 jqueryplugin 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/
hasil
sumber
a$$
a$$
, maka Anda menambahkannya ke daftar filter.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.
sumber
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.
sumber
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
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:
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.
sumber
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]/i
atau 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.
sumber
Saya setuju dengan kesia-siaan subjek, tetapi jika Anda harus memiliki filter, lihat Boxwood Ning :
Lihat juga posting blog ini untuk lebih jelasnya:
sumber
Saya menyimpulkan, untuk membuat filter senonoh yang baik kita perlu 3 komponen utama, atau setidaknya itu yang akan saya lakukan. Inilah mereka:
Sebagai bonus, itu akan memberi hadiah entah bagaimana mereka yang berkontribusi dengan reporter pelecehan yang akurat dan menghukum pelaku, misalnya menangguhkan akun mereka.
sumber
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:
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:, seperti 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.
sumber
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.
sumber
Jangan.
Karena:
Sunting: Sementara saya setuju dengan komentator yang mengatakan "sensor salah", itu bukan sifat dari jawaban ini.
sumber