Het moderne Engels wordt beschouwd als een zwak geflecteerde taal. Dat betekent dat veel Engelse woorden zijn afgeleid van een ander woord; zo is het geflecteerde woord “normality” afgeleid van “norm”, de stamvorm. Alle geflecteerde talen bestaan uit woorden met gemeenschappelijke stamvormen, maar de mate van flectie verschilt per taal.
Bij het werken met tekst is het soms nodig om normalisatietechnieken toe te passen om woorden terug te brengen van hun afgeleide vormen naar hun stam. Dit helpt willekeur te verminderen en brengt de woorden in het corpus dichter bij de vooraf gedefinieerde standaard, wat de verwerkingssnelheid verbetert omdat de computer met minder kenmerken hoeft om te gaan.
Twee van de populairste tekstnormalisatietechnieken in Natural Language Processing (NLP) zijn stemming en lemmatization.
Onderzoekers bestuderen deze technieken al jaren; NLP-practitioners gebruiken ze doorgaans om woorden, tekst en documenten voor te bereiden op verdere verwerking in allerlei taken.
Deze tutorial behandelt stemming en lemmatization vanuit een praktische invalshoek met het Python Natural Language ToolKit (NLTK)-pakket.
Bekijk deze DataLab-werkmap voor een overzicht van alle code in deze tutorial. Maak een kopie van de werkmap om de code te bewerken en uit te voeren.
Wat is stemming?
Stemming is een techniek waarmee een geflecteerd woord wordt teruggebracht tot zijn woordstam. Zo kunnen de woorden “programming”, “programmer” en “programs” allemaal worden teruggebracht tot de gemeenschappelijke stam “program”. Met andere woorden: “program” kan worden gebruikt als synoniem voor de drie voorgaande flectievormen.
Deze tekstverwerkingstechniek is vaak nuttig om met schaarste om te gaan en/of om de woordenschat te standaardiseren. Het helpt niet alleen redundantie te verminderen, omdat de woordstam en de geflecteerde woorden meestal dezelfde betekenis hebben, het stelt NLP-modellen ook in staat verbanden te leren tussen geflecteerde woorden en hun stam, wat het model helpt hun gebruik in vergelijkbare contexten te begrijpen.
Stemmers werken door een lijst met vaak voorkomende voor- en achtervoegsels in geflecteerde woorden te nemen en het einde of begin van het woord af te kappen. Dit kan soms resulteren in stammen die geen echte woorden zijn — een beperking die we hieronder bespreken.
Voordelen van stemming
- Betere modelprestaties: Stemming vermindert het aantal unieke woorden dat een algoritme moet verwerken, wat de prestaties kan verbeteren. Bovendien kan het algoritme hierdoor ook sneller en efficiënter draaien.
- Vergelijkbare woorden groeperen: Woorden met een vergelijkbare betekenis kunnen worden gegroepeerd, zelfs als ze verschillende vormen hebben. Dit kan nuttig zijn bij taken zoals documentclassificatie, waar het belangrijk is om kernthema’s of onderwerpen in een document te identificeren.
- Makkelijker te analyseren en te begrijpen: Omdat stemming doorgaans de omvang van de woordenschat verkleint, wordt het veel eenvoudiger om teksten te analyseren, te vergelijken en te begrijpen. Dit is handig bij taken zoals sentimentanalyse, waar het doel is het sentiment van een document te bepalen.
Nadelen van stemming
- Overstemming / fout-positieven: Dit gebeurt wanneer een stemmer verschillende geflecteerde woorden tot dezelfde stam terugbrengt terwijl ze niet gerelateerd zijn; zo stemt het Porter Stemmer-algoritme “universal”, “university” en “universe” tot dezelfde stam. Hoewel ze etymologisch verwant zijn, liggen hun moderne betekenissen in sterk verschillende domeinen. Ze als synoniemen behandelen vermindert de relevantie in zoekresultaten.
- Onderstemming / fout-negatieven: Dit gebeurt wanneer een stemmer geflecteerde woorden tot verschillende stammen reduceert, terwijl ze gelijk zouden moeten zijn. Zo brengt het Porter Stemmer-algoritme “alumnus”, “alumnae” en “alumni” niet tot dezelfde stam terug, hoewel ze als synoniemen behandeld zouden moeten worden.
- Taaluitdagingen: Naarmate de morfologie, spelling en tekenencoding van de doeltaal complexer worden, wordt het lastiger om stemmers te ontwerpen; een Italiaanse stemmer is bijvoorbeeld complexer dan een Engelse vanwege het grotere aantal werkwoordsvervoegingen. Een Russische stemmer is nog ingewikkelder door meer naamwoordverbuigingen.
Wat is lemmatization?
Lemmatization is een andere techniek om geflecteerde woorden terug te brengen naar hun grondwoord. Het beschrijft het algoritmische proces van het identificeren van de “lemma” (woordenboekvorm) van een geflecteerd woord op basis van de beoogde betekenis.
In tegenstelling tot stemming, steunt lemmatization op het nauwkeurig bepalen van de beoogde woordsoort en de betekenis van een woord op basis van de context. Dat betekent dat wordt meegewogen waar het geflecteerde woord in een zin staat, maar ook de bredere context rond die zin, zoals naburige zinnen of zelfs een heel document.
Lemmatization verwijst doorgaans naar het correct te werk gaan met behulp van een woordenschat en morfologische analyse van woorden, waarbij normaal gesproken alleen flectie-eindes worden verwijderd en de basis- of woordenboekvorm van een woord wordt teruggegeven, de zogenoemde lemma
Standford NLP Group, Standford NLP Group
Met andere woorden, een document lemmatiseren betekent het correct doen, omdat je daarbij een woordenschat gebruikt en een morfologische analyse van woorden uitvoert om alleen de flectie-eindes te verwijderen en de basis- of woordenboekvorm van een woord terug te geven, de “lemma”. Je kunt bijvoorbeeld verwachten dat een lemmatization-algoritme “runs”, “running” en “ran” toewijst aan de lemma “run.”
Voordelen van lemmatization
- Nauwkeurigheid: Lemmatization kapt woorden niet simpelweg af zoals bij stemming. Analyse van woorden gebeurt op basis van de woordsoort (POS) zodat context wordt meegewogen bij het produceren van lemma’s. Bovendien levert lemmatization echte woordenboekwoorden op.
Nadelen van lemmatization
- Tijdrovend: In vergelijking met stemming is lemmatization een langzaam en tijdrovend proces. Dit komt doordat lemmatization morfologische analyse vereist en de betekenis van woorden uit een woordenboek afleidt.
Voorbeelden van stemming en lemmatization in Python met NLTK
Je hebt nu een overzicht van stemming en lemmatization. In deze sectie gaan we hands-on aan de slag en laten we voorbeelden van beide technieken zien met Python en een bibliotheek genaamd NLTK.
Het Python NLTK-pakket
Natural Language Tool Kit (NLTK) is een Python-bibliotheek voor het bouwen van programma’s die natuurlijke taal kunnen verwerken. De bibliotheek kan verschillende bewerkingen uitvoeren, zoals tokenizen, stemming, classificatie, parsen, taggen, semantisch redeneren, sentimentanalyse en meer.
De nieuwste versie is NLTK 3.9.x en vereist Python 3.10 of hoger (tot en met 3.14), maar daar hoef je je geen zorgen over te maken, want het is vooraf geïnstalleerd in de DataLab-werkmap — importeer gewoon nltk en je kunt aan de slag.
Voorbeeld van stemming in Python
Een van de populairste stemmers heet de “Porter stemmer.” De Porter stemmer werd voor het eerst voorgesteld door Martin Porter in een paper uit 1980 met de titel "An algorithm for suffix stripping." De paper is uitgegroeid tot een van de meest gebruikte algoritmen voor stemming in het Engels.
Zo werkt het:
import nltk
from nltk.stem import PorterStemmer
nltk.download("punkt_tab") # Use punkt_tab in NLTK 3.9+; punkt is deprecated
# Initialize Python porter stemmer
ps = PorterStemmer()
# Example inflections to reduce
example_words = ["program","programming","programer","programs","programmed"]
# Perform stemming
print("{0:20}{1:20}".format("--Word--","--Stem--"))
for word in example_words:
print ("{0:20}{1:20}".format(word, ps.stem(word)))
"""
--Word-- --Stem--
program program
programming program
programer program
programs program
programmed program
"""
Dit is een vrij eenvoudig voorbeeld; we verwachtten deze resultaten van onze Porter stemmer, zoals hierboven in de sectie “Stemming” vermeld.
Laten we een lastiger voorbeeld proberen:
import string
from nltk.tokenize import word_tokenize
example_sentence = "Python programmers often tend like programming in python because it's like english. We call people who program in python pythonistas."
# Remove punctuation
example_sentence_no_punct = example_sentence.translate(str.maketrans("", "", string.punctuation))
# Create tokens
word_tokens = word_tokenize(example_sentence_no_punct)
# Perform stemming
print("{0:20}{1:20}".format("--Word--","--Stem--"))
for word in word_tokens:
print ("{0:20}{1:20}".format(word, ps.stem(word)))
"""
--Word-- --Stem--
Python python
programmers programm
often often
tend tend
like like
programming program
in in
python python
because becaus
its it
like like
english english
We we
call call
people peopl
who who
program program
in in
python python
pythonistas pythonista
"""
Je ziet hier dat sommige uitvoerwoorden geen deel uitmaken van het Engelse woordenboek (zoals “becaus”, “people” en “programm”). Iets anders om op te merken is dat er geen rekening wordt gehouden met context. “Programmers” is bijvoorbeeld een meervoudig zelfstandig naamwoord, maar is teruggebracht tot “program”, wat een zelfstandig naamwoord of een werkwoord kan zijn — met andere woorden: de stamwoorden zijn ambigu.
Voorbeeld van lemmatization in Python
De motivatie achter contextgevoelige lemmatizers was om de prestaties op onbekende en dubbelzinnige woorden te verbeteren. In ons lemmatization-voorbeeld gebruiken we een populaire lemmatizer genaamd WordNet lemmatizer.
WordNet is een grote, gratis en publiek beschikbare lexicale database voor het Engels die gericht is op het vastleggen van gestructureerde semantische relaties tussen woorden.
Laten we het in actie zien:
from nltk.stem import WordNetLemmatizer
nltk.download("wordnet")
nltk.download("omw-1.4")
# Initialize wordnet lemmatizer
wnl = WordNetLemmatizer()
# Example inflections to reduce
example_words = ["program","programming","programer","programs","programmed"]
# Perform lemmatization
print("{0:20}{1:20}".format("--Word--","--Lemma--"))
for word in example_words:
# pos="v" tells the lemmatizer to treat words as verbs
# Other options: "n" (noun), "a" (adjective), "r" (adverb)
print("{0:20}{1:20}".format(word, wnl.lemmatize(word, pos="v")))
"""
--Word-- --Lemma--
program program
programming program
programer programer
programs program
programmed program
"""
Ingevoerde woorden die aan onze lemmatizer worden doorgegeven, blijven ongewijzigd als ze niet in WordNet te vinden zijn. Dit betekent dat context moet worden meegegeven, wat gebeurt door de waarde voor de part-of-speech-parameter, pos, op te geven in wordnet_lemmatizer.lemmatize.
Merk op dat het woord “programmer” niet is teruggebracht tot “program” door onze lemmatizer: dit komt omdat we onze lemmatizer hebben verteld alleen werkwoorden te verwerken.
Laten we onze lemmatizer iets ingewikkelders geven om te zien hoe die het doet…
example_sentence = "Python programmers often tend like programming in python because it's like english. We call people who program in python pythonistas."
# Remove punctuation
example_sentence_no_punct = example_sentence.translate(str.maketrans("", "", string.punctuation))
word_tokens = word_tokenize(example_sentence_no_punct)
# Perform lemmatization
print("{0:20}{1:20}".format("--Word--","--Lemma--"))
for word in word_tokens:
print ("{0:20}{1:20}".format(word, wnl.lemmatize(word, pos="v")))
"""
--Word-- --Lemma--
Python Python
programmers programmers
often often
tend tend
like like
programming program
in in
python python
because because
its its
like like
english english
We We
call call
people people
who who
program program
in in
python python
pythonistas pythonistas
"""
Alle woorden die door het lemmatization-algoritme worden teruggegeven, staan in het Engelse woordenboek — op “pythonistas” na, wat meer een informele term is voor Python-programmeurs.
Stemming vs. lemmatization
Je hebt gezien hoe je beide technieken implementeert, maar hoe verhouden ze zich?
Stemming en lemmatization zijn beide tekstverwerkingstechnieken die tot doel hebben geflecteerde woorden terug te brengen tot een gemeenschappelijke stam. Ondanks de overlap in het overkoepelende doel, zijn de twee technieken niet hetzelfde.
De belangrijkste verschillen tussen stemming en lemmatization liggen in de manier waarop elke techniek het doel bereikt om geflecteerde woorden te reduceren tot een gemeenschappelijke stam.
Stemmers proberen de gemeenschappelijke stammen van verschillende flecties te vinden door het einde of begin van het woord af te kappen. Het afkappen is gebaseerd op een lijst met veelvoorkomende voor- en achtervoegsels die typisch in geflecteerde woorden voorkomen. Deze ongedifferentieerde manier van afkappen kan soms tot betekenisvolle stammen leiden, maar soms ook niet.
Lemmatization probeert daarentegen gemeenschappelijke stammen te vinden uit geflecteerde woorden door een morfologische analyse uit te voeren. Om flecties nauwkeurig te reduceren, is een gedetailleerd woordenboek nodig zodat het algoritme kan opzoeken hoe een geflecteerd woord aan zijn lemma is gekoppeld.
De twee kunnen ook verschillen doordat stemming meestal afgeleide woorden samenvoegt, terwijl lemmatization doorgaans alleen de verschillende flectievormen van een lemma samenvoegt.
Stanford NLP, IR Book
De grove, heuristische aanpak van stemmers betekent doorgaans dat ze snel en efficiënt zijn, maar niet altijd nauwkeurig. Lemmatization levert daarentegen snelheid en efficiëntie in voor nauwkeurigheid, en resulteert zo in betekenisvolle stammen.
Een stemmer kan bijvoorbeeld “saw” reduceren tot “s.” Een lemmatizer zal op basis van de context waarin het wordt gebruikt nagaan of “saw” een zelfstandig naamwoord is (de handzaag) of een werkwoord (de verleden tijd van “to see”) voordat een lemma wordt teruggegeven — als het een zelfstandig naamwoord is, geeft hij “saw” terug, en als het een werkwoord is, “see.”
Deze punten zijn nu waarschijnlijk duidelijk, dus hier is de hamvraag — “moet ik stemming of lemmatization gebruiken voor tekstpreprocessing?”
Zoals met de meeste softwarezaken: het hangt ervan af.
Hecht je waarde aan snelheid en efficiëntie? Kies dan stemming.
Is context belangrijk voor je toepassing? Als je “ja” zegt, gebruik dan lemmatization.
Welke techniek je gebruikt, hangt volledig af van de toepassing waar je aan werkt en je projectdoelen. Je wilt misschien met beide technieken experimenten uitvoeren en de resultaten vergelijken om te zien welke aanpak het best aansluit bij je doelen.
Iets waar we in deze tutorial niet diep op zijn ingegaan, is hoe lemmatizers worden gemaakt; dat komt doordat er verschillende bibliotheken zijn (zoals SpaCy, NLTK, enz.) die met diverse talen werken. Als je echter je eigen lemmatizer zou moeten bouwen voor een niet-ondersteunde taal (bijv. Akan), heb je grondige kennis en begrip van de doeltaal nodig. Stemmers zijn in zulke scenario’s veel eenvoudiger te bouwen.
| Stemming | Lemmatization | |
|---|---|---|
| Snelheid | Snel | Traag |
| Nauwkeurigheid | Lager | Hoger |
| Uitvoer | Is mogelijk geen echt woord | Altijd een echt woord |
| Gebruikt context? | Nee | Ja |
| Beste voor | Zoekmachines, spamfilters | Chatbots, sentimentanalyse, QA |
Conclusie
Samengevat: stemming en lemmatization zijn technieken voor tekstverwerking in NLP. Ze hebben beide als doel flecties terug te brengen tot gemeenschappelijke stamwoorden, maar hanteren daarbij elk een andere aanpak.
Lemmatization is veel nauwkeuriger dan stemming. Het levert altijd echte woordenboekwoorden op en houdt rekening met context. Voor de meeste moderne NLP-pijplijnen heeft lemmatization de voorkeur wanneer nauwkeurigheid belangrijk is. Werk je echter op grote schaal of bouw je snel een prototype, dan kan stemming goed genoeg en aanzienlijk sneller zijn.
FAQs
Moet ik extra iets downloaden om NLTK's stemmer en lemmatizer te gebruiken?
Voor de Porter Stemmer zijn geen extra downloads nodig naast het installeren van NLTK zelf. Voor de WordNet Lemmatizer moet je eenmalig nltk.download("wordnet") en nltk.download("omw-1.4") uitvoeren voordat je hem gebruikt. Voor tokenization heb je in NLTK 3.9+ ook nltk.download("punkt_tab") nodig.
Waarom geeft mijn lemmatizer hetzelfde woord terug zonder het te veranderen?
Dit betekent meestal een van twee dingen: ofwel is het woord niet gevonden in het woordenboek van WordNet, of je hebt niet de juiste pos (part-of-speech) parameter opgegeven. Zo geeft wnl.lemmatize("running") standaard “running” terug omdat het een zelfstandig naamwoord aanneemt. Geef pos="v" door om het als werkwoord te behandelen en “run” terug te krijgen.
Is stemming of lemmatization beter voor zoekmachines?
Stemming heeft doorgaans de voorkeur voor zoekmachines omdat snelheid daar belangrijker is dan perfecte nauwkeurigheid. Als een gebruiker zoekt op "running shoes", wil je snel resultaten voor “run”, “runner” en “runs” teruggeven. De incidentele niet-woordenboek-stam schaadt de ervaring niet veel. Lemmatization is voor de meeste zoektoepassingen overkill.
Kan ik deze technieken gebruiken met andere talen dan Engels?
Ja, maar met wisselende moeilijkheid. NLTK heeft out-of-the-box beperkte ondersteuning voor andere talen. Voor bredere meertalige ondersteuning zijn bibliotheken als spaCy of Stanza betere opties — spaCy heeft met name sterke lemmatization-ondersteuning voor talen zoals Duits, Frans, Spaans, Portugees en meer. Een eigen stemmer of lemmatizer bouwen voor een low-resource-taal (zoals Akan) vereist diepgaande kennis van de morfologie van die taal.
Levert lemmatization altijd betere NLP-modelresultaten op dan stemming?
Niet per se. Het hangt af van je taak en dataset. Voor taken waarbij de exacte woordbetekenis belangrijk is — zoals question answering, sentimentanalyse of chatbots — presteert lemmatization meestal beter. Voor simpelere taken zoals documentclassificatie of keyword-extractie levert stemming vaak net zo goede resultaten op, tegen een fractie van de rekentijd. De veiligste aanpak is om beide te testen en de resultaten op je eigen data te vergelijken.

