Tekst zawiera również krótkie omówienie innych metod filtrowania spamu, lecz moje subiektywne podejście może wypaczać ocenę możliwości innych algorytmów.
,,A tu pospolitość skrzeczy...'' powiedziałby poeta obserwując rodzime rozwiązania prawne tej kwestii (choć chyba niewiele się różnią od zachodnich). Udowodnienie komuś, że złamał przepisy dotyczące wysyłania ofert handlowych pocztą elektroniczną może być niewykonalne. Użytkownicy darmowych kont pocztowych są zasypywani spamem zgodnie z obowiązującym prawem. Najlepsze więc wydaje się postępowanie zgodnie z zasadą: ,,Umiesz liczyć, licz na siebie''.
Choć na pierwszy rzut oka rozwiązanie to może wydawać się kuszące, nie spełnia ono jednak swojej roli. Należy zwrócić uwagę, że w bazie danych może się pojawić każdy adres email - również mój. Jeśli dostatecznie dużo osób doniesie do PolSpamu, że jestem spamerem, mój adres znajdzie się w bazie danych i moje listy mogą nie dojść nawet do moich znajomych! Dużo zależy również od oprogramowania wykorzystującego bazę danych PolSpamu. Jeśli filtr sprawdza tylko zawartość pola From z nagłówka wiadomości, to może to nie odnieść żadnego skutku, ponieważ w polu tym może się znajdować dowolny tekst, również adres odbiorcy. Może się to wydawać nieprawdopodobne, ale spamer może wysłać do mnie wiadomość, która (z punktu widzenia takiego filtru) została wysłana przeze mnie.
Częściowym rozwiązaniem problemu jest stworzenie białej listy, na której znajdują się adresy, z których na pewno nie przychodzi spam. Tylko pozostałe wiadomości przechodzą wówczas proces weryfikacji poprawności adresu nadawcy. Nie zmienia to jednak faktu, że brak jest logicznego uzasadnienia poprawności działania takiego filtru.
Skuteczność tego rozwiązania jest z pewnością znacznie większa. Spamer może podmienić adres w polu From, ale nie może zmienić tytułu, ani treści listu - to nadal musi być oferta, która przyciągnie potencjalnego klienta.
Niestety każdy człowiek odróżnia spam na podstawie innych cech. Czy seksuolog może sobie pozwolić na odfiltrowywanie listów na podstawie zawierania słowa sex? Czy handlowiec może dyskryminować listy, które w tytule mają słowo oferta? Czy bankowiec zdecyduje się usunąć list, który zawiera 12 znaków $? Wniosek płynie stąd taki, że każdy użytkownik powinien sam ustalić kryteria eliminujące nieporządane przesyłki, albo zgodzić się na zastosowanie pewnych ogólnych wskaźników, które być może okażą się nieadekwatne. Drugą zasadniczą wadą tego rozwiązania jest fakt, że spam ewoluuje. Jeśli zdecydujemy się odfiltrowywać listy zawierające słowo ,,friko'', to spamerzy zaczną wysyłać listy, w których ,,friko'' zastąpione zostanie ciągiem ,,f.r.i.k.o''. Zmusza to użytkownika do ciągłej aktualizacji reguł filtru.
Algorytm zaimplementowany w Elmo opisany został przez Paula Grahama w jego artykule p.t. ,,A Plan for Spam''[1] oraz w jego kontynuacji zatytułowanej ,,Better Bayesian Filtering''[2].
Taki filtr automatycznie dostosuje się do indywidualnych predyspozycji użytkownika. Wiadomości od moich znajomych ocechowane są ich adresami email, imionami i nazwiskami. W listach tych jest poruszana tematyka związana z moimi zainteresowaniami. Wszystkie takie słowa zostaną uznane za ,,dowody'' bycia poprawną wiadomością. Jako użytkownik filtru oszczędzam sobie również analizy cech spamu. Filtr sam zdecyduje jakie cechy wiadomości są dobrymi ,,dowodami'' na bycie spamem.
W ciągu tego samego miesiąca algorytm trzykrotnie zakwalifikował poprawny list jako spam. Trzeba jednak przybliżyć, jak wyglądały listy, które zostały odfiltrowane. Dwa z nich zawierały oferty firm, z których usług Paul skorzystał wcześniej. Właściwie możnaby je zakwalifikować jako spam, ponieważ nie życzył sobie ich otrzymać, ale ponieważ nigdy nie kasował takich wiadomości, to uznał, że w tych przypadkach algorytm się pomylił. Trzeci list wysłany został z Egiptu i był w całości napisany kapitalikami. Paul opisuje również późniejsze przypadki błędnych odpowiedzi, których ogółem było 5. Przy ogólnej liczbie 7740 wiadomości daje to błąd rzędu 0.06%.
Trzeba tu jednak nadmienić, że porównywanie wydajności (i odpowiedniości) różnych filtrów jest bardzo trudne. Implementacje mogą różnić się pewnymi szczegółami, które mogą być krytyczne dla ogólnego wyniku działania filtru. Duża skuteczność filtru wynikała również z bardzo dużych rozmiarów obydwu korpusów (ok. 4 tyś. wiadomości w każdym).
Aby uaktywnić filtr antyspamowy należy w definicji skrzynki (zmiennej mailbox) ustawić polu1 protect wartość yes. Aby spam nie był automatycznie usuwany należy jeszcze do pola spam przypisać nazwę skrzynki, do której spam będzie przesuwany. Przykładowa definicja skrzynki:
set mailbox {
name: 'moja poczta'
root: ~/mail
trash: trash
spam: spam
protect: yes
}
Powyższa definicja sprawi, że Elmo będzie automatycznie oceniało
listy. Wszystkie funkcje modułu bayes są jednak nieaktywne
w skrzynkach trash, spam, sent oraz
drafts. Ocena listu wyświetlana jest zgodnie z definicją
zmiennej line_format. W miejsce ,,%#''
podstawiana jest jedna z trzech wartości:
Jeśli filtr zakwalifikuje list będący spamem jako poprawną wiadomość, należy ją usunąć przy pomocy funkcji folder_spam_delete. Jeśli zaś list został niesłusznie uznany za spam należy na nim uruchomić funkcję folder_spam_is_not.
Paul zaproponował, aby dla każdego słowa występującego w jednym z korpusów obliczyć pewną wartość, która pozwala zdecydować, jak dalece słowo jest ,,dowodem'' bycia spamem, albo ,,dowodem'' bycia wiadomością poprawną.
Wprowadźmy następujące oznaczenia:
Gdyby prawdziwe były następujące równości kombinatoryczne:
to korzystając ze wzoru na prawdopodobieństwo warunkowe:
![]() |
(3) |
otrzymalibyśmy pierwszą część wzoru
![]() |
(4) |
Niestety zarówno wzór (1) jak i wzór (2) nie określają prawdopodobieństwa, ponieważ obydwie wartości mogą być większe od 1. Dodatkowo wzór (2) mógłby być prawdziwy jedynie w sytuacji, gdyby korpusy były rozłączne. Algorytm wymusza (przy pomocy funkcji minimum i maksimum), aby obliczona wartość p(w) znalazła się w przedziale [0.01,0.99].
Z tego powodu nie będę wartości p(w) nazywał prawdopodobieństwem. Jest to jednak dość dobry współczynnik stanowiący o tym, czy słowo w jest ,,dowodem'' na bycie spamem (wartości zbliżone do 1), albo na bycie wiadomością poprawną (wartości bliskie 0). Zwróćmy uwagę na to, że duże wartości wyrażenia S(w)/m oznaczają częste występowanie słowa w w listach ze spamem, a duże wartości wyrażenia L(w)/n oznacza częste występowanie słowa w w poprawnych wiadomościach. Wzory (1) i (2) można by poprawić poprzez wstawienie do mianownika ilości listów z danego korpusu, w którym dane słowo rzeczywiście wystąpiło, ale osłabiłoby to znacznie siłę dyskryminacji p(w), ponieważ nie uwzględniałoby wielokrotnych wystąpień słowa w jednym liście.
Algorytm wybiera z wiadomości M 15 słów najbardziej odległych od arbitralnie przyjętej wartości 0.5, a następnie oblicza dla nich wartość funkcji f(M) w następujący sposób:
Kryterium dyskryminacji to f(M)>0.9.
Wzór (5) jest prawdziwy przy założeniu, że prawdopodobieństwa p(wi) są parami niezależne, a P(X)=0.5. Oczywiście nie jest to prawda w przypadku słów znajdujących się w korespondencji choćby ze względu na kontekst.
Moduł bayes jest mieszaną implementacją algorytmu prostego (zaproponowanego w pierwszej pracy Paula) i usprawnionego z pewnymi poprawkami, które sam wprowadziłem. Moduł ma bardzo wiele współczynników, które można modyfikować. Wszystkie dane, które będę poniżej wymieniał są makrodefinicjami w pliku bayes.c i umożliwiają dostrojenie algorytmu do swoich potrzeb.
Usprawnienia uwzględnione w Elmo:
Usprawnienia jeszcze nie uwzględnione:
Moje własne zmiany w algorytmie:
Jeśli chodzi o skanowanie nagłówków, to pozwoliłem sobie na zignorowaniu pozostałych nagłówków, gdyż zawierają losowe dane, które tylko zaśmiecają tablice hashujące, a niczego nie wnoszą. Aby moduł działał szybciej, prawie wszystkie operacje są wykonywane na liczbach całkowitych.
A to pełna lista definicji sterujących zachowaniem modułu:
This document was generated using the LaTeX2HTML translator Version 2K.1beta (1.48)
Copyright © 1993, 1994, 1995, 1996,
Nikos Drakos,
Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999,
Ross Moore,
Mathematics Department, Macquarie University, Sydney.
The command line arguments were:
latex2html -no_subdir -split 0 bayes.tex
The translation was initiated by rzyjontko on 2003-06-05