2016-08-02 12 views
3

私はpython 2.7でnltkのツリーパッケージを使用しています。私はそれを祖父母ノードとするツリーからすべてのルールを抽出したいと思います。 私は、次のツリーnltkを使って祖父母を見つける

t = Tree('S', [Tree('NP', [Tree('D', ['the']), Tree('N', ['dog'])]), Tree('VP', [Tree('V', ['chased']), Tree('NP', [Tree('D', ['the']), Tree('N', ['cat'])])])]) 

とツリーの制作

t.productions 
    [S -> NP VP, NP -> D N, D -> 'the', N -> 'dog', VP -> V NP, V -> 'chased', NP -> D N, D -> 'the', N -> 'cat'] 

を持っている:私が欲しいもの

   S    
     ________|_____   
     |    VP   
     |   _____|___  
     NP  |   NP  
    ___|___  |  ___|___ 
    D  N V  D  N 
    |  | |  |  | 
the  dog chased the  cat 

は、フォーム上のものです:

[S -> NP VP, S^NP -> D N, NP^D -> 'the', NP^N -> 'dog'.......] 

私は見た私はParentedTreeクラスを使っていますが、私はそれを使って自分の問題を解決する方法を知りません。

答えて

1

の制作方法を変更/上書きする必要があります。

コード:

from nltk.tree import Tree 
from nltk.compat import string_types 
from nltk.grammar import Production, Nonterminal 
from nltk.tree import _child_names 

def productions(t, parent): 
    if not isinstance(t._label, string_types): 
     raise TypeError('Productions can only be generated from trees having node labels that are strings') 

    # t._label ==> parent + "^" + t._label 
    prods = [Production(Nonterminal(parent + "^" + t._label), _child_names(t))] 
    for child in t: 
     if isinstance(child, Tree): 
      prods += productions(child, t._label) 
    return prods 


t = Tree('S', [Tree('NP', [Tree('D', ['the']), Tree('N', ['dog'])]), Tree('VP', [Tree('V', ['chased']), Tree('NP', [Tree('D', ['the']), Tree('N', ['cat'])])])]) 

# To Add Parent of 'S' as 'Start' 
# prods = productions(t, "Start") 

# To Skip Parent of 'S' 
prods = [Production(Nonterminal(t._label), _child_names(t))] 
for child in t: 
    if isinstance(child, Tree): 
     prods += productions(child, t._label) 

print prods 

出力:詳細については

[S -> NP VP, S^NP -> D N, NP^D -> 'the', 
    NP^N -> 'dog', S^VP -> V NP, VP^V -> 'chased', 
    VP^NP -> D N, NP^D -> 'the', NP^N -> 'cat'] 

nltk.treeproductions方法チェック - here

関連する問題