Я пытаюсь извлечь 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! В чем проблема?
Итак, как я могу различать стержни, которые означают OR (которые всегда находятся на RHS), с полосками, которые не означают OR и могут возникать как на RHS, так и на LHS (например, тот, который вы упомянули)? – sabzdarsabz
В каком контексте вам нужно «различать» между ними? На самом базовом уровне, подавая нетерминальный символ на LHS, как 'VP | 'будет выдавать ошибку, так как символы не должны содержать пробелов. Также поймите, что спецификация 'A -> B | C' является сокращением для более формальных 'A -> B',' A -> C'. –
jayelm
Действительно, NLTK разделяет эти правила на свои составляющие формы, поэтому помимо ввода вручную правил, таких как 'A -> B | C', вы не найдете вхождения в символы '|', что означает «несколько опций» в грамматиках NLTK. Попробуйте 'nltk.CFG.fromstring (« A -> B | C »)', который создает грамматику с двумя производственными правилами. – jayelm