Ich habe PorterStemmer und Snowball ausprobiert, aber beide funktionieren nicht bei allen Wörtern, da einige sehr häufig fehlen.
Meine Testwörter sind: " Katzen, die Kakteen-Kakteen-Kakteen-Communitys laufen lassen ", und beide bekommen weniger als die Hälfte richtig.
Siehe auch:
nlp
stemming
lemmatization
Manixrock
quelle
quelle
Antworten:
Wenn Sie Python kennen, verfügt das Natural Language Toolkit (NLTK) über einen sehr leistungsstarken Lemmatizer, der WordNet verwendet .
Beachten Sie, dass Sie den Korpus herunterladen müssen, bevor Sie ihn verwenden, wenn Sie diesen Lemmatizer zum ersten Mal verwenden. Dies kann erfolgen durch:
Sie müssen dies nur einmal tun. Angenommen, Sie haben den Korpus jetzt heruntergeladen, funktioniert dies folgendermaßen:
Es gibt andere Lemmatizer im Modul nltk.stem , aber ich habe sie selbst nicht ausprobiert.
quelle
dies
, erhalten Siedy
stattdessendie
. Gibt es nicht eine Art fest codiertes Stemmer-Wörterbuch?WordNetLemmatizer
fälschlicherweise lemmatisieren?Ich benutze Stanford Nlp , um eine Lemmatisierung durchzuführen. Ich hatte in den letzten Tagen ein ähnliches Problem. Vielen Dank an stackoverflow, um das Problem zu lösen.
Es kann auch eine gute Idee sein, Stoppwörter zu verwenden, um Ausgabe-Lemmas zu minimieren, wenn sie später im Klassifikator verwendet werden. Bitte werfen Sie einen Blick auf die von John Conwell geschriebene coreNlp- Erweiterung.
quelle
Ich habe Ihre Begriffsliste auf dieser Schneeball-Demo-Site ausprobiert und die Ergebnisse sehen in Ordnung aus.
Ein Stemmer soll gebogene Wortformen auf eine gemeinsame Wurzel reduzieren. Es ist nicht wirklich die Aufgabe eines Stemmers, diese Wurzel zu einem "richtigen" Wörterbuchwort zu machen. Dazu müssen Sie sich morphologische / orthographische Analysegeräte ansehen .
Ich denke, bei dieser Frage geht es um mehr oder weniger dasselbe, und Kaarels Antwort auf diese Frage ist, woher ich den zweiten Link genommen habe.
quelle
Die Debatten zwischen Stemmer und Lemmatizer gehen weiter. Es geht darum, Präzision der Effizienz vorzuziehen. Sie sollten lemmatisieren, um sprachlich bedeutsame Einheiten zu erhalten, und einen Stamm verwenden, um minimalen Computersaft zu verwenden und dennoch ein Wort und seine Variationen unter demselben Schlüssel zu indizieren.
Siehe Stemmers vs Lemmatizers
Hier ist ein Beispiel mit Python NLTK:
quelle
WordNetLemmatizer
istlemmatize()
kann ein POS - Tag nehmen. Also aus deinem Beispiel:" ".join([wnl.lemmatize(i, pos=VERB) for i in sent.split()])
gibt'cat run run cactus cactuses cacti community communities'
.pos=NOUN
? Übrigens: Lange nicht gesehen, hoffentlich treffen wir uns bald in der Konferenz =)pos=VERB
Sie nur Lemmatisierung für Verben. Die Substantive bleiben gleich. Ich musste nur einen Teil meines eigenen Codes schreiben, um mich um die tatsächlichen Penn Treebank-POS-Tags zu drehen und die richtige Lemmatisierung auf jedes Token anzuwenden. AußerdemWordNetLemmatizer
stinkt bei lemmatizing nltk die Standard tokenizer. Also Beispiele wiedoes n't
nicht lemmatisierendo not
.port.stem("this")
produziertthi
undport.stem("was")
wa
, auch wenn für jeden die richtige pos vorgesehen ist.Die offizielle Seite von Martin Porter enthält einen Porter Stemmer in PHP sowie in anderen Sprachen .
Wenn Sie es wirklich ernst meinen mit gutem Stemming, obwohl Sie mit etwas wie dem Porter-Algorithmus beginnen müssen, verfeinern Sie ihn, indem Sie Regeln hinzufügen, um falsche Fälle zu beheben, die Ihrem Dataset gemeinsam sind, und fügen Sie schließlich viele Ausnahmen zu den Regeln hinzu . Dies kann leicht mit Schlüssel / Wert-Paaren (DBM / Hash / Wörterbücher) implementiert werden, wobei der Schlüssel das nachzuschlagende Wort und der Wert das Stammwort ist, das das Original ersetzt. Eine kommerzielle Suchmaschine, an der ich einmal gearbeitet habe, hatte 800 Ausnahmen von einem modifizierten Porter-Algorithmus.
quelle
http://wordnet.princeton.edu/man/morph.3WN
Für viele meiner Projekte bevorzuge ich den lexikonbasierten WordNet-Lemmatizer gegenüber dem aggressiveren Porter-Stemming.
http://wordnet.princeton.edu/links#PHP hat einen Link zu einer PHP-Schnittstelle zu den WN-APIs.
quelle
Basierend auf verschiedenen Antworten auf Stack Overflow und Blogs, auf die ich gestoßen bin, ist dies die Methode, die ich verwende, und sie scheint ziemlich gut echte Wörter zurückzugeben. Die Idee ist, den eingehenden Text in eine Reihe von Wörtern aufzuteilen (verwenden Sie die gewünschte Methode) und dann die Wortarten (POS) für diese Wörter zu finden und diese zu verwenden, um die Wörter zu stammeln und zu lemmatisieren.
Das obige Beispiel funktioniert nicht so gut, da der POS nicht bestimmt werden kann. Wenn wir jedoch einen echten Satz verwenden, funktionieren die Dinge viel besser.
quelle
Schauen Sie sich WordNet an, eine große lexikalische Datenbank für die englische Sprache:
http://wordnet.princeton.edu/
Es gibt APIs für den Zugriff in mehreren Sprachen.
quelle
Das sieht interessant aus: MIT Java WordnetStemmer: http://projects.csail.mit.edu/jwi/api/edu/mit/jwi/morph/WordnetStemmer.html
quelle
Schauen Sie sich LemmaGen an - Open Source-Bibliothek in C # 3.0.
Ergebnisse für Ihre Testwörter ( http://lemmatise.ijs.si/Services )
quelle
Die Top - Python - Pakete (in keiner bestimmten Reihenfolge) für Lemmatisierung sind:
spacy
,nltk
,gensim
,pattern
,CoreNLP
undTextBlob
. Ich bevorzuge die Implementierung von spaCy und gensim (basierend auf dem Muster), da sie das POS-Tag des Wortes identifizieren und das entsprechende Lemma automatisch zuweisen. Das gibt relevantere Deckspelzen, wobei die Bedeutung intakt bleibt.Wenn Sie nltk oder TextBlob verwenden möchten, müssen Sie darauf achten, das richtige POS-Tag manuell und das richtige Lemma zu finden.
Lemmatisierungsbeispiel mit spaCy:
Lemmatisierungsbeispiel mit Gensim:
Die obigen Beispiele wurden auf dieser Lemmatisierungsseite ausgeliehen .
quelle
Suche nach Lucene, ich bin mir nicht sicher, ob es einen PHP-Port gibt, aber ich weiß, dass Lucene für viele Plattformen verfügbar ist. Lucene ist eine OSS-Indizierungs- und Suchbibliothek (von Apache). Natürlich könnten es und Community-Extras etwas Interessantes zu sehen haben. Zumindest können Sie lernen, wie es in einer Sprache gemacht wird, damit Sie die "Idee" in PHP übersetzen können
quelle
Wenn ich meine Antwort auf die Frage zitieren darf, die StompChicken erwähnt hat:
Da sie die Sprache nicht verstehen und nicht aus einem Wörterbuch von Begriffen hervorgehen, haben sie keine Möglichkeit, unregelmäßige Fälle wie "run" / "ran" zu erkennen und angemessen darauf zu reagieren.
Wenn Sie unregelmäßige Fälle behandeln müssen, müssen Sie entweder einen anderen Ansatz wählen oder Ihr Stemming mit Ihrem eigenen benutzerdefinierten Korrekturwörterbuch ergänzen, das ausgeführt wird, nachdem der Stemmer seine Aufgabe erledigt hat.
quelle
Die aktuellste Version des Stemmer in NLTK ist Snowball.
Beispiele zur Verwendung finden Sie hier:
http://nltk.googlecode.com/svn/trunk/doc/api/nltk.stem.snowball2-pysrc.html#demo
quelle
Sie könnten den Morpha-Stemmer verwenden. UW hat morpha stemmer in Maven central hochgeladen, wenn Sie es von einer Java-Anwendung aus verwenden möchten. Es gibt einen Wrapper, der die Verwendung erheblich vereinfacht. Sie müssen es nur als Abhängigkeit hinzufügen und die
edu.washington.cs.knowitall.morpha.MorphaStemmer
Klasse verwenden. Instanzen sind threadsicher (der ursprüngliche JFlex hatte unnötigerweise Klassenfelder für lokale Variablen). Instanziiere eine Klasse und rennemorpha
und das Wort, das du aufhalten möchtest.quelle
.Net Lucene hat einen eingebauten Porter Stemmer. Sie können das versuchen. Beachten Sie jedoch, dass Porter Stemming bei der Ableitung des Lemmas den Wortkontext nicht berücksichtigt. (Gehen Sie den Algorithmus und seine Implementierung durch und Sie werden sehen, wie er funktioniert.)
quelle
Martin Porter schrieb Snowball (eine Sprache für Stemming-Algorithmen) und schrieb den "English Stemmer" in Snowball neu. Es gibt einen englischen Stemmer für C und Java.
Er erklärt ausdrücklich, dass der Porter Stemmer nur aus historischen Gründen neu implementiert wurde. Wenn Sie also die Richtigkeit des Stemmers gegen den Porter Stemmer testen, erhalten Sie Ergebnisse, die Sie bereits kennen (sollten).
Dr. Porter schlägt vor, die englischen oder Porter2-Stemmer anstelle des Porter-Stemmers zu verwenden. Der englische Stemmer wird tatsächlich auf der Demo-Site verwendet, wie @StompChicken zuvor geantwortet hat.
quelle
In Java benutze ich Tartargus-Schneeball, um Wörter aufzuhalten
Maven:
Beispielcode:
quelle
Versuchen Sie dies hier: http://www.twinword.com/lemmatizer.php
Ich habe Ihre Anfrage in die Demo eingegeben
"cats running ran cactus cactuses cacti community communities"
und["cat", "running", "run", "cactus", "cactus", "cactus", "community", "community"]
mit dem optionalen Flag erhaltenALL_TOKENS
.Beispielcode
Dies ist eine API, mit der Sie von jeder Umgebung aus eine Verbindung herstellen können. So könnte der PHP REST-Aufruf aussehen.
quelle
Ich empfehle dringend die Verwendung von Spacy (Parsen und Markieren von Basistext ) und Textacy (Textverarbeitung auf höherer Ebene, die auf Spacy aufbaut ).
Lemmatisierte Wörter sind in Spacy standardmäßig als Token-
.lemma_
Attribut verfügbar , und Text kann lemmatisiert werden, während viele andere Texte mit Textacy vorverarbeitet werden. Zum Beispiel beim Erstellen einer Tasche mit Begriffen oder Wörtern oder im Allgemeinen kurz vor dem Ausführen einer Verarbeitung, die dies erfordert.Ich würde Sie ermutigen, beide zu überprüfen, bevor Sie Code schreiben, da dies Ihnen viel Zeit sparen kann!
quelle
quelle