4

这可能是一个愚蠢的问题,但是如何遍历解析树作为 NLP 解析器(如斯坦福 NLP)的输出?都是嵌套括号,既不是 anarray也不是 adictionary或我使用过的任何其他集合类型。

(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))))))))
4

2 回答 2

5

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

  • 单词作为节点(例如 As、an、accountant)
  • 短语/从句作为标签(例如 S、NP、VP)
  • 边是分层链接的,并且
  • 通常解析 TOP 或根节点是一个幻觉ROOT

(在这种情况下,您可以将其视为有向无环图 (DAG),因为它是单向且非循环的)

有一些图书馆可以阅读括号中NLTK的解析,例如在nltk.tree.Treehttp://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']
于 2015-12-22T05:56:33.487 回答
3

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

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

于 2016-05-04T05:24:51.370 回答