날짜 주위에 시간 주석을 만드는 루타 규칙을 작성하려고합니다. 아래의 테스트는 제가 어떻게 그것을하려고하는지 보여줍니다.빈 작업으로 인해 '실용 가능한 대안을 찾지 못했습니다'
@Test
public void test__Ruta__AnnotateDate() 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("Today's date is 2017-04-06.");
// 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);
rules = new String[] {
// Does not crash, but gives:
// Got Time=2017-04-06
// Got Time=-
// Got Time=04
// Got Time=-
// Got Time=06
//
"Token{REGEXP(\"[0-9]{4}\") -> MARK(Time, 1, 5)} Token{REGEXP(\"-\") -> Time} Token{REGEXP(\"[0-9]{2}\") -> Time} Token{REGEXP(\"-\") -> Time} Token{REGEXP(\"[0-9]{2}\") -> Time};"
// Crashes with exception
//
// org.apache.uima.ruta.extensions.RutaParseRuntimeException:
// Error in Ruta7969125931572676994, line 1, "}": found no viable alternative
//
// "Token{REGEXP(\"[0-9]{4}\") -> MARK(Time, 1, 5)} Token{REGEXP(\"-\") -> } Token{REGEXP(\"[0-9]{2}\") -> } Token{REGEXP(\"-\") -> } Token{REGEXP(\"[0-9]{2}\") -> };"
};
runner.applyRules(cas, rules);
for (Time aTime: JCasUtil.select(cas, Time.class)) {
System.out.println("Got Time="+aTime.getCoveredText());
}
}
테스트는 먼저 형태의 토큰의 어떠한 시퀀스 주위 시간 주석을 배치하려고 시도 토큰을 주석 [ 'YYYY', '-', 'MM', '-', 'DD'] .
나는 이것을하기 위해 두 가지 규칙을 시도했다. 첫 번째 규칙은 시간 주석이 실제로 토큰 시퀀스 전체에 적용된다는 의미에서 "일종의 작업"입니다. 또한 날짜의 각 구성 요소에 Time 주석을 추가합니다 (YYYY 부분 제외).
두 번째 규칙에서 다른 토큰에 대한 일치 결과에 빈 작업을 사용하려고 시도했지만 '실용적 대안 없음'예외가 발생합니다. 루타에서 허락 된 공허한 행동이 아닌가? 그렇지 않다면, 어떻게 날짜 토큰 시퀀스 주위에 하나의 주석을 넣을 까?
Thx.