Deze opdrachten zijn onderdeel van een programmeercursus gegeven in de opleiding Informatiekunde van de Rijksuniversiteit Groningen.
Opdracht 4.1
Het voorbeeldprogramma van het college van week 4 (PDF-slides) laat specifieke woorden zien van de standaardinvoer samen met hun relatieve frequentie:
from re import sub # laad benodigde functies from sys import argv, stdin def tokenize(regel): # definitie functie tokenize() regel = sub("([^a-zA-Z0-9 ]+)",r" \1 ",regel) return(regel.split()) def main(gezochteWoorden): # definitie hoofdfunctie teller = {} aantalWoorden = 0 # lees regel en herhaal voor elke regel for regel in stdin: # tokeniseer regel woorden = tokenize(regel) # herhaal voor elk woord op de regel for woord in woorden: # verhoog totaal aantal woorden aantalWoorden += 1 # herhaal voor elk gevraagd woord for gezocht in gezochteWoorden: # als woord van regel == gevraagd woord if woord == gezocht: # verhoog teller if woord in teller: teller[woord] += 1 else: teller[woord] = 1 # voor elk gevraagd woord for gezocht in gezochteWoorden: # laat aantal getelde woorden zien if not gezocht in teller: print(0,gezocht) else: print(teller[gezocht]/aantalWoorden,gezocht) main(argv[1:]) # aanroep hoofdfunctie, verwijder programmanaam
Pas dit programma aan zodanig dat het niet alleen de gevraagde woorden laat zien maar ook alle woorden die deze woorden bevatten.
Een voorbeeld van de interactie met een aangepaste versie van het programma:
$ gunzip -c 2011050912.txt.gz | python3 41.py groningen 3.80167425734e-05 groningen 3.80167425734e-06 112groningennl 2.5344495049e-06 lunchgroningen 1.26722475245e-06 jovdgroningen 2.5344495049e-06 dwkgroningen
Het programma wordt aangeroepen met 1 of meer woorden als argument (in het voorbeeld: groningen) en laat vervolgens alle woorden zien die 1 van de argumentwoorden bevatten, samen met hun relatieve frequenties.
Opdracht 4.2
Schrijf een Pythonprogramma waarmee kan worden bepaald hoeveel tokens en types het bestand 2011050912.txt.gz bevat. Het programma moet de volgende taken uitvoeren:
- de gebruikersnaam aan het begin van elke regel moet worden verwijderd
- de leestekens moeten worden losgemaakt van de woorden; leestekens tellen ook mee als tokens en types
- vervolgens moeten alle tokens en types worden geteld
- als het programma alle regels heeft verwerkt dan moeten de totalen op het scherm worden getoond
Hier is een voorbeeld van de interactie met het programma:
$ gunzip -c 2011050912.txt.gz | python3 42.py Gevonden: 739705 woorden en 70381 types.
Opdracht 4.3
Schrijf een Pythonprogramma dat:
- een tekst inleest vanaf standaardinvoer (net zoals in opdrachten 4.1 en 4.2)
- 1 stringargument op de commandline accepteert
- alle tekst en het stringargument omzet naar kleine letters
- de tekst tokeniseert
- in de tekst alle woorden opzoekt die eindigen met de letters van het stringargument (zoals bij rijmwoorden)
- elk gevonden woord (type) 1x laat zien in een alfabetische lijst met 1 woord per regel
Hier is een voorbeeld van interactie met het programma:
$ gunzip -c 2011050912.txt.gz | python3 43.py overen promoveren toveren veroveren
Opmerking: als je in jouw programma een lijst nodig hebt van keys van een dictionary: let erop dat dict.keys() geen lijst terug geeft maar een dictionary-object. Je kan dit object omzetten in een lijst met de functie list(), dus: list(dict.keys()) levert wel een lijst op.
Opdracht 4.4
Een zoekprogramma voor woorden die beginnen met 1 of meer a's en vervolgens eindigen met 1 of meer b's, heeft 10.000 resultaten opgeleverd: data44.txt. Maar niet alle resultaten zijn correct. De strings bovenin het bestand zijn vaker correct dan de strings onderin het bestand.
Schrijf een Pythonprogramma dat de precisie en recall uitrekent voor de eerste n regels van dit databestand. Het getal n moet door de gebruiker van het programma worden opgegeven als argument van het programma. Gebruik 300 bij de berekening van recall voor het totaal aantal correcte gevallen. Zorg ervoor dat de uitvoer netjes geformateerd wordt: gebruik niet meer dan drie cijfers achter de komma/punt voor getallen.
Hier zijn een paar voorbeelden van interactie met het programma:
$ python3 09.py 10 < data44.txt @10: precisie=1.000 recall=0.033 $ python3 09.py 100 < data44.txt @100: precisie=0.730 recall=0.243 $ python3 09.py 1000 < data44.txt @1000: precisie=0.192 recall=0.640
Beantwoord nu de volgende vragen met behulp van het programma:
- Wat is de hoogste precisiescore die je kan halen voor eerste n regels van het databestand? Geef een waarde van n waarvoor deze score wordt gehaald.
- Wat is de hoogste recallscore die je kan halen voor eerste n regels van het databestand? Geef een waarde van n waarvoor deze score wordt gehaald.
- De F1-score is het harmonische gemiddelde van precisie en recall: F1 = 2*precisie*recall/(precisie+recall) . Pas het programma aan zodat het deze score ook uitrekent. Wat is de hoogste F1-score die je kan halen? Geef een waarde van n waarvoor deze score wordt gehaald.
Lever jouw programma's, testresultaten en antwoorden op vragen in op Nestor samengevoegd in 1 tekstbestand met naam studentnummer-weeknummer.txt, bijvoorbeeld s1234567-4.txt, voor dinsdag 24 mei 2011, 14:00.
Antwoorden
Last update: May 26, 2011. erikt(at)xs4all.nl