elmo-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [elmo-users] poprawki


From: rzyjontko
Subject: Re: [elmo-users] poprawki
Date: Fri, 02 May 2003 12:04:26 +0200
User-agent: elmo/0.7

W swoim poprzednim liście napisałeś:
> 
> Nie podesłałbyś swojego konfiga (tj. fragmentu odpowiedzialnego
> za spam)? :)

To jeszcze nie jest jakoś bardzo wygodne, ale nad wygodą to trzeba
jeszcze popracować.  Mogę tylko powiedzieć, że jeszcze nie widziałem
wyniku bayesa z przedziału [0.22, 0.98] :)

set bayes_file ~/.elmo/bayes
hook folder_delete_mail folder_make_legitimate
hook folder_at_leave folder_trash_spam
hook folder_at_leave folder_scan_legitimate
hook folder_at_leave wrapbox_remove_trashed
set box_trash trash

Ja się bawię tym tak: ściągam sobie pocztę i ona ma znak zapytania,
więc wywołuję folder_check_spam albo folder_check_not_checked.  Ona
się czasami myli (szczególnie na początku) na korzyść spamu
(tzn. listy ze spamem są uznawane za poprawne).  Jeśli się tak pomyli,
to wywołuję folder_delete_as_spam.  Uwaga: skanować należy już po
przeniesieniu do skrzynki, w której chce się mieć list ponieważ
operacja przenoszenia usuwa wszelkie flagi związane z listem.

A teraz trochę technikaliów
---------------------------
folder_make_legitimate skanuje list i wszystkie słowa wrzuca do
korpusu z poprawną pocztą, a wiadomości ustawia specjalną flagę L,
która oznacza, że list został przeskanowany.

folder_delete_as_spam skanuje list i wszystkie słowa wrzuca do korpusu
ze spamem, a wiadomości ustawia flagę T (trashed) czyli do usunięcia.

wrapbox_remove_trashed usuwa wszystkie listy z flagą T lub przenosi je
do skrzynki, którą definiujemy jako box_trash w pliku
kofniguracyjnym.  Jeśli więc list ze spamem zostanie przeniesiony do
trash, to nie należy go już potem skanować ani robić po raz drugi
delete_as_spam.  On już został przeskanowany i tyle.

folder_trash_spam ustawia wszystkim listom rozpoznanym jako spam flagę
T, czyli do usunięcia.

folder_scan_legitimate uruchamia folder_make_legitimate dla każdego
listu, który jeszcze nie został przeskanowany, ale został rozpoznany
jako prawidłowy list.

folder_none_was_scanned nie zmienia nic w module bayes, ale usuwa
wszystkim listom z bierzącej skrzynki flagę L.

folder_at_leave nie robi nic, służy do tego, żeby można było
dowiązywać jej hooki.

folder_check_spam         - sprawdza wybrany
folder_check_not_checked  - sprawdza nie sprawdzone
folder_check_new_for_spam - sprawdza nowe


UWAGA: Jeśli w programe wywołaliśmy jedną z funkcji folder_check*, to
skanowanie wiadomości nie będzie wpływać na wyniki kolejnych checków.
Pierwsze uruchomienie folder_check* generuje tablicę prawdopodobieństw
z dostępnych danych (na początku żadnych) i tablica ta zostanie
usunięta dopiero po zakończeniu programu.  Na początku może się to
wydawać nienaturalne, ale z czasem przestaje mieć znaczenie, a
generacja tablicy może trochę trwać.  Jeśli chcecie sobie skanować
list, potem ew. go przeskanować i obserwować jak będzie z następnymi,
to trzeba albo opuszczać program, albo uruchamiać funkcję
bayes_free_resources.


Trochę o bayesie i jego implementacji w elmo.
---------------------------------------------
Moduł bayes jest mieszaną implementacją algorytmu prostego i
zaawansowanego z pewnymi poprawkami, które sam wprowadziłem.  Moduł ma
bardzo wiele współczynników, które możnaby modyfikować, ale nie
doszedłem jeszcze do tego, jak wymusić na configure, żeby definiował
mi w nagłówku moje zmienne.  Wszystkie dane, które będę poniżej
wymieniał są makrodefinicjami w pliku bayes.c i można sobie nimi
manipulować.

