首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何浏览nltk.tree.Tree?

如何浏览nltk.tree.Tree?
EN

Stack Overflow用户
提问于 2013-02-13 05:17:08
回答 4查看 25.5K关注 0票数 24

我已经将一个句子分成块,使用:

代码语言:javascript
复制
grammar = '''                                                                                                              
    NP:                                                                                                                    
       {<DT>*(<NN.*>|<JJ.*>)*<NN.*>}                                                                                       
     NVN:                                                                                                                  
       {<NP><VB.*><NP>}                                                                                                    
    '''
chunker = nltk.chunk.RegexpParser(grammar)
tree = chunker.parse(tagged)
print tree

结果如下所示:

代码语言:javascript
复制
(S
  (NVN
    (NP The_Pigs/NNS)
    are/VBP
    (NP a/DT Bristol-based/JJ punk/NN rock/NN band/NN))
  that/WDT
  formed/VBN
  in/IN
  1977/CD
  ./.)

但现在我被卡住了,试图弄清楚如何导航。我希望能够找到NVN子树,并访问左侧的名词短语("The_Pigs")、动词("are")和右侧的名词短语(“一个基于布里斯托尔的朋克摇滚乐队”)。我该怎么做?

EN

回答 4

Stack Overflow用户

发布于 2014-03-08 22:10:30

尝试:

代码语言:javascript
复制
ROOT = 'ROOT'
tree = ...
def getNodes(parent):
    for node in parent:
        if type(node) is nltk.Tree:
            if node.label() == ROOT:
                print "======== Sentence ========="
                print "Sentence:", " ".join(node.leaves())
            else:
                print "Label:", node.label()
                print "Leaves:", node.leaves()

            getNodes(node)
        else:
            print "Word:", node

getNodes(tree)
票数 19
EN

Stack Overflow用户

发布于 2013-03-05 07:12:35

当然,你可以编写你自己的深度优先搜索...但有一种更简单(更好)的方法。如果希望每个子树都以NVM为根,请使用Tree的subtree方法,并定义filter参数。

代码语言:javascript
复制
>>> print t
(S
    (NVN
        (NP The_Pigs/NNS)
        are/VBP
        (NP a/DT Bristol-based/JJ punk/NN rock/NN band/NN))
    that/WDT
    formed/VBN
    in/IN
    1977/CD
    ./.)
>>> for i in t.subtrees(filter=lambda x: x.node == 'NVN'):
...     print i
... 
(NVN
    (NP The_Pigs/NNS)
    are/VBP
    (NP a/DT Bristol-based/JJ punk/NN rock/NN band/NN))
票数 9
EN

Stack Overflow用户

发布于 2014-12-11 11:25:28

下面是生成标签为'NP‘的所有子树的代码示例

代码语言:javascript
复制
def filt(x):
    return x.label()=='NP'

for subtree in t.subtrees(filter =  filt): # Generate all subtrees
    print subtree

对于兄弟姐妹,您可能想看看ParentedTree.left_siblings()方法

有关更多详细信息,请参阅以下一些有用的链接。

http://www.nltk.org/howto/tree.html #一些基本用法和示例http://nbviewer.ipython.org/github/gmonce/nltk_parsing/blob/master/1.%20NLTK%20Syntax%20Trees.ipynb #使用这些方法的笔记本

http://www.nltk.org/_modules/nltk/tree.html #所有带源代码的接口

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14841997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档