我一直在研究自然语言解析树并以各种方式对其进行操作。我一直在使用斯坦福的Tregex和Tsurgeon工具,但代码混乱且不适合我的大部分Python环境(这些工具使用Java,不太适合调整)。我想要一套工具集,可以轻松地进行hack以获得更多功能。是否有其他工具非常适合在树上进行模式匹配,然后操作这些匹配的分支?
例如,我想将以下树作为输入:
例如,我想将以下树作为输入:
(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的第一个子节点和名为“Bank”的某些后代,并具有具有标签PP的第二个子节点。
- 如果匹配,则将PP节点的所有子节点取出并移动到匹配的NP节点的子节点的末尾。
例如,考虑以下树的一部分:
(NP
(NP (NNP Bank))
(PP (IN of)
(NP (NNP America))))
并将其转换为以下内容:
(NP
(NP (NNP Bank) (IN of) (NP (NNP America))))
由于我的输入树是S表达式,我考虑使用Lisp(嵌入到我的Python程序中),但我已经很久没有用Lisp编写过任何重要的东西了,甚至不知道该从哪里开始。
如何描述这些模式?如何描述这些操作?如何思考这个问题?