2017-04-06 6 views
1

날짜 주위에 시간 주석을 만드는 루타 규칙을 작성하려고합니다. 아래의 테스트는 제가 어떻게 그것을하려고하는지 보여줍니다.빈 작업으로 인해 '실용 가능한 대안을 찾지 못했습니다'

@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.

답변

0

조치가없는 규칙 요소가 허용됩니다. (따옴표 이스케이프) ommitted 할 필요가 -> 화살표를 포함한 전체 부분 : 첫 번째 규칙에

Token{REGEXP(\"[0-9]{4}\") -> MARK(Time, 1, 5)} Token{REGEXP(\"-\")} Token{REGEXP(\"[0-9]{2}\")} Token{REGEXP(\"-\")} Token{REGEXP(\"[0-9]{2}\")}; 

, 각 토큰에 대한 추가 Time 주석이 규칙 요소의 작용에 의해 생성된다. 당신이 그들을 제거하면, 당신은 당신이 그랬던 것처럼 두 번째 규칙에 끝납니다.

주석을 겹치지 않게하려면 규칙을 약간 (예 : -PARTOF(Time)) 최적화하는 것이 좋습니다.

내가 쓴 것

같은 규칙 뭔가 (NO 따옴표를 이스케이프) : 여러 규칙이 규칙 요소를 사용하는 경우

(NUM{-PARTOF(Time),REGEXP(".{4}")} 
SPECIAL.ct=="-" 
NUM{REGEXP(".{2}")} 
SPECIAL.ct=="-" 
NUM{REGEXP(".{2}")} 
){-> Time}; 

, 내가 분리를 리팩토링 것 주석, 예를 들어, 대시, Num4 및 Num2.

면책 조항 : 나는

UIMA 루타의 개발자입니다