Behebung von NLTK-Stemming-Anomalien in Python

Shikha Chaudhary 21 Juni 2023
  1. NLTK-Stemming-Anomalien in Python behoben
  2. Behebung der Stemming-Anomalien im PorterStemmer-Modul von NLTK in Python
  3. Verwendung von Lemmatisierern über Stemmern in NLTK in Python
  4. Abschluss
Behebung von NLTK-Stemming-Anomalien in Python

Stemming ist, wie der Name schon sagt, die Methode, Wörter auf ihre Wurzelformen zu reduzieren. Zum Beispiel zerfallen die Wörter wie Glück, glücklich und glücklicher alle auf das Stammwort glücklich.

In Python können wir dies mit Hilfe verschiedener Module tun, die von der NLTK-Bibliothek von Python bereitgestellt werden, aber manchmal erhalten Sie möglicherweise nicht die erwarteten Ergebnisse. Zum Beispiel wird das fairly auf fairli und nicht auf fair reduziert PorterStemmer-Modul der NLTK-Bibliothek.

In diesem Artikel wird erläutert, warum solche Unterschiede auftreten und wie sie behoben werden können, um das gewünschte Stammwort zu erhalten. Also schnapp dir einen Kaffee und lies weiter!

NLTK-Stemming-Anomalien in Python behoben

Obwohl die NLTK-Bibliothek von Python mehrere Stemmer hat, ist der am häufigsten verwendete PorterStemmer. Hier ein Beispiel, wie der PorterStemmer funktioniert.

Lassen Sie uns zuerst verstehen, was in diesem Code passiert.

Wir importieren zuerst PorterStemmer aus der Bibliothek nltk und erstellen dann eine Instanz davon. Nun können wir diese Instanz verwenden, um die gegebene Wortliste mit Hilfe der Funktion stem(), die in der nltk-Bibliothek bereitgestellt wird, zu stammeln.

from nltk.stem import PorterStemmer

p = PorterStemmer()

similar_words = ["act", "acting", "acts"]

for x in similar_words:
    print(x, "comes from", p.stem(x))

Ausgang:

act comes from act
acting comes from act
acts comes from act

Alle Wörter dieser Liste werden mit Hilfe des Moduls PorterStemmer auf den Wortstamm handeln reduziert. Aber so funktioniert dieses Modul nicht immer.

Hier ist ein weiteres Beispiel.

from nltk.stem import PorterStemmer

p = PorterStemmer()
print(p.stem("loudly"))

Ausgang:

'loudli'

Sie sehen, dass wir diesmal die Ausgabe als loudli und nicht als loud erhalten.

Frage mich, warum das passiert. Und vor allem, wie kann man das beheben?

Behebung der Stemming-Anomalien im PorterStemmer-Modul von NLTK in Python

Das Modul PorterStemmer arbeitet in fünf Phasen mit jeweils eigenen Regeln und Verfahren. Darüber hinaus basieren die Ergebnisse, die es im Allgemeinen liefert, auf der englischen Sprache.

Das bedeutet, dass das Wort loudi zwar nicht das ist, was wir wollten, aber nach den Regeln des PorterStemmer-Moduls das richtige Stammwort ist.

Aber es gibt eine gute Nachricht - nicht alle Stemmer des NLTK-Moduls funktionieren gleich. Stemmen wir das Wort laut diesmal mit Hilfe von SnowballStemmer.

Beachten Sie, dass wir hier eine Sprache als Parameter an die Funktion SnowballStemmer() übergeben müssen.

from nltk.stem import SnowballStemmer

s = SnowballStemmer("english")
print(s.stem("loudly"))

Ausgang:

'loud'

Dass wir diesmal die gewünschte Ausgabe bekommen, sieht man daran, dass der SnowballStemmer sicherlich ein anderes Regelwerk verwendet als der PorterStemmer. Hier ist nun etwas Interessantes.

Versuchen Sie, das Wort Schauspieler mit diesen beiden Modulen zu formen. Dies geschieht unten.

from nltk.stem import SnowballStemmer
from nltk.stem import PorterStemmer

