RUTA:如何解析日期-MM / dd / yyyy-并将其存储在复杂的结构中?

时间:2014-03-31 12:53:51

标签: uima ruta

我想要的是解析日期的三个组成部分,将每个组成部分存储到自己的注释中,然后创建一个复杂的结构,它将代表整个日期。我尝试了以下方法,但它没有用。

DECLARE Annotation CommDate (Annotation CMonth, Annotation CDate, Annotation CYear);    
DECLARE Annotation CommenceMonth;
DECLARE Annotation CommenceYear;
DECLARE Annotation CommenceDate;

    NUM{REGEXP("[0-3]?[0-9]?") -> MARK(CommenceMonth)};
    CommenceMonth SPECIAL NUM{REGEXP("[0-3]?[0-9]?") -> MARK(CommenceDate)};
    CommenceDate SPECIAL NUM{REGEXP("19..|20..") -> MARK(CommenceYear)};

    CommenceMonth CommenceDate CommenceYear {-> CREATE(CommDate, 1,2,3, "CMonth" = 1, "CDate" = 2,  "CYear" = 3) };

当我用“2014年12月31日”之类的东西喂它时,尽管三个CommenceXXX注释都是赋值,但CommDate的复杂结构却没有。

1 个答案:

答案 0 :(得分:1)

第一个问题是你创建复杂注释的最后一条规则错过了斜线(SPECIAL)。斜杠不是其他注释的一部分,因此最后一条规则无法在后续的CommenceDate上匹配,因为还没有,但是斜杠。如果注释CommenceDate和CommenceYear中包含斜杠,或者如果最后一个规则包含顺序模式中的斜杠,则该规则将起作用:CommenceMonth SPECIAL CommenceDate SPECIAL CommenceYear...

第二个问题是CREATE操作的错误使用。功能的注释值使用类型在CREATE操作中分配,因为此操作尝试在匹配的上下文中查找annoations。规则元素的索引在GATHER操作中用于在规则元素的匹配上下文之外分配annoations。

例如,您可以通过以下方式重写最后一条规则来解决问题:

使用动作GATHER:

CommenceMonth SPECIAL CommenceDate SPECIAL CommenceYear 
    {-> GATHER(CommDate, 1, 5, "CMonth" = 1, "CDate" = 3,  "CYear" = 5) };

使用动作CREATE:

CommenceMonth SPECIAL CommenceDate SPECIAL CommenceYear 
    {-> CREATE(CommDate, 1, 5, "CMonth" = CommenceMonth, "CDate" = CommenceDate,  "CYear" = CommenceYear) };

示例的更紧凑的表示形式可能是(使用不同的代码样式,但使用相同的模式):

DECLARE Month, Day, Year;
DECLARE Annotation Date (Month month, Day day, Year year);    
(NUM{REGEXP("[0-3]?[0-9]?") -> Month} SPECIAL NUM{REGEXP("[0-3]?[0-9]?")-> Day} 
  SPECIAL NUM{REGEXP("19..|20..") -> Year}){-> CREATE(Date, "month" = Month, "day" = Day, "year" = Year)};