斯坦福自然语言处理解析树格式

4

这可能是一个愚蠢的问题,但是如何迭代通过NLP解析器(如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))))))))

这是Lisp中嵌套列表的表示方式。如果有帮助的话,可以想象方括号代替圆括号,并在标记周围加上引号。 - tripleee
@tripleee 出于好奇,是否有原生的Python正则表达式或函数可以在Python中读取类似Lisp的嵌套列表? - alvas
绝对不是正则表达式!我找不到内置的预制解析器,但请参见https://dev59.com/SHA75IYBdhLWcg3wo6zx和https://sexpdata.readthedocs.org/en/latest/。 - tripleee
2个回答

5
这种由斯坦福分析器生成的特定输出格式被称为“括号句法分析树”。它应该被解读为一个图,其中:
- 单词作为节点(例如As,an,accountant) - 短语/从句作为标签(例如S,NP,VP) - 边缘按层级链接 - 通常,解析的TOP或根节点是一个虚构的ROOT (在这种情况下,您可以将其读作有向无环图(DAG),因为它是单向且非循环的)
有一些库可用于读取括号化的解析,例如在NLTKnltk.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']

3

你节省了我无数的研究时间。谢谢! - Digao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接