Wie logische Teile eines Satzes mit Java zu bekommen?
-
01-10-2019 - |
Frage
Lassen Sie uns sagen, es ist ein Satz:
On March 1, he was born.
Ändern es zu
He was born on March 1.
bricht nicht den Sinn des Satzes, und es ist nach wie vor gültig. erzeugen würde seltsam ungültige Sätze Worte in anderer Weise schlurfen. Also im Grunde, ich spreche über Teile des Satzes, die die Informationen präziser zu machen, aber sie entfernt nicht den ganzen Satz brechen. Gibt es eine NLP-Bibliothek, in denen solche Teile zu identifizieren verfügbar ist?
Lösung
Konstituenten
Es klingt wie Sie den Satz identifizieren wollen Bestandteile , wobei die Gruppen von Worten, die gemäß der Grammatik einer Sprache als eine einzige Einheit arbeiten.
In der Tat, wenn Linguistik versucht, eine Sprache der Grammatik zu entdecken, sie tun es teilweise durch einen Blick auf Bewegung . Wie in Ihrem Beispiel ist, wo eine Gruppe von Wörtern in eine andere Position in einem Satz bewegt werden kann, während immer noch die Bedeutung des Satzes zu erhalten.
Konstituenten können einzelne Wörter, Phrasen, oder sogar größere Gruppen wie ganze Klauseln. Innerhalb eines Satzes, haben sie eine verschachtelte hierarchische Struktur. Zum Beispiel kann das erste Beispiel Satz, den Sie gab könnten analysiert, wie:
(S (PP (IN On) (NP (NNP March) (CD 1)))
(NP (PRP he))
(VP (VBD was) (VP (VBN born))))
Der ganze Satz ist aus einem Präpositionalphrase , gefolgt von einem Nominalphrase , und dann ein Verbphrase . Die Präpositionalphrase kann weiter in eine Einheit zerlegt wird, die aus dem Wort ‚On‘ von einer Nominalphrase gefolgt.
Phrase Structure Parser
Bestandteile automatisch zu finden, dass Sie wahrscheinlich eine Phrasenstruktur Parser verwenden möchten. Es gibt viele solche Parsen von dem wählen, als Open Source verfügbar sind, einschließlich:
- Stanford Parser (Java)
- Berkeley Parser (Java)
- BLLIP (Charniak-Johnson) Parser (C ++)
- Bikel Parser (dies ist eine neu implementiert und verbesserte Version des Collins Parser schreiben in Java)
- Collins Parser (C ++)
- OpenNLP Parser (Java)
- SharpNLP Parser (C #)
Die Stanford und Berkeley-Parser sind wahrscheinlich die einfachste und Verwendung zu installieren. Wie zu sehen in Cer et al. 2010 , die genauesten Parser sind Berkeley und Charniak. Der Bikel Parser ist langsamer und weniger genau als die andere.
Online-Demo
Es gibt eine Online-Demo für die Stanford-Parser hier . Ich habe die Demo den Parsing oben Ihren Beispielsatz gegeben zu erzeugen.
Ein Hinweis zum Löschen
Innerhalb jeder Bestandteil, wird es ein Kopf Wort . Um zum Beispiel die Nominalphrase nehmen:
(NP (DT The) (JJ big) (JJ blue) (NN ball))
Der Kopf Wort, das hier ist das Substantiv ball
, und es wird durch die Adjektive big
und blue
modifiziert. Wenn diese Nominalphrase in einem Satz eingebettet wurde, könnten Sie diese Modifier löschen und noch etwas, das mit entspricht, aber weniger spezifisch als die Bedeutung des ursprünglichen Satzes.
Innerhalb von Nominalphrasen, können Sie in der Regel die Adjektive, Substantive löschen, die nicht der Kopf sind und verschachtelte Präpositionalphrasen.
Innerhalb von Verbalphrasen und vollständigen Klauseln, werden die Dinge komplizierter, da das Löschen Material, dass der Server als einergument auf das Verb kann vollständig auf die Auslegung ändern, um einen Satz. Zum Beispiel the book
von He sold Jim the book
Ergebnissen in Löschen He sold Jim
.
Andere Tipps
OpenNLP können für Sie einige dies tun. Phrase und Parsing Chunking sollte Ihnen dabei helfen. Dies ist jedoch nicht ein besonders einfaches Problem, und Algorithmen dazu neigen, zu verwirren zu lassen, wie Satzbau komplexen und mehrdeutig wird. Sie sollten innerhalb eines Satzes zu Neuordnungs Sätze manchmal in der Lage sein und pflegen bedeutet.