Как мне управлять деревьями синтаксического анализа?

Я играл с деревьями синтаксического анализа естественного языка и манипулировал ими различными способами. Я использовал инструменты Стэнфорда Tregex и Tsurgeon, но код беспорядочный и не работает » Он хорошо вписывается в мою среду, в основном на Python (эти инструменты являются Java и не идеальны для настройки). Я хотел бы иметь набор инструментов, который позволил бы легко взломать, когда мне понадобится больше функций. Существуют ли какие-либо другие инструменты, которые хорошо подходят для сопоставления шаблонов на деревьях и последующего манипулирования этими сопоставленными ветвями?

Например, я хотел бы использовать в качестве входных данных следующее дерево:

(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)))))))))))

и (это упрощенный пример):

  1. Найдите любой узел с меткой NP, у которого есть первый дочерний элемент с меткой NP и некоторый дочерний элемент с именем «Банк», а также второй дочерний элемент с меткой PP.
  2. Если это совпадает, тогда возьмите все из потомков узла PP и переместите их в конец совпадающих потомков NP.

Например, возьмите эту часть дерева:

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

и превратите ее в следующую:

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

Поскольку мои входные деревья являются S-выражениями Я' Я подумывал об использовании Lisp (встроенного в мою программу Python), но я так давно написал на Лиспе что-нибудь существенное, что я даже не знаю, с чего начать.

Как лучше всего описывать шаблоны? Как лучше всего описать манипуляции? Как лучше задуматься об этой проблеме?

15
задан dmcer 12 September 2010 в 11:03
поделиться