有幾種方法在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魯塔的開發者)
謝謝,這個效果很好一個皺紋。我正在使用假定存在句子註釋的代碼。我的單元測試有3個文檔。在第一個文檔中,第一個句子索引是1.在第二個文檔中,第一個句子索引是0.在第三個第一個句子索引是1. –
嗯,這很奇怪。你使用CURRENTCOUNT還是使用規則元素的順序屬性來分配索引?你能提供更多的信息,可能是一個可重複的例子嗎?我的第一個猜測是,可能有重疊的句子註釋或句子的開始不可見(以空白開頭)。 –