2016-05-29 3 views
2

У меня есть аннотация, которая имеет функцию типа FSArray. Эта функция должна содержать список строк.Извлечь значения из UIMA FSArray

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

Как получить список строк из FSArray?

Цитирование через fsArray.toStringArray() возвращает строку «FSArray», а не фактическое значение.

+0

Какой тип элементов FSArray имеет? – rec

ответ

1

Есть некоторые важные понятия, которые имеют важное значение для понимания при извлечении значений из FSArray в UIMA:

  • org.apache.uima.cas.Type - Тип описывает модель данных. Это похож на концепцию классов в java. Тип имеет пространство имен и определяет атрибуты (функции).
  • org.apache.uima.cas.Feature - Это атрибут, описываемый типом.
  • 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 имеет аннотат ред все предложение, используя тип com.abcColoredCar следующим образом:

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

Позволяет также предположить, что известно из определения типа, что особенность машины является FSArray из com.abcCar и автомобилей содержит следующие значения :

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)); 
      } 
     } 
    } 
} 

Копать глубже в это, это хорошая идея, чтобы прочитать, как тип системы, Heap и индекс Repository работает в CAS.

Смежные вопросы