Как заменить слова в листьях дерева разбора, сгенерированного Corenlp в python - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь заменить слова в листьях дерева разбора, сгенерированных 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
...