Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较两个相似、不相同的NLTK树_Python_Recursion_Tree_Comparison_Nltk - Fatal编程技术网

Python 比较两个相似、不相同的NLTK树

Python 比较两个相似、不相同的NLTK树,python,recursion,tree,comparison,nltk,Python,Recursion,Tree,Comparison,Nltk,我试图写一个程序,将采取在两个句子,并检查他们是否相似。我不想使用成熟的解析器,而是使用我认为最常遇到的简单语法创建了一个解析器。现在,我的兴趣是句子中的名词短语。检查标记为名词短语的子树是否相等是很容易的。我想添加更多内容,让用户决定是否接受缺少/不匹配的限定符(部分匹配) 输出树的形式是(S(NP/DT-bag/NN)is/VBZ(JP-blue/JJ)),其中我定义了语法名词短语(NP)和形容词短语(JP) 为了进行匹配,我考虑了以下几条路线: 删除相关树中的限定符节点,然后比较 将所有

我试图写一个程序,将采取在两个句子,并检查他们是否相似。我不想使用成熟的解析器,而是使用我认为最常遇到的简单语法创建了一个解析器。现在,我的兴趣是句子中的名词短语。检查标记为名词短语的子树是否相等是很容易的。我想添加更多内容,让用户决定是否接受缺少/不匹配的限定符(部分匹配)

输出树的形式是(S(NP/DT-bag/NN)is/VBZ(JP-blue/JJ)),其中我定义了语法名词短语(NP)和形容词短语(JP)

为了进行匹配,我考虑了以下几条路线:

  • 删除相关树中的限定符节点,然后比较
  • 将所有限定符节点的值更改为公共值,例如X
  • 列出除标记为“DT”的叶节点以外的所有叶节点
我是python新手,在这里面临一些问题:

  • 如果我编写一个递归函数遍历名词短语树,直到它到达带有限定符的叶子,我就无法修改原始树中的值,因为它只传递值

  • 我在nltk树上找到的唯一一个delete函数是一个要求删除与树的根相关的节点的精确索引的函数,如果它是根节点最左端子节点的最左端子节点,则其格式为[0,0]。这是一个棘手的问题,因为对于每个节点,它很可能涉及一个随着树的高度增长的整数列表

  • 我创建了一个列表,其中每个列表都有一个名词短语的所有叶子,不包括限定词,并对它们进行了比较

所以,我的问题是

如何从NLTK树中删除节点,而不首先以[0,0,1,0,…]的形式获取其索引

如何在不使用索引的情况下修改叶值?(我希望使用递归函数,并且每当函数碰到我要修改的叶时,我希望修改它)

如果这些都不可能,我如何获得一个叶的索引?我被难住了。Nltk树有一个treeposition函数,但这只适用于子树。与其他节点相比,Python认为叶子是不同的类型吗?因为树的位置对我的叶子不起作用。这可能是因为我的叶子是元组,而不仅仅是字符串,但我不知道如何更改它,因为这是pos标记器的输出。那么,有没有办法用形式(DT the)的子树替换我的叶,它是形式[the/DT]的元组?再次定义递归过程不会修改原始树


有什么建议/意见吗?

好的,让我们逐一回答你的问题

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)
获取索引,并使用这些索引在适当的位置修改/删除叶子。