Behebung von NLTK-Stemming-Anomalien in Python
-
NLTK
-Stemming-Anomalien in Python behoben -
Behebung der Stemming-Anomalien im
PorterStemmer
-Modul vonNLTK
in Python -
Verwendung von Lemmatisierern über Stemmern in
NLTK
in Python - Abschluss
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.