Zur Lemmatisierung hat spacy eine Wortliste : Adjektive, Adverbien, Verben. .. und auch Listen für Ausnahmen: adverbs_irreg ... für die regulären gibt es eine Menge von Regeln
Nehmen wir als Beispiel das Wort "breiter"
Da es sich um ein Adjektiv handelt, sollte die Regel für die Lemmatisierung aus dieser Liste übernommen werden:
%Vor%Wie ich verstehe, wird der Prozess so sein:
1) Holen Sie sich das POS-Tag des Wortes zu wissen, ob es ein Nomen, ein Verb ... ist 2) Wenn das Wort in der Liste der irregulären Fälle steht, wird es direkt ersetzt, wenn keine der Regeln angewendet wird.
Nun, wie wird entschieden, "er" zu verwenden - & gt; "e" anstelle von "er" - & gt; "" um "weit" und nicht "wid" zu bekommen?
Hier kann es getestet werden.
TLDR: spaCy prüft, ob das zu generierende Lemma in der bekannten Liste von Wörtern oder Ausnahmen für diese Wortart steht.
Lange Antwort:
Sehen Sie sich die Datei lemmatizer.py an, insbesondere die Funktion lemmatize
bei der Boden.
Bei englischen Adjektiven nimmt es zum Beispiel den String, den wir evaluieren, index
der bekannten Adjektive, exceptions
und rules
, wie Sie verwiesen haben, von dieses Verzeichnis (für englisches Modell).
Das erste, was wir in lemmatize
tun, nachdem wir den String in Kleinbuchstaben geschrieben haben, ist, ob der String in unserer Liste der bekannten Exceptions steht, inklusive Lemma-Regeln für Wörter wie "schlechter" - & gt; "schlecht".
Dann gehen wir durch unser rules
und wenden jedes einzelne auf den String an, wenn es anwendbar ist. Für das Wort wider
würden wir die folgenden Regeln anwenden:
und wir würden die folgenden Formen ausgeben: ["wid", "wide"]
.
Dann prüfen wir, ob diese Form in unserem index
der bekannten Adjektive ist. Wenn ja, hängen wir es an die Formulare an. Ansonsten fügen wir es zu oov_forms
hinzu, was meiner Meinung nach eine Abkürzung für Vokabeln ist. wide
befindet sich im Index und wird hinzugefügt. wid
wird zu oov_forms
hinzugefügt.
Schließlich geben wir entweder die gefundenen Lemmas oder irgendwelche Lemmas zurück, die den Regeln entsprachen, aber nicht in unserem Index waren, oder nur das Wort selbst.
Der Wort-Lemmatisierungs-Link, den Sie oben gepostet haben, funktioniert für wider
, weil wide
im Wortindex ist. Versuchen Sie etwas wie He is blandier than I.
spaCy wird blandier
(Wort, das ich erfunden habe) als Adjektiv markieren, aber es ist nicht im Index, also wird nur blandier
als Lemma zurückgegeben.
Beginnen wir mit der Klassendefinition: Ссылка
Es beginnt mit der Initialisierung von 3 Variablen:
%Vor% Nun sehen wir uns die self.exc
für Englisch an und sehen, dass sie auf Ссылка init .py , wo Dateien aus dem Verzeichnis Ссылка
Wahrscheinlich, weil das Deklarieren der Zeichenfolge in Code schneller ist als das Streamen von Strings über I / O.
Wenn man genau hinschaut, scheinen sie alle aus dem ursprünglichen Princeton WordNet zu stammen Ссылка
Regeln
Wenn wir es noch näher betrachten, gelten die Regeln für Ссылка ähnlich wie die _morphy
-Regeln von nltk
Ссылка
Und diese Regeln stammen ursprünglich aus der Morphy
-Software Ссылка
Außerdem enthielt spacy
einige Interpunktionsregeln, die nicht von Princeton Morphy stammen:
Ausnahmen
Was die Ausnahmen angeht, wurden sie in den *_irreg.py
-Dateien in spacy
gespeichert, und sie sehen aus, als kämen sie auch aus dem Princeton-Wordnet.
Es ist offensichtlich, wenn wir uns einen Spiegel der ursprünglichen WordNet .exc
(Ausschluss) Dateien anschauen (zB Ссылка ) und wenn Sie das Paket wordnet
von nltk
herunterladen, sehen wir, dass es dieselbe Liste ist :
Index
Wenn wir uns spacy
lemmatizers index
anschauen, sehen wir, dass es auch von Wordnet kommt, z.B. Ссылка und die neu verteilte Kopie von Wordnet in nltk
:
Ausgehend von der Tatsache, dass das Wörterbuch, die Ausnahmen und Regeln, die spacy
lemmatizer verwendet, größtenteils aus Princeton WordNet und ihrer Morphy-Software stammt, können wir die tatsächliche Implementierung von spacy
anzeigen, die die Regeln mit dem Index und verwendet Ausnahmen.
Wir gehen zurück zu Ссылка
Die Hauptaktion kommt von der Funktion und nicht von der Klasse Lemmatizer
:
lemmatize
außerhalb der Klasse Lemmatizer
? Das bin ich nicht genau sicher, aber vielleicht, es ist sicherzustellen, dass die Lemmatisierungsfunktion außerhalb einer Klasseninstanz aufgerufen werden kann, aber @staticmethod
und @classmethod
gibt es vielleicht noch weitere Überlegungen, warum die Funktion und die Klasse entkoppelt wurden
Vergleich der Funktion spacy
lemmatize () mit der morphy()
Funktion in nltk (die ursprünglich aus Ссылка erstellt vor mehr als einem Jahrzehnt), morphy()
, die wichtigsten Prozesse in Oliver Steele's Python-Port des WordNet morphy sind:
Für spacy
, möglicherweise, ist es noch in der Entwicklung, angesichts der TODO
in Zeile Ссылка
Aber der allgemeine Prozess scheint zu sein:
Bezüglich der OOV-Behandlung gibt spacy die ursprüngliche Zeichenkette zurück, wenn keine lemmatisierte Form gefunden wird, in dieser Hinsicht tut die nltk
Implementierung von morphy
dasselbe, z.
Ein weiterer möglicher Unterschied ist, wie morphy
und spacy
entscheiden, welche POS dem Wort zugeordnet werden soll. In dieser Hinsicht setzt spacy
eine linguistische Regel in Lemmatizer()
, um zu entscheiden, ob a Wort ist die Basisform und überspringt die Lemmatisierung vollständig, wenn das Wort bereits in der Infinitivform (is_base_form ()) ist, das wird einiges einsparen, wenn für alle Wörter im Korpus eine Lemmatisierung vorgenommen werden soll und ganz a Brocken davon sind Infinitive (bereits die Lemma-Form).
Aber das ist in spacy
möglich, weil es dem Lemmatizer erlaubt hat, auf das POS zuzugreifen, das eng mit einigen morphologischen Regeln verbunden ist. Während für morphy
, obwohl es möglich ist, einige Morphologie mit den feinkörnigen PTB POS-Tags herauszufinden, ist es immer noch mühsam, sie zu sortieren, um zu wissen, welche Formen unendlich sind.
Allgemein müssen die 3 Hauptsignale von Morphologie-Features im POS-Tag herausgeholt werden:
Ich denke jetzt, da wir wissen, dass es mit linguistischen Regeln und allem zusammenarbeitet, ist die andere Frage "Gibt es irgendwelche nicht-regelbasierten Methoden zur Lemmatisierung?"
Aber bevor Sie überhaupt die Frage beantwortet haben: "Was genau ist ein Lemma?" vielleicht die bessere Frage zu stellen.
Für jeden Worttyp (Adjektiv, Substantiv, Verb, Adverb) gibt es eine Reihe von Regeln und eine Reihe von Wörtern. Das Mapping passiert hier :
%Vor%Dann auf diese Zeile in lemmatizer.py den richtigen Index, Regeln und exc (außer ich glaube für Ausnahmen, zB irreguläre Beispiele) get loaded:
%Vor%Die ganze verbleibende Logik ist in der Funktion lemmatize und ist überraschend kurz . Wir führen die folgenden Operationen durch:
Überprüfen Sie für jede Regel in der Reihenfolge, in der sie für den ausgewählten Worttyp angegeben sind, ob sie mit dem angegebenen Wort übereinstimmt. Wenn es versucht, es anzuwenden.
2a. Wenn nach dem Anwenden der Regel das Wort in der Liste bekannter Wörter (d. H. Index) enthalten ist, fügen Sie es zu den lemmatisierten Formen des Wortes hinzu
2b. Ansonsten füge das Wort in eine separate Liste namens oov_forms
ein (hier glaube ich, dass oov für "out of vocabulary" steht)
Tags und Links python nlp wordnet spacy lemmatization