İyi bir küfür filtresini nasıl uygularsınız?


208

Birçoğumuz kullanıcı girişi, arama sorguları ve giriş metninin potansiyel olarak küfür veya istenmeyen dil içerebileceği durumlarla ilgilenmemiz gerekir. Çoğu zaman bunun filtrelenmesi gerekir.

Çeşitli dillerde ve lehçelerde yeminli kelimelerin iyi bir listesini nerede bulabilirim?

İyi listeler içeren kaynaklar için kullanılabilir API'lar var mı? Ya da belki bazı parametrelerle "evet bu temiz" veya "hayır bu kirli" diyen bir API?

$$, azz veya a55 gibi sistemi kandırmaya çalışan insanları yakalamak için iyi yöntemler nelerdir?

PHP için çözüm sunarsanız bonus puanları. :)

Düzenleme: Programlı sorundan kaçının diyen yanıtlara yanıt:

Örneğin, bir kullanıcı hassas bir topluluk havuzuna eklenen resimleri bulmak için genel resim aramasını kullanabildiğinde bu tür bir filtre için bir yer olduğunu düşünüyorum. Eğer "penis" arayabilirlerse, büyük olasılıkla pek çok resim alacaklardır, evet. Bunun resimlerini istemiyorsak, kelimenin bir arama terimi olarak önlenmesi, kabul edilebilir bir yöntem olmasa da, iyi bir bekçi. Kelime listesini ilk etapta almak asıl soru.

Bu yüzden gerçekten tek bir token kirli olup olmadığını anlamak için bir yol söz ve sonra sadece izin vermeyin. Tamamen komik "uzun boyunlu zürafa" referansı gibi bir duyguyu engellemekten rahatsız olmazdım. Orada yapabileceğiniz hiçbir şey yok. :)


12
En iyi cevapların programlama zorluğundan varoluşçu ve yenilgici sapmalar olması utanç vericidir. Mechanical Turk gibi "cyborg" hesaplama hizmetleri buhar kazanıyor ve neredeyse tüm yazılımlar sosyalleşiyorsa, kırmızı bayrak içerikli bir sezgisel tarama yapmak ve bir moderatörün dikkatine sunmak her zamankinden daha önemli!
JasonSmith

10
Lütfen özellikle de i18n yapıyorsanız, dil bağlamında dikkatli olun. Bir keresinde "Sanal Ortamda Görselleştirme" için Türkçe olan "Sanal Görsel Görselleştirme" adlı kursu için bir Google Grubu kurmaya çalıştım. Google, başlık "anal" kelimesini içerdiğinden reddedecek kadar aptalcaydı . Sanal [tr] = Sanal [en] ve Google utanmadan beni küfür etmekle suçladı! : D Lütfen bunun gibi garip şeylerin olmasına izin vermeyin.
edgerunner

İspanyolca kelime için arama yaparsanız ne olur ? Aslında Google Görseller filtresini bu şekilde kullanabilirsiniz (başka bir dile yerelleştirilmişseniz).
yeni123456

Başka bir öneri bu kelimeleri yasaklamak değil, onları kullanan kullanıcıları kaydetmek olacaktır. Bir kullanıcı / IP 2, 3 veya daha fazlasını isterse, o kişiyi engelleyin. Hiçbiri kusursuz değil, ama bence engellenmesi ve 'kedi' yerine 'kabarık beyaz tavşan' yazmaktan çok kullanıcı / IP / her ikisini de değiştirmek zorunda değilsiniz. Bir kısmı, kullanıcılar NE kullanamayacakları kelimeleri veya ifadeleri bilmiyorlar, bu yüzden farklı kötü kelimeleri yasaklandıkça kolayca tahmin edemiyorlar.
Francisco Presencia

1
Küfür filtreleri kötü bir fikirdir. Sistemi kandırmaya çalışan biri ("Fudge!") Ve tamamen uygun bir şey hakkında meşru bir şekilde konuşan biri ("Çikolata şekerlemeyi seviyorum.")
clickbait

Yanıtlar:


177

Müstehcenlik Filtreleri: Kötü Fikir mi, İnanılmaz Bir Şekilde Kötü Fikir mi?

