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