2010-04-23 7 views
6

Angenommen, es gibt einen Satz:Wie bekomme ich logische Teile eines Satzes mit Java?

On March 1, he was born. 

es

He was born on March 1. 

den Sinn des Satzes nicht bricht ändern, und es ist nach wie vor gültig. Das Mischen von Wörtern in anderer Weise würde seltsame bis ungültige Sätze erzeugen. Im Grunde genommen spreche ich über Teile des Satzes, die die Information spezifischer machen, aber das Entfernen von ihnen bricht nicht den ganzen Satz. Gibt es eine NLP-Bibliothek, in der solche Teile identifiziert werden können?

Antwort

26

Konstituenten

Es klingt wie Sie den Satz des constituents, identifizieren wollen, die Gruppen von Wörtern, die als eine einzige Einheit arbeiten.

In der Tat, wenn Linguistik versuchen, die Grammatik einer Sprache zu entdecken, tun sie es teilweise durch Blick auf movement. Wie in Ihrem Beispiel ist dies der Fall, wenn eine Gruppe von Wörtern an eine andere Position in einem Satz verschoben werden kann, während die Bedeutung des Satzes erhalten bleibt.

Bestandteile können einzelne Wörter, Sätze oder sogar größere Gruppen wie ganze Klauseln sein. Innerhalb eines Satzes haben sie eine verschachtelte hierarchische Struktur.

(S (PP (IN On) (NP (NNP March) (CD 1))) 
    (NP (PRP he)) 
    (VP (VBD was) (VP (VBN born)))) 

Der ganze Satz wird von einem noun phrase eines prepositional phrase, gefolgt gemacht, und dann eine verb phrase: Zum Beispiel könnte das erste Beispiel Satz, den Sie gab als analysierende. Die Präpositionalphrase kann weiter in eine Einheit zerlegt werden, die aus dem einzelnen Wort "Ein" gefolgt von einer Nominalphrase besteht.

Phrase Structure Parsers

Bestandteile automatisch zu finden, werden Sie wahrscheinlich eine Phrasenstruktur Parser verwenden möchten.Es gibt viele solcher Parsen zur Auswahl, die als Open-Source zur Verfügung stehen, einschließlich:

Die Stanford und Berkeley-Parser sind wahrscheinlich die am einfachsten zu installieren und zu nutzen. Wie in Cer et al. 2010 gesehen, sind die genauesten Parser Berkeley und Charniak. Der Bikel-Parser ist langsamer und weniger genau als die anderen.

Online Demo

Es gibt eine Online-Demo für den Stanford-Parser here. Ich habe die Demo verwendet, um das obige Parsen des Beispielsatzes zu erzeugen.

Hinweis zu Löschen

Innerhalb jeder Bestandteil, wird es eine head word sein. Nehmen wir zum Beispiel die Nominalphrase:

(NP (DT The) (JJ big) (JJ blue) (NN ball))

Der Kopf Wort hier ist das Substantiv ball, und es wird durch die Adjektive big und blue modifiziert. Wenn diese Nominalphrase in einen Satz eingebettet wäre, könnten Sie diese Modifizierer löschen und haben immer noch etwas, das konsistent, aber weniger spezifisch als die Bedeutung des ursprünglichen Satzes ist.

Innerhalb von Nominalphrasen können Sie im Allgemeinen die Adjektive, Substantive, die nicht der Kopf sind, und verschachtelte Präpositionalphrasen löschen.

Innerhalb von Verbalphrasen und vollständigen Klauseln werden die Dinge komplizierter, da das Löschen von Material, das als Argument für das Verb dient, die Interpretation eines Satzes vollständig verändern kann. Wenn Sie zum Beispiel the book von He sold Jim the book löschen, erhalten Sie He sold Jim.

+1

Ich schaute gerade auf all diese Parser und fand ein Papier geschrieben von Daniel unter http://nlp.stanford.edu/pubs/lrecstanforddeps_final_final.pdf –

+4

Ja, das ist eigentlich mein Papier :) – dmcer

+0

Ich wunderte mich über den Link Grammer Parser Leistung, aber ich sehe in Ihrem Papier haben Sie es unter dem RelEx-Parser abgedeckt. –

1

OpenNLP kann einiges davon für Sie tun. Phrase chunking und Parsing sollte Ihnen dabei helfen. Dies ist jedoch kein besonders einfaches Problem, und Algorithmen werden dazu neigen, verwirrt zu werden, wenn die Satzstruktur komplexer und mehrdeutig wird. Sie sollten manchmal in der Lage sein, Sätze innerhalb eines Satzes neu zu ordnen und Bedeutung zu bewahren. nach der Grammatik einer Sprache