Как сопоставить конкретные токены в UIMA Ruta?

DECLARE A,B;
DECLARE Annotation C(Annotation firstA, Annotation secondA,...);
"token1|token2|...|tokenn" -> A;
"token3|token4" -> B;

A A B {->MARK(C,1,3)}; 

Я сделал с GATHER

(A  COMMA A B) {-> GATHER(C,1,4,"firstA"=1,"secondA" = 3,"B"=4)};

Но как быть в случае неизвестной последовательности типа A? как показано ниже, как можно сохранить все элементы A в функциях? Количество функций также неизвестно. В плане java мы объявляем массив String и можем добавлять элемент, но в руте вроде нет такого процесса.

(A  (COMMA A)+ B) {-PARTOF(C) -> GATHER(C,beginPosition,endPosition,"firstA"=1,"secondA" = 3,"thirdA"=?,so on)};

1 ответ

Решение

Аннотации в UIMA относятся к полному интервалу от начального смещения до конечного смещения. Итак, если вы хотите указать что-то с двумя элементами, то простой аннотации недостаточно. Вы не можете создать аннотацию типа C, которая охватывает первые A и B, но не вторую A.

Тем не менее, вы можете хранить важную информацию в значениях функций. Как это реализовать, зависит от разных вещей.

Если вы всегда хотите запомнить только две аннотации, добавьте две функции к типу C и присвойте значения объектов в данном правиле, например, с помощью CREATE(C,1,3,"first" = A, "second" = Б).

Вы также можете использовать различные действия, такие как GATHER, или использовать одну функцию FSArray для хранения аннотаций.

Полный пример с FSArray:

DECLARE A, B;
DECLARE Annotation C (FSArray as, B b);
"A" -> A;
"B" -> B;
(A (COMMA A)+ B){-PARTOF(C) -> CREATE(C, "as" = A, "b" = B)};

При применении к тексту типа "A, A, A B" последнее правило создает одну аннотацию типа C, в которой хранятся три аннотации A в функции "as" и одна аннотация B в функции "b".

Другие вопросы по тегам