# 3.5 Spamfilters

Men schat dat tegenwoordig bijna 90 procent van de e-mails die worden verzonden spam is. Daarom wordt er erg veel gedaan aan het bestrijden van spam. Een manier om dit te doen is gebruik te maken van spamfilters. Als gebruiker heb je dan weinig last van de spam, omdat die er voor je uit wordt gefilterd. Maar hoe werkt dat filteren precies?

De makkelijkste manier om mail te filteren is gebruik maken van een woordfilter. Alle berichten die binnenkomen, worden door de computer gescand. Als er een bepaald woord uit het woordfilter in voorkomt (bijvoorbeeld viagra), dan bestempelt de computer het bericht als spam.

Woordfilters kunnen werken met verboden woorden, zoals hierboven, en ook met toegestane woorden. Door te tellen hoeveel toegestane en verboden woorden een bericht bevat, kan de computer bepalen of een bericht wel of geen spam is. Dit heet een heuristisch filter. Zo een filter bepaalt eigenlijk de kans dat een bericht spam is.

Nog slimmer is het om geen vaste woordenlijsten te gebruiken, maar de woordenlijsten steeds aan te passen. In zo een geval wordt een spamfilter Bayesiaans genoemd. Bayesiaanse filters moeten worden getraind. Dit betekent, dat je het filter van tevoren moet vertellen welke berichten wel spam zijn, en welke berichten geen spam zijn. Het programma scant dan alle berichten, en maakt een lijst van alle woorden die in die berichten voorkomen.

Voor elk woord wordt geteld in hoeveel spamberichten het voorkomt en in hoeveel ham-berichten het voorkomt. Een ham-bericht is hetzelfde als een niet-spam bericht. Dit levert dus een lijst op met voor elk woord dat in de berichten voorkomt twee getallen: het aantal spamberichten waar het in voorkomt in en het aantal ham-berichten waar het in voorkomt. Een spamfilter wordt natuurlijk steeds beter als je het traint met meer berichten.

Voorbeeld

Bijvoorbeeld: Het filter is getraind met 1000 berichten, waarvan er 700 spam zijn en 300 ham. De lijst ziet er als volgt uit:

woord | aantal keer in spam | aantal keer in ham
Aanbieding | 200 | 30
! | 500 | 100
boeken | 7 | 6
twee | 7 | 50

Het filter krijgt nu het volgende bericht binnen:
Aanbieding! Koop nu gloednieuwe boeken bij ons. Op is op. Betaal over twee jaar.
Is dit bericht nu spam of ham? Met de formule van Bayes kunnen we dit berekenen.
De formule is het makkelijkst uit te leggen aan de hand van een voorbeeld. Stel dat we alleen kijken naar woord aanbieding dat voorkomt in ons binnengekomen bericht en we willen weten of het bericht spam of ham is.

- P(spam|aanbieding) = De kans dat een bericht spam is als het woord aanbieding voorkomt. Dit is wat we gaan berekenen.
- P(aanbieding|spam) = de kans dat het woord aanbieding voorkomt in een spambericht = aantal keer dat het woord aanbieding in een spambericht voorkomt gedeeld door het totaal aantal spamberichten = 200/ 700 = 0.29
- P(spam) = de kans dat een bericht spam is = aantal spamberichten gedeeld door het totaal aantal berichten = 700/1000 = 0.7
- P(aanbieding) = de kans dat het woord aanbieding voorkomt = totaal aantal keer dat het woord aanbieding voorkomt gedeeld door totaal aantal berichten = 230/1000 = 0.23

We krijgen nu dus:

De kans dat een bericht met het woord aanbieding erin spam is, is 87%.

Naïeve Bayes
We hadden niet alleen een bericht waar het woord aanbieding in voorkwam maar we hadden een langer bericht. Hier komen de woorden aanbieding, !, boeken en twee voor in de lijst van het spamfilter. Je krijgt nu de naïeve Bayes formule:

We kunnen nu berekenen of het bericht met deze 4 woorden spam is.

- P(aanbieding|spam) = aantal keer dat het woord aanbieding in een spambericht voorkomt gedeeld door het totaal aantal spamberichten = 200/ 700 = 0.29
- P(!|spam) = aantal keer dat het woord ! in een spambericht voorkomt gedeeld door het totaal aantal spamberichten = 500/ 700 = 0.72
- P(boeken|spam) = aantal keer dat het woord boeken in een spambericht voorkomt gedeeld door het totaal aantal spamberichten = 7/ 700 = 0.01
- P(twee|spam) = aantal keer dat het woord twee in een spambericht voorkomt gedeeld door het totaal aantal spamberichten = 7/ 700 = 0.01
- P(spam) = aantal spam berichten gedeeld door het totaal aantal berichten = 700/1000 = 0.7
- P(aanbieding|ham) = aantal keer dat het woord aanbieding in een hambericht voorkomt gedeeld door het totaal aantal hamberichten = 30/ 300 = 0.1
- P(!|ham) = aantal keer dat het woord ! in een hambericht voorkomt gedeeld door het totaal aantal hamberichten = 100/ 300 = 0.33
- P(boeken|ham) = aantal keer dat het woord boeken in een hambericht voorkomt gedeeld door het totaal aantal hamberichten = 6/ 300 = 0.02
- P(twee|ham) = aantal keer dat het woord twee in een hambericht voorkomt gedeeld door het totaal aantal hamberichten = 50/ 300 = 0.17
- P(ham) = aantal ham berichten gedeeld door het totaal aantal berichten = 300/1000 = 0.3

De uitkomst is nu:

Opdracht

Maak nu de opdracht "Ongewenste e-mail " uit het menu-onderdeel "Opdrachten en Toetsen".