Nasıl iyi bir küfür filtre uygulamak?

21 Cevap php

Birçoğumuz kullanıcı girişi, arama sorguları ve giriş metin potansiyel küfür veya istenmeyen bir dil içerebilir durumlarla başa çıkmak gerekir. Çoğu kez, bu filtre edilmesi gerekmektedir.

Nerede bir çeşitli dillerde ve lehçelerde küfürlere iyi bir listesini nereden bulabilirim?

Iyi listelerini içeren kaynaklardan mevcut API'ler var mı? Ya da belki sadece "evet, bu temiz" veya bazı parametreleri ile "hayır bu kirli" diyor bir API?

Sistem kandırmak için çalışıyor millet yakalamak için bazı iyi yöntemler $ $, azz veya A55 gibi, nelerdir?

Bonus puan PHP için çözümler sunuyoruz eğer. :)

Edit: Response to answers that say simply avoid the programmatic issue:

Örneğin ben, bir kullanıcı bir duyarlı topluluk havuzuna ekledi olsun fotoğraflarını bulmak için kamu resim arama kullanabilirsiniz, filtre bu tür bir yer olduğunu düşünüyorum. Onlar "penis" için arama yapabilirsiniz, sonra onlar büyük olasılıkla evet, birçok resim alacak. Biz kuşkusuz değil kusursuz bir yöntem olsa da, daha sonra bir arama terimi iyi bir bekçi gibi kelime önlenmesi o fotoğraflarını istemiyorsanız. Ilk etapta kelimelerin listesini alma gerçek bir soru.

Yani gerçekten tek bir belirteç anlamaya bir şekilde bahsediyorum sadece bunu izin vermemek, kirli ya da değil ve daha sonra. Ben tamamen komik "uzun boyunlu zürafa" referans gibi bir duygu önlenmesi rahatsız olur. Orada yapabileceğiniz bir şey yok. :)

21 Cevap

Obscenity Filters: Bad Idea, or Incredibly Intercoursing Bad Idea?

Also, one can't forget The Untold History of Toontown's SpeedChat, where even using a "safe-word whitelist" resulted in a 14 year old quickly circumventing it with: "I want to stick my long-necked Giraffe up your fluffy white bunny."

Bottom line: Sonuçta, uygulamak herhangi bir sistem için, insan inceleme için herhangi bir yerini tutamaz (akran olsun veya başka türlü) kesinlikle yoktur. Drive-by yıllardan kurtulmak için ilkel bir araç uygulamak için çekinmeyin, ama kararlı trol için, kesinlikle olmayan bir algoritma tabanlı bir yaklaşım olmalıdır.

Anonimlik kaldırır ve hesap verebilirlik (yığın taşması iyi yapar bir şey) tanıtır bir sistem muharebe John Gabriel's G.I.F.T. yardım etmek, özellikle amacıyla, aynı zamanda yararlı

Varsayılan küfür listeleri için kaynak kodu kontrol - Dansguardian olduğunu kontrol etmek için bir açık kaynak projesi - sen küfür listeleri başlamak için alabileceğiniz de sordu. Sizin için yararlı gleaning noktası olabilir proxy indirebilirsiniz Phrase List ek bir üçüncü parti de vardır.

Edit in response the question edit: yapmak için çalışıyoruz ne açıklama için teşekkürler. Eğer sadece basit bir kelime filtresi yapmaya çalışıyorsanız bu durumda, bunu iki yolu vardır. One sansür istediğiniz yasaklı ifadelerin tümü, ve sadece bir regex onunla değiştirin / bulurum tek bir uzun regexpi oluşturmaktır. Bir regex gibi:

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

ve, bir hit toptan testine preg_match() kullanarak giriş dizesi çalıştırın

veya preg_replace() dışarı onları boş için.

Ayrıca diziler yerine tek bir uzun regex bu işlevleri yükleyebilirsiniz, ve uzun bir kelime listeleri için, daha yönetilebilir olabilir. Diziler esnek nasıl kullanılabileceği gibi bazı iyi örnekler için preg_replace() bakın.

