Extra

Deze pagina bevat uitvoerbare code.

Woordenschat vergelijken

Twee schrijvers gebruiken zelden precies dezelfde woorden. De basisopgave telt hóe vaak elk woord voorkomt in één tekst; hier gaat het om een andere vraag: welke woorden delen twee teksten, en welke woorden zijn uniek voor één ervan?

Dat is geen telvraag meer, dus geen dictionary. Het is een vraag over lidmaatschap, en daar is de set voor gemaakt.

Unie en doorsnede

Voor twee sets a en b:

Vraag

Methode

Operator

Wat zit in minstens één van de twee?

a.union(b)

a | b

Wat zit in allebei?

a.intersection(b)

a & b

Voorbeeld, voor a = {"appel", "peer"} en b = {"appel", "kiwi"}:

a.union(b)  # {'appel', 'peer', 'kiwi'}
a.intersection(b)  # {'appel'}

De teksten

assets/teksten/kort.txt en assets/teksten/vuurtoren.txt zijn dezelfde bestanden als in de basisopgave.

Wat je gaat maken

Stap

Functie

Doet

1

unique_words

de verzameling unieke woorden in één tekst

2

shared_words

de woorden die in twee teksten allebei voorkomen

3

all_words

de woorden die in minstens één van de twee voorkomen

Stap 1: unique_words(text)

Geeft de set van unieke woorden in de tekst, allemaal in kleine letters en zonder leestekens - dezelfde opschoning als word_list uit de basisopgave, alleen levert deze functie een set op in plaats van een lijst.

Aanroep

Resultaat

unique_words("Spam, spam. Taart!")

{"spam", "taart"}

len(unique_words(read_text("assets/teksten/kort.txt")))

11

Hint

Splits de tekst zoals in de basisopgave tot een lijst van schone woorden, en zet die lijst dan om in een set met set(...).

def read_text(filename):
    """Leest een heel bestand en geeft de inhoud terug als één string

    :param filename: de naam van het bestand
    :type filename: str
    :rtype: str
    """
    with open(filename) as file:
        return file.read()
# jouw oplossing
assert unique_words("Spam, spam. Taart!") == {"spam", "taart"}
assert len(unique_words(read_text("assets/teksten/kort.txt"))) == 11

Stap 2: shared_words(text1, text2)

Geeft de set van woorden die in beide teksten voorkomen: de doorsnede van hun unieke woorden.

Aanroep

Resultaat

shared_words("ik wil taart", "ik wil koekjes")

{"ik", "wil"}

Hint

unique_words heb je al. Combineer de twee resultaten met .intersection() of &.

# jouw oplossing
assert shared_words("ik wil taart", "ik wil koekjes") == {"ik", "wil"}
assert shared_words(
    read_text("assets/teksten/kort.txt"), read_text("assets/teksten/vuurtoren.txt")
) == {"de", "en", "voor", "wil"}

Stap 3: all_words(text1, text2)

Geeft de set van woorden die in minstens één van de twee teksten voorkomen: de unie van hun unieke woorden.

Aanroep

Resultaat

all_words("ik wil taart", "ik wil koekjes")

{"ik", "wil", "taart", "koekjes"}

len(all_words(read_text("assets/teksten/kort.txt"), read_text("assets/teksten/vuurtoren.txt")))

141

# jouw oplossing
assert all_words("ik wil taart", "ik wil koekjes") == {"ik", "wil", "taart", "koekjes"}
assert len(
    all_words(read_text("assets/teksten/kort.txt"), read_text("assets/teksten/vuurtoren.txt"))
) == 141

Uitproberen

kort.txt en vuurtoren.txt delen maar 4 woorden op 141 in totaal - niet gek voor twee teksten die niets met elkaar te maken hebben. Probeer twee teksten van dezelfde schrijver, of over hetzelfde onderwerp, en vergelijk: delen die meer?