2015-12-21 2 views
3

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

(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)))))))) 
+0

FWIW это как вложенная списки представлены в Лиспе. Представьте квадратные скобки вместо круглых скобок и цитаты вокруг жетонов, если это поможет. – tripleee

+0

@ tripleee из любопытства, есть ли собственное регулярное выражение python или функция, чтобы читать Lisp как вложенный список в python? – alvas

+0

Определенно не регулярное выражение! Я не мог найти встроенный консервный парсер, но см. Http://stackoverflow.com/questions/3182594/parsing-s-expressions-in-python и https://sexpdata.readthedocs.org/en/latest/ – tripleee

ответ

3

Этот конкретный формат вывода Стэнфордского парсера вызывает «квадратный синтаксический анализ (дерево)». Предполагается, следует рассматривать как граф с

  • слова, как узлы (например, As, ап, бухгалтер)
  • фразы/п в качестве меток (например, S, NP, VP)
  • края связаны иерархически и
  • обычно разбирает вверх или корневой узел является галлюцинировал 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'] 
1

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

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

Смежные вопросы