Ek PHP programlama örnekleri için de (bir PHP örneği olduğunu, sansürlü kelime merkez harfleri 's dışarı * kelime filtreleme için somewhat advanced generic class için bu sayfayı görmek ve bu previous Stack Overflow question Orada ana değerli parçası SQL tabanlı süzülmüş kelime yaklaşımdır - leet-konuşmak kompansatör Eğer gereksiz bulursanız vazgeçilebilir olabilir).

Ayrıca eklendi: "Getting the list of words in the first place is the real question." - Bir önceki Dansgaurdian bazı bağlantılar için ek olarak, yardımcı olmak için 458 kelimelerin this handy .zip bulabilirsiniz.

Eğer (Ben bu konuya bağlantılardan biri ile başladı) filtrelemek istediğiniz bazı kötü kelimelerin iyi bir MYSQL tablo var sonra, böyle bir şey yapabilirsiniz:

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

Ben tüm bu değiştirmeler yapmak için daha etkili bir yol olduğundan emin değilim, ama ben bunu anlamaya yeterince akıllı değilim (ve bu verimsiz de olsa, tamam iş gibi görünüyor).

Ben kullanıcıların kayıt izin tarafında err ve filtre ve gerekli olarak küfür tabloya eklemek için insanları kullanmak gerektiğine inanıyoruz. Hepsi bir yanlış pozitif maliyetine bağlıdır rağmen yanlış negatif (kötü bir kelime aracılığıyla alır) karşı (tamam kelime olarak kötü bayraklı). Sonuçta ne kadar agresif veya muhafazakar sizin filtreleme stratejisi vardır yönetmek gerekir.

Eğer joker kullanmak istiyorsanız bazen daha onerously niyetinde daha davranabilir beri ben de, çok dikkatli olacaktır.

Bunun için herhangi bir iyi kütüphanelerin biliyorum, ama ne yaparsan yap, sen yoluyla şeyler icar yönünde err emin yapmazlar. Ben bir alt dize olarak "eşek" içerdiğinden bana, bir kullanıcı adı olarak "mpassell" kullanmak için izin vermedi sistemleri ele ettik. Bu kullanıcıların yabancılaştırmak için harika bir yoldur!

Benim bir iş görüşmesi sırasında, bana görüşme oldu şirket CTO Java yazdığım bir kelime / web oyun çalıştı. Tüm Oxford İngilizce Sözlük bir kelime listesi dışında, tahmin edilecek kadar geldi ilk kelime neydi?

Tabii ki, İngilizce dilinde en çok faul kelime.

Her nasılsa, ben hala iş teklifi aldım, ama o (değil unlike this one), bir küfür kelime listesi aşağı izlenen ve hatta bakmak zorunda kalmadan (kötü kelimelerin tüm olmadan yeni bir sözlük oluşturmak için hızlı bir senaryo yazdı Listeye).

Sizin özel durum için, ben gerçek kelime arama karşılaştırarak böyle bir kelime listesi ile gitmek için bir yol gibi geliyor. Alternatif stilleri / noktalama biraz daha fazla çalışma gerektirir, ama kullanıcılar genellikle yeterli bir sorun olması için kullanabilirsiniz şüpheliyim.

Bir küfür filtreleme sistemi programcı cocksure ve tüm çıplak gelişmeleri yakından takip ediyor olsa bile, mükemmel asla

temel sorun mevcut teknoloji ile language understanding hangi oldukça fazla dirençli olduğu söyledi, 'yaramaz kelimelerin' herhangi bir liste, herhangi bir başka listesinin yanı sıra gerçekleştirmek için muhtemeldir

yani, tek pratik çözüm iki yönlüdür:

  1. sık sık sözlüğü güncellemek için hazırlıklı olun
  2. yanlış pozitif (yerine "klasik" örneğin "clbuttic") ve yanlış negatif düzeltmek için bir insan editörü kiralama (oops! cevapsız!)

Webpurify.com bu küfür filtreleme ihtiyaçları idare edecek bir api. Ben bir programcı arkadaşı tarafından sevk edildi ve şimdi birkaç yıl için kendi hizmetini kullanıyorum ve çok memnunum. Kullanıcı "beyaz listeler" ve "kara listeler" oluşturabilirsiniz. Hizmet küfür sayılmasını sağlayan veya sadece sembollerle küfür değiştirme gibi birkaç fark filtreleme seçenekleri sunuyor.

Saldırgan kullanıcı girişini önlemek için tek yolu tüm kullanıcı girişi önlemektir.

Eğer izin kullanıcı girişi ısrar ve ılımlılık gerekiyorsa, o zaman insan moderatörler dahil.

Lütfen "sistem kandırmak" subquestion ilgili olarak, "kötü kelime" listesi ve arama yapmadan önce kullanıcı tarafından girilen metni hem de normalize olduğunu işleyebilir. (PHP o varsa veya tr), örneğin, [4@] "a", vb [z$5] için "s" dönüştürmek için bir regexes dizi kullanın sonra normalleştirilmiş metin karşı normalize "kötü bir kelime" listesi karşılaştırın. Ben şu anda herhangi bir fiili durumda düşünemiyorum rağmen, normalleşme potansiyel ek yanlış pozitif yol açabileceğini unutmayın.

Büyük zorluk "penis" bloke ederken insanlar "kılıçtan daha pen is güçlüdür" alıntı sağlayacak bir şey ile gelip etmektir.

Eğer ... kullanıcıların / işareti müstehcen içerik DOWNVote olabilir Digg / Stackoverflow gibi bir şey yapabilirsek bunu.

Sonra yapmanız gereken tüm "yaramaz" kullanıcıları inceleyebilir ve kuralları çiğneyen bunları engellemek olduğunu.

Yapmak değil.

Çünkü:

  • Clbuttic
  • Küfür OMG EVIL değil
  • Küfür etkili tanımlanamaz
  • Çoğu kişi büyük ihtimalle küfür gelen "korumalı" hoşuma gitmiyor

Düzenleme: Ben "sansür yanlış" dedi yorumcu ile kabul ederken, bu cevap niteliği değildir.

Bu soru oldukça eski olduğunu biliyorum, ama sık görülen bir soru olsa da ...

Orada bir sebebi ve küfür filtreleri için ayrı bir ihtiyacı (bkz. Wikipedia entry here) hem de, ama genellikle çok farklı nedenlerden dolayı% 100 doğru olmanın kısa sonbahar; Context ve accuracy.

Size ulaşmak için çalışıyoruz ne (tamamen) bağlıdır - bu en temel var, muhtemelen "seven dirty words" karşılamak için çalışıyoruz ve daha sonra bazı ... Bazı işletmeler en temel filtre gerekir küfür: temel kelimeleri, URL'leri veya benzeri hatta kişisel bilgilerinizi ve yemin ederim, ama diğerleri yasadışı hesabı adlandırma (Xbox canlı bir örnektir) veya çok daha önlemek gerekir ...

Kullanıcı içeriği sadece hücum referanslar içerebilir, küfürlere potansiyelini içermiyor oluşturulur:

  • Cinsel eylemler
  • Cinsel yönelim
  • Din
  • Etnik
  • Vs ..

Ve potansiyel olarak, birden çok dilde. Shutterstock bugüne kadar 10 dilde basic dirty-words lists geliştirdi, ama yine de temel ve çok onların 'etiketleme' ihtiyacı yönelik bulunuyor. Internet üzerinde mevcut diğer listeleri vardır.

Ben tanımlanmış bir bilim ve as dil değil kabul cevap katılıyorum, sürekli challenge ancak% 90 yakalama oranı% 0 daha iyi birini gelişen. Bu sizin hedeflerinize tamamen bağlıdır - size ulaşmak için çalışıyoruz ne var destek seviyesi ve ne kadar önemli farklı profanities kaldırmaktır.

Bir filtre binada, aşağıdaki unsurları ve nasıl proje ile ilgili dikkate almak gerekir:

  • Kelime / cümle
  • Kısaltmalar (FOAD / LMFAO vs)
  • False positives ('kötü vuruş', 'scunthorpe' ve 'titsworth' gibi kelimeler, yerler ve isimler)
  • URL'ler (porno siteleri açık bir hedef vardır)
  • Kişisel bilgiler (e-posta, adres, telefon vb - eğer varsa)
  • Dil seçimi (varsayılan olarak genellikle İngilizce)
  • Moderasyon (nasıl, hiç değilse, kullanıcı tarafından oluşturulan içerik ve ne onunla yapabilirsiniz ile etkileşime girebilir)

Kolayca profanities% 90 + yakalayan bir küfür filtresi inşa edebilirsiniz, ama% 100 isabet asla. Bu sadece mümkün değil. Yakınsanız% 100 almak istiyorum, zor o olur ... günde en fazla 500K gerçek zamanlı mesajlar ele geçmişte karmaşık bir küfür motoru yerleşik olması, ben şu tavsiyelerde ediyorum:

A basic filter would involve:

  • Uygulanabilir profanities listesini Bina
  • Profanities ve türevlerinin ile ilgili bir yöntem geliştirilmesi

A moderately complex filer would involve, (In addition to a basic filter):

  • (Gelişmiş regex kullanarak) genişletilmiş derivasyon ile başa çıkmak için eşleşen karmaşık desen kullanarak
  • Leetspeak (l33t) ile başa çıkmak
  • false positives ile başa çıkmak

A complex filter would involve a number of the following (In addition to a moderate filter):

  • Whitelists ve kara
  • Ibareleri / terimleri Naive bayesian inference filtreleme
  • Soundex fonksiyonları (bir kelime başka gibi geliyor)
  • Levenshtein distance
  • Stemming
  • Örnekle öğrenmek veya maçlar rehberliği olmadan yeterli (self / sürekli geliştiren sistemi) doğru değil nerede bir filtreleme motoru rehberlik edecek insan moderatörler
  • AI motoru Belki bazı formu

Eğer bir Java filtresi, WebService, ve her şeyi yönetmek için bir web uygulaması ile tam bir çözüm istiyorsanız, Inversoft Temiz Konuş adlı bir ürün satıyor. Bu son derece hızlı ve doğru. Bu yedek karakterleri (a $ $) ve boşluk (eşek) yönetir. Diğer birçok filtreler boşluk ve diğer noktalama ile kolayca kırmak gibi görünüyor.

Sen sunucularında yazılım dağıtabilir ve entegrasyon oldukça basittir. Onlar da bir moderasyon sistemi gibi Kullanıcı Tarafından Oluşturulan İçerik ve bir izleme sistemi yönetmek yardımcı olmak için ek bir dizi araç sunuyor.

Yerelleştirme sorunları dikkat: ne bir dilde bir sövgü başka bir gayet normal bir kelime olabilir.

Bu bir güncel örnek: ebay feedback "kötü sözler" filtrelemek için bir sözlük yaklaşım kullanır. Eğer Almanca çeviri girmeye çalışırsanız ("das war eine perfekte Transaktion") "bu mükemmel bir işlem oldu", ebay nedeniyle kötü sözlerle geri reddeder.

Neden? Için Almanca kelime "savaş" olduğunu "oldu", ve "savaş", "kötü sözler" ebay sözlükte Çünkü.

Yani yerelleştirme sorunları sakının.

OT: Ben bir ya da iki yıl önce kötü bir kelime listesi ararken çocukça zevk sürü var. O benim küfür filtreleme deneyimlerinden kazandığı tek olumlu şey.

Ben yaklaşık 20 km Scunthorpe canlı bu yazıyı okurken göz önünde bulundurunuz.

I (www.webpurify.com) kendi küfür filtre yazmaya çalışıyorum deli sürebilirsin WebPurify kullanarak başarı bir sürü vardı, bu adamlar anladım var gibi görünüyor.

Ben partiye biraz geç kaldım, ama ben bu okuyanlardan bazıları için işe yarayabilecek bir çözüm var. Bu javascript yerine php, ama bunun için geçerli bir sebebi var.

Tam açıklama, ben bu eklenti yazdım ...

Her neyse.

Ben gittin yaklaşım "Opt-In" onların küfür filtreleme için bir kullanıcıya izin vermek için olduğunu. Temelde küfür varsayılan olarak izin verilecektir, ama benim kullanıcıların okumak istemiyorsanız, onlar yok. Bu aynı zamanda "l33t sp3 @ k" sorunu ile yardımcı olur.

Konsepti müşterinin hesabının küfür filtreleme sağlayan ise sunucu tarafından enjekte alır basit bir eklentisi. Oradan, o yemin ediyor örtecek sadece bir kaç basit çizgileri bulunuyor.

Here's the demo page
http://profanityfilter.chaseflorell.com/

<div id="foo">
    ass will fail but password will not
</div>

<script>
    // code:
    $('#foo').profanityFilter({
        customSwears: ['ass']
    });
</script>

result

*** Başarısız ama şifre olacak değil

Açıkçası, ben onları "sistem kandırmak" kelimeleri almak ve sadece bana olan yerine, onları yasaklamak izin verirdim. Ama aynı zamanda programlama daha basit hale getirir.

Ne yaparım böylece gibi bir regex filtre uygulamak olduğunu: /[\s]dooby (doo?)[\s]/i veya kelime başkalarına öneki, /[\s]doob(er|ed|est)[\s]/. Bu assuaged gibi mükemmel geçerli olduğu, filtreleme sözcükleri önleyecek, ancak yeni bir bilgi varsa da diğer varyantları bilgi ve gerçek filtreyi güncelleme gerektirir. Açıkçası bütün bu örnekler, ancak bunu kendiniz nasıl karar olurdu.

Ben aslında bunları bilmek istemiyorum ben, bilmiyorum tüm kelimeleri yazın değilim.

Yapmak değil. Sadece sorunlara yol açar. Ben küfür filtreleri ile One clbuttic kişisel deneyim ben ya da bu yönde bir şey "bir kaç saat için Hancock için köprü üzerinde başlığı" olduğunu söz için bir IRC kanalında yasaklandı / tekme oldu zamanıdır.

Ben daha bu tartışmada kadar HanClinto adlı yazı ile katılıyorum. Ben genelde dize maç giriş metin için normal ifadeleri kullanabilirsiniz. Başlangıçta belirtildiği gibi açıkça "bloke" listesinde net popüler yazma her hile formu için hesap var gibi ve bu, boşuna bir çabadır.

Diğerleri sansür etiğini tartışıyor iken bir yan not olarak, ben bir çeşit web üzerinde gerekli olduğunu kabul etmelisiniz. Bazı insanlar bu insanların büyük bir vücut için anında saldırgan olabilir çünkü sadece argo gönderme zevk ve kesinlikle yazarın adına hiçbir düşünce gerektirir.

Fikirler için teşekkür ederiz.

HanClinto kuralları!

Ben konunun boşuna katılıyorum, ama bir filtre olması varsa, Ning ait kontrol Boxwood:

Şimşir bir metin parçası içinde birden fazla kelime hızlı değiştirilmesi için bir PHP uzantısıdır. Bu harfe duyarlıdır ve harf büyüklüğüne duyarsız eşleşme destekler. Bu çalışır metin UTF-8 olarak kodlanmış olması gerekir.

Ayrıca daha fazla bilgi için bu blog yazısı bakın:

Arama ve algoritma aramak için kelime listesinde daha fazla kelime ile yavaş almaz değiştirin - Şimşir ile, arama terimlerinin listenizi sürece istediğiniz gibi olması olabilir. Tüm arama terimleri bir tray bina ve sonra sadece bir kez konu metni tarar, trayın unsurları yürürken ve metin karakter bunları karşılaştırarak çalışır. Bu harf duyarlı veya duyarsız eşleştirme, ABD-ASCII ve UTF-8 destekler ve mantığı kontrol sınır bazı İngilizce-merkezli kelime var.