Türkiye Online Medya Araştırması

İçeriğin rss beslemesi kullanımda değil 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.

 1 2 »  son »
adres ozdemit profilini göster
tolga özdemir 24.05.2009 16:23:44
En iyi cevap mı ?
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

adres MotionCoder profilini göster
Mehmet KARACA 24.05.2009 17:19:10
En iyi cevap mı ?
Faydalı cevap

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..<<

adres aerkanc profilini göster
Ahmet Erkan ÇELİK 24.05.2009 17:38:36
En iyi cevap mı ?

@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ı :(

adres Gundii profilini göster
Selman Kurt 25.05.2009 08:04:14
En iyi cevap mı ?
Faydalı cevap
adres iersoy profilini göster
İbrahim Ersoy 25.05.2009 09:34:05
En iyi cevap mı ?

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

adres aerkanc profilini göster
Ahmet Erkan ÇELİK 25.05.2009 11:14:32
En iyi cevap mı ?

@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.

adres iersoy profilini göster
İbrahim Ersoy 25.05.2009 12:05:44
En iyi cevap mı ?

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?

adres aerkanc profilini göster
Ahmet Erkan ÇELİK 27.05.2009 11:38:07
En iyi cevap mı ?
Faydalı cevap

@İ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

adres Safakizilkaya profilini göster
Safa kızılkaya 27.05.2009 12:51:57
En iyi cevap mı ?

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.

adres aerkanc profilini göster
Ahmet Erkan ÇELİK 27.05.2009 14:08:04
En iyi cevap mı ?

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.

adres iersoy profilini göster
İbrahim Ersoy 27.05.2009 16:13:16
En iyi cevap mı ?

:)

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...

adres aerkanc profilini göster
Ahmet Erkan ÇELİK 27.05.2009 17:12:56
En iyi cevap mı ?

@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.

adres Gazing profilini göster
Yağız Gürgül 27.05.2009 20:31:03
En iyi cevap mı ?
Faydalı cevap

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.

adres aerkanc profilini göster
Ahmet Erkan ÇELİK 27.05.2009 21:18:04
En iyi cevap mı ?
Faydalı cevap

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

adres MeHMeTBaY profilini göster
mehmet bay 27.10.2009 09:55:19
En iyi cevap 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; }

 1 2 »  son »

aç-kapa Bu Yazıyı Tutanlar

yeni üyelik | şifremi unuttum

aç-kapa 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

aç-kapa Yarışma 3. Uluslararası Ekslibris Yarışması: İstanbul 2010

3. Uluslararası Ekslibris Yarışması: İstanbul 2010

İstanbul Ekslibris Dernegi, Feyziye Mektepleri Vakfı ve Işık Üniversitesi, kitaplar için mülkiyet işareti olarak kabul edilen ve üzerinde estetik dege...
Kategori: Yarışma

aç-kapa Konferans Yeni Medya ve Etkileşim Konferansı 2010 - Marmara Üniversitesi

Yeni Medya ve Etkileşim Konferansı 2010 - Marmara Üniversitesi

Generally speaking, the term "New" brought about debates. We try to open up and elucidate the term "New" along with "Interact...
Kategori: Konferans

aç-kapa Konferans 3. Uluslararası Gelecek İçin Öğrenme Alanında Yenilikler Konferansı 2010: e-Öğrenme

3. Uluslararası Gelecek İçin Öğrenme Alanında Yenilikler Konferansı 2010: e-Öğrenme

Konferans ile ilgili ayrıntılı bilgiye aşağıdaki bağlantıdan ulaşabilirsiniz: http://www.futurelearning.org.tr/katilim_cagrisitr.pdf ...
Kategori: Konferans

üyeler Son Kahramanlar...

stats Kimler Burada? web stats

Son 1 dakika içinde MMIstanbul' da 64 (50 kayıtlı, 14 ziyaretçi) kullanıcı varmış. Login durumda olanlar aşağıda:

srkndmrc ...

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)

coldfusion mysql ubuntu
 
sponsor adobe istanbul