如何从tree.productions()中提取元素

时间:2014-12-28 11:57:52

标签: python nlp nltk stanford-nlp context-free-grammar

(1)我的目标:提取生产的左侧和右侧。

(2)我的方法: 我正在使用stanford解析器和nltk工具来提取句子的分析。我的代码如下:

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''NP VP。 “即可。有没有什么方法可以用来解决这个问题?

任何人都可以帮助我,并指出一些指示吗?

1 个答案:

答案 0 :(得分:2)

nltk.Tree实际上是Python list的子类,因此您可以cc[0],{{c[1]访问任何节点c[2]的子级。 1}}等等。请注意,NLTK树不是设计明确的二进制,所以你的概念是&#34; left&#34;和&#34;对&#34;可能必须在合同的某个地方强制执行。

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

  

但我想要做的是提取作品的左侧,并用相同的左侧收集所有作品的右侧。

如果我理解正确,你可以遍历树并建立一个dict,其中键是左侧,值是可能的右手制作列表。我不确定nltk.Tree对象是否可以是hashable / immutable(如果没有,它们不能用作dict个键),但你可以使用{Tree的字符串形式在任何情况下,对象都是键。