Natural Language Toolkit - Analyse
Parsing und seine Relevanz in NLP
Das Wort "Parsing", dessen Ursprung aus dem lateinischen Wort stammt ‘pars’ (was bedeutet ‘part’) wird verwendet, um die genaue Bedeutung oder Wörterbuchbedeutung aus dem Text zu ziehen. Es wird auch als syntaktische Analyse oder Syntaxanalyse bezeichnet. Beim Vergleich der Regeln der formalen Grammatik überprüft die Syntaxanalyse den Text auf Aussagekraft. Der Satz wie "Gib mir heißes Eis" würde zum Beispiel vom Parser oder syntaktischen Analysator abgelehnt.
In diesem Sinne können wir Parsing oder syntaktische Analyse oder Syntaxanalyse wie folgt definieren:
Es kann als der Prozess der Analyse der Zeichenfolgen in natürlicher Sprache definiert werden, die den Regeln der formalen Grammatik entsprechen.
Wir können die Relevanz des Parsens in NLP anhand der folgenden Punkte verstehen:
Der Parser wird verwendet, um Syntaxfehler zu melden.
Es hilft, häufig auftretende Fehler zu beheben, damit die Verarbeitung des restlichen Programms fortgesetzt werden kann.
Der Analysebaum wird mit Hilfe eines Parsers erstellt.
Mit dem Parser wird eine Symboltabelle erstellt, die in NLP eine wichtige Rolle spielt.
Parser wird auch verwendet, um Zwischendarstellungen (IR) zu erzeugen.
Deep Vs Shallow Parsing
Tiefes Parsen | Flaches Parsen |
---|---|
Beim Deep Parsing gibt die Suchstrategie einem Satz eine vollständige syntaktische Struktur. | Es ist die Aufgabe, einen begrenzten Teil der syntaktischen Informationen aus der gegebenen Aufgabe zu analysieren. |
Es ist für komplexe NLP-Anwendungen geeignet. | Es kann für weniger komplexe NLP-Anwendungen verwendet werden. |
Dialogsysteme und Zusammenfassung sind Beispiele für NLP-Anwendungen, bei denen Deep Parsing verwendet wird. | Informationsextraktion und Text Mining sind Beispiele für NLP-Anwendungen, bei denen Deep Parsing verwendet wird. |
Es wird auch als vollständige Analyse bezeichnet. | Es wird auch Chunking genannt. |
Verschiedene Arten von Parsern
Wie bereits erwähnt, ist ein Parser im Grunde eine prozedurale Interpretation der Grammatik. Es findet einen optimalen Baum für den gegebenen Satz, nachdem es den Raum einer Vielzahl von Bäumen durchsucht hat. Lassen Sie uns einige der verfügbaren Parser unten sehen -
Rekursiver Abstiegsparser
Das Parsen rekursiver Abstammung ist eine der einfachsten Formen des Parsens. Im Folgenden sind einige wichtige Punkte zum rekursiven Abstiegsparser aufgeführt:
Es folgt ein Top-Down-Prozess.
Es wird versucht zu überprüfen, ob die Syntax des Eingabestreams korrekt ist oder nicht.
Es liest den Eingabesatz von links nach rechts.
Eine notwendige Operation für einen Parser für rekursiven Abstieg besteht darin, Zeichen aus dem Eingabestream zu lesen und sie mit den Terminals aus der Grammatik abzugleichen.
Shift-Reduce-Parser
Im Folgenden finden Sie einige wichtige Punkte zum Shift-Reduce-Parser:
Es folgt einem einfachen Bottom-up-Prozess.
Es wird versucht, eine Folge von Wörtern und Phrasen zu finden, die der rechten Seite einer Grammatikproduktion entsprechen, und diese durch die linke Seite der Produktion zu ersetzen.
Der obige Versuch, eine Wortfolge zu finden, wird fortgesetzt, bis der gesamte Satz reduziert ist.
Mit anderen Worten, der Shift-Reduce-Parser beginnt mit dem Eingabesymbol und versucht, den Parser-Baum bis zum Startsymbol zu erstellen.
Diagrammparser
Im Folgenden finden Sie einige wichtige Punkte zum Chart-Parser:
Es ist hauptsächlich nützlich oder geeignet für mehrdeutige Grammatiken, einschließlich Grammatiken natürlicher Sprachen.
Es wendet eine dynamische Programmierung auf die Analyseprobleme an.
Aufgrund der dynamischen Programmierung werden teilweise hypothetische Ergebnisse in einer Struktur gespeichert, die als "Diagramm" bezeichnet wird.
Das 'Diagramm' kann auch wiederverwendet werden.
Regexp-Parser
Das Regexp-Parsing ist eine der am häufigsten verwendeten Parsing-Techniken. Im Folgenden finden Sie einige wichtige Punkte zum Regexp-Parser:
Wie der Name schon sagt, wird ein regulärer Ausdruck verwendet, der in Form einer Grammatik über einer Zeichenfolge mit POS-Tags definiert ist.
Grundsätzlich werden diese regulären Ausdrücke verwendet, um die Eingabesätze zu analysieren und daraus einen Analysebaum zu generieren.
Beispiel
Es folgt ein Arbeitsbeispiel für Regexp Parser -
import nltk
sentence = [
("a", "DT"),
("clever", "JJ"),
("fox","NN"),
("was","VBP"),
("jumping","VBP"),
("over","IN"),
("the","DT"),
("wall","NN")
]
grammar = "NP:{<DT>?<JJ>*<NN>}"
Reg_parser = nltk.RegexpParser(grammar)
Reg_parser.parse(sentence)
Output = Reg_parser.parse(sentence)
Output.draw()
Ausgabe
Abhängigkeitsanalyse
Dependency Parsing (DP), ein moderner Parsing-Mechanismus, dessen Hauptkonzept darin besteht, dass jede Spracheinheit, dh Wörter, durch eine direkte Verbindung miteinander in Beziehung stehen. Diese direkten Links sind eigentlich‘dependencies’in der Sprache. Das folgende Diagramm zeigt beispielsweise die Abhängigkeitsgrammatik für den Satz“John can hit the ball”.
NLTK-Paket
Wir haben zwei Möglichkeiten, um Abhängigkeitsanalyse mit NLTK durchzuführen:
Probabilistischer, projektiver Abhängigkeitsparser
Dies ist die erste Möglichkeit, Abhängigkeitsanalyse mit NLTK durchzuführen. Dieser Parser hat jedoch die Einschränkung des Trainings mit einem begrenzten Satz von Trainingsdaten.
Stanford Parser
Dies ist eine weitere Möglichkeit, Abhängigkeitsanalyse mit NLTK durchzuführen. Der Stanford-Parser ist ein hochmoderner Abhängigkeitsparser. NLTK ist von einem Wrapper umgeben. Um es zu verwenden, müssen wir folgende zwei Dinge herunterladen:
Der Stanford CoreNLP-Parser .
Sprachmodell für die gewünschte Sprache. Zum Beispiel ein englisches Sprachmodell.
Beispiel
Sobald Sie das Modell heruntergeladen haben, können wir es über NLTK wie folgt verwenden:
from nltk.parse.stanford import StanfordDependencyParser
path_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser.jar'
path_models_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser-3.4.1-models.jar'
dep_parser = StanfordDependencyParser(
path_to_jar = path_jar, path_to_models_jar = path_models_jar
)
result = dep_parser.raw_parse('I shot an elephant in my sleep')
depndency = result.next()
list(dependency.triples())
Ausgabe
[
((u'shot', u'VBD'), u'nsubj', (u'I', u'PRP')),
((u'shot', u'VBD'), u'dobj', (u'elephant', u'NN')),
((u'elephant', u'NN'), u'det', (u'an', u'DT')),
((u'shot', u'VBD'), u'prep', (u'in', u'IN')),
((u'in', u'IN'), u'pobj', (u'sleep', u'NN')),
((u'sleep', u'NN'), u'poss', (u'my', u'PRP$'))
]