2014-07-17 76 views
3

我有一個RUTA腳本,其中所有句子已用句子註釋註釋,並且各種單詞和短語已用自己的特定註釋註釋。這一切都按預期工作。將特徵值設置爲UIMA中包含註釋的數量Ruta

這些註釋中的每一個都有包含它的句子的索引的特徵。因此,在一個人爲的例子中,並給出文本

傑克和吉爾上山。傑克摔倒了。

我有一個「向下」的註釋,我想將句子索引設置爲2,表明它在第二個句子中。雖然我知道這是不正確的,但我正在考慮類似以下內容。

Sentence{CONTAINS(Down) -> Down.sentence_index = index 

其中索引是句子的索引。這可能與RUTA?如果是這樣,什麼是適當的腳本。我可以在一個單獨的分析引擎中完成此操作,並且在過去已經這樣做了,但我希望用ruta腳本替換其中的一些。

感謝,

尼克

回答

2

有幾種方法在UIMA魯塔來表達這一點。我的第一個猜測會是這樣的:

// just to have an executable example 
DECLARE Sentence; 
DECLARE Annotation Down (INT sentence_index); 
((# PERIOD){-> Sentence})+; 
"down" -> Down; 

// the acutal rule with a helper variable 
INT index; 
Sentence{CONTAINS(Down), CURRENTCOUNT(Sentence, index)} -> 
    {Down{-> Down.sentence_index = index};}; 

該規則與包含向下註釋的所有句子匹配。此外,CURRENTCOUNT將Sentence註釋計數到匹配位置並將值存儲在變量索引中。然後,內聯規則(由第一個「 - >」指示)與匹配句子中所有向下註釋相匹配,並將該變量的值分配給匹配的向下註釋的特徵。根據如果你想入手0或1,你需要增加分配的值:

... Down.sentence_index = (index+1)};}; 

條件CURRENTCOUNT還可以接受的最小和最大價值,以像一個真正的狀態。這是真的很老,所以我不知道它如何衡量大型文件。

這裏是另外一個例子,但這次沒有CURRENTCOUNT條件和存儲在句子註釋索引:

DECLARE Annotation Sentence (INT index); 
DECLARE Annotation Down (INT sentence_index); 
INT index; 

(# PERIOD){-> Sentence, ASSIGN(index, (index + 1)), Sentence.index = index}; 
PERIOD (# PERIOD){-> Sentence, ASSIGN(index, (index + 1)), Sentence.index = index}; 
"down" -> Down; 

Sentence{CONTAINS(Down) -> ASSIGN(index, Sentence.index)} 
    -> {Down{-> Down.sentence_index = index};}; 

記住,因爲它使用了不能用於​​第一個例子創建句子註釋規則只有一個規則匹配,並且其操作將應用於匹配的片段。第二個示例中的規則導致許多規則匹配,因此在處理下一個規則匹配之前應用這些操作。在不同匹配範圍的特徵值之間進行復制並不是很好,但是有時可能會有所改進。

Sentence{-> ASSIGN(index, (index + 1)), Sentence.index = index}; 

例子已與UIMA魯塔2.2.1-SNAPSHOT測試:

如果您已經句子的註釋,你可以像分配指標。

(我UIMA魯塔的開發者)

+1

謝謝,這個效果很好一個皺紋。我正在使用假定存在句子註釋的代碼。我的單元測試有3個文檔。在第一個文檔中,第一個句子索引是1.在第二個文檔中,第一個句子索引是0.在第三個第一個句子索引是1. –

+0

嗯,這很奇怪。你使用CURRENTCOUNT還是使用規則元素的順序屬性來分配索引?你能提供更多的信息,可能是一個可重複的例子嗎?我的第一個猜測是,可能有重疊的句子註釋或句子的開始不可見(以空白開頭)。 –