Co wziąłem z algorytmu zaawansowanego?
 - tokeny są case-sensitive "Free" i "free" to nie są te same tokeny;
 - adresy nie są rozdzielane "address@hidden" jest pojedynczym tokenem,
   kropki w środku słowa są jego częścią;
 - tokeny często występujące wyłącznie w korpusie ze spamem są
   bardziej interesujące w sensie algorytmu niż te występujące mniej
   niż 10 razy (ale również wyłącznie w korpusie ze spamem).

Czego nie wziąłem?
 - brak strukturalizacji i degeneracji tokenów.

Co zmieniłem?
 - z nagłówka skanowane są tylko wybrane części i to dopiero po
   rozkodowaniu -- Received, Sender, From, To, Subject;
 - słowa nie mogą przekraczać 60 znaków.

Jeśli chodzi o strukturalizację i degenerację tokenów, to chciałbym to
jeszcze kiedyś zrobić, ale jest przy tym trochę pracy, a aktualne
wyniki robią naprawdę bardzo duże wrażenie.  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ą.

Ja jestem tak gorącym przeciwnikiem spamu, że pozwoliłem sobie na
nagięcie parametrów tak by były bardziej dyskryminujące ze wskazaniem
na spam.  Jak tym sterować?

Aby moduł działał szybciej, prawie wszystkie operacje są wykonywane na
liczbach całkowitych.  Prawdopodobieństwo zdarzenia pewnego wynosi
10000, ale można to zmienić.

PROB_CERTAIN służy do sterowania dokładnością prawdopodobieństwa.
Domyślna wartość 10000 oznacza, że pod uwagę będą brane cztery cyfry
po przecinku.

PROB_NEUTRAL określa prawdopodobieństwo dla słowa, które pojawiło się
w obydwu korpusach mniej niż PROB_MIN_OCCUR razy.

PROB_LIMIT to prawdopodobieństwo powyżej którego listy będą
kwalifikowane jako spam.

PROB_HALF określa które słowa będą bardziej interesujące z punktu
widzenia algorytmu.  Wartości bliższe 0 będą preferowały słowa
wskazujące na poprawność listu, a bliższe 1 będą preferowały słowa
wskazujące na spam.  Ta liczba powinna być z zakresu 0.49 - 0.51.

PROB_MIN określa minimalną wartość prawdopodobieństwa oraz
prawdopodobieństwo słowa, które występuje wyłącznie w korupsie z
poprawną pocztą.

PROB_MAX określa prawdopodobieństwo słowa, które występuje wyłącznie w
korupsie ze spamem, ale mniej niż 10 razy.

PROB_MAX_MAX określa maksymalne prawdopodobieństwo słowa oraz wartość
prawdopodobieństwa dla słowa, które występuje wyłącznie w korpusie ze
spamem, ale więcej niż 10 razy.

WORD_MAX_LEN to maksymalna długość tokenu.

HEAP_SIZE oznacza ilość słów branych pod uwagę przy obliczaniu
prawdopodobieństwa.  Większa ilość słów będzie wpływać niekorzystnie
na rozpoznawanie długich listów, ale może zmniejszyć
prawdopodobieństwo pomyłki na niekorzyść poprawnego listu.  Ta liczba
musi być potęgą dwójki.


W sumie to możnaby jeszcze manipulować biasem, ale zaszyłem go w kod.
Jeśli uważacie, że przydatna byłaby taka możliwość, to zmienię to.


A oto proponowane przeze mnie zestawy wartości:

1. Dla paranoików

PROB_HALF    --  5100
PROB_MIN     --     1
PROB_MAX     --  9000
PROB_MAX_MAX --  9900
HEAP_SIZE    --    32

2. Przeciętny

PROB_HALF    --  5000
PROB_MIN     --    10
PROB_MAX     --  9800
PROB_MAX_MAX --  9900
HEAP_SIZE    --    16

3. Dla desperado

PROB_HALF    --  5100
PROB_MIN     --    10
PROB_MAX     --  9900
PROB_MAX_MAX --  9999
HEAP_SIZE    --    16

Na CVSie jest wariant numer 3 :)  I tylko ten wariant testowałem.
Jeśli chodzi o wariant 1 to nie wiem, czy w ogóle będzie coś
odfiltrowywał, ale o ile się dobrze orientuję to po przeskanowaniu
bardzo dużej liczby wiadomości wartości te nie będą miały większego
znaczenia i ich skuteczność powinna być mniej więcej taka sama.

----                                ----
rzyjontko         <rzyj # plusnet () pl>
http://www.student.ii.uni.wroc.pl/~rzyj/
----                                ----





reply via email to

[Prev in Thread] Current Thread [Next in Thread]