В Python у меня есть ввод списка, например:
[('S', ['NP', 'VP']),
('A', ['V', 'NP']),
('VP', ['V', 'NP']),
('NP', ['DET', 'NP']),
('N', "'mouse'"),
('NP', "'mouse'"),
('DET', "'the'"),
('V', "'saw'"),
('N', "'Ron'"),
('NP', "'Ron'")]
Это результат следующего алгоритма CYK -
S -> NP VP
VP -> A NP | V NP
NP -> N N | DET NP | 'chocolate' | 'cat' | 'John' | 'Ron' | 'mouse'
DET -> 'the'
N -> 'chocolate' | 'cat' | 'John' | 'Ron' | 'mouse'
V -> 'saw' | 'bought' | 'ate'
A -> V NP
Строка, которой я хочу сопоставить: «Рон видел мышь».
Я хочу связать вывод вот так:
(S (NP Ron) (VP (V saw) (NP (DET the) (NP mouse))))
Я не уверен, как должен быть построен алгоритм, особенно с неоднозначным алгоритмом, который может содержать несколько выходов. Как мне создать код? Любое предложение, какой должен быть лучший подход с / без рекурсии?
ОБНОВИТЬ---
Мне удалось получить одно точное дерево синтаксического анализа после добавления дополнительных значений положения родительских и дочерних узлов во входной список. Но моя проблема не решается двусмысленным предложением.
Спасибо за ответ, мне удалось получить информацию о позициях родительских и дочерних узлов. Мой текущий недостаток - решение неоднозначного дерева. Мне удалось получить одно точное правильное дерево разбора.





Обычно алгоритм CYK предоставляет начальную и конечную позиции для каждого экземпляра продукции, который он находит в строке. Эта дополнительная информация упростит построение дерева синтаксического анализа. Есть ли причина, по которой у вас нет информации о должности?