webentwicklung-frage-antwort-db.com.de

Was ist die beste Methode zum Stemming in Python?

Ich habe alle nltk-Methoden zum Stemming ausprobiert, aber ich bekomme mit ein paar Worten seltsame Ergebnisse. 

Beispiele

Es schneidet oft das Ende von Wörtern ab, wenn es es nicht tun sollte:

  • pudel => Pudel
  • artikel artikel

oder nicht sehr gut: 

  • leicht und einfach werden nicht im selben Wort gestemmt
  • blätter wachsen, sind ziemlich nicht gestemmt

Kennen Sie andere stemming libs in Python oder ein gutes Wörterbuch?

Vielen Dank

24
PeYoTlL

Die Ergebnisse, die Sie erhalten, werden (in der Regel) in englischer Sprache erwartet. Sie sagen, Sie haben "alle nltk-Methoden" ausprobiert, aber wenn ich Ihre Beispiele versuche, scheint das nicht der Fall zu sein.

Hier einige Beispiele, die den PorterStemmer verwenden

import nltk
ps = nltk.stemmer.PorterStemmer()
ps.stem('grows')
'grow'
ps.stem('leaves')
'leav'
ps.stem('fairly')
'fairli'

Die Ergebnisse sind 'grow', 'leav' und 'fairli', die, selbst wenn sie das sind, was Sie wollten, Stammversionen des ursprünglichen Wortes sind.

Wenn wir zum Schneeballstemmer wechseln, müssen wir die Sprache als Parameter angeben.

import nltk
sno = nltk.stem.SnowballStemmer('english')
sno.stem('grows')
'grow'
sno.stem('leaves')
'leav'
sno.stem('fairly')
'fair'

Die Ergebnisse sind nach wie vor für "Wachsen" und "Blätter", aber "ziemlich" ist "fair".

In beiden Fällen (und in nltk stehen mehr als zwei Stemmers zur Verfügung), sind Wörter, von denen Sie behaupten, dass sie nicht gestemmt sind. Der LancasterStemmer gibt 'easy' zurück, wenn er mit 'easy' oder 'easy' als Eingabe versehen wird.

Vielleicht wollten Sie wirklich einen Lemmatizer? Das würde "Artikel" und "Pudel" unverändert zurückgeben.

import nltk
lemma = nltk..wordnet.WordNetLemmatizer()
lemma.lemmatize('article')
'article'
lemma..lemmatize('leaves')
'leaf'
88
Spaceghost

Alle diese hier beschriebenen Stemmers sind algorithmische Stemmer, daher können sie immer zu unerwarteten Ergebnissen führen, wie z

In [3]: from nltk.stem.porter import *

In [4]: stemmer = PorterStemmer()

In [5]: stemmer.stem('identified')
Out[5]: u'identifi'

In [6]: stemmer.stem('nonsensical')
Out[6]: u'nonsens'

Um die Wurzelwörter richtig zu erhalten, benötigt man einen wörterbuchbasierten Dammmer wie Hunspell Stemmer.Hier ist eine Python-Implementierung davon im folgenden link . Beispielcode ist hier

>>> import hunspell
>>> hobj = hunspell.HunSpell('/usr/share/myspell/en_US.dic', '/usr/share/myspell/en_US.aff')
>>> hobj.spell('spookie')
False
>>> hobj.suggest('spookie')
['spookier', 'spookiness', 'spooky', 'spook', 'spoonbill']
>>> hobj.spell('spooky')
True
>>> hobj.analyze('linked')
[' st:link fl:D']
>>> hobj.stem('linked')
['link']
9
0xF

Beim Stemming geht es nur um das Entfernen von Suffixen (normalerweise nur Suffixe, sofern ich es nicht versucht habe, dass kein nltk-Stemmer ein Präfix entfernen konnte, Infixes vergessen). Damit können wir das stemming eindeutig als dummes/nicht so intelligentes Programm bezeichnen. Es wird nicht geprüft, ob ein Wort vor oder nach dem Stemming eine Bedeutung hat. Wenn Sie versuchen, "xqaing" zu halten, obwohl es kein Wort ist, wird es "-ing" entfernen und Ihnen "xqa" geben.

Um ein intelligenteres System zu verwenden, kann man Lemmatizer verwenden. Lemmetisers verwendet wohlgeformte Lemmata (Wörter) in Form von Wordnet und Wörterbüchern. So gibt es immer ein korrektes Wort zurück. Es ist jedoch langsam, weil es alle Wörter durchläuft, um das relevante zu finden.

1
Ritveak Dugar

In meinem Chatbot-Projekt habe ich PorterStemmer verwendet. LancasterStemmer dient jedoch auch dem Zweck. Das ultimative Ziel ist es, das Wort an die Wurzel zu binden, damit wir mit den eingegebenen Suchbegriffen suchen und vergleichen können.

Zum Beispiel: Von nltk.stem import PorterStemmerps = PorterStemmer ()

def SrchpattrnStmmed(self):
    KeyWords =[]
    SrchpattrnTkn = Word_tokenize(self.input)
    for token in SrchpattrnTkn:
        if token not in stop_words:
            KeyWords.append(ps.stem(token))
            continue
    #print(KeyWords)
    return KeyWords

Hoffe das wird helfen ..

0
sarvesh Kumar

Stemmers variieren in ihrer Aggressivität. Porter ist einer der aggressivsten Engländer. Ich finde, es tut in der Regel mehr weh, als es hilft. Auf der leichteren Seite können Sie entweder einen Lemmatizer verwenden, wie bereits vorgeschlagen, oder einen leichteren algorithmischen Stemmer. Die Einschränkung bei Lemmatizern ist, dass sie unbekannte Wörter nicht handhaben können , das ist kein ernstes Problem.

Persönlich gefällt mir der Krovetz-Stemmer, eine Hybridlösung, die einen Wörterbuch-Lemmatizer und einen leichten Stemmer nach Vokabeln sucht. Krovetz auch kstem oder light_stemmer Option in Elasticsearch. Es gibt eine Python-Implementierung auf pypi https://pypi.org/project/KrovetzStemmer/ , obwohl dies nicht die ist, die ich verwendet habe.

Eine weitere Option ist der Lemmatizer in spaCy. Nach der Verarbeitung mit dem SpaCy-Evry-Token wird das Attribut lemma_ verwendet. (Beachten Sie, dass der Unterstrich lemma einen numerischen Bezeichner des lemma_ enthält) - https://spacy.io/api/token

Hier sind einige Artikel, die verschiedene Stemming-Algorithmen vergleichen:

0
Daniel Mahler