如何在给定括号解析的情况下提取语法产生式规则?

How to extract the grammar productions rules given bracketed parses?

我有一个例句。 "Open the door." 我解析了一个句子,得到括号内的解析输出,如下所示。

(S (VP (VB open) (NP (DT the) (NN door))) (. .))

我需要提取生成解析输出的 CFG 语法规则。 我可以这样手动写出来:

grammar = CFG.fromstring("""   
S -> VP NP   
NP -> Det N   
VP -> V   
Det ->'the '   
N -> 'door'   
V -> 'Open'   
""")  

但是很费时间,给定括号自动解析的语法规则如何生成?

您可以使用Tree.productions()方法从树中获取CFG规则。

示例:

from nltk import Tree

t = Tree.fromstring("(S (VP (VB open) (NP (DT the) (NN door))) (. .))")
print t.productions()

输出:

[S -> VP ., VP -> VB NP, VB -> 'open', NP -> DT NN, DT -> 'the', 
 NN -> 'door', . -> '.']

更多信息请查看 - NLTK Tree Productions

如果您要从括号中的解析创建规则,您可以使用 Tree.productions()

>>> from nltk import Tree
>>> t = Tree.fromstring("(S (NP (D the) (N dog)) (VP (V chased) (NP (D the) (N cat))))")
>>> t.productions()
[S -> NP VP, NP -> D N, D -> 'the', N -> 'dog', VP -> V NP, V -> 'chased', NP -> D N, D -> 'the', N -> 'cat']

Tree.productions() 将 return 一个包含 nltk.grammar.Productions 个对象的列表:

>>> type(t.productions()[0])
<class 'nltk.grammar.Production'>

要将规则转换为字符串形式,请使用 Production.unicode_repr:

>>> t.productions()[0].unicode_repr()
u'S -> NP VP'

要获取从括号解析中学到的语法的字符串表示形式:

>>> from nltk import Tree
>>> t = Tree.fromstring("(S (NP (D the) (N dog)) (VP (V chased) (NP (D the) (N cat))))")
>>> grammar_from_parse = "\n".join([rule.unicode_repr() for rule in t.productions()])
>>> print grammar_from_parse
S -> NP VP
NP -> D N
D -> 'the'
N -> 'dog'
VP -> V NP
V -> 'chased'
NP -> D N
D -> 'the'
N -> 'cat'