Wie funktioniert spacy lemmatizer?

8

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.

    
Luis Ramon Ramirez Rodriguez 05.05.2017, 01:50
quelle

3 Antworten

7

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.

%Vor%

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:

%Vor%

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.

    
Amrit Saini 07.05.2017 06:43
quelle
6

Beginnen wir mit der Klassendefinition: Ссылка

Klasse

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 Ссылка

Warum liest Spacy nicht einfach eine Datei?

Wahrscheinlich, weil das Deklarieren der Zeichenfolge in Code schneller ist als das Streamen von Strings über I / O.

Woher kommen diese Indexe, Ausnahmen und Regeln?

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:

%Vor%

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 :

%Vor%

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 :

%Vor%

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 :

%Vor%

Warum ist die Methode 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

Morphy gegen Spacy

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:

  1. Überprüfen Sie die Ausnahmelisten
  2. Wenden Sie Regeln einmal auf die Eingabe an, um y1, y2, y3 usw. zu erhalten.
  3. Geben Sie alle in der Datenbank enthaltenen Daten zurück (und überprüfen Sie auch das Original)
  4. Wenn keine Übereinstimmungen vorhanden sind, wenden Sie Regeln an, bis wir eine Übereinstimmung gefunden haben
  5. Gib eine leere Liste zurück, wenn wir nichts finden können

Für spacy , möglicherweise, ist es noch in der Entwicklung, angesichts der TODO in Zeile Ссылка

Aber der allgemeine Prozess scheint zu sein:

  1. Suchen Sie nach den Ausnahmen, holen Sie sie, wenn das Lemma aus der Ausnahmeliste, wenn das Wort darin ist.
  2. Übernehmen Sie die Regeln
  3. Speichern Sie diejenigen, die in den Indexlisten enthalten sind
  4. Wenn es kein Lemma von Schritt 1-3 gibt, dann behalten Sie einfach die Out-of-vocabular Wörter (OOV) im Auge und fügen Sie auch die ursprüngliche Zeichenfolge den Lemma-Formularen
  5. hinzu
  6. Geben Sie die Lemma-Formulare
  7. zurück

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.

%Vor%

Überprüfung auf Infinitiv vor Lemmatisierung

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:

  • Person
  • Nummer
  • Geschlecht

Epilog

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.

    
alvas 12.05.2017 16:43
quelle
3

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:

  1. Wenn es eine Ausnahme (d. h. das Wort ist unregelmäßig) einschließlich der angegebenen Zeichenfolge gibt, verwenden Sie sie und fügen Sie sie den lemmatisierten Formularen
  2. hinzu
  3. Ü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)

  4. Falls wir mindestens ein Formular gefunden haben, das die obigen Regeln verwendet, geben wir die Liste der gefundenen Formulare zurück, andernfalls geben wir die oov_forms-Liste zurück.
Ivaylo Strandjev 07.05.2017 07:04
quelle