我已经将一个句子分成块,使用:
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")和右侧的名词短语(“一个基于布里斯托尔的朋克摇滚乐队”)。我该怎么做?
发布于 2014-03-08 22:10:30
尝试:
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)发布于 2013-03-05 07:12:35
当然,你可以编写你自己的深度优先搜索...但有一种更简单(更好)的方法。如果希望每个子树都以NVM为根,请使用Tree的subtree方法,并定义filter参数。
>>> 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))发布于 2014-12-11 11:25:28
下面是生成标签为'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 #所有带源代码的接口
https://stackoverflow.com/questions/14841997
复制相似问题