Ayrıca, Toontown'un SpeedChat'in Anlatılmamış Tarihi'ni de unutamam , burada "güvenli kelime beyaz listesi" kullanmanın bile 14 yaşında bir çocuğu çabucak atlamasıyla sonuçlandı: "Uzun boyunlu Zürafamı kabarık beyaz tavşana yapıştırmak istiyorum ."

Alt satır: Sonuçta, uyguladığınız herhangi bir sistem için, insan incelemesinin (akran ya da başka türlü) kesinlikle bir alternatifi yoktur. Sürüşten kurtulmak için temel bir araç uygulamaktan çekinmeyin, ancak belirlenen trol için kesinlikle algoritmaya dayalı olmayan bir yaklaşıma sahip olmalısınız.

Anonimliği ortadan kaldıran ve hesap verebilirlik getiren bir sistem (Stack Overflow'un iyi yaptığı bir şey), özellikle John Gabriel'in GIFT'siyle savaşmaya yardımcı olmak için de yararlıdır.

Ayrıca, başlamak için küfür listelerini nereden alabileceğinizi sordunuz - kontrol etmek için açık kaynaklı bir proje Dansguardian - varsayılan küfür listeleri için kaynak koduna bakın. Ayrıca, sizin için yararlı bir parlama noktası olabilecek proxy için indirebileceğiniz ek bir üçüncü taraf İfade Listesi de vardır.

Düzenleme soruya yanıt olarak düzenleme: Yapmaya çalıştığınız konu hakkında açıklama için teşekkürler. Bu durumda, sadece basit bir kelime filtresi yapmaya çalışıyorsanız, bunu yapmanın iki yolu vardır. Birincisi, sansürlemek istediğiniz tüm yasaklı ifadelerle tek bir uzun regexp oluşturmak ve sadece onunla bir regex bulma / değiştirme yapmaktır. Aşağıdaki gibi bir normal ifade:

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

ve isabet için toptan testi yapmak üzere preg_match () kullanarak giriş dizenizde çalıştırın ,

veya boşlaştırmak için preg_replace () yöntemini kullanın.

Ayrıca bu işlevleri tek bir uzun normal ifade yerine dizilerle yükleyebilirsiniz ve uzun sözcük listeleri için daha yönetilebilir olabilir. Dizilerin esnek bir şekilde nasıl kullanılabileceğine ilişkin bazı iyi örnekler için preg_replace () işlevine bakın .

Ek PHP programlama örnekleri için, * kelimesini sansürlenmiş sözcüklerden merkez harfleri dışarıda bırakan kelime filtreleme için biraz gelişmiş bir genel sınıf ve bu PHP örneğine sahip olan önceki Stack Stackflow sorusu için SQL tabanlı filtrelenmiş kelime yaklaşımı - gereksiz bulursanız, leet-speak compensator'dan vazgeçilebilir).

Ayrıca ekledi: " İlk etapta kelimelerin listesi alınıyor gerçek bir sorudur. " - Önceki Dansgaurdian bağlantıların bazı ek olarak, bulduğun bu kullanışlı .zip yardımcı olmak için 458 kelimelik.


@JPLemme: Evet olmalı - daha sonra [sic] eklemeliydim, çünkü Atwood bunu böyle yazdı. :)
HanClinto

"Club Penguin" her gün küfür filtrelerine yüzlerce giriş ekliyor : raphkoster.com/2008/05/09/…
Frank Farmer

6
Normal ifade seçeneklerinizin etrafındaki bir kelime sınır sarıcı, clbuttic hatayı önleyecektir
cjk

@ck: Sadece yanlış yazılmış kelimeleri "F * ckkkk yo 'asssss" filtrelemekten endişe etmiyorsanız :) Trollerimin çok hassas yazım kurallarına güvendiğime emin değilim.
HanClinto

1
Eğer meşhur atın ağzından "Kabarık Beyaz Tavşan" hikayesini duymak istiyorsanız, bu bir podcast bölümü şimdi: socialmediaclarity.tumblr.com/post/70499341079/…
F. Randall Farmer

44

Bu sorunun oldukça eski olduğunu bilsem de, sıkça karşılaşılan bir soru ...

