gpt4 book ai didi

java - 空操作导致 'found no viable alternative'

转载 作者:太空宇宙 更新时间:2023-11-04 11:36:05 24 4
gpt4 key购买 nike

我正在尝试编写一些 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', '-', 'MM', '-', 'DD'] 的标记序列周围添加时间注释。

我尝试了两条规则来做到这一点。第一条规则“有点起作用”,因为时间注释确实放置在整个 token 序列周围。但它还在日期的每个组成部分周围添加了时间注释(YYYY 部分除外)。

在第二条规则中,我尝试对其他 token 的匹配结果使用空操作,但这会导致“找不到可行的替代方案”异常。 Ruta 不允许空 Action 吗?如果没有,我将如何在日期标记序列周围添加单个注释?

谢谢。

最佳答案

允许没有操作的规则元素。包括箭头 -> 在内的完整部分需要省略(引号转义):

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) 以避免注释重叠。

我会编写类似的规则(没有转义引号):

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

如果您在多个规则中使用这些规则元素,我会将其重构为单独的注释,例如 Dash、Num4 和 Num2。

免责声明:我是 UIMA Ruta 的开发者

关于java - 空操作导致 'found no viable alternative',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43263795/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com