我有一个具有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中的工作方式。

08-06 22:10