Hem küfür filtreleri için hem bir neden hem de belirgin bir ihtiyaç vardır ( buradaki Wikipedia girişine bakın ), ancak çok farklı nedenlerden dolayı genellikle% 100 doğru olmaktan yoksundurlar; Bağlam ve doğruluk .

(Tamamen) neyi başarmaya çalıştığınıza bağlıdır - en temelde, muhtemelen " yedi kirli kelimeyi " ve daha sonra bazılarını örtmeye çalışıyorsunuz ... Bazı işletmelerin küfürün en temelini filtrelemesi gerekir: temel kelimeleri, URL'leri veya hatta kişisel bilgileri vb.), ancak başkalarının yasadışı hesap adlandırmalarını (Xbox Live bir örnektir) veya çok daha fazlasını önlemeleri gerekir ...

Kullanıcı tarafından oluşturulan içerik yalnızca potansiyel küfür sözcükleri içermez, ayrıca aşağıdakilere yönelik rahatsız edici referanslar da içerebilir:

  • Cinsel eylemler
  • Cinsel yönelim
  • Din
  • Etnik köken
  • Vb...

Ve potansiyel olarak, birden fazla dilde. Shutterstock, bugüne kadar 10 dilde temel kirli kelimeler listesi geliştirdi , ancak hala temel ve 'etiketleme' ihtiyaçlarına yönelik. Web'de kullanılabilecek başka listeler de vardır.

Bunun bir tanımlanmış bilim olmadığını kabul yanıta katılabilir ve sıra dil bir sürekli gelişen bir meydan okuma ama% 90 yakalama oranı% 0'dan iyidir biri. Bu tamamen sizin hedeflerinize - ne elde etmeye çalıştığınıza, sahip olduğunuz desteğe ve farklı türdeki küfürleri ortadan kaldırmanın ne kadar önemli olduğuna bağlıdır.

Bir filtre oluştururken, aşağıdaki öğeleri ve bunların projenizle ilişkilerini dikkate almanız gerekir:

  • Kelimeler / ifadeler
  • Kısaltmalar (FOAD / LMFAO vb.)
  • Yanlış pozitifler ('mishit', 'scunthorpe' ve 'titsworth' gibi kelimeler, yerler ve isimler)
  • URL'ler (porno siteleri bariz bir hedeftir)
  • Kişisel bilgiler (e-posta, adres, telefon vb. - varsa)
  • Dil seçimi (genellikle varsayılan olarak İngilizce)
  • Denetleme (kullanıcı tarafından oluşturulan içerikle nasıl etkileşime girebilirsiniz ve bununla neler yapabilirsiniz)

Kolaylıkla% 90 + küfür elde eden bir küfür filtresi oluşturabilirsiniz, ancak asla% 100'e ulaşmazsınız. Bu mümkün değil. % 100'e yaklaşmak istediğinizde, zorlaşıyor ... Geçmişte günde 500.000'den fazla gerçek zamanlı mesajla uğraşan karmaşık bir küfür motoru oluşturduktan sonra, aşağıdaki önerileri sunarım:

Temel bir filtre şunları içerir:

  • Geçerli küfürlerin bir listesini oluşturma
  • Küfürlerin türetilmeleri ile ilgili bir yöntem geliştirme

Orta derecede karmaşık bir dosyalayıcı içerir (Temel bir filtreye ek olarak):

  • Genişletilmiş türevlerle başa çıkmak için karmaşık desen eşleşmesi kullanma (gelişmiş normal ifade kullanarak)
  • Leetspeak (l33t) ile başa çıkmak
  • Yanlış pozitiflerle başa çıkmak

Karmaşık bir filtre aşağıdakileri içerir (Orta bir filtreye ek olarak):

  • Beyaz ve kara listeler
  • İfadelerin / terimlerin saf bayesian çıkarım filtrelemesi
  • Soundex işlevleri (bir kelimenin diğerine benzediği yerlerde)
  • Levenshtein mesafesi
  • Stemming
  • Bir filtreleme motoruna örnek olarak veya eşleşmelerin rehberlik olmadan yeterince doğru olmadığı durumlarda rehberlik etmesine yardımcı olan insan moderatörler (kendini / sürekli gelişen bir sistem)
  • Belki bir çeşit AI motoru

