В настоящее время я работаю над проектом с участием НЛП. Я реализовал идентификатор CKY, как указано в Jurafsky and Martin (алгоритм на стр. 450). Созданная таблица фактически хранит нетерминалы в таблице (вместо обычных булевых значений). Однако единственной проблемой, которую я получаю, является извлечение дерева синтаксического анализа.Шаги для генерации дерева синтаксиса из алгоритма CYK (обработка естественного языка)
Вот иллюстрация того, что делает мой CKY идентификатор:
Это моя грамматика
S -> NP VP
S -> VP
NP -> MODAL PRON | DET NP | NOUN VF | NOUN | DET NOUN | DET FILENAME
MODAL -> 'MD'
PRON -> 'PPSS' | 'PPO'
VP -> VERB NP
VP -> VERB VP
VP -> ADVERB VP
VP -> VF
VERB -> 'VB' | 'VBN'
NOUN -> 'NN' | 'NP'
VF -> VERB FILENAME
FILENAME -> 'NN' | 'NP'
ADVERB -> 'RB'
DET -> 'AT'
И это алгоритм:
for j from i to LENGTH(words) do
table[j-1,j] = A where A -> POS(word[j])
for i from j-2 downto 0
for k from i+1 to j-1
table[i,j] = Union(table[i,j], A such that A->BC)
where B is in table[i,k] and C is in table[k,j]
И это то, что мой разборе стол выглядит следующим образом:
Теперь, когда я знаю, что, поскольку S находится в [0,5], строка была проанализирована, а для k = 1 (согласно алгоритму, указанному в Мартине и Юрафском), мы имеем S -> таблицу [ 0] [2] таблица [2] [5] ie S -> NP VP
Единственная проблема, которую я получаю, заключается в том, что я смог получить используемые правила, но затем они находятся в смешанном формате, т.е. не на основе их появления в дереве разбора. Может ли кто-нибудь предложить алгоритм для получения правильного дерева синтаксического анализа?
Thankyou.
Thankyou так много, он работал как шарм для меня. – AbbaShareen
Рад, что я помог :) – dkar