Lemmatization 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.
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:
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))
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.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
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
Lemmatization 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.
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:
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))
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.
Tack för dina kommentarer!