28

Bunun için iyi bir kütüphane bilmiyorum, ama ne yaparsanız yapın, içeri girmenize izin verdiğinizden emin olun. Bir alt dize olarak "ass" içerdiğinden, bir kullanıcı adı olarak "mpassell" kullanmama izin vermez sistemleri ele aldım. Kullanıcıları yabancılaştırmanın harika bir yolu!


17
ya da uçan bir uzay oyununda "kokpit" yasaklayan
Shinhan

24

Benim iş görüşmem sırasında, benimle görüşen CTO şirketi Java'da yazdığım bir kelime / web oyununu denedi. Tüm Oxford İngilizce sözlüğünün kelime listesinden, tahmin edilen ilk kelime neydi?

Tabii ki, İngilizce'deki en kötü kelime.

Her nasılsa, hala iş teklifim var, ama sonra bir küfür kelime listesini izledim (bunun aksine değil) ) ve tüm kötü kelimeler olmadan (listeye bakmak zorunda kalmadan) yeni bir sözlük oluşturmak için hızlı bir komut dosyası yazdım .

Özel durumunuz için, aramanın gerçek kelimelerle karşılaştırılması, böyle bir kelime listesiyle gitmenin yolu gibi geliyor. Alternatif stiller / noktalama işaretleri biraz daha fazla çalışma gerektirir, ancak kullanıcıların bir sorun için yeterince sık kullanacağından şüpheliyim.


8
Konu dışı, ama en kötü kelime nedir? Her zaman c kelimesini veya n kelimesini düşündüm, ancak insanların f kelimesinin olduğunu düşündüklerini varsayıyorum
Jeff

2
"Kullanıcıların bunu bir sorun olmak için yeterince sık kullanacağından şüpheliyim" Umarım hayatta kalır . Kullanıcılar filtreyi karıştırdıklarında, atlatma yollarını bulmaya çalışacaklardır. Harflerin, boşlukların tek yerleştirilmesi vb. Yerine sayılarla değiştirilmesi kadar basit olabilir).
BryanH

21

programcı cocksure olsa ve tüm çıplak gelişmeleri takip etse bile, bir küfür filtreleme sistemi asla mükemmel olmaz.

Bununla birlikte, herhangi bir 'yaramaz kelime' listesinin yanı sıra diğer listelerin de gerçekleştirilmesi muhtemeldir, çünkü altta yatan sorun dil anlamadır mevcut teknoloji ile oldukça zor olan

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

  1. sözlüğünü sık sık güncellemeye hazır ol
  2. yanlış pozitifleri (örneğin "klasik" yerine "clbuttic") ve yanlış negatifleri (ayıp!

1
Her iki tarafı da boşluklu olan kelimeyi tespit et, sonra tam dur, Hayır?
David D

1
H3Hiç kimse, sadece en önemsiz durumlarda çalışır; burada insanlarla uğraşıyoruz ve oldukça zekiler :)
Steven A. Lowe

14

Rahatsız edici kullanıcı girişini önlemenin tek yolu tüm kullanıcı girişlerini önlemektir.

Kullanıcı girişine izin vermekte ve denetlenmeye ihtiyaç duyuyorsanız, insan denetleyicileri dahil edin.



7

"Sistemi kandırın" alt sorusu ile ilgili olarak, aramanızı yapmadan önce hem "kötü kelime" listesini hem de kullanıcı tarafından girilen metni normalleştirerek bunu kaldırabilirsiniz. örneğin, [z $ 5] değerini "s", [4 @] biçimine dönüştürmek için bir dizi normal ifade (veya PHP varsa tr ) kullanın i "a", vb , ardından normalleştirilmiş "kötü kelime" listesini normalleştirilmişle karşılaştırın Metin. Normalleştirmenin potansiyel olarak ek yanlış pozitiflere yol açabileceğini unutmayın, ancak şu anda gerçek durumları düşünemiyorum.

