(1) Моя цель: извлечь левую и правую части произведения.Как извлечь элементы из tree.productions()
(2) Мой подход: Я использую синтаксический анализатор stanford и инструменты nltk для извлечения parsetree предложения. Мой код ниже: «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» и . Можно ли использовать какой-либо метод для решения этой проблемы?
Может ли кто-нибудь помочь мне и, возможно, указать на некоторые направления?
Почему вы используете метод 'productions'? Похоже на то, что вы действительно хотите сделать, - это пересечь дерево. См. Метод ['productions'] (http://www.nltk.org/api/nltk.html#nltk.tree.Tree.productions) для примера того, как перемещаться по дереву NLTK. –
@JonGauthier Что я хочу сделать, так это извлечь обе стороны производственного объекта, такие как '' S ''и' 'NP VP''. Я прочитал методы' productions', но до сих пор не знаю, как Пройдите дерево правильно. Не могли бы вы показать мне пример кода? – allenwang
Экземпляры 'Tree' являются итерабельными. 'для child в t: # child - это экземпляр дерева, соответствующий ребру дерева t' –