2016-05-29 68 views
2

我有一個具有FSArray類型特徵的註釋。該功能應包含一個字符串列表。從UIMA FSArray檢索值

FSArray fsArray = (FSArray)annotation.getFeatureValue(fe); 

如何從FSArray獲取字符串列表?

通過fsArray.toStringArray()循環只返回字符串「FSArray」而不是實際值。

+0

FSArray的元素有哪些類型? – rec

回答

1

有哪些是重要的內UIMA從FSArray檢索值時,瞭解一些重要概念:

  • org.apache.uima.cas.Type - 的類型描述的數據模型。它的類似於java中的類的概念,它是 。一個類型有一個名字空間 ,它定義了屬性(特徵)。
  • org.apache.uima.cas.Feature - 是由Type描述的屬性。
  • org.apache.uima.jcas.cas.TOP - 是最通用的類​​型,可以用java.lang.Object進行比較。
  • org.apache.uima.cas.FeatureStructure - 一個FeatureStructure最好是 ,它被描述爲一個Type的實例。 FeatureStructure是你用來訪問數據的東西。

讓我們說,我們有以下兩種類型:

  • com.abcColoredCar
  • com.abcCar

,我們有下面的句子:

Car A and car B are both blue. 

讓我們假設以前的UIMA舞臺有一個nnotated使用Type com.abcColoredCar全句如下:

begin: 0 
end: 24 
color: "blue" 
cars: FSArray 

讓我們也假設我們從類型定義該功能的汽車是com.abcCar的FSArray已知的,以及汽車包含下列值:

begin: 4 
end: 5 
manufacturer: "Volvo" 

begin: 14 
end: 15 
manufacturer: "Toyota" 

以下代碼將演示如何檢索汽車FSArray的製造商屬性/功能。

public void process(JCas aJCas) throws AnalysisEngineProcessException { 
    List<TOP> tops = new ArrayList<TOP>(JCasUtil.selectAll(aJCas)); 
    List<String> manufacturers = new ArrayList<>(); 
    for (TOP t : tops) { 
     if (t.getType().getName().endsWith("ColoredCar")) { 
      Feature carsFeature = t.getType().getFeatureByBaseName("cars"); 
      FSArray fsArray = (FSArray) t.getFeatureValue(carsFeature); 
      FeatureStructure[] arrayStructures = fsArray.toArray(); 
      for (int i = 0; i < arrayStructures.length; i++) { 
       FeatureStructure fs = arrayStructures[i]; 
       Feature manufacturerFeature = fs.getType().getFeatureByBaseName("cars"); 
       manufacturers.add(fs.getStringValue(manufacturerFeature)); 
      } 
     } 
    } 
} 

要深入瞭解這一點,最好了解Type系統,堆和索引存儲庫如何在CAS中工作。