En büyük zorluk, insanların alıntı yapmasına izin verecek bir şey bulmaktır. "peni s" bloke ederken Kalem kılıçtan daha güçlüdür bulmaktır.


14
Expert-exchange.com ve pen-island.com'u unutmayın; bu site URL'leri bir zamanlar tire içermiyordu.
BryanH

7

Yerelleştirme sorunlarına dikkat edin: bir dilde küfür kelimesi başka bir dilde tamamen normal bir kelime olabilir.

Bunun güncel bir örneği: ebay, "kötü kelimeleri" geri bildirimden filtrelemek için bir sözlük yaklaşımı kullanır. "Bu mükemmel bir işlemdi" ("das war eine perfekte Transaktion") Almanca çevirisini girmeye çalışırsanız, ebay kötü kelimeler nedeniyle geri bildirimi reddeder.

Neden? Çünkü "Almanca" kelimesi "savaş" ve "savaş" ebay sözlüğünde "kötü kelimeler".

Bu yüzden yerelleştirme sorunlarına dikkat edin.


6

Digg / Stackoverflow gibi, kullanıcıların müstehcen içeriği aşağı indirebileceği / işaretleyebileceği bir şey yapabiliyorsanız ...

O zaman tek yapmanız gereken "yaramaz" kullanıcıları gözden geçirmek ve kuralları ihlal ederse onları engellemek.


4

Partiye biraz geç kaldım, ama bunu okuyanlar için işe yarayabilecek bir çözümüm var. Php yerine javascript var, ancak bunun geçerli bir nedeni var.

Tam açıklama, bu eklentiyi yazdım ...

Neyse.

Gittiğim yaklaşım, bir kullanıcının küfür filtrelemesine "Katılım" yapmasına izin vermektir. Temel olarak küfür varsayılan olarak izin verilir, ancak kullanıcılarım okumak istemiyorsa, bunu yapmak zorunda değildir. Bu aynı zamanda "l33t sp3 @ k" sorununa da yardımcı olur.

Kavram basit Müşterinin hesabı küfür filtrelemeyi etkinleştiriyorsa sunucu tarafından enjekte edilen eklentidir. Oradan, yeminleri lekeleyen sadece birkaç basit çizgi var.

İşte demo sayfası
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>

sonuç

*** başarısız olur, ancak şifre olmaz


İşte bu yanıta eşlik edecek bir jsFiddle çalışma demosu .
Chase Florell

Çok saf. Filtre uygulamadıa$$
Kanat oyuncusu Sendon

3
@EmperorAiman ​​asla l33t konuşmayı filtrelemek için tasarlanmamıştı . Bunu filtrelemeyi tavsiye etmiyorum, çünkü kaybedilen bir savaş. Gönderdiğim küfür filtresi "kullanıcıların küfür filtrelemesine" kaydolmasına "izin vermek için oluşturuldu. yani varsayılan olarak küfür sağlayan bir sitede en iyi şekilde kullanılır. Filtrelemek a$$istiyorsanız, filtre listesine eklersiniz.
Chase Florell

4

12 dilde 2200 kötü kelime topladım: en, ar, cs, da, de, eo, es, fa, fi, fr, merhaba, hu, o, ja, ko, nl, hayır, pl, pt, ru, sv , th, tlh, tr, zh.

MySQL döküm, JSON, XML veya CSV seçenekleri mevcuttur.

https://github.com/turalus/openDB

Bu SQL'i DB'nize çalıştırmanızı ve kullanıcı bir şey girdiğinde her seferinde kontrol etmenizi öneririm.


2

Yapma. Sadece sorunlara yol açar. Küfür filtreleriyle yaşadığım bir kişisel deneyim, bir IRC kanalından "birkaç saatliğine Hancock'a köprüden geçiyorum" ya da bu konuda bir şey olduğumu belirtmek için atıldığım / yasaklandığım zamandır.


2

Bu tartışmada HanClinto'nun gönderisini kabul ediyorum. Genellikle giriş metni dize eşleşmesi için normal ifadeler kullanın. Ve bu boş bir çabadır, çünkü başlangıçta belirttiğiniz gibi, "engellenenler" listenizde net olarak popüler olan her hile formunu açıkça hesaba katmanız gerekir.

