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

book
Lemmatization Mit POS-Tagging

Die englische Sprache ist voller Wörter, die als mehrere Wortarten mit unterschiedlichen Bedeutungen dienen können. Zum Beispiel kann "running" ein Verb ("He is running.") oder ein Substantiv ("Running is fun.") sein.

Wie wir bereits gesehen haben, kann ein Lemmatizer ein Wort nur dann genau auf seine Grundform reduzieren, wenn er die Wortart im gegebenen Kontext kennt. POS-Tagging liefert wiederum diesen Kontext und macht die Lemmatisierung präziser.

Lemmatisierung mit POS-Tagging in NLTK

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

Der Zuordnungsprozess beinhaltet die Umwandlung der detaillierten Penn Treebank-Tags in die breiteren Kategorien, die von WordNet erkannt werden. Zum Beispiel würden sowohl 'VBD' (Vergangenheit Verb) als auch 'VBG' (Gerundium oder Partizip Präsens) aus dem Penn Treebank zu 'v' (Verb) für die Verwendung mit dem WordNet-Lemmatizer zugeordnet werden.

Lassen Sie uns eine Funktion für diesen Zweck schreiben:

python
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 überprüft einfach den ersten Buchstaben des Penn Treebank-Tags: Wenn es 'J' ist, gibt es das WordNet-Tag für Adjektive zurück; wenn 'V', für Verben; wenn 'R', für Adverbien.

In allen anderen Fällen, einschließlich wenn das Tag mit 'N' beginnt oder keine der angegebenen Bedingungen erfüllt, wird standardmäßig das WordNet-Tag für Nomen zurückgegeben. Diese ADJ, VERB usw. sind nur Konstanten, wobei ADJ, ADJ_SAT, ADV, NOUN, VERB = "a", "s", "r", "n", "v".

Angesichts dieser Funktion führen wir nun die Lemmatisierung mit vorherigem POS-Tagging durch:

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))
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 zuerst das POS-Tagging mit der Funktion pos_tag() durchgeführt. Anschließend haben wir List Comprehension verwendet, um eine Liste von lemmatisierten Tokens zu erstellen, 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 absichtlich keine Stoppwörter entfernt, um zu demonstrieren, dass der Code alle Tokens effektiv verarbeitet.

Aufgabe

Swipe to start coding

Es ist an der Zeit, alle bisher gelernten Textvorverarbeitungstechniken zu kombinieren, um lemmatisierten Text ohne die Stoppwörter aus dem ursprünglichen Rohtext zu erhalten. Ihre Aufgabe ist die folgende:

  1. Konvertieren Sie text in Kleinbuchstaben.

  2. Laden Sie die Liste der englischen Stoppwörter und konvertieren Sie sie in set.

  3. Initialisieren Sie einen Lemmatisierer.

  4. Tokenisieren Sie den text-String.

  5. Filtern Sie die Stoppwörter mit List Comprehension heraus.

  6. Führen Sie das POS-Tagging mit der entsprechenden Funktion durch.

  7. Lemmatisieren Sie die resultierenden Tokens unter Berücksichtigung ihrer POS-Tags mit List Comprehension.

Lösung

import nltk
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from nltk import pos_tag
from nltk.stem import WordNetLemmatizer
from nltk.corpus import wordnet as wn

nltk.download('punkt_tab')
nltk.download('stopwords')
nltk.download('averaged_perceptron_tagger_eng')
nltk.download('wordnet')


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:
return wn.NOUN


text = '''Late in the evening, as the stars began to twinkle in the clear night sky,
an old man sat quietly on the porch, reminiscing about his youthful adventures.'''
# Convert the text to lowercase
text = text.lower()
# Load the list of English stop words and convert it to set
stop_words = set(stopwords.words('english'))
# Initialize a lemmatizer
lemmatizer = WordNetLemmatizer()
# Tokenize the text
tokens = word_tokenize(text)
# Filter out the stop words
filtered_tokens = [token for token in tokens if token.lower() not in stop_words]

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 2. Kapitel 5
import nltk
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from nltk import pos_tag
from nltk.stem import WordNetLemmatizer
from nltk.corpus import wordnet as wn

nltk.download('punkt_tab')
nltk.download('stopwords')
nltk.download('averaged_perceptron_tagger_eng')
nltk.download('wordnet')


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:
return wn.NOUN


text = '''Late in the evening, as the stars began to twinkle in the clear night sky,
an old man sat quietly on the porch, reminiscing about his youthful adventures.'''
# Convert the text to lowercase
text = ___
# Load the list of English stop words and convert it to set
stop_words = ___
# Initialize a lemmatizer
lemmatizer = ___
# Tokenize the text
tokens = ___
# Filter out the stop words
filtered_tokens = [___ for token ___]
# Perform POS tagging
tagged_tokens = ___
# Lemmatize the tokens
lemmatized_tokens = [___ for token, tag ___]
print(' '.join(lemmatized_tokens))

Fragen Sie AI

expand
ChatGPT

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

some-alt