2014-12-28 60 views
2

(1)我的目标:提取产品的左侧和右侧。如何从tree.productions中提取元素()

(2)我的方法: 我正在使用斯坦福分析器和nltk工具来提取句子的分析树。我的代码如下:“NP VP”

corenlp_dir = "/home/corenlp-python/stanford-corenlp-full-2013-11-12/" 
parser = corenlp.StanfordCoreNLP(corenlp_path=corenlp_dir) 

result_json = json.loads(parser.parse("I have a tree.")) 
for sentence in result_json["sentences"]: 
    t = Tree.fromstring(sentence["parsetree"]) 
    print t.productions() # [ROOT -> S, S -> NP VP ., NP -> PRP, PRP -> 'I', VP -> VBP NP, VBP -> 'have', NP -> DT NN, DT -> 'a', NN -> 'tree', . -> '.'] 

    print t.productions()[1] # S -> NP VP . 
    print type(productions()[1]) # <class 'nltk.grammar.Production'> 

    for (i,child) in enumerate(t): 
     print (i,child) # (0, Tree('S', [Tree('NP', [Tree('PRP', ['I'])]), Tree('VP', [Tree('VBP', ['have']), Tree('NP', [Tree('DT', ['a']), Tree('NN', ['tree'])])]), Tree('.', ['.'])])) I can only get one tree. 

(3)我的问题是如何能够继续提取从每个生产的两侧的元件,如“S”。有什么方法可以用来解决这个问题吗?

任何人都可以帮助我,也许指出一些方向?

+0

你为什么使用'productions'方法?这听起来像你真正想要做的就是遍历树。查看['productions'方法](http://www.nltk.org/api/nltk.html#nltk.tree.Tree.productions),了解如何遍历NLTK'Tree'的示例。 –

+0

@JonGauthier我想要做的是提取一个生产对象的双方,比如''S''和''NP VP“'。我已经阅读过'productions'方法,但是仍然不知道如何正确地遍历树。请给我看一些示例代码吗? – allenwang

+0

'树'实例是可迭代的。 '对于t中的孩子:#孩子是树的一个实例,对应于树的孩子t' –

回答

2

nltk.Tree实际上是Python list的子类,这样你就可以通过c[0]c[1]c[2]等访问任何节点c的孩子们需要注意的是NLTK的树都没有设计明确的二进制,所以你的“左概念“和”正确“可能必须在合同的某个地方执行。

假设树是二进制的,您可以使用c[0]访问节点的左子节点,并且使用c[1]访问右节点。对于你的第二项任务:

但我想要做的是提取生产的左侧,并收集所有产品的左手边的相同。

如果我理解正确的话,你可以遍历树并建立一个dict当您去,其中键是左侧面和值是可能的右手作品名单。我不确定nltk.Tree对象是否可以被哈希/不可变(如果没有,它们将不能用作dict键),但是在任何情况下都可以使用字符串形式的Tree对象作为键。

+0

感谢您的满意答复。你的意思是,在这个任务中,我不需要使用'tree.productions()'。只要遍历树并使用列表索引来获得生产的双方? – allenwang

+0

这应该足够了,除非你想要考虑特定节点下面的整个树,而不仅仅是节点本身的标签。如果你想捕获节点下的整个子树,你可以将键存储为'str(c.productions())'。再次,我不确定您的确切意图/应用程序。 –

+0

感谢您的回复。我的意图是获得左手边,并收集所有作品的所有右手边,例如,S→NP VP,S→NP ADVP VP,S-> S→...'这足以说明我的意图吗?你确定我不需要'tree.productions()'吗? – allenwang