Lemmatization med Ordklassemærkning
Det engelske sprog indeholder mange ord, der kan fungere som flere ordklasser med forskellige betydninger. For eksempel kan "running" være et verbum ("He is running.") eller et substantiv ("Running is fun.").
Som vi allerede har set, kan en lemmatiseringsalgoritme kun nøjagtigt reducere et ord til dets grundform, hvis den kender ordets ordklasse i den givne kontekst. POS-tagging giver denne kontekst og gør lemmatiseringen mere præcis.
Lemmatisering med POS-tagging i NLTK
Da vi allerede er bekendt med begge disse teknikker hver for sig, er det tid til at kombinere dem. Der er dog et vigtigt aspekt at tage i betragtning, nemlig forskellen i formatet for POS-tags mellem pos_tag og det format, som WordNet Lemmatizer forventer.
NLTK's pos_tag-funktion anvender Penn Treebank-tag-sættet, som indeholder en bred vifte af tags til detaljeret grammatisk kategorisering. WordNet Lemmatizer forventer derimod POS-tags i en forenklet form, der stemmer overens med WordNets egen kategorisering. Specifikt skelner den kun mellem substantiver ('n'), verber ('v'), adjektiver ('a' eller 's' for satellitadjektiver) og adverbier ('r').
Kortlægningsprocessen indebærer at konvertere detaljerede Penn Treebank-tags til bredere kategorier, som genkendes af WordNet. For eksempel ændres både 'VBD' (datidsverbum) og 'VBG' (gerundium eller præsens participium) fra Penn Treebank til 'v' (verbum), når de bruges i WordNet Lemmatizer.
Lad os skrive en funktion til dette formå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
Denne funktion kontrollerer blot det første bogstav i Penn Treebank-tagget: hvis det er 'J', returnerer den WordNet-tagget for adjektiver; hvis 'V', for verber; hvis 'R', for adverbier. I alle andre tilfælde, inklusive når tagget starter med 'N' eller ikke matcher nogen specificeret betingelse, returneres standardmæssigt WordNet-tagget for substantiver.
Konstanterne ADJ, VERB og andre, som du ser i koden, stammer fra WordNet. Deres værdier er ADJ = 'a', ADJ_SAT = 's', ADV = 'r', NOUN = 'n', VERB = 'v'.
Med denne funktion kan vi udføre lemmatisering med POS-tagging:
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, udførte vi først POS-tagging ved hjælp af funktionen pos_tag(), derefter brugte vi list comprehension til at oprette en liste af lemmatiserede tokens ved at anvende metoden lemmatize() med det aktuelle token og korrekt formateret tag (ved hjælp af vores funktion get_wordnet_pos(tag)) som argumenter. Vi undlod bevidst at fjerne stopord for at demonstrere, at koden effektivt behandler alle tokens.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
Awesome!
Completion rate improved to 3.45
Lemmatization med Ordklassemærkning
Stryg for at vise menuen
Det engelske sprog indeholder mange ord, der kan fungere som flere ordklasser med forskellige betydninger. For eksempel kan "running" være et verbum ("He is running.") eller et substantiv ("Running is fun.").
Som vi allerede har set, kan en lemmatiseringsalgoritme kun nøjagtigt reducere et ord til dets grundform, hvis den kender ordets ordklasse i den givne kontekst. POS-tagging giver denne kontekst og gør lemmatiseringen mere præcis.
Lemmatisering med POS-tagging i NLTK
Da vi allerede er bekendt med begge disse teknikker hver for sig, er det tid til at kombinere dem. Der er dog et vigtigt aspekt at tage i betragtning, nemlig forskellen i formatet for POS-tags mellem pos_tag og det format, som WordNet Lemmatizer forventer.
NLTK's pos_tag-funktion anvender Penn Treebank-tag-sættet, som indeholder en bred vifte af tags til detaljeret grammatisk kategorisering. WordNet Lemmatizer forventer derimod POS-tags i en forenklet form, der stemmer overens med WordNets egen kategorisering. Specifikt skelner den kun mellem substantiver ('n'), verber ('v'), adjektiver ('a' eller 's' for satellitadjektiver) og adverbier ('r').
Kortlægningsprocessen indebærer at konvertere detaljerede Penn Treebank-tags til bredere kategorier, som genkendes af WordNet. For eksempel ændres både 'VBD' (datidsverbum) og 'VBG' (gerundium eller præsens participium) fra Penn Treebank til 'v' (verbum), når de bruges i WordNet Lemmatizer.
Lad os skrive en funktion til dette formå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
Denne funktion kontrollerer blot det første bogstav i Penn Treebank-tagget: hvis det er 'J', returnerer den WordNet-tagget for adjektiver; hvis 'V', for verber; hvis 'R', for adverbier. I alle andre tilfælde, inklusive når tagget starter med 'N' eller ikke matcher nogen specificeret betingelse, returneres standardmæssigt WordNet-tagget for substantiver.
Konstanterne ADJ, VERB og andre, som du ser i koden, stammer fra WordNet. Deres værdier er ADJ = 'a', ADJ_SAT = 's', ADV = 'r', NOUN = 'n', VERB = 'v'.
Med denne funktion kan vi udføre lemmatisering med POS-tagging:
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, udførte vi først POS-tagging ved hjælp af funktionen pos_tag(), derefter brugte vi list comprehension til at oprette en liste af lemmatiserede tokens ved at anvende metoden lemmatize() med det aktuelle token og korrekt formateret tag (ved hjælp af vores funktion get_wordnet_pos(tag)) som argumenter. Vi undlod bevidst at fjerne stopord for at demonstrere, at koden effektivt behandler alle tokens.
Tak for dine kommentarer!