Twee tellingen
Je kunt nu de woorden van één lijst tellen. Het filter leert van twee stapels voorbeelden: spamberichten en gewone berichten. Het telt ze apart, in twee dictionaries.
Voorspel
spam = {"gratis": 2, "nu": 2, "klik": 2}
gewoon = {"je": 3, "nu": 1, "school": 2}
print("nu" in spam, "nu" in gewoon)
print("je" in spam, "je" in gewoon)
print("hoi" in spam, "hoi" in gewoon)
Wat print dit programma?
Antwoord
True True
False True
False False
nu staat in allebei de tellingen, je alleen in die van de gewone
berichten. hoi staat in geen van beide: dat woord kwam in geen enkel
voorbeeld voor.
Zo werkt het
Het filter telt twee keer: één keer de woorden uit spam, en één keer de woorden uit gewone berichten. Allebei zijn het voorbeelden waarvan je het antwoord al weet.
Een woord kan in allebei de tellingen staan, zoals nu. Daarom vraag je het
aan elke dictionary apart, met twee losse if's.
Onderzoek
- Verander
woordin"je", en daarna in"school". In welke telling staan ze, en hoe vaak? - Probeer
"hoi". Wat print het programma? - Verander de tweede
ifinelif, en probeer"nu"nog eens. Wat mis je nu?
Antwoorden
jestaat drie keer in de gewone berichten, en niet in spam.schoolstaat twee keer in de gewone berichten.- Niets.
hoistaat in geen van beide tellingen: het filter heeft dat woord nooit gezien. - Je ziet alleen
in spam: 2. Metelifslaat Python de tweede vraag over zodra de eerste past. Een woord kan in allebei staan, dus je hebt twee losseif's nodig.
Opdracht: tel ook de gewone woorden
In de editor telt het filter de spamwoorden al. Tel ook de woorden uit
gewone_woorden, in een dictionary gewoon. De uitvoer wordt:
{'win': 1, 'nu': 2, 'gratis': 2, 'geld': 2, 'prijs': 1, 'klik': 2, 'hier': 1, 'voor': 1}
{'zie': 1, 'je': 3, 'morgen': 1, 'op': 1, 'school': 2, 'heb': 1, 'het': 1, 'huiswerk': 1, 'al': 1, 'kom': 1, 'nu': 1, 'naar': 1}
Begin klein, en breid de code stap voor stap uit:
- Draai de code: je ziet de telling van de spamwoorden.
- Maak onder de
printeen lege dictionarygewoon, en print hem. Je ziet nu ook{}. - Zet tussen die twee nieuwe regels een loop die de woorden uit
gewone_woordentelt ingewoon, net als de loop vanspam. Nu staat'je': 3erin.
Tip
Kopieer de loop van spam, en vervang daarin elke naam die bij spam hoort.
Het zijn er vijf: één keer de lijst, en vier keer de dictionary.
Antwoord
spamwoorden = "win nu gratis geld gratis prijs klik nu klik hier voor geld".split()
gewone_woorden = "zie je morgen op school heb je het huiswerk al kom je nu naar school".split()
spam = {}
for woord in spamwoorden:
if woord in spam:
spam[woord] = spam[woord] + 1
else:
spam[woord] = 1
print(spam)
gewoon = {}
for woord in gewone_woorden:
if woord in gewoon:
gewoon[woord] = gewoon[woord] + 1
else:
gewoon[woord] = 1
print(gewoon)
{'win': 1, 'nu': 2, 'gratis': 2, 'geld': 2, 'prijs': 1, 'klik': 2, 'hier': 1, 'voor': 1}
{'zie': 1, 'je': 3, 'morgen': 1, 'op': 1, 'school': 2, 'heb': 1, 'het': 1, 'huiswerk': 1, 'al': 1, 'kom': 1, 'nu': 1, 'naar': 1}
Dit zijn de tellingen die het filter in de volgende stappen gebruikt.
Door naar de score.