我有一个具有FSArray类型特征的注释。此功能应包含字符串列表。
FSArray fsArray = (FSArray)annotation.getFeatureValue(fe);
如何从FSArray中获取字符串列表?
循环访问fsArray.toStringArray()仅返回字符串“ FSArray”,而不返回实际值。
最佳答案
在UIMA中从FSArray检索值时,有一些重要的概念需要理解:
org.apache.uima.cas.Type-类型描述数据模型。它的
类似于Java中类的概念。类型具有名称空间
它定义了属性(功能)。
org.apache.uima.cas.Feature-是由Type描述的属性。
org.apache.uima.jcas.cas.TOP-是最通用的Type,可以与java.lang.Object比较。
org.apache.uima.cas.FeatureStructure-FeatureStructure最好是
描述为Type的实例。 FeatureStructure是您所需要的
用于访问数据。
假设我们有以下两种类型:
com.a.b.c.ColoredCar
com.a.b.c.Car
我们有以下句子:
Car A and car B are both blue.
假设先前的UIMA阶段已使用Type com.a.b.c.ColoredCar注释了整个句子,如下所示:
begin: 0
end: 24
color: "blue"
cars: FSArray
还让我们假设,从类型定义中我们可以知道特征汽车是com.a.b.c.Car的FSArray,并且Car包含以下值:
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中的工作方式。