#uima #ruta #dkpro-core
Вопрос:
У меня есть правило Ruta, которое выглядит примерно так, где dep-это тип импортированной зависимости DKPro.
dep{}->{MyItem{->
SETFEATURE("Display", "displayedValue"),
SETFEATURE("Lemma", dep.Dependent.lemma.value),
SETFEATURE("Parent", dep.Governor)};};
Первые два действия работают. Проблема, с которой я столкнулся, заключается в третьем действии SETFEATURE("Parent", dep.Governor)
. деп.Губернатор возвращает тип токена, но для моей функции требуется другой тип, который находится в том же месте, что и губернатор. Другими словами, мне нужен мой собственный тип, а не деп.Губернатор, это уже обозначило это управляющее слово.
Я не уверен, как восстановить аннотацию (мою аннотацию), которая занимает то же пространство, что и dep.Губернатор. В идеале я хотел бы восстановить его как переменную, чтобы я мог повторно использовать его для других функций, чтобы сделать что-то подобное.
a:MyItem [that overlaps dep.Governor]
dep{}->{MyItem{->SETFEATURE("Parent", a)};};
Вот более точный пример
d:dep.Dependency{->
MyItem,
MyItem.Display = "Ignore",
MyItem.Lemma = d.Dependent.lemma.value,
MyItem.LanguageParent = d,
};
Строка моя.LanguageParent = d выдает эту ошибку Ruta
Trying to access value of feature "type.MyItem:LanguageParent" as "type.MyItem", but range of feature is "de.tudarmstadt.ukp.dkpro.core.api.syntax.type.dependency.Dependency"
Комментарии:
1. Правило в вашем точном exmaple работает на моем рабочем столе Ruta. Возможно, ваша проблема уже была в какой-то новой версии Руты.
Ответ №1:
Я уверен, что есть более чистый способ, чем этот, но на данный момент я преобразую тип с помощью функции блока и сохраняю его в переменную аннотации.
BLOCK(ConvertTokenToMyItem) Token{IS(MyItem)} {
varMyItem:MyItem;
}
Тогда я использую его
d:dep.Dependency{->
MyItem,
MyItem.Display = "Ignore",
MyItem.Lemma = d.Dependent.lemma.value,
MyItem.LanguageParent = varMyItem,
};
Комментарии:
1. Интересно, почему ваш пример здесь работает, поскольку метка-это своего рода локальная переменная, которая не должна назначаться между операторами. Ваше правило должно хорошо работать и без блока. Я рекомендую использовать метки при неявном действии:
m:MyItem, m.Display = "Ignore",
2. Я использую глобальную переменную, а не локальную переменную, и вызываю блок непосредственно перед ее использованием, чтобы переменная использовалась немедленно. Спасибо за советы по этикеткам. О, и я обращаю внимание на ваш комментарий выше. Я буду экспериментировать, чтобы посмотреть, смогу ли я избавиться от блока.