2016-11-19 70 views
1

目的:循環問題 - UIMA魯塔

要分配的標題級別。

第一個標題是分配的級別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 

回答

1

問題是CALL限制了規則元素匹配的跨度上的窗口。這意味着BLOCK僅在現有的Headinglevel註釋中執行。但是,您需要擁有完整的文檔,以便塊中的第二條規則完成其工作。

這是最有可能不是最好的解決辦法,但來到了我的腦海裏的第一個。

你可以在塊內無論CALL行動的限制與DOCUMENTBLOCK重置窗口完整的文檔:

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魯塔開發商

+0

我加org.apache.uima.ruta.block.DocumentBlockExtension在additionalExtensions。但是我得到錯誤,輸入「DOCUMENTBLOCK」沒有在這個腳本/塊中定義! – prasanth

+0

看起來像腳本運行後新添加的參數被刪除(在這種情況下有錯誤)。 dictRemoveWS也會發生同樣的情況,所以每次運行腳本時都需要添加它。 – prasanth

+0

是的,看起來擴展在Workbench中不可用。我會修好它。 –