Я играл с деревьями разбора естественного языка и манипулировал ими разными способами. Я использую инструменты Stanford 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)))))))))))
и (это упрощенный пример):
- Найти любой node с меткой NP, у которой есть первый ребенок с меткой NP и некоторым потомком с именем "Банк", и вторым ребенком с меткой PP.
- Если это соответствует, затем возьмите все дочерние элементы PP node и переместите их до конца дочерних NP файлов.
Например, возьмите эту часть дерева:
(NP
(NP (NNP Bank))
(PP (IN of)
(NP (NNP America))))
и превратите его в это:
(NP
(NP (NNP Bank) (IN of) (NP (NNP America))))
Так как мои деревья ввода - это S-выражения, которые я рассмотрел с помощью Lisp (встроенный в мою программу на Python), но это было так долго, что я написал что-то существенное в Lisp, что я понятия не имею, где даже начать.
Что было бы хорошим способом описать шаблоны? Что было бы хорошим способом описать манипуляции? Какой хороший способ подумать об этой проблеме?