Bir yan notta, diğerleri sansür etiğini tartışırken, web'de bir formun gerekli olduğunu kabul etmeliyim. Bazı insanlar sadece büyük bir insan kitlesine anında saldırgan olabileceğinden ve yazarın parçası üzerinde kesinlikle bir düşünce gerektirmediği için sadece kaba konuşma göndermekten zevk alırlar.

fikirler için teşekkür ederiz.

HanClinto kuralları!


2

Filtrelemek istediğiniz bazı kötü kelimelerin iyi bir MYSQL tablosuna sahip olduğunuzda (bu iş parçacığındaki bağlantılardan biriyle başladım), şö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 />";

Eminim tüm bu değişiklikleri yapmanın daha etkili bir yolu var, ama anlamaya yetecek kadar akıllı değilim (ve bu verimsiz de olsa iyi görünüyor).

Kullanıcıların kaydolmasına izin vermenin yanına düşmeniz gerektiğine ve gerektiğinde küfür tablonuza filtre uygulamak ve eklemek için insanları kullanmanız gerektiğine inanıyorum. Her ne kadar hepsi yanlış bir pozitif (kötü olarak işaretlenmiş tamam kelime) ve yanlış negatif (kötü kelime geçer) maliyetine bağlıdır. Bu, sonuçta filtreleme stratejinizde ne kadar agresif veya muhafazakar olduğunuzu yönetmelidir.

Joker karakter kullanmak istiyorsanız da çok dikkatli olurum, çünkü bazen amaçladığınızdan daha zahmetli davranabilirler.


1

Açıkçası, "sistemi kandırmak" kelimelerini çıkarmasına izin verirdim ve onları yasakladım, ki bu sadece benim. Ancak programlamayı da kolaylaştırır.

Yapacağım gibi bir regex filtre uygulamak: /[\s]dooby (doo?)[\s]/iya da kelime başkalarına önekidir /[\s]doob(er|ed|est)[\s]/. Bunlar, tam olarak geçerli olan ancak diğer varyantlar hakkında bilgi sahibi olmayı ve yeni bir filtre öğrenirseniz gerçek filtreyi güncellemeyi gerektiren, tahsis edilmiş kelimeleri filtrelemeyi önleyecektir. Açıkçası bunların hepsi örnektir, ancak bunu kendiniz nasıl yapacağınıza karar vermeniz gerekir.

Bildiğim tüm kelimeleri yazmak üzereyim, onları gerçekten bilmek istemediğim zaman değil.


1

Konunun boşuna katılıyorum, ancak bir filtreniz varsa, Ning's Boxwood'a göz atın :

Boxwood, bir metinde birden çok kelimenin hızlı bir şekilde değiştirilmesi için bir PHP uzantısıdır. Büyük / küçük harfe duyarlı ve büyük / küçük harfe duyarlı olmayan eşleştirmeyi destekler. Üzerinde çalıştığı metnin UTF-8 olarak kodlanmasını gerektirir.

Daha fazla ayrıntı için bu blog yayınına da bakın:

Boxwood ile, arama terimleri listenizin istediğiniz kadar uzun olmasını sağlayabilirsiniz - arama ve değiştirme algoritması, aranacak sözcük listesinde daha fazla kelime ile yavaşlamaz. Tüm arama terimlerinden bir trie oluşturarak çalışır ve daha sonra konu metninizi yalnızca bir kez tarar, trie öğelerini aşağı doğru yürür ve metninizdeki karakterlerle karşılaştırır. ABD-ASCII ve UTF-8'i, büyük / küçük harfe duyarlı veya duyarsız eşleşmeyi destekler ve bazı İngilizce merkezli kelime sınır kontrol mantığına sahiptir.


1

Sonuç olarak, iyi bir küfür filtresi oluşturmak için 3 ana bileşene ihtiyacımız var, ya da en azından yapacağım şey bu. Bunlar:

  1. Filtre: bir kara listeye, sözlüğe veya buna benzer bir şeyi doğrulayan bir arka plan hizmeti.
  2. Anonim hesaba izin verme
  3. Kötüye Kullanımı Bildir

