斯坦福NLP解析树格式

斯坦福NLP解析树格式,nlp,stanford-nlp,parse-tree,Nlp,Stanford Nlp,Parse Tree,这可能是一个愚蠢的问题,但是作为NLP解析器的输出(比如斯坦福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

这可能是一个愚蠢的问题,但是作为NLP解析器的输出(比如斯坦福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))))))))

斯坦福解析器的这种特殊输出格式称为“括号解析(树)”。它应该被解读为一个带有

  • 作为节点的单词(如as、an、accounter)
  • 短语/从句作为标签(例如S、NP、VP)
  • 边是按层次和顺序链接的
  • 通常,parses TOP或root节点是幻觉的
    根节点
(在本例中,您可以将其作为有向无环图(DAG)来读取,因为它是单向和非循环的)

有一些库可以读取括号内的解析,例如在
NLTK
NLTK.tree.tree
():


请注意,如果您对树中由类似正则表达式的规则标识的特定节点感兴趣,可以使用这个非常非常简单的类,使用类似正则表达式的匹配器提取所有此类节点:


FWIW这就是嵌套列表在Lisp中的表示方式。想象一下,如果有帮助的话,用方括号代替圆括号和引号括起标记。@tripleee出于好奇,有没有本机python正则表达式或函数来读取python中类似Lisp的嵌套列表?绝对不是正则表达式!我找不到一个内置的罐装解析器,但是看到了,你帮我节省了无数的研究时间。非常感谢。
>>> 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']