Jeg går rett på sak:
Samle data:
1. Finn alle ordene som finnes i epostene du bruker som referanse.
For hvert ord må du holde rede på hvor mange ganger det forekommer i gruppen med spampost,
og hvor mange ganger det forekommer i ikke-spam post.
Hvordan du gjør det rent teknisk kan vel varieres, men du må nå ende opp med en struktur som ligner dette:
String Ord -> int Antall_i_spam, int Antall_i_ikkespam ...for hvert ord som finnes i epostene dine.
NB! Jeg tenker meg at du kun teller et ord en gang, selv om det er flere forekomster av det i en epost.
Så om ordet "tilbud" forekommer 3 ganger i en epost, så teller du det kun 1 gang der.
2. Nyttige variabler du kan lagre allerede nå er antall ord totalt i spam-epostene og tilsvarende for ikke-spam.
Finn ut om en epost er spam om vi kun sjekker ETT ord:
Tar utgangpunkt i Bayes':
P(S|W) = P(W|S) * P(S) / P(W)
S = Er spam, W = Ett gitt ord
P(S|W) er da sannsynligheten (P=probability) for at eposten er spam GITT (| = gitt at) at den inneholder ordet W.
P(W|S) er sannsynligheten for at eposten inneholder ordet W GITT at det er spam.
Denne finner du slik: (Antall eposter W forkommer i, i gruppen eposter med spam)/(total antall eposter i gruppen med spam)
eks: ordet "tilbud" finnes i total 40 eposter i spam gruppen (husk at vi teller flere forekomster i samme epost bare en gang).
Totalt antall spam-eposter i referansegruppen din er 100. P(W|S) = 40/ 100 = 0.4
P(S) er sannsynligheten for at en tilfeldig epost er spam, uavhengig av hva vi driver med her. Dette er blitt anslått til
minst 0.8 (80%). Imidlertid pleier de fleste filtre av denne typen og sette denne til 50%. Mulig de gjør det som ekstra sikkerhet mot
falske positiver. ALternativt kan du jo bruke kun ditt eget referansegrunnlag som data her.
P(W) er sannsynligheten for at ordet W forekommer i en tilfeldig epost, av hvilken som helst type.
Denne finner du slik:
(Antall ganger ordet W forekommer i spam eposter + antall ganger ordet W forekommer i ikke-spam eposter)/ (total antall eposter av begge typer)
feks: vi har 100 spam eposter og 100 ikke-spam, ordet "tilbud" forekommer 40 ganger i spam gruppen og 5 ganger i ikke-spam gruppen
P(W) = (40 + 5) / (100 +100) = 0.225
Vi får da: P(S|W) = (0.4 * 0.5) / 0.225 = 0.89 (89%). (Her valgte jeg å brukte jeg 50% for at en tilfeldig epost er spam)
Som om ordet "tilbud" er det eneste ordet du bruker for å identifisere spam, så er det altså 89% sjanse for en epost som
inneholder ordet "tilbud" er spam, med det datagrunnlaget jeg brukte som eksempler her.
Men du skal selvfølgelig sjekke alle ordene (eller i hvertfall mange):
Ovenstående prosedyre gjennomfører du for hvert ord i eposten du skal sjekke (eller du kan ignorere vanlige ord som "er", "du" osc, prøv deg fram).
Da ender du opp med en rekke sannsynligheter P1, P2, P3...Pn, for en epost med n antall ord.
Kombiner disse for å finne sannsynligheten for at en epost er spam:
P = (P1 * P2 * P3 * ... * Pn) / ( (P1 * P2 * P3 * ... * Pn) + ( (1-P1) * (1-P2) * (1-P3) * ... * (1-Pn) ) )
P er da den sannsynligheten du er ute etter. Så kan du for eksempel kreve at 95% er minimum for å kategorisere en epost som spam.
Du oppdaterer selvfølgelig tellingene av ord ettersom du mottar eposter, slik at programmet forbedrer seg etterhvert som det får
mer data på jobbe med.
http://en.wikipedia.org/wiki/Bayesian_spam_filtering
NB! Formelen skiller seg litt ut fra den jeg brukte her, men den gir samme resultat.
Tar forbehold om at jeg er på bærtur.