Как читать дерево синтаксического анализа на основе избирательных округов

У меня есть корпус предложений, которые были предварительно обработаны системами Стэнфорда CoreNLP. Одна из вещей, которые он предоставляет, - это дерево синтаксического анализа предложения (на основе избирательных округов). Хотя я могу понять дерево синтаксического анализа, когда оно нарисовано (например, дерево), я не уверен, как его читать в этом формате:

E.g.:

          (ROOT
          (FRAG
          (NP (NN sent28))
          (: :)
          (S
          (NP (NNP Rome))
          (VP (VBZ is)
          (PP (IN in)
          (NP
          (NP (NNP Lazio) (NN province))
          (CC and)
          (NP
          (NP (NNP Naples))
          (PP (IN in)
          (NP (NNP Campania))))))))
          (. .)))

Исходное предложение:

sent28: Rome is in Lazio province and Naples in Campania .

Как я должен читать это дерево или, альтернативно, есть ли код (на Python), который делает это правильно? Спасибо.


person Cheshie    schedule 23.02.2015    source источник


Ответы (2)


NLTK имеет класс для чтения деревьев синтаксического анализа: nltk.tree.Tree. Соответствующий метод называется fromstring. Затем вы можете перебирать его поддеревья, листья и т. Д.

В качестве отступления: вы можете удалить бит с надписью sent28:, поскольку он сбивает с толку синтаксический анализатор (он также не является частью предложения). Вы получаете не полное дерево синтаксического анализа, а только фрагмент предложения.

person mbatchkarov    schedule 23.02.2015
comment
Спасибо! и я добавил from nltk.draw.tree import draw_trees >>> draw_trees(tree), чтобы визуализировать его как настоящее дерево :-) [Да, и я не могу снять sent28, это часть задания ...] - person Cheshie; 23.02.2015
comment
Забыл сказать: Tree.pprint тоже очень кстати - person mbatchkarov; 23.02.2015

Вы можете просто использовать стэнфордский парсер, например:

sentences = parser.raw_parse_sents(["Hello, My name is Melroy.", "What is your name?"])  #probably raw_parse(just a string) or parse_sents(list but has been splited)
for line in sentences:
    for sentence in line:
        ***sentence.draw()***
person chauncyzhu    schedule 21.04.2017