Bir bonus, doğru istismar gazetecileriyle katkıda bulunanları ve suçluyu cezalandıranları bir şekilde ödüllendirmek, örneğin hesaplarını askıya almak olacaktır.


1

Ayrıca oyunda geç, ama bazı araştırmalar yaparak ve burada tökezledi. Diğerlerinin de belirttiği gibi, otomatikleştirilmişse neredeyse imkansızdır, ancak tasarımınız / gereksiniminiz bazı durumlarda (ancak her zaman değil) küfür olup olmadığını gözden geçirmek için insan etkileşimlerini içerebilirse, ML'yi düşünebilirsiniz. https://docs.microsoft.com/tr-tr/azure/cognitive-services/content-moderator/text-moderation-api#profanity şu anda birçok nedenden dolayı şu anki seçimim:

  • Birçok yerelleştirmeyi destekler
  • Veritabanını güncellemeye devam ediyorlar, bu yüzden en son slangs veya dilleri takip etmek zorunda değilim (bakım sorunu)
  • Yüksek bir olasılık olduğunda (yani% 90 veya daha fazla) pragmatik olarak reddedebilirsiniz.
  • Küfür olabilecek veya olmayabilecek bir bayrağa neden olan bir kategoriyi gözlemleyebilirsiniz ve birisinin küfür olup olmadığını öğretmek için onu gözden geçirmesini sağlayabilirsiniz.

Benim ihtiyacım için, diğer kullanıcıların kullanıcı adını görebileceği / görebileceği halka açık ticari hizmete (Tamam, video oyunları) dayanıyordu / dayanıyordu, ancak tasarım saldırgan kullanıcı adını reddetmek için küfür filtresinden geçmesi gerekiyor. Bunun üzücü yanı, klasik "clbuttic" sorunun büyük olasılıkla gerçekleşeceğidir, çünkü kullanıcı adları genellikle birden çok kelimenin birleştirilmiş tek bir kelimesidir (en fazla N karakter) ... Yine Microsoft'un bilişsel hizmeti "Assist" i Metin olarak işaretlemez. HasProfanity = true, ancak kategorilerden birinin yüksek olma olasılığını işaret edebilir.

OP'nin sorguladığı gibi, "a $$" hakkında ne varsa, filtreden geçirdiğimde bir sonuç var: resim açıklamasını buraya giringördüğünüz gibi, bunun küfür olmadığını belirledi, ancak yüksek olasılıklı, bu yüzden öneriler olarak işaretler gözden geçirme (insan etkileşimleri).

Olasılık yüksek olduğunda, ya geri dönebilirim "Üzgünüm, bu isim zaten alınmış" (olmasa bile), sansür karşıtı kişilere ya da bir şeye daha az saldırgan olması için istemiyorsak insan incelemesini entegre etmek veya "Kullanıcı adınız canlı operasyon departmanına bildirildiyse, kullanıcı adınızın incelenmesini ve onaylanmasını veya başka bir kullanıcı adı seçilmesini bekleyebilirsiniz". Ya da her neyse...

Bu arada, bu hizmetin maliyeti / fiyatı amacım için oldukça düşük (kullanıcı adı ne sıklıkta değişiyor?), Ancak yine OP için tasarım daha yoğun sorgular gerektiriyor ve bunun için ödeme yapmak / abone olmak için ideal olmayabilir ML-hizmetleri veya insan incelemesi / etkileşimleri olamaz. Her şey tasarıma bağlıdır ... Ama tasarım faturaya uyuyorsa, belki de bu OP'nin çözümü olabilir.

İlgileniyorsanız, gelecekte yorumda eksilerini listeleyebilirim.


-2

Küfür filtreleri kötü bir fikirdir. Bunun nedeni, her küfür kelimesini yakalayamamanız. Eğer denerseniz, yanlış pozitifler alırsınız.

Kelimeleri Yakalamak

Diyelim ki F-kelimesini yakalamak istiyorsunuz. Kolay değil mi? İyi, görelim bakalım.

"Siktir" i bulmak için bir dizeyi kullanarak döngü yapabilirsiniz. Ne yazık ki, insanlar günümüzde filtreleri kandırıyor. Küfür filtresi "fuk" u almamıştı.

