我一直在玩自然语言解析树并以各种方式操纵它们。我一直在使用斯坦福大学的 Tregex 和 Turgeon 工具,但代码很乱,不适合我主要使用 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 的第一个子节点和一些名为“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 中编写了任何重要的东西,以至于我什至不知道从哪里开始。
什么是描述模式的好方法?什么是描述操作的好方法?考虑这个问题的好方法是什么?