Extra

Deze pagina bevat uitvoerbare code.

Woordenschat vergelijken

Opdracht: Woordenschat vergelijken

# Dit notebook staat in solutions/ en de teksten in problems/assets/teksten/,
# vandaar het pad terug. In de opgave zelf is dat gewoon "assets/teksten/".
TEKSTEN = "../problems/assets/teksten/"
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()
LEESTEKENS = ".,!?;:"


def unique_words(text):
    """Geeft de verzameling unieke woorden in de tekst, in kleine letters en zonder leestekens

    :param text: de tekst
    :type text: str
    :rtype: set
    """
    schoon = ""

    for teken in text.lower():
        if teken in LEESTEKENS:
            schoon = schoon + " "
        else:
            schoon = schoon + teken

    return set(schoon.split())


assert unique_words("Spam, spam. Taart!") == {"spam", "taart"}
assert len(unique_words(read_text(TEKSTEN + "kort.txt"))) == 11

Dezelfde opschoning als word_list uit de basisopgave, alleen levert set(...) meteen de unieke woorden op: een set kan geen duplicaten bevatten, dus het omzetten zelf doet het tellen overbodig.

def shared_words(text1, text2):
    """Geeft de set van woorden die in beide teksten voorkomen

    :param text1: de eerste tekst
    :type text1: str
    :param text2: de tweede tekst
    :type text2: str
    :rtype: set
    """
    return unique_words(text1).intersection(unique_words(text2))


assert shared_words("ik wil taart", "ik wil koekjes") == {"ik", "wil"}
assert shared_words(
    read_text(TEKSTEN + "kort.txt"), read_text(TEKSTEN + "vuurtoren.txt")
) == {"de", "en", "voor", "wil"}
def all_words(text1, text2):
    """Geeft de set van woorden die in minstens één van de twee teksten voorkomen

    :param text1: de eerste tekst
    :type text1: str
    :param text2: de tweede tekst
    :type text2: str
    :rtype: set
    """
    return unique_words(text1).union(unique_words(text2))


assert all_words("ik wil taart", "ik wil koekjes") == {"ik", "wil", "taart", "koekjes"}
assert len(
    all_words(read_text(TEKSTEN + "kort.txt"), read_text(TEKSTEN + "vuurtoren.txt"))
) == 141

shared_words en all_words zijn allebei één regel, omdat unique_words het echte werk al doet. Dat is precies het punt van deze opgave: eenmaal als set, en de vraag wordt een kwestie van de juiste operator kiezen.