Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Lemmatization med ordklassemerking | Stamming og Lemmatisering
Introduksjon til NLP

bookLemmatization 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.

Note
Les mer

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:

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ø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.

question mark

Hvorfor er funksjonen get_wordnet_pos nødvendig når man lemmatiserer med NLTKs WordNetLemmatizer etter POS-tagging?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 7

Spør AI

expand

Spør AI

ChatGPT

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

bookLemmatization 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.

Note
Les mer

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:

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ø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.

question mark

Hvorfor er funksjonen get_wordnet_pos nødvendig når man lemmatiserer med NLTKs WordNetLemmatizer etter POS-tagging?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 7
some-alt