← Previous · All Episodes · Next →
Bayesyen Filtreleme Yöntemlerini Geliştirmek Üzerine Çalışmalar ve Gelecek Planları (Better Bayesian Filtering) Episode 24

Bayesyen Filtreleme Yöntemlerini Geliştirmek Üzerine Çalışmalar ve Gelecek Planları (Better Bayesian Filtering)

· 33:59

|
"Paul Graham'ın 2003 tarihli bu makalesi, spam filtrelemesi üzerine çalışmalarını ve gelecek planlarını anlatıyor. Graham, spam filtrelemesinin metin sınıflandırmasının bir alt kümesi olduğunu ve bu alanda yapılan ilk çalışmaların oldukça eski olduğunu belirtiyor. Graham'ın kendi spam filtresi, %99.5 oranında spam yakalayabilmiş ve yanlış pozitiflerin oranı %0.03’ten az olmuştur. Bu sonuçlar, Graham’ın metin sınıflandırma tekniklerini kullanarak geliştirdiği algoritmasının etkinliğini göstermektedir. Makalede ayrıca, spam filtreleme tekniklerinin gelecekte nasıl geliştirilebileceği üzerine çeşitli öneriler sunulmuştur. Makale, spam filtreleme ve metin analizi konusunda ilgili olan herkes için yararlı bilgiler içermektedir.

---

# Bayesyen Filtreleme Yöntemlerini Geliştirmek Üzerine Çalışmalar ve Gelecek Planları (Better Bayesian Filtering)

Ocak 2003

