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