Dostlar, selam. Geçenlerde bir oyun sunucusu için gerçek zamanlı chat moderasyon botu yazma işine kalkıştım. "Hadi canım, flood kontrolü basit bir sayaç, küfür filtresi de birkaç regex pattern'inden ibaret" diye düşünüyordum. Ne kadar da safmışım! Meğerse kendimi, insan zekasının spam ve küfür konusundaki yaratıcılığıyla savaşan, sürekli regex yazan bir makineye dönüştürecektim.
Python:
# İlk saf pattern'im. Komik...
kufur_pattern = r"(siktir|amk|aq)"
Flood kontrolü için basit bir zaman damgası ve mesaj sayacı mantığı kurdum. Kullanıcı ID'si, son mesaj zamanı, 5 saniye içinde 3'ten fazla mesaj -> mute. Mantık güzel çalışıyordu, ta ki insanların flood'u harf harf, karakter karakter yapmaya başlayana kadar. "A... S... L... A... N... I... M" şeklinde yazınca benim basit zaman kontrolüm çakılıyordu. Kafayı yiyecektim. StackOverflow'da bile böyle bir saçmalığın çözümünü bulamadım. Sonunda, harfler arasına sıkıştırılmış özel karakterleri ve boşlukları temizleyen bir ön işlemci yazmak zorunda kaldım.
İlk regex listem bir saat bile dayanmadı. İnsanlar kelimeleri bozuyor, harfleri değiştiriyor (a yerine @, i yerine 1), aralara nokta koyuyordu. Her güncellemede pattern iki katına çıkıyordu. Şaka gibi ama, "re" kütüphanesiyle uğraşırken kendi kendime küfür etmeye başlamıştım! Nihayetinde, kelimeyi temel sesli/sessiz harflere indirgeyen ve benzer sesleri yakalayan basit bir fonksiyon yazdım. Tam bir "regex'i yeniden keşfetmek" deneyimiydi.
En büyük ders: Gerçek zamanlı moderasyonda saf regex yetmez. Kullanıcı davranışını modellemek, mesajları ön işlemden geçirmek ve biraz da makine öğrenmesi (ya da en azından basit istatistik) şart. Flood kontrolü için de sadece mesaj sayısına değil, mesajların içeriğindeki benzerliğe de bakmak gerekiyor.
Python:
# Basitleştirilmiş ön işlem fonksiyonu
def temizle(mesaj):
return re.sub(r'[^a-zA-Z0-9ğüşıöçĞÜŞİÖÇ]', '', mesaj).lower()
# Artık "A.s.l.a.n.ı.m" da "aslanım" oluyor.
Sonuç olarak, bot şimdilik çalışıyor ama eminim yarın yeni bir "yaratıcı" spam yöntemi bulacaklar. Siz de böyle bir regex veya flood kontrolü cehennemi yaşadınız mı? Bu işin daha temiz, daha az sinir bozucu bir yolu var mı sizce? Fikirlerinizi bekliyorum!