2017-04-06 12 views
1

日付の周りにタイムアノテーションを作成するRutaルールをいくつか記述しようとしています。下のテストは、私がそれをやろうとしているところを示しています。空のアクションによって '実行可能な代替が見つかりませんでした'

@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」、「 - 」、「M」、「 - 」、「DD」] 。

私はこれを行うために2つのルールを試しました。時間注釈が実際にトークンの全シーケンスの周りに置かれるという意味での第一のルール「作品の並べ替え」。しかし、日付の各構成要素の周りにタイムアノテーションを追加します(YYYY部分を除く)。

第2のルールでは、他のトークンとの一致の結果として空のアクションを使用しようとしましたが、これは '実行可能な代替手段が見つかりません'という例外を引き起こします。ルタで空の行動が許可されていませんか?そうでない場合は、日付トークンのシーケンスの周りに単一の注釈を配置する方法はありますか?

Thx。

答えて

0

アクションのないルール要素は許可されます。 (引用符はエスケープ)省略される必要がある->矢印を含む完全な部分:あなたの最初のルールで

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

、各トークンのための追加Time注釈がルール要素の作用によって作成されます。それらを削除すると、2番目のルールになります。

注釈が重複しないように、ルールを少し、たとえば-PARTOF(Time)で最適化することをおすすめします。

私は(NOは引用符をエスケープ)のようなルールに何か書かれています:、あなたはいくつかのルールでこれらのルール要素を使用している場合は、私はダッシュ、例えば、注釈を分離するために、それをリファクタリングしたい

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

Num4とをNum2。

免責事項:私はUIMAルタ

のデベロッパー
関連する問題