p = PorterStemmer()
print(p.stem("actor"))


s = SnowballStemmer("english")
print(s.stem("actor"))

Ausgang:

'actor'
'actor'

Sie können sehen, dass diese beiden Module dieselbe Ausgabe zurückgeben, actor, nicht das Wurzelwort act. Versuchen wir dies nun mit einem anderen Stemmer namens LancasterStemmer.

from nltk.stem import LancasterStemmer

l = LancasterStemmer()
print(l.stem("actor"))

Ausgang:

'act'

Sie sehen, dass wir diesmal die gewünschte Ausgabe act erhalten.

Sie haben gesehen, wie verschiedene Stemmer mit unterschiedlichen Wörtern unterschiedliche Ergebnisse liefern.

Wir können verschiedene andere Stemmer verwenden, aber da alle auf einigen Algorithmen basieren, besteht immer die Möglichkeit, dass Sie nicht die gewünschte Ausgabe erhalten. Außerdem sind diese Stemmer sehr streng darin, die Wörter basierend auf dem Algorithmus abzuschneiden.

Außerdem funktioniert Stemming hauptsächlich im Suffix-Teil und ist nicht schlau genug, um Wörter durch Entfernen von Präfixen oder Infixen herauszuarbeiten. Stemming-Algorithmen schlagen nicht einmal die Bedeutung von Wörtern und die daraus resultierenden Wurzeln nach.

Sehen Sie sich dieses Beispiel an.

Hier ist eine Reihe von zufälligen Buchstaben mit einem ing am Ende, und der Stemmer entfernt dieses Suffix und gibt die Ausgabe zurück.

from nltk.stem import PorterStemmer

p = PorterStemmer()
print(p.stem("wkhfksafking"))

Ausgang:

'wkhfksafk'

Um dieses Problem zu lösen, wäre es daher besser, einen Lemmatisierer zu verwenden. Betrachten wir die Funktionsweise von Lemmatisierern im Detail.

Verwendung von Lemmatisierern über Stemmern in NLTK in Python

Im Gegensatz zu Stemmern können Lemmatisierer Wörter morphologisch analysieren und das am besten geeignete Lemma basierend auf dem Kontext finden, in dem sie verwendet werden. Beachten Sie, dass ein Lemma nicht dasselbe wie ein Stamm ist, da es im Gegensatz zu einem Stamm die Grundform aller seiner Formen ist.

Schauen wir uns ein Beispiel an, um zu sehen, wie Lemmatisierer besser sind als Stemmer.

Hier verwenden wir das PorterStemmer, um mehrere Wörter zu stammeln.

from nltk.stem import PorterStemmer

p = PorterStemmer()

w = ["studies", "studying", "study"]

for i in w:
    print(p.stem(i))

Ausgang:

studi
studi
studi

Sie können sehen, dass die Ausgabe, die wir erhalten, nicht sehr hilfreich ist. Lassen Sie uns fortfahren und einen Lemmatisierer auf denselben Satz von Wörtern anwenden.

Wir importieren zuerst das Modul WordNetLemmatizer und erstellen eine Instanz davon. Dann verwenden wir die Funktion lemmatize() mit einer for-Schleife, um das Lemma jedes Wortes herauszufinden.

from nltk.stem import WordNetLemmatizer

l = WordNetLemmatizer()

w = ["studies", "studying", "study"]

for i in w:
    print(l.lemmatize(i))

Ausgang:

study
studying
study

Diesmal erhalten wir keine absurden Ergebnisse, und alle Worte machen Sinn.

Aus diesem Grund ist die Verwendung eines Lemmatizers besser als die Verwendung eines Stemmers.

Weitere Informationen zu Stemmern und Lemmatisierern finden Sie unter diesem Link.

Abschluss

Dieser Artikel hat uns etwas über Stemmer und Lemmatisierer in NLTK in Python beigebracht. Wir haben gesehen, wie und warum Stemmer manchmal absurde Ergebnisse liefern und wie wir Lemmatisierer verwenden können, um bessere Ergebnisse zu erzielen.