Python 比较两个相似、不相同的NLTK树
我试图写一个程序,将采取在两个句子,并检查他们是否相似。我不想使用成熟的解析器,而是使用我认为最常遇到的简单语法创建了一个解析器。现在,我的兴趣是句子中的名词短语。检查标记为名词短语的子树是否相等是很容易的。我想添加更多内容,让用户决定是否接受缺少/不匹配的限定符(部分匹配) 输出树的形式是(S(NP/DT-bag/NN)is/VBZ(JP-blue/JJ)),其中我定义了语法名词短语(NP)和形容词短语(JP) 为了进行匹配,我考虑了以下几条路线:Python 比较两个相似、不相同的NLTK树,python,recursion,tree,comparison,nltk,Python,Recursion,Tree,Comparison,Nltk,我试图写一个程序,将采取在两个句子,并检查他们是否相似。我不想使用成熟的解析器,而是使用我认为最常遇到的简单语法创建了一个解析器。现在,我的兴趣是句子中的名词短语。检查标记为名词短语的子树是否相等是很容易的。我想添加更多内容,让用户决定是否接受缺少/不匹配的限定符(部分匹配) 输出树的形式是(S(NP/DT-bag/NN)is/VBZ(JP-blue/JJ)),其中我定义了语法名词短语(NP)和形容词短语(JP) 为了进行匹配,我考虑了以下几条路线: 删除相关树中的限定符节点,然后比较 将所有
- 删除相关树中的限定符节点,然后比较
- 将所有限定符节点的值更改为公共值,例如X
- 列出除标记为“DT”的叶节点以外的所有叶节点
- 如果我编写一个递归函数遍历名词短语树,直到它到达带有限定符的叶子,我就无法修改原始树中的值,因为它只传递值
- 我在nltk树上找到的唯一一个delete函数是一个要求删除与树的根相关的节点的精确索引的函数,如果它是根节点最左端子节点的最左端子节点,则其格式为[0,0]。这是一个棘手的问题,因为对于每个节点,它很可能涉及一个随着树的高度增长的整数列表
- 我创建了一个列表,其中每个列表都有一个名词短语的所有叶子,不包括限定词,并对它们进行了比较
有什么建议/意见吗?好的,让我们逐一回答你的问题
tree = Tree.parse("(S (NP The/DT bag/NN) is/VBZ (JP blue/JJ))")
删除节点:
tree.remove(tree('JP',['blue/JJ'))
tree.remove('is/VBZ')
修改一个值。您可以通过获取树成员的索引来实现这一点(记住,它继承列表):
tree.index('is/VBZ')
但同样,这不是一个好办法
遍历叶子的最佳方法是使用tree.leaves()
获取叶子,然后通过tree.leaf\u treeposition(index)
获取索引,并使用这些索引在适当的位置修改/删除叶子。