Wie bearbeite ich Analysebäume?

Ich habe mit Analysebäumen in natürlicher Sprache herumgespielt und sie auf verschiedene Arten manipuliert. Ich habe Stanfords Tregex- und Tsurgeon-Tools verwendet, aber der Code ist ein Chaos und passt nicht gut zu meiner meistens Python-Umgebung (diese Tools sind Java und eignen sich nicht zum Optimieren). Ich hätte gerne ein Toolset, das einfaches Hacken ermöglicht, wenn ich mehr Funktionen benötige. Gibt es noch andere Tools, die sich gut für den Mustervergleich an Bäumen und die anschließende Bearbeitung dieser übereinstimmenden Zweige eignen?

Zum Beispiel möchte ich den folgenden Baum als Eingabe nehmen:

(ROOT
  (S
    (NP
      (NP (NNP Bank))
      (PP (IN of)
        (NP (NNP America))))
    (VP (VBD used)
      (S
        (VP (TO to)
          (VP (VB be)
            (VP (VBN called)
              (NP
                (NP (NNP Bank))
                (PP (IN of)
                  (NP (NNP Italy)))))))))))

und (dies ist ein vereinfachtes Beispiel):

Finden Sie einen Knoten mit der Bezeichnung NP, der ein erstes Kind mit der Bezeichnung NP und einen Nachkommen namens "Bank" und ein zweites Kind mit der Bezeichnung PP hat.Wenn dies zutrifft, nehmen Sie alle untergeordneten Elemente des PP-Knotens und verschieben Sie sie an das Ende der untergeordneten Elemente des übereinstimmenden NP.

Nehmen Sie zum Beispiel diesen Teil des Baums:

(NP
  (NP (NNP Bank))
  (PP (IN of)
    (NP (NNP America))))

und mach daraus:

(NP
  (NP (NNP Bank) (IN of) (NP (NNP America))))

Da meine Eingabebäume S-Ausdrücke sind, habe ich überlegt, Lisp (eingebettet in mein Python-Programm) zu verwenden, aber es ist so lange her, dass ich irgendetwas Bedeutendes in Lisp geschrieben habe, dass ich keine Ahnung habe, wo ich überhaupt anfangen soll.

Was wäre ein guter Weg, um die Muster zu beschreiben? Was wäre ein guter Weg, um die Manipulationen zu beschreiben? Was ist ein guter Weg, um über dieses Problem nachzudenken?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage