python - 使用Python从nltk树结构中提取特定的叶子值

标签 python tree nltk

我对 NLTK 的树函数有一些疑问。我正在尝试从树结构中提取某个单词,如下所示。

test = Tree.parse('(ROOT(SBARQ(WHADVP(WRB How))(SQ(VBP do)(NP (PRP you))(VP(VB ask)(NP(DT a)(JJ total)(NN stranger))(PRT (RP out))(PP (IN on)(NP (DT a)(NN date)))))))')

print "Input tree: ", test
print test.leaves()

(SBARQ
    (WHADVP (WRB How))
    (SQ
      (VBP do)
      (NP (PRP you))
      (VP
        (VB ask)
        (NP (DT a) (JJ total) (NN stranger))
        (PRT (RP out))
        (PP (IN on) (NP (DT a) (NN date)))))))

['How', 'do', 'you', 'ask', 'a', 'total', 'stranger', 'out', 'on', 'a', 'date']

我可以使用 leaves() 函数找到所有单词的列表。有没有办法只获得特定的叶子?例如:我只想从 NP 短语中获取第一个/最后一个名词?第一个名词的答案是“陌生人”,最后一个名词的答案是“约会”。

最佳答案

虽然名词短语可以嵌套在其他类型的短语中,但我相信大多数语法总是在名词短语中包含名词。因此,您的问题可能可以改写为:如何找到第一个和最后一个名词?

你可以简单地获取单词和 POS 标签的所有 tuple 并像这样进行过滤,

>>> [word for word,pos in test.pos() if pos=='NN']
['stranger', 'date']

在本例中只有两个,所以您就完成了。如果您有更多名词,您只需在 [0][-1] 处索引列表。


如果您正在寻找可以在不同短语中使用的另一种 POS,但您只想在特定短语中使用它,或者如果您有一个奇怪的语法允许名词在 NP 之外,您可以执行以下操作...

你可以找到'NP'子树

>>> NPs = list(test.subtrees(filter=lambda x: x.node=='NP'))
>>> NPs
[Tree('NP', [Tree('PRP', ['you'])]), Tree('NP', [Tree('DT', ['a']), Tree('JJ', ['total']), Tree('NN', ['stranger'])]), Tree('NP', [Tree('DT', ['a']), Tree('NN', ['date'])])]

继续缩小子树,我们可以使用这个结果来寻找'NN'个词,

>>> NNs_inside_NPs = map(lambda x: list(x.subtrees(filter=lambda x: x.node=='NN')), NPs)
>>> NNs_inside_NPs
[[], [Tree('NN', ['stranger'])], [Tree('NN', ['date'])]]

所以这是一个列表,其中包含每个'NP'中所有'NN'列表 > 短语。在这种情况下,每个短语中恰好只有零个或一个名词。

现在我们只需要遍历 'NP' 并获取单个名词的所有 leaves(这实际上意味着我们只想访问 'stranger' Tree('NN', ['stranger']) 的一部分。

>>> [noun.leaves()[0] for nouns in NNs_inside_NPs for noun in nouns]
['stranger', 'date']

关于python - 使用Python从nltk树结构中提取特定的叶子值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16407880/

相关文章:

python - 如何查找类别中的唯一单词 - Python

python - 找到所有具有一定数量的变量和次数的单项式

python - 如何用字符串列表替换 pandas 列中的元素

javascript - 无法推送嵌套数组中子级的数据子级

linux - 如何将树和 wc -l 结合起来?

python - NLTK:摆脱括号和后置标签

python - 运行相同的循环两次,但得到不同的结果

python - 如何修复 Ubuntu 21.10 中的 QT 问题?

algorithm - 为什么 Eric Lippert 的不可变二叉树中没有循环?

nlp - 如何从 NLTK 中的文本中提取关系