Ich habe einen Datensatz mit mehreren Annotationsschichten über dem zugrunde liegenden Text, z. B. part-of-tags , Chunks von einem flachen Parser , Name entities und andere aus verschiedenen Verarbeitung natürlicher Sprache (NLP) Werkzeuge. Für einen Satz wie The man went to the store
könnten die Anmerkungen wie folgt aussehen:
Ich möchte eine Reihe von Dokumenten mit Annotationen wie diesen mithilfe von Lucene indizieren und anschließend die verschiedenen Ebenen durchsuchen. Ein Beispiel für eine einfache Abfrage wäre, alle Dokumente abzurufen, in denen Washington als Person markiert ist. Ich bin zwar nicht unbedingt der Notation verpflichtet, aber syntaktisch können Endbenutzer die Abfrage wie folgt eingeben:
Abfrage : Word=Washington,NER=Person
Ich möchte auch komplexere Abfragen durchführen, bei denen die sequentielle Reihenfolge von Annotationen über verschiedene Ebenen hinweg verwendet wird, z. finde alle Dokumente, in denen ein Wort mit person getaggt ist, gefolgt von den Wörtern arrived at
gefolgt von einem mit location gekennzeichneten Wort. Eine solche Abfrage könnte folgendermaßen aussehen:
Abfrage : "NER=Person Word=arrived Word=at NER=Location"
Was ist ein guter Weg, Lucene näher zu kommen? Gibt es überhaupt Indexfelder, die über strukturierte Dokumente strukturiert sind?
Payloads
Ein Vorschlag war, zu versuchen, Lucene zu verwenden Nutzlasten . Aber ich dachte, Nutzlasten könnten nur verwendet werden, um die Rangfolge von Dokumenten anzupassen, und sie werden nicht verwendet, um auszuwählen, welche Dokumente zurückgegeben werden.
Letzteres ist wichtig, da für einige Anwendungsfälle die Anzahl der Dokumente , die ein Muster enthalten, wirklich das ist, was ich möchte.
Außerdem werden nur die Payloads in Termen untersucht, die mit der Abfrage übereinstimmen. Das bedeutet, dass Nutzdaten nur bei den Rankings der ersten Beispielabfrage , Word=Washington,NER=Person
, helfen können, wobei wir nur sicherstellen wollen, dass der Begriff Washingonton
als getaggt markiert ist a Person
. Für die zweite Beispielabfrage, "NER=Person Word=arrived Word=at NER=Location"
, muss ich jedoch die Tags auf nicht spezifizierte und damit nicht passende Terme überprüfen.
Was Sie suchen, sind Payloads . Lucid Imagination hat einen ausführlichen Blogeintrag zu diesem Thema. Mit Payloads können Sie ein Byte-Array mit Metadaten zu einzelnen Begriffen speichern. Sobald Sie Ihre Daten mit den zugehörigen Nutzdaten indiziert haben, können Sie einen neuen Ähnlichkeitsmechanismus erstellen, der Ihre Nutzdaten beim Scoring berücksichtigt.
Eine Möglichkeit, um das zu erreichen, was Sie fordern, ist das Indizieren jeder Annotationsklasse an der gleichen Position (z. B. Word, POS, Chunk, NER) und das Voranstellen jeder Annotation mit einer eindeutigen Zeichenkette. Kümmern Sie sich nicht um Präfixe für Wörter. Sie benötigen einen benutzerdefinierten Analyzer, um die Präfixe beizubehalten, aber dann sollten Sie in der Lage sein, die gewünschte Syntax für Abfragen zu verwenden.
Um genau zu sein, was ich vorschlage ist, dass Sie die folgenden Token an den angegebenen Positionen indizieren:
%Vor%Um die Semantik zu erhalten, verwenden Sie SpanQuery oder SpanTermQuery , um die Tokenfolge zu erhalten .
Ich habe das nicht versucht, aber die Indexierung der verschiedenen Klassen von Begriffen an der gleichen Position sollte es ermöglichen, dass positionsabhängige Abfragen das Richtige tun, um Ausdrücke wie
zu bewertenNER = Person ist bei NER = Location
angekommen
Beachten Sie den Unterschied zu Ihrem Beispiel: Ich habe das Präfix Word = gelöscht, um es als Standard zu behandeln. Außerdem kann die Wahl der Präfixsyntax (z. B. "class=") den Inhalt des zu indexierenden Dokuments einschränken. Stellen Sie sicher, dass die Dokumente entweder die Phrasen nicht enthalten oder dass Sie sie in der Vorverarbeitung irgendwie umgehen. Dies hängt natürlich mit dem Analysator zusammen, den Sie verwenden müssen.
Update: Ich habe diese Technik zum Indexieren von Satz- und Absatzgrenzen im Text verwendet (mit break=sen
und break=para
tokens), um zu entscheiden, wo Phrasenabfrage-Matches zu brechen sind. Scheint gut zu funktionieren.
Tags und Links java nlp text-mining data-mining lucene