2017-04-06 5 views
1

사물 간의 'is-a'관계를 포착하기위한 루타 규칙을 작성하려고합니다. 관계에 관련된 두 가지를 가리키는 entity1 및 entity2 특성을 포함하는 Relation 클래스가 있습니다.Ruta로 선언 된 변수를 사용할 수 없습니다. DECLARE

필자는이 두 요소에 선언 된 주석을 "캡처해야"하므로 나중에 주석을 관계 주석의 특성으로 설정할 수 있다는 점을 이해합니다.

그래서 내 규칙이있다 : 어떻게 든

DECLARE Token Thing1; 
DECLARE Token Thing2; 

하지만를, 내가 Thing1 또는 Thing2 것으로 토큰을 표시 할 때, 루타는 해당 유형에 액세스 할 수 있음을 알려줍니다.

DECLARE Thing1; 
DECLARE Thing2; 

DECLARE Thing1 Token; 
DECLARE Thing2 Token; 

: 여기

문제를 내가 대신 다음과 같은 선언과 노력

@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()); 
    } 
} 

주를 설명하는 테스트입니다3210

답변

0

빈 작업을 수행하는 방법을 찾지 못했지만 해결 방법을 찾았습니다. 기본적으로, 나는 RutaNull 어노테이션 클래스를 가지고 있으며, 빈 액션을 사용할 필요가있을 때마다 MARK (RutaNull)을 사용할 것이다. 그러나 아무도 공허한 행동을하는 법에 대한 답을 가지고 있다면, 나는 아직도 그것을 듣고 싶어합니다.

DECLARE가 변수지만 UIMA 유형을 선언하지 않습니다

+0

작업의 개발자입니다. 간단히 생략 할 수는 있지만'->'을 제거해야한다. –

0

여기에서 고려해야 할 몇 가지가 있습니다. 유형에 대한 변수 선언은 TYPE myTypeVar;과 같습니다. 나는 당신이 당신의 질문에서 하나의 변수를 의미하지 않는다고 가정합니다.

UIMA에서 CAS의 유형 시스템은 CAS를 만든 후에는 정적입니다. 분석 엔진이 CAS를 처리 할 때 규칙이 실행될 때 ruta 규칙은 DECLARE 문으로이를 확장 할 수 없습니다. Ruta에는 각 선언에 대한 유형 설명이 들어있는 ruta 스크립트의 유형 시스템 설명을 작성하는 별도의 기능이 있습니다. 일반적으로 이것은 "컴파일"레벨에서 수행됩니다 (예 : ruta-maven-plugin 또는 Ruta Workbench). 질문의 코드처럼 프로그래밍 방식으로 사용해야하는 경우 유형을 수동으로 추가하거나 RutaDescriptorFactory를 사용할 수 있습니다. 작동 방법은 code입니다. uimaFIT의 팩토리를 사용하여 CAS를 생성하려면 생성 된 TypeSystemDescription을 인수로 간단히 사용할 수 있습니다.

작업은 규칙 요소에서 필요하지 않습니다. 단순히 생략 할 수는 있지만 화살표 ->도 제거해야합니다. 예를 들어 Ruta Workbench의 Query View에서 쿼리 문으로 사용하기 위해 단일 액션없이 규칙을 작성할 수도 있습니다.

DECLARE 문은 새로운 형식을 선언합니다. 새로운 유형에 대한 선택적인 상위 유형을 제공 할 수 있습니다. 물론 새로운 유형의 상위 유형입니다. Thing1이 새 유형 인 경우 DECLARE Thing1 Token;은 유효하지 않습니다. 하지만 DECLARE Token Thing1;입니다. DECLARE Thing1;은 수퍼 유형을 uima.tcas.Annotation으로 설정합니다. 토큰을 수퍼 유형으로 사용하지 않는 것이 좋습니다.

유형 Relation의 정의는 질문에 나와 있지 않습니다. 이 유형이 이미 존재합니까? 그렇지 않은 경우 다른 유형과 동일하게 적용됩니다. CAS 유형 시스템에 포함해야합니다.

아마도 가장 중요한 참고 사항 : 전체적으로 문제를 피할 수있는 새로운 유형을 선언 할 필요가 없습니다. 특수 효과의 주석을 다른 주석으로 채우는 방법에는 여러 가지가 있습니다. ruta 문서의 1.4 Learning by Example에는 CREATE, GATHER, 암시 적 작업, 변수, 레이블 표현과 같은 몇 가지 예가 있습니다. 대부분 Relation의 정의와 실제 사용 사례에 달려 있습니다. 다른 사용하여

//DECLARE Relation (Token source, Token target); just a comment how the Relation type is assumed to be defined 
(t1:Token "is" "a" "kind" "of" t2:Token){-> Relation, Relation.source=t1, Relation.target=t2}; 

나 ... 당신은 아마이 규칙을 최적화해야

Token "is" "a" "kind" "of" Token{-> GATHER(Relation,1,6,"source"=1,"target"=6)}; 

: 당신의 예에서, 규칙 (더 따옴표를 탈출? 관계는 당신의 유형 중 하나입니다)처럼 보일 수 없었다 일치 조건, 필터 유형 또는 -PARTOF.

면책 조항 : 나는 필요하지 않습니다 UIMA 루타