Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Lemmatization med ordklasstaggning | Stamning och LemmatiseRing
Introduktion till NLP

bookLemmatization med ordklasstaggning

Det engelska språket innehåller många ord som kan fungera som flera olika ordklasser med olika betydelser. Till exempel kan "running" vara ett verb ("He is running.") eller ett substantiv ("Running is fun.").

Som vi redan har sett kan en lemmatizer endast korrekt reducera ett ord till dess grundform om den känner till ordets ordklass i det givna sammanhanget. POS-taggning tillhandahåller detta sammanhang, vilket gör lemmatiseringen mer exakt.

Lemmatisering med POS-taggning i NLTK

Eftersom vi redan är bekanta med båda dessa tekniker separat är det dags att kombinera dem. Det finns dock en viktig aspekt att ta hänsyn till, nämligen skillnaden i format för ordklasstaggning mellan pos_tag och det format som WordNet Lemmatizer förväntar sig.

Note
Läs mer

NLTK:s pos_tag-funktion använder Penn Treebank-tagguppsättningen, som innehåller ett brett utbud av taggar för detaljerad grammatisk kategorisering. WordNet Lemmatizer förväntar sig däremot ordklasstaggar i ett förenklat format som överensstämmer med WordNets egen kategorisering. Specifikt skiljer den endast mellan substantiv ('n'), verb ('v'), adjektiv ('a' eller 's' för satellitadjektiv) och adverb ('r').

Kartläggningsprocessen innebär att detaljerade Penn Treebank-taggar omvandlas till bredare kategorier som känns igen av WordNet. Till exempel ändras både 'VBD' (verb i dåtid) och 'VBG' (gerundium eller presens particip) från Penn Treebank till 'v' (verb) när de används i WordNet Lemmatizer.

Låt oss skriva en funktion för detta ändamål:

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  

Denna funktion kontrollerar helt enkelt den första bokstaven i Penn Treebank-taggen: om det är 'J' returneras WordNet-taggen för adjektiv; om 'V', för verb; om 'R', för adverb. I alla andra fall, inklusive när taggen börjar med 'N' eller inte matchar något av de angivna villkoren, returneras WordNet-taggen för substantiv som standard.

Konstanterna ADJ, VERB och andra som du ser i koden kommer från WordNet. Deras värden är ADJ = 'a', ADJ_SAT = 's', ADV = 'r', NOUN = 'n', VERB = 'v'.

Med denna funktion kan vi utföra lemmatisering med POS-taggning:

123456789101112131415161718192021222324252627282930313233
from 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))
copy

Som du kan se, utförde vi först POS-taggning med funktionen pos_tag(), därefter använde vi listkomprehension för att skapa en lista med lemmatiserade token genom att tillämpa metoden lemmatize() med den aktuella token och korrekt formaterad tagg (med vår funktion get_wordnet_pos(tag)) som argument. Vi tog medvetet inte bort stoppord för att visa att koden effektivt bearbetar alla token.

question mark

Varför är funktionen get_wordnet_pos nödvändig vid lemmatisering med NLTK:s WordNetLemmatizer efter POS-taggning?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 2. Kapitel 7

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Suggested prompts:

Can you explain why mapping POS tags is necessary for lemmatization?

What would happen if we didn't provide the correct POS tag to the lemmatizer?

Can you show more examples of lemmatization with different sentences?

Awesome!

Completion rate improved to 3.45

bookLemmatization med ordklasstaggning

Svep för att visa menyn

Det engelska språket innehåller många ord som kan fungera som flera olika ordklasser med olika betydelser. Till exempel kan "running" vara ett verb ("He is running.") eller ett substantiv ("Running is fun.").

Som vi redan har sett kan en lemmatizer endast korrekt reducera ett ord till dess grundform om den känner till ordets ordklass i det givna sammanhanget. POS-taggning tillhandahåller detta sammanhang, vilket gör lemmatiseringen mer exakt.

Lemmatisering med POS-taggning i NLTK

Eftersom vi redan är bekanta med båda dessa tekniker separat är det dags att kombinera dem. Det finns dock en viktig aspekt att ta hänsyn till, nämligen skillnaden i format för ordklasstaggning mellan pos_tag och det format som WordNet Lemmatizer förväntar sig.

Note
Läs mer

NLTK:s pos_tag-funktion använder Penn Treebank-tagguppsättningen, som innehåller ett brett utbud av taggar för detaljerad grammatisk kategorisering. WordNet Lemmatizer förväntar sig däremot ordklasstaggar i ett förenklat format som överensstämmer med WordNets egen kategorisering. Specifikt skiljer den endast mellan substantiv ('n'), verb ('v'), adjektiv ('a' eller 's' för satellitadjektiv) och adverb ('r').

Kartläggningsprocessen innebär att detaljerade Penn Treebank-taggar omvandlas till bredare kategorier som känns igen av WordNet. Till exempel ändras både 'VBD' (verb i dåtid) och 'VBG' (gerundium eller presens particip) från Penn Treebank till 'v' (verb) när de används i WordNet Lemmatizer.

Låt oss skriva en funktion för detta ändamål:

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  

Denna funktion kontrollerar helt enkelt den första bokstaven i Penn Treebank-taggen: om det är 'J' returneras WordNet-taggen för adjektiv; om 'V', för verb; om 'R', för adverb. I alla andra fall, inklusive när taggen börjar med 'N' eller inte matchar något av de angivna villkoren, returneras WordNet-taggen för substantiv som standard.

Konstanterna ADJ, VERB och andra som du ser i koden kommer från WordNet. Deras värden är ADJ = 'a', ADJ_SAT = 's', ADV = 'r', NOUN = 'n', VERB = 'v'.

Med denna funktion kan vi utföra lemmatisering med POS-taggning:

123456789101112131415161718192021222324252627282930313233
from 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))
copy

Som du kan se, utförde vi först POS-taggning med funktionen pos_tag(), därefter använde vi listkomprehension för att skapa en lista med lemmatiserade token genom att tillämpa metoden lemmatize() med den aktuella token och korrekt formaterad tagg (med vår funktion get_wordnet_pos(tag)) som argument. Vi tog medvetet inte bort stoppord för att visa att koden effektivt bearbetar alla token.

question mark

Varför är funktionen get_wordnet_pos nödvändig vid lemmatisering med NLTK:s WordNetLemmatizer efter POS-taggning?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 2. Kapitel 7
some-alt