Jouw berichten
Het filter haalt alles uit zijn voorbeelden. Geef je het andere voorbeelden, dan leert het iets anders. In deze laatste stap leer je het filter je eigen berichten.
Voorspel
spam = {"je": 1, "pakket": 1, "wacht": 1, "betaal": 1, "nu": 1}
gewoon = {"ik": 1, "heb": 1, "je": 1, "pakket": 1}
score = 0
for woord in "betaal je pakket".split():
if woord in spam:
score = score + spam[woord]
if woord in gewoon:
score = score - gewoon[woord]
print("score:", score)
Welke score krijgt "betaal je pakket"? En welke score krijgt
"je pakket"?
Antwoord
score: 1
betaal geeft +1. je en pakket staan in allebei de tellingen even vaak,
dus ze geven samen 0. Bij "je pakket" blijft alleen dat over: score 0,
geen spam.
Zo werkt het
Een filter dat leert, is zo goed als zijn voorbeelden. Staat een woord even vaak in spam als in gewone berichten, dan zegt het niets over een nieuw bericht. Met meer voorbeelden leert het filter beter welke woorden vooral in spam staan.
Bouw zelf: leer het filter jouw berichten
Vervang de voorbeelden door je eigen: zet in spamwoorden de woorden uit
een paar spamberichten die je zelf kreeg (of verzin ze), en in
gewone_woorden de woorden uit gewone berichten van vrienden. Bedenk daarna
drie nieuwe berichten die het filter nog nooit zag, en kijk of het ze goed
indeelt.
Begin klein, en breid de code stap voor stap uit:
- Draai de code. In de editor staat het filter uit de vorige stappen, met maar drie woorden spam en drie gewone woorden.
- Zet in
spamwoordende woorden uit een paar spamberichten, en ingewone_woordendie uit gewone berichten. - Bedenk drie nieuwe berichten, en kijk bij elk of het filter het goed indeelt.
Tip
Schrijf de voorbeelden in kleine letters en zonder leestekens, want het
filter vergelijkt hele woorden. Hoe meer voorbeelden, hoe beter het filter
gewone woorden als je en het leert herkennen.
Antwoord
Een voorbeeld van het begin:
spamwoorden = "je pakket wacht betaal nu je account is geblokkeerd log nu in".split()
gewone_woorden = "kom je zaterdag voetballen ik heb je pakket meegenomen".split()
Test bijvoorbeeld "betaal nu voor je pakket" (spam) en
"heb je zaterdag tijd" (geen spam). Dat het filter niet altijd gelijk heeft,
is geen fout in je code. Het weet alleen wat in je voorbeelden stond: met
je pakket in allebei de lijsten twijfelt het bij elk bericht over een
pakket.
Echte spamfilters tellen ook woorden in voorbeelden, maar rekenen daarmee een kans uit in plaats van een score. Het idee is hetzelfde: het filter leert van berichten waarvan je het antwoord al weet.
Door naar een afstand.