Kelimenin birden fazla yazımını ve varyantını kontrol etmeye çalışabilirsiniz, ancak bu kodunuzun performansını yavaşlatır. F-Word'ü yakalamak için "fuc", "Fuc", "fuk", "Fuk", "F ***" vb. Aramanız gerekir.

Masumiyetten Kaçınmak

Peki, büyük küçük harf duyarsız hale getirmeye ve boşlukları görmezden gelmeye "P u C k" yi yakalamaya ne dersiniz? Bu iyi bir fikir gibi gelebilir, ancak birisi "FUCK" ile küfür filtresini atlayabilir

Noktalama işaretlerini yok sayıyorsunuz.

Şimdi bu gerçek bir problem, çünkü “ Cehennem , oradaki!” Gibi bir cümle . "cehennem" ve "Wh ass up?" "eşek" olarak alır.

Ve filtreden çıkarmanız gereken bir sürü kelime var, örneğin "Eksilerini baştankara ", çünkü içinde "baştankara" var.

İnsanlar "Frack" gibi ikame sözcükleri de kullanabilirler. Siz de mi engelliyorsunuz? Peki ya "penis" için "kalem" dir? Programınızın dizenin iyi mi kötü mü olduğunu bilmek için yapay zekası yok.

Küfür filtreleri kullanmayın. Geliştirilmesi zor ve tarama kadar yavaş.


2
-1 OP sorusuna cevap vermez ve çoğunlukla bir görüş yorumudur. Bu yardımcı program için geçerli birçok kullanım durumu vardır. Örneğin, şirketin utanmaması için denetimden önce kaynak kodunun temizlenmesi.
davidjmcclelland

-3

Yapma.

Çünkü:

  • Clbuttic
  • Küfür OMG EVIL değil
  • Küfür etkili bir şekilde tanımlanamaz
  • Çoğu insan büyük olasılıkla küfürden "korunmak" hoşuna gitmez

Edit: Ben "sansür yanlış" diyen yorumcuyu kabul ederken, bu cevabın doğası değildir.


90
Bu cevapsız için 10 oy? Küfürü filtrelemek isteyen herkes ahlaki bir yarım zekâ olmalı mı? İyi keder. Bu geçerli bir soru ve sinsi sürerek yanıtlar ödüllendirilmemelidir. -1.
Kluge

12
@Kludge: "Yarım zekâyı ahlaklı" diyen tek kişi sensin, aslında bir küfür filtresi uygulamanın ahlaki doğası hakkında hiçbir şey söylemedim. Mitch, "yapma" deme nedenimin bir bölümünü ortaya çıkarıyor ve bu çok da zorlayıcı değil. Bazen "yapma", "nasıl yaparım?" [devamı]
göz kapağı kaybı

2
@eyelidlessness: Belki de tek kelimelik cevabınızı çok fazla okuduğum konusunda haklısınız. Ancak ayrıntılı bir şekilde açıklamadığınız için, itirazlarınızın ahlaki veya teknik gerekçelerle olup olmadığını anlayamadım. "Herhangi bir şekilde sansür kötü" diye bıktığımı itiraf edeceğim.
Kluge

5
-1. "Yapma", ahlaki veya teknik konulardan bağımsız olarak geçerli bir cevap değildir. İçeriğin içeriğine göre içeriği filtrelemenin mükemmel bir şekilde uygun olduğu birçok zaman vardır. Kadınların iç çamaşırlarını satan ve 'İncelemeler' özelliği sunan bir e-ticaret sitesi düşünün. Prepubescent erkeklerin sitenizi çöple kirletmesini gerçekten istiyor musunuz? Tabii ki değil. Ve belki de bir insan onay sürecine sahip olmak çok zahmetli. Çöplerle yorumları reddetmek için basit bir filtre iyi bir şeydir.
pspahn

3
@pspahn, "yapma" yanlış soruna çözüm isteyen herhangi bir sorunun doğru cevabıdır. İçeriğin denetlenmesi gereken kesinlikle geçerli durumlar vardır, ancak bir "küfür filtresi" değildir.
eyelidlessness
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.