【问题标题】:Comparing two similar, non-identical NLTK trees比较两个相似的、不相同的 NLTK 树
【发布时间】:2013-10-24 12:59:20
【问题描述】:

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

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

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

  • 删除相关树中的确定节点,然后进行比较
  • 将所有确定器节点的值更改为一个公共值,例如 X
  • 列出所有叶节点,但标记为“DT”的叶节点除外

我是 python 新手,在这里遇到了一些问题:

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

  • 我发现的关于 nltk 树的唯一删除函数是一个需要删除节点相对于树根的确切索引的函数,其格式为 [0,0] if它是根节点最左边的孩子的最左边的孩子。这很棘手,因为它很可能涉及一个整数列表,每个节点都会随着树的高度而增长

  • 我创建了一个列表列表,其中每个列表包含一个名词短语的所有叶子,不包括限定词,并比较了这些。

所以,我的问题是,

如何在不首先以 [0,0,1,0,...] 形式获取其索引的情况下从 NLTK 树中删除节点?

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

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

有什么建议/意见吗?

【问题讨论】:

    标签: python recursion tree comparison nltk


    【解决方案1】:

    好的,让我们一一解决您的问题。

    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 成员的索引来做到这一点(请记住,它继承了列表):

    tree.index('is/VBZ')

    但同样,这不是一个好方法。

    遍历叶子的最佳方法是使用tree.leaves() 获取叶子,然后通过tree.leaf_treeposition(index) 获取索引,并使用这些索引就地修改/删除叶子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多