Soru - Cevap Bölümü
/ Kategori: Programlama
09/02/2010 - 07:51:13 cevap (18) Okunma : 1698 Bu yazıyı 2 kişi tuttu.
Küfür filtresi yapma
arkadaşlar, herkese iyi çalışmalar;
oyun içindeki mesajlaşma bölümü için bir küfür filtresi yapmaya çalışıyorum.
Web üzerinde bir çok örneği inceledim, bana oldukça yavaş algoritmalar olarak göründü. Çoğunlukla sabit bir kaç kelime üzerinden filtreleme yapıyorlar. Benim istediğim ise şöyle birşey:
bir kelime başında ve sonunda boşluk ,özel karakter, veya sayı içeren harf dizisi olarak algılanmalı.
Örn.
"kelime"
kelime
,kelime,
1kelime
küfür tek bir kelime de olabilir, bir cümle kalıbı da. Küfürlü kelime dizisi dışarıdan (veri tabanından yada XML dosyasından) alınacak.
Bu şartlar altında bul değiştir yapmam lazım. Filtreleme işini tüm mesajların dağıtıldığı RTMP server üzerinde de yapabilirim. Ancak bir şikayet opsiyonu da olacak. Şikat edildiğinde, oyun masasındaki tüm yazışmanın sansürsüz haliyle şikaterler veritabanına kaydedilmesi gerekiyor. Bu durumda da, gidip gelen mesajlara bir de mesajın sansürsüz halini eklemek gerekir.
En hızlı çalışan algoritmayı kurmak için düşünüyorum. Bu konuda sizlerinde fikirlerini almak isterim.
Cevaplar
( Faydalı Cevapları Göster )
merhaba muhtemelen denemissinizdir ama yinede yazıyım istedim.
ben flash içinde özel karakterler kullanmak için yazmıstım.
package MotionCoder
{
public class Replace
{
public static var rk:Array = [
{_old:'[r]', _new:'®' },
{_old:'[c]', _new:'©' }
];
public static function all( yazi:String ):String
{
for ( var i:uint = 0; i < rk.length; i++ ) {
yazi = yazi.split( rk[i]._old ).join(rk[i]._new )
}
return yazi;
}
}
}
kolaygelsin..<<
@tolga, makaleyi inceleyeceğim, ilk bakışta işe yarar bir yazı gibi görünü teşekkür ederim
@mehmet, cevabın için teşekkür ederim, bul değiştir, akla gelen ilk yöntem elbette ancak "ansiklopedi" gibi bir kelimeye sansür uygulayacaktır. Böyle bir duruma birde whitelist yaratmak gerekir ya da cümleyi önce kelimelere ayırmak gerekebilir. Ancak öyle bir duruma da da "k ü f ü r" gibi bir kelime filtreden kaçabilir. Wikipediada (swear filter) bu konulardan da bahsetmiş.
yani aşağı tükürsen sakal yukarı tükürsen bıyık durumları :(
http://www.aytekinmeral.com/blog/archives/100 Belki işini görür.
Ben de şöyle bir çözüm düşündüm...
"abdurrahman bisiklete bindi."
bu tarz bir örnekte aranılan küfürlü sözcüğün solunda yada sağında harfler olup olmadığını kontrol edebiliriz.
mesela bisiklet de solunda ve sağında harfler var.("bi" ve "let")
"s.k" kelimesinde ise ne solunda ne sağında harf var dolayısıyla küfürlü kelime ve küfür filtresi uygulanabilir.
Nasıl yaparsın hiç bilemiyorum ama bu tarz bir yaklaşım işini görür kanısındayım.
Kolay Gelsin
@selman cevabın için teşekkürler, bu örneği bende daha önce incelemiştim.
@İbrahim; şöyle bir senaryo yazalım. Bahsettiğin tarz bir algoritma ile çalışan bir küfür filtremiz olsun. Bu şekilde "bisiklet" sansürlenmeyecek elbette. Ama daha önce de bahsettiğim gibi "k ü f ü r" şeklinde aralarında birer kare boşluk bırakılarak yazılan bir sözcükte sansürlenmeyecek.
Bu sorun içinde şöyle bir çözüm önerisi var:
Önce tüm cümledeki whitespace karakterleri temizleyelim. Bölece "k ü f ü r" => "küfür" haline gelir. Biz de aradığımızı buluruz. Ama bu kezde "bisiklet" kelimesi yine sansüre uğradı.
işte işin içinden çıkamadığım nokta da burası.
Belki tek çözüm bir de whitelist oluşturmaktır. Ama bu kez arama bulma işleri çok yavaşlayacak.
Bence Şöyle Yapalım:
1. adım -> Aralarda Boşluk varsa Kaldırılsın.ve normal kelimeye dönüştürülsün.
2. adım -> Kelime nin sağında yada solunda harf olup olmadığı kontrol edilsin
3. adım -> Kelimenin sağında veya solunda harf varsa filtrelenmesin.Olduğu gibi gösterilsin
4. adım -> Kelimenin sağında veya solunda harf yoksa küfürlü kelimeler listesine baksın.
5. adım -> Eğer kelime küfürlüyse filtrelensin,küfürlü değilse olduğu gibi gösterilsin
6. adım -> 1.adıma geri dönsün
böyle yapılabilir mi?
@İbrahim Bahsettiğiniz algoritma hatalı çalışacaktır. Aradaki boşluklar kaldırıldığında zaten tüm cümle tek bir kelime olacak ve tüm küfürlerin, başında ve sonunda harf olacaktır. Dolayısıyla hiç bir küfür filtrelenmeyecektir.
Benim bulduğum çözüm ise şöyle. BlackList içerisinde girilmiş olan kelimenin başına ve sonuna birer boşluk yerleştirerek, cümle içinde arama yaptıracağım ve bul değiştir yapacağım.
Örn. küfürlü kelime "xxx" ise arayacağım kelime " xxx " olacaktır.
Bundan sonra önemli olan sadece BlackList içine bir küfürü tüm varyasyonlarıyla birlikte eklemek olacaktır.
İlgilenen tüm arkadaşlara teşekkür ederim
En mantıklısı bir veritabanındaki veriyi referans almak ve denetimi bu veritabanına göre yapmak.
Hissedilir düzeyde bir yavaşlama olacağını sanmam.
Evet veri tabanındaki veriyi esas alacağım, ama şöyle bir yapı düşünüyorum. Oyun uygulaması açıldığı anda server'dan clien'a Kasalistedeki kelimeler iletilecek. Eğer veri tabanında bir güncelleme olursa yeni eklenen kelime yine tüm clientlara iletilecek. Her client kendi içinde gelen cümleyi sansürleyecek. Böylece her client üzerinde, mesajın hem sansürlü hemde sansürsüz hali bulunacak.
Eğer bir şikayet olursa, şikayet eden client üzerindeki tüm mesaj kayıtları sunucuya iletilecek.
:)
ben kelime kelime filtreleme yapılıyor diye düşünmüştüm.ona göre de yukarıdaki tarzda bir algoritma kurdum.siz sanırım tüm cümle yi filtreleyen bir algoritma yapmak istiyorsunuz
zor bir işlem olacak gibi...
@ibrahim kelime kelime de yapılsa, kelimeler boşluklardan bölünecektir. Dolayısıyla sizin algoritmanızdaki "Arada boşluk varsa kaldırılsın" adımı, yine geçersiz kalacaktır. Çünkü "k ü f ü r" kelimesini içeren cümle" şeklindeki bir cümleyi kelimelere ayırmaya kalkarsanız.
k
ü
f
ü
r
kelimesini
içeren
bir
cümle
şeklinde ayrışacaktır.
Pek düşünmedem hazırladığım bir algoritma:
var filtre:Array = ["Salak","gerizekalı"];
function kufurFilter(_cumle:String,_filtre:Array):Boolean {
var harfler:Array = _cumle.split("");
var bosluksuz:String = "";
for(var i:int=0; i<harfler.length; i++) {
bosluksuz=bosluksuz+(harfler[i]==" "?"":harfler[i]);
}
bosluksuz = bosluksuz.toLowerCase();
for(var b:int=0; b<_filtre.length; b++) {
if(findWord(bosluksuz,filtre[b].toLowerCase())) {
return true;
}
}
return false;
}
function findWord(e:String,b:String):Boolean {
var el:Array = e.split("");
var bl:Array = b.split("");
//
for(var i:int=0; i<e.length; i++) {
if(el[i]==bl[0]) {
var buldu:Boolean=true
for(var j:int=0; j<bl.length; j++) {
if(el[i+j] != bl[j]) {
buldu=false;
}
}
if(buldu) {
return true;
}
}
}
return false;
}
trace(kufurFilter("Sen Salaksın",filtre)); //true - küfür etmiş
trace(kufurFilter("araba geride kalmış",filtre)); //false - küfür yok
trace(kufurFilter("Geri zekalısın!!",filtre)); //true - küfür etmiş
trace(kufurFilter("Sen tam bir s a l a k s ı n",filtre)); //true - küfür etmiş
trace(kufurFilter("bilgisayarlar geri zekalıymış",filtre)); //true - küfür etmiş BUG
Algoritma ne kadar iyi olursa olsun, bilgisayar insan gibi en azından günümüzde düşünemeyeceğinden böyle bir filtre otomatik yapılamaz. Mutlaka filtrelenmesi gereken yazıları birisi kontrol etmeli.
yağız gerçekten güzel bir çalışma olmuş. Ellerine sağlık; Ayrıca ilgin için teşekkürler.
Ancak ilk yazımda da belirttiğim kusur burada da var. Örn:
"Asalak yaşıyan canlı" // küfürlü çıkacaktır.
boşluklar gidince içinde "salak" geçiyor çünkü;
mesajlaşma esnasında, türlü cambazlıklarla küfür edilmesi insanların anlayabileceği birşey. Ama küfür olmayan bir mesajın filtrelenmesi insanların tepkisini toplayacak birşey.
Burada oturmuş, ona olmaz, bu yanlış diye ahkam kesiyormuş gibi görünmek istemiyorum. Ama gerçekten beni çok uğraştıran bir mevzu var burada. Burada yazılan cevapların da çok faydası dokunuyor. İşim bitince yazdığım class'ı buradan paylaşırım
private function sepetitemkontrol(urunstr:String):int
{
var i:int;
var bi:int;
bi=-1;
for (i=0;i<SEPET_EKLE.list.length;i++)
{
if (SEPETEKLE.list.getItemAt(i).URUNID==urunstr)
{
bi=i;
}
}
return bi;
}
Etkinlikler
Konferans
XII. Akademik Bilisim Konferansı
XII. Akademik Bilisim Konferansı
II. AB'10
XII. Akademik Bilisim Konferansı 10-12 Şubat
Mugla Üniversitesi
Üniversitelerde bilgi teknolojileri konusunda ilgili grupları biraraya
...
Kategori:
Konferans
Kimler Burada? 
Son 1 dakika içinde MMIstanbul' da 64 (50 kayıtlı, 14 ziyaretçi) kullanıcı varmış. Login durumda olanlar aşağıda:
MMIstanbul Blog'undan
Blog Bölümü Blogevi.com'a Taşınıyor
Selam arkadaşlar MMIstanbul'da , tasarımcı ve programcıların blog yazılarını "feedleyerek" MMIstanbul okurlarını MMIstanbul dışın ...
7.500'üncü üyemiz Cem Koç!
Neler Yapılabilir?
500 Hatası Hakkında!
Reklam, MMIstanbul ve Yeni Projeler (Durumumuz Bu Tarzında)










Faydalı cevap
Sanırım bu makale işine yarayabilir.. Bayesian filtresi denilen bir yöntem kullanabilirsin, spam filtreleri de böyle yapılıyor bildiğim kadarıyla..
http://www.process.com/precisemail/bayesian_filtering.htm