Я пытаюсь написать некоторые правила Ruta для фиксации отношений «есть-а» между вещами. У меня есть класс Relation, который включает в себя атрибуты entity1 и entity2, которые указывают на две вещи, связанные с отношением.
Насколько я понимаю, я должен «захватить» эти два элемента с аннотациями, которые ОБЪЯВЛЕНЫ, чтобы позже я мог установить их как атрибуты аннотации отношения.
Итак, мое правило гласит:
DECLARE Token Thing1;
DECLARE Token Thing2;
Но каким-то образом, когда я пытаюсь пометить токен как Thing1 или Thing2, Ruta сообщает мне, что он не может получить доступ к этому типу.
Вот тест, который иллюстрирует проблему
@Test
public void test__Ruta__BUG__DeclareNotWorking() throws UIMAException, IOException, URISyntaxException {
final class RulesRunner {
public void applyRules(JCas cas, String[] rules) throws AnalysisEngineProcessException, InvalidXMLException, ResourceInitializationException, ResourceConfigurationException, IOException, URISyntaxException {
for (String aRule: rules) {
Ruta.apply(cas.getCas(), aRule);
}
}
}
RulesRunner runner = new RulesRunner();
JCas cas = JCasFactory.createJCas();
cas.setDocumentText("A cat is a kind of mammal.");
// Tokenize the string
String[] rules = new String[] {
"ANY{REGEXP(\"[a-zA-Z0-9]+\") -> Token};",
"ANY{REGEXP(\"[^ a-zA-Z0-9]+\") -> Token};"
};
runner.applyRules(cas, rules);
// Capture the "is-a" relation between 'cat' and 'mammal' and 'car' and 'vehicle'
rules = new String[] {
"DECLARE Token Thing1; \n" +
"DECLARE Token Thing2; \n" +
// This results in: 'not able to resolve type: Thing1'
"Token{ -> MARK(Thing1)} " +
"Token{REGEXP(\"is\") -> RutaNevermind} " +
"Token{REGEXP(\"a\") -> RutaNevermind} " +
"Token{REGEXP(\"kind\") -> RutaNevermind} " +
"Token{REGEXP(\"of\") -> RutaNevermind} " +
"Token{ -> MARK(Relation, 1, 6)} " +
";"
};
runner.applyRules(cas, rules);
for (Relation aRelation: JCasUtil.select(cas, Relation.class)) {
System.out.println("Got Relation="+aRelation.getCoveredText());
}
}
Обратите внимание, что вместо этого я также пытался использовать следующие объявления:
DECLARE Thing1;
DECLARE Thing2;
а также
DECLARE Thing1 Token;
DECLARE Thing2 Token;
а также
DECLARE Token thing1; // Obviously, changed the MARK statement accordingly
DECLARE Token thing2;