web-dev-qa-db-ja.com

nltk.tree.Treeをナビゲートする方法は?

私は以下を使用して文をチャンクしました:

grammar = '''                                                                                                              
    NP:                                                                                                                    
       {<DT>*(<NN.*>|<JJ.*>)*<NN.*>}                                                                                       
     NVN:                                                                                                                  
       {<NP><VB.*><NP>}                                                                                                    
    '''
chunker = nltk.chunk.RegexpParser(grammar)
tree = chunker.parse(tagged)
print tree

結果は次のようになります。

(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")、および右側の名詞句( "Bristolベースのパンクロックバンド")にアクセスできるようにしたい。それ、どうやったら出来るの?

23
Roy Smith

試してください:

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)
16
danger89

もちろん、独自の深さ優先検索を作成することもできますが、もっと簡単な(より良い)方法があります。 NVMをルートとするすべてのサブツリーが必要な場合は、フィルターパラメーターを定義してTreeのサブツリーメソッドを使用します。

>>> 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
Peter Enns

これは、ラベル「NP」を持つすべてのサブツリーを生成するためのコードサンプルです。

_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 #ソース付きのすべてのAPI

7
redreamality

これを試して:

for a in tree:
        if type(a) is nltk.Tree:
            if a.node == 'NVN': # This climbs into your NVN tree
                for b in a:
                    if type(b) is nltk.Tree and b.node == 'NP':
                        print b.leaves() # This outputs your "NP"
                    else:
                        print b # This outputs your "VB.*"

これを出力します:

[( 'The_Pigs'、 'NNS')]

(「ある」、「VBP」)

[( 'a'、 'DT')、( 'Bristol-based'、 'JJ')、( 'punk'、 'NN')、( 'rock'、 'NN')、( 'band'、 'NN ')]

5
matt