Преобразование дерева зависимостей в последовательность переходов Arc-eager
В настоящее время я пытаюсь построить модель NMT с учетом синтаксиса.
В этом проекте мне нужна последовательность одного из трех переходных действий (SHIFT, REDUCE-L, REDUCE-R)
Подобно тому, что на изображении
Этот блок представляет переходную зависимость для 2 предложений (1 для 1 блока, разделенного на пустые строки)
я использую Syntaxnet
сначала получить дерево разбора зависимостей, но оно не предоставляет непосредственно эти последовательности действий перехода.
Это результаты следующие,
Можно ли получить последовательности действий, подобные этому изображению? Можно ли преобразовать то, что достигается от этого изображения в исходный формат изображения.
1 ответ
Функция, которая преобразует дерево зависимостей в последовательность переходов, называется оракулом. Это необходимый компонент статистического парсера. Переходы, которые вы описали (сдвиг, уменьшение-l, уменьшение-r)¹ - это переходы стандартной системы переходов дуги (не дугообразной системы, а именно: сдвиг, левая дуга, правая дуга, уменьшение).
Псевдокод для стандартного оракула:
stack = [] # stack[0] is the top of the stack
buffer = [w1, w2, ..., wn]
while len(buffer) > 0 or len(stack) != 1:
if stack[0] is the head of stack[1]:
apply left-arc
if stack[1] is the head of stack[0]:
if there is a token in the buffer whose head is stack[0]
# (i.e not all children of stack[1] have been attached to it)
apply shift
else:
apply right-arc
На этих слайдах представлены два алгоритма синтаксического анализа и их оракулы.
EdReduce-left, Reduce-Right часто называют правой дугой и левой дугой в контексте анализа зависимости.