Stanford NLP формат дерева разбора

Это может быть глупым вопросом, но как можно выполнить итерацию по дереву синтаксического анализа в качестве вывода синтаксического анализатора NLP (например, Stanford NLP)? Это все вложенные скобки, которые не являются array ни dictionary или любой другой тип коллекции, которую я использовал.

(ROOT\n  (S\n    (PP (IN As)\n      (NP (DT an) (NN accountant)))\n    (NP (PRP I))\n    (VP (VBP want)\n      (S\n        (VP (TO to)\n          (VP (VB make)\n            (NP (DT a) (NN payment))))))))

2 ответа

Решение

Этот конкретный формат вывода Stanford Parser называется "синтаксический разбор (дерево)". Предполагается, что читать как график с

  • слова как узлы (например, как, бухгалтер)
  • фраза / предложение в качестве меток (например, S, NP, VP)
  • края связаны иерархически и
  • как правило, синтаксический анализ TOP или корневой узел галлюцинирует ROOT

(В этом случае вы можете прочитать его как Направленный ациклический граф (DAG), поскольку он однонаправленный и нециклический)

Есть библиотеки для чтения в скобках, например, в NLTK"s nltk.tree.Tree ( http://www.nltk.org/howto/tree.html):

>>> from nltk.tree import Tree
>>> output = '(ROOT (S (PP (IN As) (NP (DT an) (NN accountant))) (NP (PRP I)) (VP (VBP want) (S (VP (TO to) (VP (VB make) (NP (DT a) (NN payment))))))))'
>>> parsetree = Tree.fromstring(output)
>>> print parsetree
(ROOT
  (S
    (PP (IN As) (NP (DT an) (NN accountant)))
    (NP (PRP I))
    (VP
      (VBP want)
      (S (VP (TO to) (VP (VB make) (NP (DT a) (NN payment))))))))
>>> parsetree.pretty_print()
                           ROOT                             
                            |                                
                            S                               
      ______________________|________                        
     |                  |            VP                     
     |                  |    ________|____                   
     |                  |   |             S                 
     |                  |   |             |                  
     |                  |   |             VP                
     |                  |   |     ________|___               
     PP                 |   |    |            VP            
  ___|___               |   |    |    ________|___           
 |       NP             NP  |    |   |            NP        
 |    ___|______        |   |    |   |         ___|_____     
 IN  DT         NN     PRP VBP   TO  VB       DT        NN  
 |   |          |       |   |    |   |        |         |    
 As  an     accountant  I  want  to make      a      payment

>>> parsetree.leaves()
['As', 'an', 'accountant', 'I', 'want', 'to', 'make', 'a', 'payment']

Обратите внимание, что если вас интересуют конкретные узлы в дереве, идентифицируемые по правилам, подобным регулярным выражениям, вы можете использовать этот класс рук для извлечения всех таких узлов, используя сопоставление, подобное регулярному выражению:

http://nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/trees/tregex/TregexPattern.html

Другие вопросы по тегам