我正在尝试从其语法分析树中提取Chomsky范式(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 Normal Form。

看一下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'

具体而言,请查看CNF中未包含的规则VP -> VBD NP PP(任何生产规则的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范式语法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26921862/

10-10 06:30