Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  1 632
Jeg forsøker å konstruere et spamfilter i C ved hjelp av ADT (Abstract data type) og Bayes' theorem.

Jeg ønsker bare å finne den enkleste måten å bruke Bayes til å sammenligne en mengde mailer for å skille ut spam fra normal mail, ved hjelp av bayes...

Her er de sidene jeg leser på nå:

http://www.paulgraham.com/spam.html
www.haifux.org/lectures/155/spam.pdf (Side 29, 30, 31)
http://www.cs.princeton.edu/courses/...ts/spamfilter/

Noen som har konstruert noe lignende som kan gi meg et tips på hvordan jeg kan lage et enkelt program for å finne ut prosentvis hvor mange av mailene mine som er spam, ved å bruke mailer jeg allerede er spam som referansepunkt?

På forhånd takk.

[EDIT:] Dette er ikke leksehjelp, jeg vil bare få noen utspill fra flere om hvor få funksjoner jeg trenger for å gjøre denne jobben.
Sist endret av Turbolego; 16. februar 2009 kl. 20:14. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
▼ ... over en uke senere ... ▼
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.