Lemmatisierung 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.
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:
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))
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.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
Awesome!
Completion rate improved to 3.45
Lemmatisierung 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.
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:
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))
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.
Danke für Ihr Feedback!