Я пытаюсь заменить слова в листьях дерева разбора, сгенерированных Corenlp, на их лемму
Я хочу вернуться к исходному дереву разбора, если я изменю слова в листьях сгенерированного дерева разбораСтэнфордским парсером Corenlp к их основной лемме с помощью функции list_of_leaves. Например, я хочу заменить слова в этом примере файла разбора:
<p>
"""(ROOT
(SQ (VBD Did)
(NP (NNP Matt))
(VP (VB win)
(NP (DT the) (NNS men) (NN slalom)))
(. ?)))""
</p>
with this:
<p>
"""(ROOT
(SQ (VBD Do)
(NP (NNP Matt))
(VP (VB win)
(NP (DT the) (NNS man) (NN slalom)))
(. ?)))""
</p>
Возможно, у меня есть эти леммы, хранящиеся в списке или предоставленные непосредственно из nltk wordnet. Примечание: @Genome уже ответил, как добраться до листьев, в другом вопросе здесь Как мне достичь листьев дерева, генерируемых синтаксическим анализатором Стэнфорда в python? Из приведенного ниже кода я могу добраться до листьев, состоящих изтеги POS и исходные слова, но я хочу вернуться к дереву разбора после замены слов их леммой, как показано в примере выше.
# class for tree nodes
class Node:
def __init__(self,start):
self.start = start
self.children = []
self.text = ''
# make a tree
def make_tree(s):
stack = []
nodes = []
cur = None
root = None
for i, c in enumerate(s):
if c == '(':
cur = Node(i)
if stack:
stack[-1].children.append(cur)
stack.append(cur)
if root is None:
root = cur
elif c == ')' and stack:
topnode = stack.pop()
text = s[topnode.start + 1: i]
topnode.text = text
return root
# list of leaves
def list_of_leaves(node):
result = []
for child in node.children:
result.extend(list_of_leaves(child))
if not result:
return [node]
return result
s = """(ROOT
(SQ (VBD Did)
(NP (NNP Matt))
(VP (VB win)
(NP (DT the) (NNS men) (NN slalom)))
(. ?)))"""
root = make_tree(s)
for node in list_of_leaves(root):
print node.text