UIMA Ruta:将包含注释的要素值复制到包含注释

时间:2015-12-06 06:40:08

标签: uima ruta

注意:这似乎与Setting feature value to the count of containing annotation in UIMA Ruta密切相关。但我不能完全回答我的情况。

我正在分析假定以下结构的纯文本文档:

  • 文件(当然一个)
    • 科(很多)
      • 标题(每个部分一个)

我被要求通过检查他们的标题是否满足条件来识别部分。一个有用且显而易见的条件是:标题是否与给定的正则表达式匹配?一个不太有用但可能更容易实现的条件是:标题是否包含给定的文本

我可以并且已经通过获取正则表达式和节标题的元组列表来实现这一点,并且在设计时,对于列表中的每个成员都是如此:

BLOCK(forEach) SECTION{} {
    ...
    HEADING{REGEXP(".*table.*contents.*", true) -> 
            SETFEATURE("value", "Table of Contents")};
    ...
}

SECTION{ -> SETFEATURE("value", "Table of Contents")} 
         <- { HEADING.headingValue == "Table of Contents"; };

这种方法相当简单,但有一些很大的缺点:

  1. 严重违反DRY原则
  2. 即使只为一个部分编写规则来识别,规则作者也必须复制部分标题两次(它只需要指定一次)
  3. 这使得剧本不必要地长而且笨拙
  4. 它给规则作者带来了沉重的负担,在理想的情况下,他只需要知道Regex - 而不是Ruta
  5. 所以我想重构以实现以下目标:

    • 文本文件用于存储正则表达式和相应的标题,规则迭代这些对
    • 功能而非类型用于区分不同的部分/标题(例如,如上所述,使用SECTION.value=="Table of Contents"而不是TableOfContentsSection

    在查看UIMA Ruta参考文献以了解哪些选项可用于实现这些目标后,我选择了以下内容:

    1. 使用WORDTABLE存储section title, words to find / regex if possible, lookup type的元组 - 例如,Table of Contents,contents,sectiontitles
    2. 使用MARKTABLE标记中间注释类型LookupMatch,其hint功能包含节标题,其lookup功能包含我们正在讨论的查找类型
    3. 对于每个HEADING,查看LookupMatch.lookup == "sectiontitle"是否在内部,如果是,请将LookupMatch.hint复制到标题的value字段。
    4. 对于每个SECTION,查看HEADING是否在value内;如果是,请将value复制到SECTION.value字段。
    5. 发现实施步骤3和4并不容易,这并不奇怪。这就是我所处的位置以及我寻求帮助的原因。

      // STEP 1
      
      WORDTABLE Structure_Heading_WordTable =
          '/uima/resource/structure/Structure_Heading_WordTable.csv';
      
      // STEP 2
      
      Document.docType == "Contract"{
          -> MARKTABLE(LookupMatch,                                       // annotation
                       2,                                                 // lookup column #
                       Structure_Heading_WordTable,               // word table to lookup
                       true,                                              // case-insensitivity
                       0,                                                 // length before case-insensitivity
                       "",                                                // characters to ignore
                       0,                                                 // matches to ignore
                       "hint" = 1, "lookup" = 3                           // features
                       )
      };
      
      // STEPS 3 AND 4 ... ???
      
      BLOCK(ForEach) LookupMatch.lookup == "sectiontitle"{} {
          ???
      }
      
      HEADING{ -> SETFEATURE("value", ???)} <- {
          ???
      };
      

      这是我对它的第一次真正尝试:

      HEADING{ -> SETFEATURE("value", lookupMatchHint)} <- {
          LookupMatch.lookup == "HeadingWords"{ -> GETFEATURE("hint", lookupMatchHint)};
      };
      

      TL; DR

      如何有条件地将要素值从一个注释复制到另一个注释? GETFEATURE假设你只得到1 ......

0 个答案:

没有答案