(1)我的目标:提取作品的左侧和右侧。
(2)我的方法:我正在使用斯坦福解析器和nltk工具来提取句子的parsetree。我的代码如下:
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”。。请问有什么方法可以解决这个问题?
谁能帮我,也许指出一些方向?
nltk.Tree
实际上是Python的一个子类list
,这样你就可以访问任何节点的孩子c
通过c[0]
,c[1]
,c[2]
,等需要注意的是NLTK的树都没有设计明确的二进制,所以你的“左”和“右”的概念可能需要强制执行合同中的某处。
假设树是二叉树,则可以使用来访问节点的左子节点c[0]
,而使用可以访问右节点c[1]
。对于第二项任务:
但是我要做的是提取产品的左侧,并以相同的左侧收集所有产品的右侧。
如果我理解正确,则可以遍历树并随即构建一个dict
,其中键在左侧,而值是可能的右侧生成的列表。我不确定nltk.Tree
对象是否可哈希/不可变(如果不能,则不能用作dict
键),但是Tree
在任何情况下都可以将对象的字符串形式用作键。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句