_(Bu makale, 2003 Spam Konferansı'nda bir konuşma olarak sunuldu. Spam için Bir Plan adlı yazıda anlattığım algoritmanın performansını nasıl iyileştirdiğimi ve gelecekteki planlarımı burada ele alıyorum.)_

Hadi biraz zaman yolculuğu yapalım ve 2003 yılına gidelim. İşte o zamanlar, araştırma makalelerini değerlendiren bir algoritma üzerinde çalışıyordum. Bu algoritma, ""Spam için Bir Plan"" isimli çalışmam Slashdot'ta yayınlandıktan sonra ortaya çıktı. 

Spam filtrelemesi, metin sınıflandırmanın, ki bu oldukça tanınmış bir alandır, bir alt kategorisidir. Fakat Bayesci spam filtrelemesi konusunda ilk çalışmalar 1998 yılında aynı konferansta sunulmuştur. Bu çalışmalardan biri Pantel ve Lin [2] tarafından, diğeri ise Microsoft Araştırma Grubu [3] tarafından yapılmıştır.

Bu çalışmayı ilk duyduğumda biraz şaşırdım. Dört yıl önce insanlar Bayes filtrelemesini keşfetmişlerse, neden herkes bu yöntemi kullanmıyor ki? Makaleleri okuduktan sonra nedenini anladım. Pantel ve Lin'in geliştirdiği filtre, iki metod arasında daha etkili olsa da, sadece %92 oranında spam e-postaları yakalayabiliyordu ve maalesef %1.16 oranında da yanlış alarm veriyordu.

Bayesian spam filtresi yazmayı denediğimde, spam'ın yüzde 99.5'ini yakaladı ve yanlış pozitiflerin oranı yüzde 0.03'ten daha azdı [4]. Aynı deneyi yapan iki kişi çok farklı sonuçlar alınca insan haliyle endişelenir. Bu durum özellikle tedirgin edici çünkü bu iki sonuç seti birbirine zıt sonuçlara yol açabilir. Her kullanıcının farklı ihtiyaçları vardır, ancak bana kalırsa birçok kişi için yüzde 92 filtreleme oranı ve yüzde 1.16 yanlış pozitif oranı, filtrelemenin kabul edilemez bir çözüm olduğunu gösteriyor. Öte yandan, yüzde 99.5 başarı oranı ve yüzde 0.03'ten daha az yanlış pozitif oranı, filtrelemenin kabul edilebilir bir çözüm olduğunu gösteriyor.

Peki, neden bu kadar farklı rakamlar elde ettik? Pantel ve Lin'in sonuçlarını yeniden denemeyi düşünmedim ama makaleyi okuduktan sonra, bu farklılığın sebeplerini açıklayabilecek beş nokta gördüm.

Bir sebep, filtrelerini çok az veri üzerinde eğittikleri: 160 spam ve 466 spam olmayan mail. Bu kadar küçük veri setleriyle filtre performansı hala artıyor olmalı. Dolayısıyla, bu rakamlar algoritmalarının performansını doğru bir şekilde yansıtmayabilir, Bayesci spam filtrelemenin genel performansını söylemek zaten yanıltıcı olur.

Ama en önemli farkın, onların mesaj başlıklarını yoksaymaları olduğunu düşünüyorum. Spam filtreleri üzerinde çalışan biri için bu, oldukça garip bir karar gibi görünebilir. Ama ben de ilk filtrelerimi yazarken, başlıkları görmezden gelmiştim. Neden mi? Çünkü işin düzgün ve sade olmasını istemiştim. O zamanlar mail başlıkları hakkında pek bir şey bilmiyordum ve bana oldukça karışık ve anlamsız geliyordu. Buradan filtre yazanlara bir ders çıkarabiliriz: veriyi görmezden gelmeyin. Bu dersin çok açık olduğunu ve belirtmeye bile gerek olmadığını düşünebilirsiniz ancak ben bu dersi birkaç kez öğrenmek zorunda kaldım.

Üçüncü olarak, Pantel ve Lin, ""mailing"" ve ""mailed"" gibi kelimeleri köklerine, yani ""mail""e indirgedi. Bu durumu, çalıştıkları metin kümesinin çok küçük olmasına bağlamış olabilirler. Ancak eğer böyle düşünüyorlarsa, bu durum aslında gereksiz yere erken yapılmış bir optimizasyon olabilir.

Dördüncüsü, olasılıkları farklı hesapladılar. Onlar tüm belirteçleri kullanırken, ben sadece en önemli 15 tanesini kullandım. Eğer tüm belirteçleri kullanırsanız, genellikle daha uzun olan spam mesajları gözden kaçırırsınız. Yani birinin size, çok seviyeli bir pazarlama planı sayesinde nasıl zengin olduğuna dair uzun hikayesini anlattığı türden mesajları kaçırabilirsiniz. Ve bu tür bir algoritmayı spam gönderenlerin aşması oldukça kolay olur: sadece spam terimlerini dengede tutmak için büyük bir miktar rastgele metin eklemeleri yeterli olacaktır.

Son olarak, yanlış pozitifler konusunda önyargılı değillerdi. Bu, spam filtrelerinin en büyük zorluklarından biridir. Bir e-posta doğru bir şekilde spam olarak işaretlenirse, kullanıcı önemli bir mesajı kaçırabilir. Bu nedenle, yanlış pozitif oranını düşürmek, doğru pozitif oranını artırmaktan daha zor bir problemdir.

Bu deneyimlerden sonra, spam filtrelemesi konusunda daha fazla araştırma yapmaya karar verdim. Gelecekteki planlarım arasında, daha büyük veri setleri kullanmak, başlıkları daha iyi değerlendirmek, daha fazla belirteç kullanmak ve yanlış pozitif oranını düşürmek yer alıyor. Bu alanda daha fazla çalışma yapmak, spam filtrelemesini daha da geliştirmek için önemli bir adım olabilir.Her spam filtreleme algoritmasında, filtreleme oranını artırmak için bir düğme olmalı. Bu düğme, yanlış pozitif sonuçları azaltmaya yardımcı olabilir. Benim bu konudaki stratejim ise, spam olmayan metinlerdeki belirteç sayısını ikiye katlamak. 

Spam filtrelemeyi sadece bir metin sınıflandırma problemi olarak görmek pek de doğru değil. Evet, metin sınıflandırma tekniklerini kullanabilirsiniz, ama unutmayın ki karşımızda sadece metin değil, bir e-posta ve özellikle de spam var. E-posta, sadece düz metin değil, belirli bir yapısı olan bir şey. Spam filtreleme sadece sınıflandırma değil, yanlış pozitif sonuçların yanlış negatif sonuçlardan çok daha kötü etkileri olabilir ve bu sebeple onları farklı bir hata türü olarak ele almalıyız. Ve unutmayın, hata kaynağı sadece rastgele değişkenler değil, aynı zamanda filtrenizi devre dışı bırakmayı hedefleyen gerçek bir spam gönderici olabilir.

**Tokenler**

Slashdot makalesinden sonra karşılaştığım bir diğer proje Bill Yerazunis'in CRM114 [5] projesiydi. Bu, az önce bahsettiğim tasarım ilkesinin tam bir karşı örneği. Bu proje sadece metinleri sınıflandırma işlemi yapıyor ama o kadar etkili ki, ne yaptığını tam olarak anlamadan spam'leri neredeyse tamamen filtreliyor.

CRM114'ün nasıl işlediğini anladığımda, tek kelimelerle filtrelemeden daha karmaşık bir yönteme geçmenin kaçınılmaz olduğunu fark ettim. Ancak önce, tek kelimelerle ne kadar ilerleyebileceğimi görmeyi düşündüm. Ve sonuç gerçekten şaşırtıcı oldu, tek kelimelerle bile oldukça mesafe kat edebilmişim.

Öncelikli olarak daha zeki tokenizasyon, yani verinin küçük parçalara bölünmesi üzerinde yoğunlaştım. Şuanki spam e-postalar üzerinde uyguladığım tekniklerle, CRM114'ün başarı oranlarına oldukça yaklaştım. Bu teknikler genellikle Bill'in kullandığı tekniklerden farklı; en iyi çözüm, her iki yaklaşımı da bir araya getirebilir.

""Spam İçin Bir Plan"" adlı yazımda, token'ın çok basit bir tanımını kullanıyorum. Harfler, rakamlar, tireler, apostroflar ve dolar işaretleri token'ın bir parçasıdır ve geri kalan her şey token'ı birbirinden ayırır. Ayrıca büyük-küçük harf ayrımını da hiçe saydım.

Artık bir 'token'ın daha karmaşık bir tanımı var:

1. Dava korunmuştur.

2. Ünlem işaretleri, cümlenin ayrılmaz parçalarıdır.

3. Nokta ve virgüller, iki rakam arasında bulunduğunda birer bileşen olurlar. Bu, IP adreslerini ve fiyatları tamamen doğru bir şekilde yakalayabilmemi sağlar.

4. $20-25 gibi bir fiyat aralığı, iki farklı fiyatı, $20 ve $25'ı ifade eder.

5. 'Kime', 'Kimden', 'Konu' ve 'Geri Gönder' satırları içinde ya da URL'lerde bulunan öğeler (tokenler) uygun şekilde işaretlenir. Örneğin, 'Konu' satırında geçen 'foo' kelimesi 'Konu*foo' şeklinde işaretlenir. (Asteriks, belirli bir karakteri içermemesi gereken herhangi bir karakter olabilir.)

Bu tür uygulamalar, filtrenin kelime hazinesini artırır ve böylece daha seçici hale getirir. Örneğin, mevcut filtrede, konu satırında yer alan ""ücretsiz"" kelimesi %98 spam olasılığına sahipken, aynı kelime metnin içinde geçtiğinde bu oran sadece %65'e düşüyor.

İşte şu anki olasılıklardan bazıları [6]:

Subject*FREE 0.9999

bedava!! 0.9999

To*free 0.9998

Konu*free 0.9782

ücretsiz! 0.9199

Ücretsiz 0.9198

Url*free 0,9091

ÜCRETSİZ 0.8747

From*free 0.7636

ücretsiz 0.6546

Spam Filtre Planı'nda, bu tüm belirteçlerin olasılığı aynıydı, yani .7602. Bu filtre yaklaşık 23.000 belirteci tanıyordu. Ancak mevcut filtre yaklaşık 187.000 belirteci tanıyor.

Daha fazla sayıda belirtecinizin olması, hataların oluşma ihtimalini artırır. Bilgi kümenizi daha fazla belirteç üzerine dağıtmak, onu küçültmüş gibi bir etkiye sahip olabilir. Örneğin, ünlem işaretlerini bileşen olarak düşünürsek, 'ücretsiz' kelimesinin ardından yedi ünlem işareti gelmesi durumunda spam olasılığını belirleyemeyebiliriz. Oysaki, 'ücretsiz' kelimesinden sonra sadece iki ünlem işareti gelmesinin spam olasılığının %99,99 olduğunu biliyoruz.

Bu duruma benim 'dejenerasyon' dediğim bir çözüm var.Bir belirteç için tam bir eşleşme bulamadığınızda, daha az spesifik bir versiyonunu ele alabilirsiniz. Bu, sonunda ünlem işareti olanlar, büyük harfle yazılanlar ve belirli beş durumda geçenler için geçerlidir. Örneğin, ""Konu*bedava!"" için bir olasılık bulamazsanız, ""Konu*bedava"", ""bedava!"" ve ""bedava"" için olasılıklarını araştırabilir ve en 0.5'e en uzak olanını seçebilirsiniz.

Filtreniz, konu satırında ""ÜCRETSİZ!!!"" ifadesini görür ve bunun için bir olasılık belirlememişse, aşağıdaki alternatifleri düşünebilirsiniz:

- Konu*Ücretsiz!!!
- Konu*ücretsiz!!!
- Konu*Ücretsiz!
- Konu*Ücretsiz!
- Konu*ücretsiz!
- Konu*ÜCRETSİZ
- Konu*Serbest
- Konu*free
- BEDAVA!!!
- Bedava!!!
- Bedava!!!
- ÜCRETSİZ!
- Bedava!
- Bedava!
- ÜCRETSİZ
- Ücretsiz
- ücretsiz

Eğer bunu yapacaksanız, büyük harfle başlayan versiyonları, tamamen büyük harfle yazılmış ve tamamen küçük harfle yazılmış versiyonları da göz önünde bulundurun. 

Spam mesajlar genellikle emir kipinde cümleler içerir ve genellikle bu cümlelerin ilk kelimesi bir fiil olur. Dolayısıyla, ilk harfi büyük yazılan fiiller, tamamı küçük harfle yazıldığında sahip oldukları spam olasılığından daha yüksektir. Örneğin, benim spam filtrelem sistemimde ""Act"" kelimesinin spam olma ihtimali %98, ancak ""act"" kelimesinin spam olma ihtimali sadece %62.

Kelime dağarcığınızı genişlettikçe, ""aynı"" kelimenin eski tanımınıza göre birden fazla kez sayıldığını fark edebilirsiniz. Mantıken, artık aynı kelime olmayabilirler. Ancak bu sizi rahatsız ediyorsa, tecrübelerimden yola çıkarak şunu ekleyeyim: genellikle birden fazla kez saydığınız gibi görünen kelimeler, tam da odaklanmanız gereken kelimeler oluyor.

Daha geniş bir kelime dağarcığına sahip olmanın bir başka etkisi, gelen bir e-postaya baktığınızda, daha fazla ilginç kelime bulmanızdır, yani olasılıkları %50'ye yakın olmayanları. E-postanın spam olup olmadığına karar verirken en ilginç 15 kelimeye bakarım. Ancak böyle sabit bir sayı kullandığınızda bazen bir sorunla karşılaşabilirsiniz. Eğer çok fazla en yüksek ilgi çeken kelime bulduysanız, sonuç, eşit derecede ilginç olan kelimelerin hangi sırayla geldiğini belirleyen rastgele bir faktöre bağlı olabilir. Bu durumu çözmenin bir yolu, bazı kelimeleri diğerlerinden daha ilginç olarak değerlendirmektir.

Örneğin, ""dalco"" kelimesi spam verilerimde 3 kez geçerken, meşru verilerimde hiç geçmiyor. ""Url*optmails"" kelimesi ise (bu ""optmails"" kelimesinin bir url içinde geçtiği anlamına geliyor) tam 1223 kez karşımıza çıkıyor. Ancak, sözcüklerin spam olasılıklarını hesaplarken, her ikisi de aynı spam olasılığına, yani %99'a sahip oluyor.

Bu pek doğru gelmiyor. Bu iki token'ı önemli ölçüde farklı olasılıklarla değerlendirmek için teorik argümanlar var (Pantel ve Lin bunu yapıyor), ancak ben henüz bunu denemedim. Ancak, eğer bir metin veya diğerinde sadece 15'ten fazla token bulursak, sıklıkla karşılaştığımızları önceliklendirmemiz gerektiği gibi görünüyor. Dolayısıyla, şimdi iki eşik değerimiz var. Sadece spam metninde bulunan token'lar için, 10'dan fazla kez karşılaşıldığında olasılık .9999, aksi halde .9998. Aynı şekilde, yalnızca meşru metinde bulunan token'lar için de bu durum geçerli.

Daha sonra belirteç olasılıklarını belki büyük ölçüde artırırım, fakat bu minik ölçeklendirme en azından belirteçlerin doğru şekilde sıralanmasını sağlıyor.

Bir başka alternatif, sadece 15 anahtar kelimeye değil, belirli bir ilgi düzeyinin üzerindeki tüm anahtar kelimelere odaklanmaktır. Steven Hauser, istatistiksel spam filtresinde bunu uyguluyor. Eğer belirli bir eşik değeri kullanacaksanız, bunu oldukça yüksek tutmanızı öneririm. Çünkü aksi halde spam gönderenler, mesajları daha masum kelimelerle doldurarak sizi kandırabilirler.

Peki, HTML hakkında ne yapmalı? Tüm seçenekleri denedim, hem onu görmezden gelmeyi hem de tamamen çözümlemeyi. HTML'i yok saymak kötü bir fikir, çünkü bir sürü yararlı spam işaretleri var içinde. Ancak tümünü çözümlemeye çalışırsanız, filtre sadece bir HTML belirleyiciye dönüşebilir.Biraz HTML bilgisiyle, gelen kutunuzdaki spam trafiğini nasıl azaltabileceğinizi öğrenebilirsiniz. Bazı etiketleri fark etmek ve diğerlerini görmezden gelmek, işte başarılı bir yaklaşım budur. Ben genellikle 'a', 'img', ve 'font' etiketlerine bakıyorum, geri kalanı umursamıyorum. Linklere ve görüntülere kesinlikle bakmalısınız, çünkü içlerinde URL'ler var.

HTML hakkında daha fazla bilgi sahibi olmak belki de daha akıllıca olabilir, ama buna çokça zaman harcamanın değeceğini sanmıyorum. HTML dolu spamler kolayca filtreleniyor. Zeki spam gönderenler zaten bunu kullanmaktan kaçınıyor. Dolayısıyla, gelecekteki performansımızın ne olacağı, HTML ile nasıl başa çıktığımıza çok da bağlı değil.

**Performans**

10 Aralık 2002 ile 10 Ocak 2003 arasında yaklaşık 1750 spam mail aldım. Bu spam maillerden sadece 4 tanesi filtremi geçti. Bu da demek oluyor ki, filtreleme oranım yaklaşık %99,75.

Kaçırdığım dört spam'dan ikisi, rastgele benim gerçek e-postalarımda sıkça kullanılan kelimeleri içerdiği için filtrelerden sıyrılıp bana ulaşmayı başardı.

Üçüncü tür, güvensiz bir CGI scriptini kullanarak üçüncü taraflara mail gönderenlerdir. Sadece içeriklerine bakarak bunları filtrelemek oldukça zor çünkü başlıkları masum ve kullandıkları kelimeler konusunda oldukça dikkatliler. Yine de genellikle bunları yakalamayı başarıyorum. Ama bu seferki, .9 olan eşik değerinin hemen altında, .88 olasılıkla kaçmayı başardı.

Tabii ki, birden çok kelime dizisine bakmak hemen fark edilmesini sağlar. ""İşte geri bildirim formunuzun sonucu"" ifadesi hemen göze çarpar.

Dördüncü spam, benim ""geleceğin spamları"" olarak adlandırdığım türdendi, çünkü spamların bu şekilde evrileceğini düşünüyorum: biraz tamamen nötr metin ve ardından bir URL. Bu durumda, sonunda ana sayfalarını tamamladıklarını ve kontrol etmemi isteyen birinden geldi. (Sayfa elbette bir porno sitesini tanıtan bir reklamdı.)

Spam gönderenler başlıklar konusunda dikkatli olur ve yeni bir URL kullanırlarsa, gelecekteki spam'lar filtrelerin dikkatini çekmeyebilir. Tabii ki, bir çözüm olarak sayfayı denetlemek için bir tarayıcı gönderebiliriz. Ama bu bile gerekli olmayabilir. Gelecekteki spam'lara gelen yanıtların oranı düşük olmalı, yoksa herkes bunu yapardı zaten. Eğer bu oran gerçekten düşükse, spam gönderenlerin bunun için para harcamasına gerek kalmayacak ve bizim de bu tür spam'ları filtrelemek için fazla çaba harcamamız gerekmeyecek.

Şimdi, gerçekten sarsıcı bir haberim var: o bir aylık süre içinde tam _üç_ yanıltıcı pozitif sonuçla karşılaştım.

Bir anlamda yanlış pozitif sonuçlar almak bir rahatlama oluyor. ""Spam için Bir Plan""ı yazdığım zaman hiç yanlış pozitif sonuç almamıştım ve nasıl olacaklarını bilmiyordum. Şimdi birkaç tanesini deneyimledikten sonra, aslında korktuğum kadar kötü olmadıklarını görmek beni rahatlattı. İstatistiksel filtrelerin yakaladığı yanlış pozitif sonuçlar genellikle spam gibi görünen e-postalar oluyor ve bunlar genellikle kaçırsanız da pek umursamayacağınız türden e-postalar oluyor.

Yanlış pozitif olarak nitelendirdiğim iki durum, daha önce alışveriş yaptığım şirketlerin bültenleriydi. Bu bültenleri almayı asla talep etmemiştim, bu yüzden aslında onları spam olarak düşünebiliriz. Ancak ben onları yanlış pozitif olarak adlandırıyorum çünkü daha önce bu tür bültenleri spam olarak silme ihtiyacı hissetmiyordum. Bu e-postaların filtreler tarafından tespit edilme sebebi, her iki şirketin de Ocak ayında kendi sunucularından e-posta göndermeyi bırakıp, ticari e-posta servislerini kullanmaya başlamalarıydı. Bu değişiklikle birlikte, hem e-postaların başlıkları hem de içerikleri daha fazla spam e-posta hissi verir hale geldi.

Üçüncü yanlış pozitif sonuç gerçekten kötüydü. Bu, Mısır'dan birinden gelmiş ve tamamen büyük harflerle yazılmış bir mesajdı. Bu durum, anahtar kelimeleri büyük-küçük harfe duyarlı hale getirmemizin doğrudan bir sonucuydu. 'Spam Planı' filtresi bu değişikliği yapmasaydı, bu mesajı yakalayamayacaktı.

Genel yanlış pozitif oranını belirtmek zor, çünkü istatistiksel olarak çok fazla belirsizlik var. Filtreler üzerinde çalışmış olanlar (özellikle etkili olanlar), bu problemin farkındadır.E-postaların spam olup olmadığını belirlemek bazen gerçekten zor olabilir, değil mi? Özellikle filtrelerinizi sıkılaştırdığınızda, bazen istemeden de olsa istenmeyen postaları yakalayabilirler. Ben de bu durumu birkaç kez yaşadım. Örneğin, bir yazım hatası nedeniyle bana gönderilen iki e-posta ve beni başkası zanneden bir kişinin gönderdiği bir e-posta... Bu e-postalar ne tam anlamıyla istenmeyen postalarım (spam) ne de istenen postalarım, değil mi?

Bir keresinde, Virtumundo'nun bir başkan yardımcısından yanlış bir pozitif durum yaşadım. Müşteri gibi davranıp onlara bir e-posta attım ve cevapları Virtumundo'nun mail sunucularından geldi. Cevap, suçlama için olabilecek en kesin başlıklara sahipti. Aslında, bu da tam anlamıyla bir yanlış pozitif olmayabilir, bir tür Heisenberg belirsizlik prensibinin bir etkisi gibi: Yani, sadece spam filtreleme hakkında yazıyordum ve bu yüzden bu durumu fark ettim.

Bunları saymazsak, bugüne kadar toplamda beş yanıltıcı bildirim aldım, bu da yaklaşık 7740 gerçek e-posta'nın yüzde 0.06'sını oluşturuyor. Diğer iki yanıltıcı bildirim ise, satın aldığım bir ürünün stokta olmadığını belirten bir bildirim ve Evite'den gelen bir parti hatırlatıcıydı.

Bu sayıya tam olarak güvenemem. Kısmen örneklemin çok küçük olmasından, kısmen de filtrelemeyi biraz daha düzenleyerek bazı sonuçları elemenin mümkün olduğunu düşünüyorum.

Bana göre yanlış pozitifler ve yanlış negatifler farklı türde hatalar. Filtreleme oranı, performansın bir göstergesi. Yanlış pozitifleri ise sanki programdaki hatalar gibi görüyorum. Filtreleme oranını artırmaya çalışırken bir optimizasyon süreci izlerim, yanlış pozitifleri azaltırkenyse hata ayıklama sürecini uygularım.

Bu beş yanlış pozitif benim hata listemi oluşturuyor. Örneğin, Mısır'dan gelen mail, büyük harflerle yazılmış olması nedeniyle filtrelerime Nijerya tarzı bir spam gibi göründü. Bu durum aslında bir tür bug, yani hata. HTML'deki gibi, e-postanın tamamen büyük harflerle yazılması aslında tek bir özelliği ifade eder, her kelime için ayrı ayrı özellikler değil. Büyük-küçük harf olayını daha sofistike bir şekilde ele almalıyım.

Peki bu %0.06 ne anlama geliyor? Bence pek önemli değil. Küçük bir örneklem olduğunu düşünerek, bunu bir üst sınır kabul edebilirsiniz. Ama şu anda bu, Bayesci filtrelemenin doğası gereği yanlış pozitif oranını değil, uygulamamdaki hataların bir göstergesi gibi duruyor.

**Gelecek**

Peki, sonraki adım ne? Filtreleme bir optimizasyon meselesi ve optimizasyonun anahtarı profillemektir. Kodunuzun nerede yavaş olduğunu tahmin etmeye çalışmayın, çünkü büyük ihtimalle yanılacaksınız. _Gidin ve bakın_, kodunuzun hangi kısmının yavaş olduğunu tespit edin ve onu düzeltin. Filtreleme söz konusu olduğunda ise bu, şu şekilde anlam kazanıyor: kaçırdığınız spamleri inceleyin ve onları yakalamak için ne yapabileceğinizi bulmaya çalışın.

Örneğin, spam göndericileri şimdi filtreleri atlatmak için agresif bir şekilde çalışıyor. Bunun için kelimeleri parçalara ayırıp, yanlış yazarak filtrelerin onları tanımasını engelliyorlar. Ancak bu üzerinde çalışmak benim ilk önceliğim değil, çünkü bu tür spamleri yakalamakta hala sorun yaşamıyorum [10 ].

Şu an başımı ağrıtan iki tür spam var. Birincisi, bir kadının sizi onunla sohbet etmeye veya bir arkadaşlık sitesinde profilini görmeye davet ettiği bir e-posta gibi gözüken tür. Bunlar, satış jargonu olmadan yapabileceğiniz tek tür satış teklifleri olduğu için filtreleri aşıyorlar. Normal bir e-postada kullanılacak kelimeleri kullanıyorlar.

Filtrelemekte zorlandığım diğer spam türleri genellikle Bulgaristan gibi ülkelerden programlama hizmetleri sunan şirketlerden geliyor. Bu mesajlar, gerçek e-postalarımdan ayırt etmek zor çünkü ben de bir yazılımcıyım ve bu spam e-postalar, normalde aldığım e-postalardaki kelimelerle dolu.

Öncelikle kişisel reklam türüne yoğunlaşacağım gibi duruyor. Yakından inceleyince, bunlarla gerçek maillerim arasında istatistiksel farklılıklar bulabileceğimi düşünüyorum.Yazma stili kesinlikle farklı, ama bu farkı görebilmek için biraz daha dikkatli olmam gerekiyor. Ayrıca, URL'lerin genellikle tekrarlandığını fark ettim. Bir URL'yi bir meşru mailde tekrarlayan birinin bunu yapması ise oldukça nadir bir durum.

Dış kaynak kullanımı türündeki spamleri yakalamak oldukça zor olacak. Bir web tarayıcısıyla siteye dahi girseniz, açık ve kesin bir istatistiksel kanıta rastlamazsınız. Belki de tek çözüm, spam maillerde reklamı yapılan alan adlarının bir merkezi listesi oluşturabilir. Ancak, bu türden çok fazla mail olacağını düşünmüyorum. Eğer geriye kalan tek spam mailler, istenmeyen Bulgaristan'dan gelen yazılım geliştirme hizmetleri teklifleri olsaydı, hepimiz rahatlıkla başka bir konuya geçebilirdik.

İstatistiksel filtreleme bizi gerçekten istediğimiz yere getirebilecek mi, bu konuda emin değilim. Şu anda, kesinlikle söyleyebilirim ki, benim için spam bir sorun teşkil etmiyor. Ancak, spamlar henüz ciddi bir biçimde istatistiksel filtreleri aşma konusuna odaklanmış değiller. Peki, ya bu konuya el atarlarsa ne olacak?

Ağ düzeyinde çalışan filtreler hakkında pek de umutlu değilim. Eğer aşmaları gereken sabit bir engel varsa, spamcıların bu engeli aşmakta oldukça verimli olduklarını görebiliriz. Hatta Assurance Systems adında bir şirket var ki, e-postalarınızı Spamassassin'e tabi tutar ve e-postanızın filtrelenip filtrelenmeyeceğini size bildirir.

Ağ seviyesindeki filtreler tamamen işe yaramaz olmayacak. Bu filtreler, Virtumundo ve Equalamail gibi şirketlerin gerçekten katılımlı listeler oluşturduğunu iddia ettikleri ""opt-in"" spam'leri yok etmek için yeterli olabilir. Mesajın içeriği ne olursa olsun, sadece başlıklara bakarak bu tür spamleri filtreleyebilirsiniz. Ancak başlık bilgilerini sahteleyen veya açık iletim noktalarını kullanan herkes, büyük ihtimalle çoğu pornografik spam göndericiler de dahil, eğer isterlerse ağ seviyesindeki filtrelerden bazı mesajları geçirebilir. (Elbette, göndermek istedikleri mesajın tam olarak aynısını geçiremezler, bu da başka bir konu.)

Umut verici bulduğum filtre türleri, her kullanıcının e-postalarına dayalı olasılıkları hesaplayanlardır. Bu tür filtreler, sadece yanlış pozitif sonuçları engellemede değil, aynı zamanda filtrelemede de oldukça etkilidirler. Örneğin, bir mesajın herhangi bir yerinde alıcının e-posta adresinin base-64 şeklinde kodlanmış olması, genellikle güçlü bir spam belirtisidir.

Bireysel filtrelerin asıl avantajı, hepsinin birbirinden farklı olmasıdır. Herkesin filtresi farklı olasılıklarla çalıştığında, spam gönderenlerin 'optimizasyon döngüsü' ya da programcıların deyimiyle 'düzenle-kompile-test' süreci inanılmaz yavaşlar. Masaüstlerindeki bir filtreye uygun bir spam metni oluşturmak yerine, her bir ayarı tek tek test etmek zorunda kalacaklar. Bu durum, interaktif bir üst düzeyi olmayan bir dilde kod yazmaya benziyor ve ben kimseye bu durumu yaşatmak istemem.

#### Notlar

[1] Paul Graham. ``Spam'a Bir Çözüm.' Ağustos 2002. http://paulgraham.com/spam.html.

Bu algoritmadaki olasılıklar, Bayes'in Kuralı'nın özel bir durumu kullanılarak hesaplanmaktadır. Burada iki basit varsayım yapılıyor. Birincisi, özelliklerin (yani kelimelerin) olasılıklarının birbirinden bağımsız olduğu varsayımı. İkincisiyse, bir e-postanın önceden belirlenmiş bir spam olma ihtimali hakkında hiçbir bilgimiz olmadığı varsayımı.

Metin sınıflandırmada bu ilk varsayım oldukça yaygın. Buna dayanan algoritmalara genellikle ""naif Bayes"" denir.

İkinci varsayımım, gelen e-postalarımdaki spam miktarının gün içinde, hatta saat içinde bile oldukça dalgalanması sebebiyle ortaya çıktı. Bu kadar değişken bir durumda, genel önceden belirlenmiş oranın tahmin etmek için çok da işe yaramadığını düşündüm.Gelin, spam e-postaların dünyasına birlikte bir yolculuk yapalım. Öncelikle, e-posta kutunuzun yarısının spam (P(spam)) ve diğer yarısının ise spam olmayan e-postalar (P(nonspam)) ile dolu olduğunu hayal edin. Bu iki oran birbirini nötralize eder ve formülden çıkarılabilir.

Eğer Bayes filtrelemesi kullanıyorsanız ve spam ile gerçek mesajların oranı sürekli olarak çok yüksek ya da çok düşükse, filtreleme performansınızı artırmak için önceden belirlenmiş olasılıkları dahil edebilirsiniz. Bu işlemi tam anlamıyla doğru yapmak istiyorsanız, günün saatine göre oranları takip etmelisiniz. Çünkü hem spam hem de meşru e-postaların hacimleri, gün içinde belirgin bir şekilde değişiyor.

Biraz daha derine inelim ve bazı kaynaklara göz atalım:

- [2] Patrick Pantel ve Dekang Lin'in ""SpamCop - İşte Bu Bir Spam Sınıflandırma ve Düzenleme Programı"" adlı çalışması
- [3] Mehran Sahami, Susan Dumais, David Heckerman ve Eric Horvitz'in ""Spam E-Postaları Filtrelemek için Bayes Yaklaşımı"" adlı çalışması
- [4] Bir kullanıcının deneyimini paylaştığı bir blog yazısı
- [5] Bill Yerazunis'in ""Nadiren Kullanılan İkili Polinomlu Hash Mesaj Filtrelemesi ve CRM114 Ayırt Edici"" adlı çalışması
- [6] Bir kullanıcının deneyimini paylaştığı bir blog yazısı
- [7] Bir kullanıcının deneyimini paylaştığı bir blog yazısı
- [8] Steven Hauser'ın ""İstatistiksel Spam Filtresi Benim İçin İş Görüyor"" adlı blog yazısı
- [9] Bir kullanıcının deneyimini paylaştığı bir blog yazısı
- [10] Bir kullanıcının deneyimini paylaştığı bir blog yazısı

Bu kaynaklar, spam filtreleme konusunda size daha fazla bilgi ve perspektif sunabilir. Unutmayın, spam filtreleme bir sanattır ve herkesin kendi yöntemleri ve stratejileri vardır.Şu anda, ilk 15 anahtar kelime arasında aynı kelimenin tekrar etmesine izin vermiyorum. Neden mi? Çünkü eğer bir gönderici, yanlışlıkla bir kelimeyi birkaç kez kullanırsa, yanıltıcı bir şekilde pozitif bir sonuç elde edebiliriz. (Örneğin, 'dick' kelimesi, spam olma olasılığı .9999 olan bir kelime, ancak aynı zamanda bir isim de olabilir.) Ama tabii ki, kelime tekrarlarını da dikkate almalıyız. Bu yüzden, Brian Burton'ın SpamProbe'deki uygulaması gibi, her anahtar kelimenin iki kez tekrar etmesine izin vermeyi düşünüyorum.

[12] Spammerlar, mesajın geri kalanını oluşturmak için mad-lib tekniğine başvurmak zorunda kaldıklarında, Brightmail gibi yaklaşımların işlevsiz hale geleceği açıktır.

[13] Bazen, ağ düzeyinde filtrelemenin daha verimli olabileceğini ve bu yüzden bu şekilde çalışmamız gerektiğini savunanlar olabiliyor. Ancak genellikle bu tür bir şeyi söyleyenler aslında kendi çözümlerini korumak istiyorlar. Yani ""Zaten ağ seviyesinde filtreleme yapıyoruz ve baştan başlamak istemiyoruz"" demek istiyorlar. Ama unutmayın, çözümünüzü korumak için sorunu çarpıtmaya çalışamazsınız.

Tarihsel olarak bakıldığında, 'kıt kaynak' savunmaları, yazılım tasarımı tartışmalarında genellikle kaybeden taraf olmuştur. İnsanlar bu tür savunmaları genellikle, (özellikle eylemsizlik durumlarında) başka nedenlerle yapılmış olan kararları haklı çıkarmak için kullanır.

**Özel Teşekkürler**: Bu makalenin taslaklarını okuyup değerli yorumlarını paylaştıkları için Sarah Harlin, Trevor Blackwell ve Dan Giffin'e teşekkür etmek istiyorum. Ayrıca, bu filtrenin üzerinde çalıştığı altyapının çoğunu sağladığı için Dan'a bir kez daha minnettarım.

**İlgili:**""""

---

İlişkili Konseptler: Bayesyen spam filtreleme, spam filtre performansının iyileştirilmesi, spam filtrelemesinde metin sınıflandırma, spam filtrelemesinde tokenleştirme, spam filtrelemesinde yanlış pozitifler, spam filtre optimizasyonu, spam filtrelemenin geleceği, bireysel kullanıcı tabanlı spam filtreler, spam filtre hata ayıklama, spam filtrelerinde HTML işleme."

Subscribe

Listen to Yiğit Konur'un Okuma Listesi using one of many popular podcasting apps or directories.

Spotify Pocket Casts Amazon Music YouTube
← Previous · All Episodes · Next →