Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Lemmatisierung mit POS-Tagging | Stemming und Lemmatisierung
Einführung in NLP

bookLemmatisierung mit POS-Tagging

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. Dabei gibt es 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 grammatische 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 zu 'v' (Verb) konvertiert, wenn sie im WordNet-Lemmatizer verwendet werden.

Im Folgenden wird eine Funktion für diesen Zweck 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 '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 kann die Lemmatisierung unter Verwendung von POS-Tagging durchgeführt werden:

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, haben wir zunächst das POS-Tagging mit der Funktion pos_tag() durchgeführt. Anschließend haben wir mittels List Comprehension eine Liste lemmatisierter Tokens erstellt, indem wir die Methode lemmatize() mit dem aktuellen Token und dem korrekt formatierten Tag (unter Verwendung unserer Funktion get_wordnet_pos(tag)) als Argumente angewendet haben. Wir haben bewusst keine Stoppwörter entfernt, um zu zeigen, dass der Code alle Tokens 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 2. Kapitel 7

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

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

Awesome!

Completion rate improved to 3.45

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. Dabei gibt es 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 grammatische 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 zu 'v' (Verb) konvertiert, wenn sie im WordNet-Lemmatizer verwendet werden.

Im Folgenden wird eine Funktion für diesen Zweck 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 '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 kann die Lemmatisierung unter Verwendung von POS-Tagging durchgeführt werden:

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, haben wir zunächst das POS-Tagging mit der Funktion pos_tag() durchgeführt. Anschließend haben wir mittels List Comprehension eine Liste lemmatisierter Tokens erstellt, indem wir die Methode lemmatize() mit dem aktuellen Token und dem korrekt formatierten Tag (unter Verwendung unserer Funktion get_wordnet_pos(tag)) als Argumente angewendet haben. Wir haben bewusst keine Stoppwörter entfernt, um zu zeigen, dass der Code alle Tokens 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 2. Kapitel 7
some-alt