私は以下を使用して文をチャンクしました:
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ベースのパンクロックバンド")にアクセスできるようにしたい。それ、どうやったら出来るの?
試してください:
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)
もちろん、独自の深さ優先検索を作成することもできますが、もっと簡単な(より良い)方法があります。 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))
これは、ラベル「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
これを試して:
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 ')]