Vorige | Home | Slides | Volgende

 

PTT Python 2011: Opdracht 4


Deze opdrachten zijn onderdeel van een programmeercursus gegeven in de opleiding Informatiekunde van de Rijksuniversiteit Groningen.

Achtergrondinformatie bij deze opdracht is te vinden in de secties 1.6, 5.1, 5.2, 5.3, 5.5, 5.6, 6.3, 6.5, 11.2, 11.6 en 11.7 van het boek van Zelle. De online-Pythonhandleiding kan worden gebruikt als extra naslagwerk.

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:

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:

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:

  1. 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.

  2. 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.

  3. 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