2016-08-09 6 views
1

Я в настоящее время пытается решить следующую потребительскую случай РУТА:UIMA RUTA - Как имитировать IF-ELSE-условие?

If a Fragment contains one or more words from a WordlistA, then CREATE(Process, "finished" = "true") 
If the Fragment contains none of the words from the WordlistA, then CREATE(Process, "finished" = "false") 

Так созданный аннотацию процесс @ закончил должно быть истинным или ложным, но никогда не «истина» и «ложь» в то же время.

Я попытался это один:

DECLARE Process (STRING finsihed); 
WORDLIST WordlistA = 'mywordlist.txt'; 
Document{-> MARKFAST(ProcessTerm, WordlistA)}; 
Fragment {} -> {ProcessTerm {-> CREATE(Process, "finished" = "true")};}; 
Fragment {-CONTAINS(ProcessTerm) -> CREATE(Process, "finished" = "false")}; 

Насколько я могу видеть, второе правило соответствует всегда !? Но почему? В результате обработанная обработкой ProcessTerm @ содержит «true» и «false», если также совпадает первое правило.

Каков наилучший способ использования прецедента с использованием RUTA? По-моему, мне нужно что-то вроде IF-ELSE-Statement.

В прецеденте немного изменилось в последние два часа в

If a **Document** contains one or more words from a WordlistA, then CREATE(Process, "finished" = "true") 
If the **Document** contains none of the words from the WordlistA, then CREATE(Process, "finished" = "false") 

Я сейчас, используя Peters предложение следующим образом:

Document->{ 
    Document{CONTAINS(ProcessTerm)-> CREATE(Process, "finished" = "true")}; 
    Document{-PARTOF(Process) -> CREATE(Process, "finished" = "false")}; 
}; 

ответ

0

Существует нет IF-THEN построить в Руте (пока). Наиболее подобным было бы две конструкции BLOCK с взаимоисключающими условиями. Ну, это также может быть достигнуто с помощью правил.

К вашим правилам: Если второе правило совпадает всегда, то в каждой аннотации фрагментов нет (видимых) аннотаций ProcessTerm.

В первом правиле вы создаете аннотацию процесса для каждой аннотации ProcessTerm в каждой аннотации фрагмента.

Если бы я не извратить ваше описание, я бы предположить, что это может быть то, что вы ищете:

Fragment {CONTAINS(ProcessTerm) -> CREATE(Process, "finished" = "true")}; 
Fragment {-CONTAINS(ProcessTerm) -> CREATE(Process, "finished" = "false")}; 

This перебирает все Фрагмент аннотациями дважды, не является действительно необходимым. Вы также можете сделать что-то вроде (или какой-либо вариант с блочными и переменных):

Fragment->{ 
    Document{CONTAINS(ProcessTerm)-> CREATE(Process, "finished" = "true")}; 
    Document{-PARTOF(Process) -> CREATE(Process, "finished" = "false")}; 
}; 

письменный отказ от ответственности: Я разработчик UIMA Ruta

+0

Спасибо за ваш ответ. Вторая версия с блоком делает трюк. :-) –