Lemmatization med ordklassemerking
Det engelske språket inneholder mange ord som kan fungere som flere ordklasser med ulike betydninger. For eksempel kan "running" være et verb ("He is running.") eller et substantiv ("Running is fun.").
Som vi allerede har sett, kan en lemmatiserer bare redusere et ord til dets grunnform nøyaktig hvis den kjenner ordets ordklasse i den gitte konteksten. POS-tagging gir denne konteksten, noe som gjør lemmatiseringen mer presis.
Lemmatisering med POS-tagging i NLTK
Siden vi allerede er kjent med begge disse teknikkene hver for seg, er det på tide å kombinere dem. Det er imidlertid én viktig ting å ta hensyn til, nemlig forskjellen i formatet på POS-tagger mellom pos_tag og formatet som WordNet Lemmatizer forventer.
NLTKs pos_tag-funksjon benytter Penn Treebank-tagsettet, som inkluderer et bredt utvalg av tagger for detaljert grammatisk kategorisering. WordNet Lemmatizer forventer derimot POS-tagger i et forenklet format som samsvarer med WordNets egen kategorisering. Spesifikt skiller den kun mellom substantiv ('n'), verb ('v'), adjektiv ('a' eller 's' for satellittadjektiv), og adverb ('r').
Kartleggingsprosessen innebærer å konvertere detaljerte Penn Treebank-etiketter til bredere kategorier som gjenkjennes av WordNet. For eksempel endres både 'VBD' (verb i preteritum) og 'VBG' (gerundium eller presens partisipp) fra Penn Treebank til 'v' (verb) når de brukes i WordNet Lemmatizer.
La oss skrive en funksjon for dette formålet:
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 funksjonen sjekker enkelt den første bokstaven i Penn Treebank-etiketten: hvis det er 'J', returnerer den WordNet-etiketten for adjektiv; hvis 'V', for verb; hvis 'R', for adverb. I alle andre tilfeller, inkludert når etiketten starter med 'N' eller ikke samsvarer med noen spesifisert betingelse, returneres WordNet-etiketten for substantiv som standard.
Konstantene ADJ, VERB og andre du ser i koden er hentet fra WordNet. Verdiene deres er ADJ = 'a', ADJ_SAT = 's', ADV = 'r', NOUN = 'n', VERB = 'v'.
Med denne funksjonen kan vi utføre lemmatisering med ordklassemerking:
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ørte vi først POS-tagging ved å bruke funksjonen pos_tag(), deretter brukte vi list comprehension for å lage en liste med lemmatiserte token ved å anvende metoden lemmatize() med den nåværende token og korrekt formatert tag (ved å bruke vår funksjon get_wordnet_pos(tag)) som argumenter. Vi valgte bevisst å ikke fjerne stoppord for å demonstrere at koden effektivt prosesserer alle token.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
Awesome!
Completion rate improved to 3.45
Lemmatization med ordklassemerking
Sveip for å vise menyen
Det engelske språket inneholder mange ord som kan fungere som flere ordklasser med ulike betydninger. For eksempel kan "running" være et verb ("He is running.") eller et substantiv ("Running is fun.").
Som vi allerede har sett, kan en lemmatiserer bare redusere et ord til dets grunnform nøyaktig hvis den kjenner ordets ordklasse i den gitte konteksten. POS-tagging gir denne konteksten, noe som gjør lemmatiseringen mer presis.
Lemmatisering med POS-tagging i NLTK
Siden vi allerede er kjent med begge disse teknikkene hver for seg, er det på tide å kombinere dem. Det er imidlertid én viktig ting å ta hensyn til, nemlig forskjellen i formatet på POS-tagger mellom pos_tag og formatet som WordNet Lemmatizer forventer.
NLTKs pos_tag-funksjon benytter Penn Treebank-tagsettet, som inkluderer et bredt utvalg av tagger for detaljert grammatisk kategorisering. WordNet Lemmatizer forventer derimot POS-tagger i et forenklet format som samsvarer med WordNets egen kategorisering. Spesifikt skiller den kun mellom substantiv ('n'), verb ('v'), adjektiv ('a' eller 's' for satellittadjektiv), og adverb ('r').
Kartleggingsprosessen innebærer å konvertere detaljerte Penn Treebank-etiketter til bredere kategorier som gjenkjennes av WordNet. For eksempel endres både 'VBD' (verb i preteritum) og 'VBG' (gerundium eller presens partisipp) fra Penn Treebank til 'v' (verb) når de brukes i WordNet Lemmatizer.
La oss skrive en funksjon for dette formålet:
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 funksjonen sjekker enkelt den første bokstaven i Penn Treebank-etiketten: hvis det er 'J', returnerer den WordNet-etiketten for adjektiv; hvis 'V', for verb; hvis 'R', for adverb. I alle andre tilfeller, inkludert når etiketten starter med 'N' eller ikke samsvarer med noen spesifisert betingelse, returneres WordNet-etiketten for substantiv som standard.
Konstantene ADJ, VERB og andre du ser i koden er hentet fra WordNet. Verdiene deres er ADJ = 'a', ADJ_SAT = 's', ADV = 'r', NOUN = 'n', VERB = 'v'.
Med denne funksjonen kan vi utføre lemmatisering med ordklassemerking:
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ørte vi først POS-tagging ved å bruke funksjonen pos_tag(), deretter brukte vi list comprehension for å lage en liste med lemmatiserte token ved å anvende metoden lemmatize() med den nåværende token og korrekt formatert tag (ved å bruke vår funksjon get_wordnet_pos(tag)) som argumenter. Vi valgte bevisst å ikke fjerne stoppord for å demonstrere at koden effektivt prosesserer alle token.
Takk for tilbakemeldingene dine!