斯坦福 NLP 解析树格式
Stanford NLP parse tree format
这可能是一个愚蠢的问题,但是如何将解析树作为 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))))))))
斯坦福解析器的这种特殊输出格式称为 "bracketed parse (tree)"。它应该被阅读为带有
的图表
- 单词作为节点(例如 As、an、accountant)
- phrase/clause 作为标签(例如 S、NP、VP)
- 边按层次链接并且
- 通常解析 TOP 或根节点是幻觉
ROOT
(在这种情况下,您可以将其视为有向无环图 (DAG),因为它是单向且非循环的)
有一些库可以读取括号内的解析,例如在 NLTK
的 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']
请注意,如果您对树中由类似正则表达式的规则识别的特定节点感兴趣,您可以使用这种非常非常有用的方法 class 使用类似正则表达式的匹配器提取所有此类节点:
http://nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/trees/tregex/TregexPattern.html
这可能是一个愚蠢的问题,但是如何将解析树作为 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))))))))
斯坦福解析器的这种特殊输出格式称为 "bracketed parse (tree)"。它应该被阅读为带有
的图表- 单词作为节点(例如 As、an、accountant)
- phrase/clause 作为标签(例如 S、NP、VP)
- 边按层次链接并且
- 通常解析 TOP 或根节点是幻觉
ROOT
(在这种情况下,您可以将其视为有向无环图 (DAG),因为它是单向且非循环的)
有一些库可以读取括号内的解析,例如在 NLTK
的 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']
请注意,如果您对树中由类似正则表达式的规则识别的特定节点感兴趣,您可以使用这种非常非常有用的方法 class 使用类似正则表达式的匹配器提取所有此类节点:
http://nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/trees/tregex/TregexPattern.html