Lemmatizatie met POS-Tagging
De Engelse taal bevat veel woorden die als meerdere woordsoorten met verschillende betekenissen kunnen dienen. Bijvoorbeeld, "running" kan een werkwoord zijn ("He is running.") of een zelfstandig naamwoord ("Running is fun.").
Zoals we al hebben gezien, kan een lemmatizer een woord alleen nauwkeurig tot zijn basisvorm terugbrengen als het de woordsoort in de gegeven context kent. POS-tagging biedt deze context, waardoor lemmatisering preciezer wordt.
Lemmatisering met POS-tagging in NLTK
Aangezien we nu bekend zijn met beide technieken afzonderlijk, is het tijd om ze te combineren. Er is echter één belangrijk aspect om rekening mee te houden, namelijk het verschil in POS-tagformaten tussen pos_tag en het formaat dat de WordNet Lemmatizer verwacht.
De pos_tag-functie van NLTK maakt gebruik van de Penn Treebank tagset, die een breed scala aan tags bevat voor gedetailleerde grammaticale categorisatie. De WordNet Lemmatizer verwacht daarentegen POS-tags in een vereenvoudigde vorm die aansluit bij de categorisatie van WordNet. Specifiek maakt deze alleen onderscheid tussen zelfstandige naamwoorden ('n'), werkwoorden ('v'), bijvoeglijke naamwoorden ('a' of 's' voor satelliet-bijvoeglijke naamwoorden) en bijwoorden ('r').
Het mappingproces omvat het omzetten van gedetailleerde Penn Treebank-tags naar bredere categorieën die door WordNet worden herkend. Bijvoorbeeld, zowel 'VBD' (verleden tijd werkwoord) als 'VBG' (gerundium of tegenwoordig deelwoord) uit Penn Treebank worden omgezet naar 'v' (werkwoord) wanneer ze worden gebruikt in de WordNet Lemmatizer.
Hier volgt een functie voor dit doel:
from nltk.corpus import wordnet as wn
def get_wordnet_pos(treebank_tag):
if treebank_tag.startswith('J'):
return wn.ADJ
elif treebank_tag.startswith('V'):
return wn.VERB
elif treebank_tag.startswith('R'):
return wn.ADV
else:
# Default to noun if no match is found or starts with 'N'
return wn.NOUN
Deze functie controleert eenvoudigweg de eerste letter van de Penn Treebank-tag: als deze 'J' is, retourneert het de WordNet-tag voor bijvoeglijke naamwoorden; als 'V', voor werkwoorden; als 'R', voor bijwoorden. In alle andere gevallen, inclusief wanneer de tag begint met 'N' of niet overeenkomt met een gespecificeerde voorwaarde, wordt standaard de WordNet-tag voor zelfstandige naamwoorden geretourneerd.
De constanten ADJ, VERB en andere die je in de code ziet, zijn afkomstig uit WordNet. Hun waarden zijn ADJ = 'a', ADJ_SAT = 's', ADV = 'r', NOUN = 'n', VERB = 'v'.
Met deze functie kan lemmatisatie met POS-tagging worden uitgevoerd:
123456789101112131415161718192021222324252627282930313233from nltk.stem import WordNetLemmatizer from nltk.tokenize import word_tokenize from nltk import pos_tag from nltk.corpus import wordnet as wn import nltk nltk.download('wordnet') nltk.download('averaged_perceptron_tagger_eng') nltk.download('punkt_tab') # Initialize the lemmatizer lemmatizer = WordNetLemmatizer() # Function to map NLTK's POS tags to the format used by the WordNet lemmatizer def get_wordnet_pos(treebank_tag): if treebank_tag.startswith('J'): return wn.ADJ elif treebank_tag.startswith('V'): return wn.VERB elif treebank_tag.startswith('R'): return wn.ADV else: # Default to noun if no match is found or starts with 'N' return wn.NOUN text = "The leaves on the tree were turning a bright red, indicating that fall was leaving its mark." text = text.lower() tokens = word_tokenize(text) tagged_tokens = pos_tag(tokens) # Lemmatize each token with its POS tag lemmatized_tokens = [lemmatizer.lemmatize(token, get_wordnet_pos(tag)) for token, tag in tagged_tokens] print("Original text:", text) print("Lemmatized text:", ' '.join(lemmatized_tokens))
Zoals je kunt zien, hebben we eerst POS-tagging uitgevoerd met behulp van de functie pos_tag(). Vervolgens hebben we list comprehension gebruikt om een lijst van lemmatiseerde tokens te maken door de methode lemmatize() toe te passen met het huidige token en de correct geformatteerde tag (met onze functie get_wordnet_pos(tag)) als argumenten. We hebben er bewust voor gekozen om stopwoorden niet te verwijderen om te laten zien dat de code effectief alle tokens verwerkt.
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Awesome!
Completion rate improved to 3.45
Lemmatizatie met POS-Tagging
Veeg om het menu te tonen
De Engelse taal bevat veel woorden die als meerdere woordsoorten met verschillende betekenissen kunnen dienen. Bijvoorbeeld, "running" kan een werkwoord zijn ("He is running.") of een zelfstandig naamwoord ("Running is fun.").
Zoals we al hebben gezien, kan een lemmatizer een woord alleen nauwkeurig tot zijn basisvorm terugbrengen als het de woordsoort in de gegeven context kent. POS-tagging biedt deze context, waardoor lemmatisering preciezer wordt.
Lemmatisering met POS-tagging in NLTK
Aangezien we nu bekend zijn met beide technieken afzonderlijk, is het tijd om ze te combineren. Er is echter één belangrijk aspect om rekening mee te houden, namelijk het verschil in POS-tagformaten tussen pos_tag en het formaat dat de WordNet Lemmatizer verwacht.
De pos_tag-functie van NLTK maakt gebruik van de Penn Treebank tagset, die een breed scala aan tags bevat voor gedetailleerde grammaticale categorisatie. De WordNet Lemmatizer verwacht daarentegen POS-tags in een vereenvoudigde vorm die aansluit bij de categorisatie van WordNet. Specifiek maakt deze alleen onderscheid tussen zelfstandige naamwoorden ('n'), werkwoorden ('v'), bijvoeglijke naamwoorden ('a' of 's' voor satelliet-bijvoeglijke naamwoorden) en bijwoorden ('r').
Het mappingproces omvat het omzetten van gedetailleerde Penn Treebank-tags naar bredere categorieën die door WordNet worden herkend. Bijvoorbeeld, zowel 'VBD' (verleden tijd werkwoord) als 'VBG' (gerundium of tegenwoordig deelwoord) uit Penn Treebank worden omgezet naar 'v' (werkwoord) wanneer ze worden gebruikt in de WordNet Lemmatizer.
Hier volgt een functie voor dit doel:
from nltk.corpus import wordnet as wn
def get_wordnet_pos(treebank_tag):
if treebank_tag.startswith('J'):
return wn.ADJ
elif treebank_tag.startswith('V'):
return wn.VERB
elif treebank_tag.startswith('R'):
return wn.ADV
else:
# Default to noun if no match is found or starts with 'N'
return wn.NOUN
Deze functie controleert eenvoudigweg de eerste letter van de Penn Treebank-tag: als deze 'J' is, retourneert het de WordNet-tag voor bijvoeglijke naamwoorden; als 'V', voor werkwoorden; als 'R', voor bijwoorden. In alle andere gevallen, inclusief wanneer de tag begint met 'N' of niet overeenkomt met een gespecificeerde voorwaarde, wordt standaard de WordNet-tag voor zelfstandige naamwoorden geretourneerd.
De constanten ADJ, VERB en andere die je in de code ziet, zijn afkomstig uit WordNet. Hun waarden zijn ADJ = 'a', ADJ_SAT = 's', ADV = 'r', NOUN = 'n', VERB = 'v'.
Met deze functie kan lemmatisatie met POS-tagging worden uitgevoerd:
123456789101112131415161718192021222324252627282930313233from nltk.stem import WordNetLemmatizer from nltk.tokenize import word_tokenize from nltk import pos_tag from nltk.corpus import wordnet as wn import nltk nltk.download('wordnet') nltk.download('averaged_perceptron_tagger_eng') nltk.download('punkt_tab') # Initialize the lemmatizer lemmatizer = WordNetLemmatizer() # Function to map NLTK's POS tags to the format used by the WordNet lemmatizer def get_wordnet_pos(treebank_tag): if treebank_tag.startswith('J'): return wn.ADJ elif treebank_tag.startswith('V'): return wn.VERB elif treebank_tag.startswith('R'): return wn.ADV else: # Default to noun if no match is found or starts with 'N' return wn.NOUN text = "The leaves on the tree were turning a bright red, indicating that fall was leaving its mark." text = text.lower() tokens = word_tokenize(text) tagged_tokens = pos_tag(tokens) # Lemmatize each token with its POS tag lemmatized_tokens = [lemmatizer.lemmatize(token, get_wordnet_pos(tag)) for token, tag in tagged_tokens] print("Original text:", text) print("Lemmatized text:", ' '.join(lemmatized_tokens))
Zoals je kunt zien, hebben we eerst POS-tagging uitgevoerd met behulp van de functie pos_tag(). Vervolgens hebben we list comprehension gebruikt om een lijst van lemmatiseerde tokens te maken door de methode lemmatize() toe te passen met het huidige token en de correct geformatteerde tag (met onze functie get_wordnet_pos(tag)) als argumenten. We hebben er bewust voor gekozen om stopwoorden niet te verwijderen om te laten zien dat de code effectief alle tokens verwerkt.
Bedankt voor je feedback!