首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环问题- UIMA Ruta

循环问题- UIMA Ruta
EN

Stack Overflow用户
提问于 2016-11-19 07:55:00
回答 1查看 144关注 0票数 1

目标:

指定标题级别。

第一个标题被指定为第一级。我提取字体族和它的大小,并找到匹配的标题。一旦分配了级别,我就取消标题标记,保留标题&另一个注释(HeadingHierarchy)中的特性。一旦级别完成,只要Headinglevel注释中还有任何标题,我就会一次又一次地调用同一个块。

发行:

这个脚本可以很好地找到所有的1级标题。但是,当通过Call语句执行块时,它只会为每个级别找到第一个匹配(级别2)。因此,以下输入的级别总数为10,而必须为4。

输入:(.txt)

代码语言:javascript
复制
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

脚本:

代码语言:javascript
复制
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))};

预期输出:

代码语言:javascript
复制
   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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-20 14:35:04

问题是,调用限制了由规则元素匹配的span上的窗口。这意味着该块仅在现有的Headinglevel注释中执行。但是,您需要有完整的文档,以便块中的第二条规则能够完成它的工作。

这很可能不是最好的解决方案,而是我脑海中出现的第一个解决方案。

可以使用DOCUMENTBLOCK将块内的窗口重置为完整的文档,而不必考虑调用操作的限制:

代码语言:javascript
复制
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是块扩展。您需要在org.apache.uima.ruta.block.DocumentBlockExtension配置参数中包含additionalExtensions

下面是使用FOREACH块的另一种解决方案:

代码语言:javascript
复制
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的开发人员

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40690525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档