作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试从语法分析树中提取乔姆斯基范式 (CNF) - 句子的语法产生式:
(ROOT
(S
(NP (DT the) (NNS kids))
(VP (VBD opened)
(NP (DT the) (NN box))
(PP (IN on)
(NP (DT the) (NN floor))))))
我将整棵树放入一个名为 S 的字符串中,然后:
tree = Tree.fromstring(S)
tree.chomsky_normal_form()
for p in tree.productions():
print p
输出是
(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
但有些作品(7 号和 8 号)似乎不是 CNF!有什么问题?
最佳答案
VP|<NP-PP>
是一个 非终结符号。竖线并不是传统意义上的多个选项。相反,NLTK 把它放在那里是为了指示规则的来源,即“这个新的非终结符号是从 VP 和 NP-PP 的组合中衍生出来的。”这是 NLTK 创建的新产生式规则,用于将您的语法转换为 Chomsky 范式。
看看树的产品,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'
具体看规则VP -> VBD NP PP
, 这不在 CNF 中(任何生产规则的 RHS 上必须恰好有两个非终结符号)
两条规则(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>'
关于python - 从分析树中提取 Chomsky-normal-form 文法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26921862/
我是一名优秀的程序员,十分优秀!