Как выбрать и установить аннотацию покрытия/покрытия в качестве объекта в RUTA

#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. Я использую глобальную переменную, а не локальную переменную, и вызываю блок непосредственно перед ее использованием, чтобы переменная использовалась немедленно. Спасибо за советы по этикеткам. О, и я обращаю внимание на ваш комментарий выше. Я буду экспериментировать, чтобы посмотреть, смогу ли я избавиться от блока.