繁体   English   中英

Python NLTK解析子树

[英]python NLTK parse subtree

关于NLTK中树木的两个问题:

  1. 我可以在一棵树(句子)中区分第一,第二,...子树吗?
  2. 如何使用子树叶子中的标签?

以下代码效果很好,

          for subtree in tree.subtrees(filter=lambda t: t.node == 'NP'):
            for attributes in subtree.leaves():
                print attributes

但它返回带有单词和标签的列表:

('noun', 'NN')
('verb', VBZ)

依此类推:我需要区分子树中不同类型的单词。 subtree.labels()不存在。

就像是:

           for subtree in tree.subtrees(filter=lambda t: t.node == 'NP'):
            for attributes in subtree.leaves():
                if subtree.labels() == 'NN':
                  # do something with the nouns...

谢谢你的提示

所以我用python做到了。 无论如何,如果有人有更好的主意...

         for subtree in tree.subtrees(filter=lambda t: t.node == 'NP' or t.node == 'NNS'):
            for attributes in subtree.leaves():
                (expression, tag) = attributes
                if tag == 'NN':
                    # do something with the nouns

我做了以下类似的事情,从树中提取名词短语。

from itertools import groupby
[' '.join([t[0] for t,m in group]) for key, group in groupby(tree.pos(), lambda s: s[-1]=='NP') if key]

更笼统地说,我们可以检查“组”内部的内容,并对组中的元素进行任何操作。 例如,

[list(group]) for key, group in groupby(tree.pos(), lambda s: s[-1]=='NP') if key]

一旦知道了“列表(组)”中的元素所包含的内容,我们就可以对其进行任何操作。

另一种方法是使用tree2conlltags。 例如,

from nltk.chunk import tree2conlltags
from itertools import groupby

chunks = tree2conlltags(tree)

print(chunks)

results = [' '.join(word for word, pos, chunk in group).lower() for key, group in groupby(chunks, lambda s: s[-1]!='O') if key]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM