sab*_*abz 5 python grammar nltk parse-tree chomsky-normal-form
我试图从其解析树中提取Chomsky Normal Form(CNF) - 一个句子的语法产生:
(ROOT
(S
(NP (DT the) (NNS kids))
(VP (VBD opened)
(NP (DT the) (NN box))
(PP (IN on)
(NP (DT the) (NN floor))))))
Run Code Online (Sandbox Code Playgroud)
我将整个树放入一个名为S的字符串中,然后:
tree = Tree.fromstring(S)
tree.chomsky_normal_form()
for p in tree.productions():
print p
Run Code Online (Sandbox Code Playgroud)
输出是
(1) NN -> 'box'
(2) PP -> IN NP
(3) DT -> 'the'
(4) ROOT -> S
(5) NP -> DT NN
(6) VBD -> 'opened'
(7) VP|<NP-PP> -> NP PP
(8) VP -> VBD VP|<NP-PP>
(9) NP -> DT NNS
(10) NN -> 'floor'
(11) IN -> 'on'
(12) NNS -> 'kids'
(13) S -> NP VP
Run Code Online (Sandbox Code Playgroud)
但有些作品(7号和8号)似乎不是CNF!问题是什么?
VP|<NP-PP>是一个非终结符。竖线并不意味着传统意义上的多个选项。相反,NLTK 将其放在那里是为了指示规则的来源,即“这个新的非终结符是从 VP 和 NP-PP 的组合中得出的”。这是 NLTK 创建的新产生式规则,用于将语法转换为乔姆斯基范式。
看看 CNF 之前的树的产生:
ROOT -> S
S -> NP VP
NP -> DT NNS
DT -> 'the'
NNS -> 'kids'
VP -> VBD NP PP ***
VBD -> 'opened'
NP -> DT NN
DT -> 'the'
NN -> 'box'
PP -> IN NP
IN -> 'on'
NP -> DT NN
DT -> 'the'
NN -> 'floor'
Run Code Online (Sandbox Code Playgroud)
具体来说,查看规则VP -> VBD NP PP,它不在 CNF 中(任何产生式规则的右侧必须恰好有两个非终结符号)
您的问题中的两条规则 (7):VP|<NP-PP> -> NP PP和 (8):VP -> VBD VP|<NP-PP>在功能上等同于更一般的规则VP -> VBD NP PP。
当VP检测到时,规则应用会导致:
VBD VP|<NP-PP>
并且,VP|<NP-PP>是创建的产生式规则的 LHS,其结果是:
VBD NP PP
具体来说,如果你孤立规则本身,你可以看一下具体的符号(确实是单数):
>>> tree.chomsky_normal_form()
>>> prod = tree.productions()
>>> x = prod[7] # VP|<NP-PP> -> NP PP
>>> x.lhs().symbol() # Singular!
u'VP|<NP-PP>'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2331 次 |
| 最近记录: |