Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Lemmatisierung mit POS-Tagging | Abschnitt
Verarbeitung natürlicher Sprache

bookLemmatisierung mit POS-Tagging

Swipe um das Menü anzuzeigen

Die englische Sprache enthält zahlreiche Wörter, die als verschiedene Wortarten mit unterschiedlichen Bedeutungen verwendet werden können. Zum Beispiel kann "running" ein Verb sein ("He is running.") oder ein Substantiv ("Running is fun.").

Wie bereits gezeigt, kann ein Lemmatizer ein Wort nur dann korrekt auf seine Grundform reduzieren, wenn er die Wortart im jeweiligen Kontext kennt. Das POS-Tagging liefert diesen Kontext und macht die Lemmatisierung dadurch präziser.

Lemmatisierung mit POS-Tagging in NLTK

Da wir mit beiden Techniken bereits vertraut sind, ist es an der Zeit, sie zu kombinieren. Es gibt jedoch einen wichtigen Aspekt zu beachten, nämlich den Unterschied im Format der POS-Tags zwischen pos_tag und dem von WordNet Lemmatizer erwarteten Format.

Note
Mehr erfahren

Die Funktion pos_tag von NLTK verwendet das Penn Treebank Tag-Set, das eine Vielzahl von Tags für eine detaillierte grammatikalische Kategorisierung umfasst. Der WordNet Lemmatizer hingegen erwartet POS-Tags in einer vereinfachten Form, die mit der Kategorisierung von WordNet übereinstimmt. Konkret unterscheidet er nur zwischen Substantiven ('n'), Verben ('v'), Adjektiven ('a' oder 's' für Satellitenadjektive) und Adverbien ('r').

Der Zuordnungsprozess beinhaltet die Umwandlung detaillierter Penn Treebank-Tags in allgemeinere Kategorien, die von WordNet erkannt werden. Zum Beispiel werden sowohl 'VBD' (Verb in der Vergangenheit) als auch 'VBG' (Gerundium oder Partizip Präsens) aus dem Penn Treebank beim Einsatz im WordNet-Lemmatizer zu 'v' (Verb) geändert.

Hierzu wird eine Funktion erstellt:

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  

Diese Funktion prüft einfach den ersten Buchstaben des Penn Treebank-Tags: Ist es ein 'J', wird das WordNet-Tag für Adjektive zurückgegeben; bei 'V' für Verben; bei 'R' für Adverbien. In allen anderen Fällen, einschließlich wenn das Tag mit 'N' beginnt oder keine der Bedingungen erfüllt ist, wird standardmäßig das WordNet-Tag für Substantive zurückgegeben.

Die Konstanten ADJ, VERB und andere, die im Code verwendet werden, stammen aus WordNet. Ihre Werte sind ADJ = 'a', ADJ_SAT = 's', ADV = 'r', NOUN = 'n', VERB = 'v'.

Mit dieser Funktion wird die Lemmatisierung unter Verwendung von POS-Tagging durchgeführt:

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

Wie Sie sehen können, wurde zunächst das POS-Tagging mit der Funktion pos_tag() durchgeführt. Anschließend wurde mittels List Comprehension eine Liste lemmatisierter Token erstellt, indem die Methode lemmatize() mit dem aktuellen Token und dem korrekt formatierten Tag (unter Verwendung unserer Funktion get_wordnet_pos(tag)) als Argumente angewendet wurde. Es wurden absichtlich keine Stoppwörter entfernt, um zu zeigen, dass der Code alle Token effektiv verarbeitet.

question mark

Warum ist die Funktion get_wordnet_pos beim Lemmatisieren mit NLTKs WordNetLemmatizer nach dem POS-Tagging notwendig?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 1. Kapitel 16

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Abschnitt 1. Kapitel 16
some-alt