Extra¶
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.