【问题标题】:Looping issue - UIMA Ruta循环问题 - UIMA Ruta
【发布时间】:2016-11-19 07:55:00
【问题描述】:

目标:

分配标题级别。

第一个标题被分配到级别 1。我提取字体系列和它的大小并找到匹配的标题。分配级别后,我取消标记标题,将标题和功能保留在另一个注释(HeadingHierarchy)中。关卡完成后,只要 Headinglevel 注释中还有任何标题,我就会一次又一次地调用同一个块。

问题:

该脚本适用于查找所有 1 级标题。但是当通过 Call 语句执行块时,它只找到每个级别的第一个匹配项(从级别 2 开始)。因此,以下输入的总层数变为 10,而它必须为 4。

输入:(.txt)

Apache UIMA Ruta Overview =>Arial,18
What is Apache UIMA Ruta? =>Arial,16
Getting started =>Arial,16
UIMA Analysis Engines =>Arial,16
Ruta Engine =>Times New Roman,14
Configuration Parameters =>Arial,10
Annotation Writer =>Times New Roman,14
Configuration Parameters =>Arial,10
Apache UIMA Ruta Language =>Arial,18
Syntax =>Arial,16
Rule elements and their matching order =>Arial,16

脚本:

PACKAGE uima.ruta.example;

DECLARE Headinglevel(STRING family, INT size, INT level);
DECLARE HeadingHierarchy(STRING family, INT size, INT level);
DECLARE FontFamily, FontSize;

STRING family;
INT size;

RETAINTYPE(BREAK);
    BREAK? #{-PARTOF(Headinglevel)} @SPECIAL+ W+ COMMA NUM{->MARK(Headinglevel,2,6), MARK(HeadingHierarchy,2,6), MARK(FontFamily,4), MARK(FontSize,6)};
RETAINTYPE;

h:Headinglevel{->h.family = family, HeadingHierarchy.family = family}
<-{FontFamily{PARSE(family)};};

h:Headinglevel{->h.size = size, HeadingHierarchy.size = size}
<-{FontSize{PARSE(size)};};

INT i=1;

BLOCK(ForEachHeadLevel)Document{}
{
    # h:Headinglevel{-> family = h.family, size = h.size};
    h:Headinglevel{AND(h.family == family, h.size == size)-> h.level=i, HeadingHierarchy.level = i, UNMARK(h)};
}
Headinglevel{->i=i+1, CALL(Test2.ForEachHeadLevel)};
Document{->LOG("    LEVELS : " + (i))};

预期输出:

   HeadingHierarchy                        Feature

Apache UIMA... =>Arial,18                  level: 1
What is Apa... =>Arial,16                  level: 2
Getting sta... =>Arial,16                  level: 2
UIMA Analys... =>Arial,16                  level: 2
Ruta Engine... =>Times New Roman,14        level: 3
Configurati... =>Arial,10                  level: 4
Annotation ... =>Times New Roman,14        level: 3
Configurati... =>Arial,10                  level: 4
Apache UIMA... =>Arial,18                  level: 1
Syntax =>Ar... =>Arial,16                  level: 2
Rule elemen... =>Arial,16                  level: 2

【问题讨论】:

    标签: uima ruta


    【解决方案1】:

    问题在于 CALL 将窗口限制在规则元素匹配的跨度上。这意味着 BLOCK 仅在现有的 Headinglevel 注释中执行。但是,您需要拥有完整的文档,这样块中的第二条规则才能发挥作用。

    这很可能不是最好的解决方案,但我想到的第一个。

    您可以将 BLOCK 中的窗口重置为完整的文档,而不管 DOCUMENTBLOCK 的 CALL 操作的限制:

    BLOCK (ForEachHeadLevel)Document{}
    {
        DOCUMENTBLOCK Document{} 
        {
            # h:Headinglevel{-> family = h.family, size = h.size};
            h:Headinglevel{AND(h.family == family, h.size == size)-> h.level=i, HeadingHierarchy.level = i, UNMARK(h)};
        }
    }
    

    DOCUMENTBLOCK 是一个块扩展。您需要在additionalExtensions 配置参数中包含org.apache.uima.ruta.block.DocumentBlockExtension

    这是另一个使用 FOREACH 块的解决方案:

    INT i=0;
    FOREACH(hl) Headinglevel{}{
        hl{IS(Headinglevel)-> i=i+1, family = hl.family, size = hl.size};
        h:Headinglevel{h.family == family, h.size == size ->  h.level=i, HeadingHierarchy.level = i, UNMARK(h)};
    }
    

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

    【讨论】:

    • 我在附加扩展中添加了 org.apache.uima.ruta.block.DocumentBlockExtension。但我收到错误,键入“DOCUMENTBLOCK”未在此脚本/块中定义!
    • 看起来新添加的参数在脚本运行后被删除(在这种情况下出现错误)。 dictRemoveWS 也是如此,因此每次运行脚本时都必须添加它。
    • 是的,看起来扩展在 Workbench 中不可用。我会解决的。
    • 是的,有很多方法。我假设您也可以使用带有存储观察到的布局的列表的单个规则来执行此操作,如果您使除标题之外的所有内容均不可见。我使用 FOREACH 块添加了另一种方式(请注意,该块较慢,因为它应该在 2.5.0 )
    • “我假设您也可以使用单个规则来执行此操作,其中包含存储观察到的布局的列表,如果您使除标题之外的所有内容均不可见。” - 你能详细说明一下吗?
    猜你喜欢
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2018-08-27
    相关资源
    最近更新 更多